*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta;
+import static com.google.common.base.Verify.verify;
import static com.google.common.base.Verify.verifyNotNull;
import static java.util.Objects.requireNonNull;
import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import java.util.Collection;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
-import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractSchemaTreeStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.BoundStmtCtx;
+import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStatementState;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceStmtCtx;
+import org.opendaylight.yangtools.yang.parser.spi.meta.QNameWithFlagsEffectiveStatementState;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportNamespace;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
.addOptional(YangStmtMapping.STATUS)
.addOptional(YangStmtMapping.WHEN)
.build();
+ private static final ImmutableSet<StatementDefinition> RFC6020_CASE_SHORTHANDS = ImmutableSet.of(
+ YangStmtMapping.ANYXML, YangStmtMapping.CONTAINER, YangStmtMapping.LEAF, YangStmtMapping.LIST,
+ YangStmtMapping.LEAF_LIST);
private static final SubstatementValidator RFC7950_VALIDATOR = SubstatementValidator.builder(YangStmtMapping.CHOICE)
.addAny(YangStmtMapping.ANYDATA)
.addAny(YangStmtMapping.ANYXML)
.addAny(YangStmtMapping.CASE)
+ .addAny(YangStmtMapping.CHOICE)
.addOptional(YangStmtMapping.CONFIG)
.addAny(YangStmtMapping.CONTAINER)
.addOptional(YangStmtMapping.DEFAULT)
.addOptional(YangStmtMapping.STATUS)
.addOptional(YangStmtMapping.WHEN)
.build();
+ private static final ImmutableSet<StatementDefinition> RFC7950_CASE_SHORTHANDS = ImmutableSet.of(
+ YangStmtMapping.ANYDATA, YangStmtMapping.ANYXML, YangStmtMapping.CHOICE, YangStmtMapping.CONTAINER,
+ YangStmtMapping.LEAF, YangStmtMapping.LIST, YangStmtMapping.LEAF_LIST);
- private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator) {
+ private final ImmutableSet<StatementDefinition> caseShorthands;
+
+ private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator,
+ final ImmutableSet<StatementDefinition> caseShorthands) {
super(YangStmtMapping.CHOICE, instantiatedPolicy(), config, requireNonNull(validator));
+ this.caseShorthands = requireNonNull(caseShorthands);
}
public static @NonNull ChoiceStatementSupport rfc6020Instance(final YangParserConfiguration config) {
- return new ChoiceStatementSupport(config, RFC6020_VALIDATOR);
+ return new ChoiceStatementSupport(config, RFC6020_VALIDATOR, RFC6020_CASE_SHORTHANDS);
}
public static @NonNull ChoiceStatementSupport rfc7950Instance(final YangParserConfiguration config) {
- return new ChoiceStatementSupport(config, RFC7950_VALIDATOR);
+ return new ChoiceStatementSupport(config, RFC7950_VALIDATOR, RFC7950_CASE_SHORTHANDS);
}
@Override
public Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final NamespaceStmtCtx parent,
final StatementDefinition stmtDef) {
- if (!YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(stmtDef)) {
+ if (!caseShorthands.contains(stmtDef)) {
return Optional.empty();
}
return Optional.of(verifyNotNull(parent.getFromNamespace(StatementSupportNamespace.class,
}
@Override
- protected ChoiceStatement createDeclared(@NonNull final StmtContext<QName, ChoiceStatement, ?> ctx,
- final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ protected ChoiceStatement createDeclared(final BoundStmtCtx<QName> ctx,
+ final ImmutableList<DeclaredStatement<?>> substatements) {
return DeclaredStatements.createChoice(ctx.getArgument(), substatements);
}
public ChoiceEffectiveStatement copyEffective(final Current<QName, ChoiceStatement> stmt,
final ChoiceEffectiveStatement original) {
return EffectiveStatements.copyChoice(original, stmt.getArgument(),
- computeFlags(stmt, original.effectiveSubstatements()), stmt.original(ChoiceSchemaNode.class));
+ computeFlags(stmt, original.effectiveSubstatements()));
}
@Override
try {
return EffectiveStatements.createChoice(stmt.declared(), stmt.getArgument(),
- computeFlags(stmt, substatements), substatements, defaultCase, stmt.original(ChoiceSchemaNode.class));
+ computeFlags(stmt, substatements), substatements, defaultCase);
} catch (SubstatementIndexingException e) {
throw new SourceException(e.getMessage(), stmt, e);
}
}
+ @Override
+ public EffectiveStatementState extractEffectiveState(final ChoiceEffectiveStatement stmt) {
+ verify(stmt instanceof ChoiceSchemaNode, "Unexpected statement %s", stmt);
+ final var schema = (ChoiceSchemaNode) stmt;
+ return new QNameWithFlagsEffectiveStatementState(stmt.argument(), new FlagsBuilder()
+ .setHistory(schema)
+ .setStatus(schema.getStatus())
+ .setConfiguration(schema.effectiveConfig().orElse(null))
+ .setMandatory(schema.isMandatory())
+ .toFlags());
+ }
+
private static int computeFlags(final Current<?, ?> stmt,
final Collection<? extends EffectiveStatement<?, ?>> substatements) {
return new FlagsBuilder()