X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2Fif_feature%2FIfFeatureStatementSupport.java;h=a1362b9c04bbfc8cee7e6572d877db200ba5294e;hb=223f7753e408b981b0f077d14ede44b8037425c8;hp=b5311cf3d2b32a7584638bed480aba6f98836136;hpb=0e80edde0bb51772b0e2f709114328803ed76fec;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java index b5311cf3d2..a1362b9c04 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/if_feature/IfFeatureStatementSupport.java @@ -7,27 +7,47 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.if_feature; +import static com.google.common.base.Verify.verifyNotNull; + +import com.google.common.collect.ImmutableList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.Set; -import java.util.function.Predicate; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureExpr; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.FeatureNamespace; +import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; +import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; +import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction; +import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceContext; +import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite; +import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public final class IfFeatureStatementSupport extends AbstractStatementSupport>, IfFeatureStatement, - EffectiveStatement>, IfFeatureStatement>> { +public final class IfFeatureStatementSupport + extends BaseStatementSupport { + private static final Logger LOG = LoggerFactory.getLogger(IfFeatureStatementSupport.class); private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder( YangStmtMapping.IF_FEATURE) .build(); private static final IfFeatureStatementSupport INSTANCE = new IfFeatureStatementSupport(); private IfFeatureStatementSupport() { - super(YangStmtMapping.IF_FEATURE); + super(YangStmtMapping.IF_FEATURE, CopyPolicy.CONTEXT_INDEPENDENT); } public static IfFeatureStatementSupport getInstance() { @@ -35,29 +55,73 @@ public final class IfFeatureStatementSupport extends AbstractStatementSupport> parseArgumentValue(final StmtContext ctx, final String value) { + public IfFeatureExpr parseArgumentValue(final StmtContext ctx, final String value) { if (YangVersion.VERSION_1_1.equals(ctx.getRootVersion())) { return IfFeaturePredicateVisitor.parseIfFeatureExpression(ctx, value); } + return IfFeatureExpr.isPresent(StmtContextUtils.parseNodeIdentifier(ctx, value)); + } + + @Override + public void onFullDefinitionDeclared( + final Mutable stmt) { + super.onFullDefinitionDeclared(stmt); + + final ModelActionBuilder verifyFeatures = stmt.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL); + final Map, QName> backRef = new HashMap<>(); + for (QName feature : stmt.coerceStatementArgument().getReferencedFeatures()) { + backRef.put(verifyFeatures.requiresCtx(stmt, FeatureNamespace.class, feature, + ModelProcessingPhase.EFFECTIVE_MODEL), feature); + } + + verifyFeatures.apply(new InferenceAction() { + @Override + public void apply(final InferenceContext ctx) { + LOG.debug("Resolved all feature references in {}", backRef.values()); + } + + @Override + public void prerequisiteFailed(final Collection> failed) { + final Set unresolvedFeatures = new HashSet<>(); + for (Prerequisite prereq : failed) { + unresolvedFeatures.add(verifyNotNull(backRef.get(prereq))); + } + + throw new InferenceException(stmt.getStatementSourceReference(), + "Failed to resolve feature references %s in \"%s\"", unresolvedFeatures, + stmt.rawStatementArgument()); + } + }); + } - final QName qname = StmtContextUtils.parseNodeIdentifier(ctx, value); - return setQNames -> setQNames.contains(qname); + @Override + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } @Override - public IfFeatureStatement createDeclared(final StmtContext>, IfFeatureStatement, ?> ctx) { - return new IfFeatureStatementImpl(ctx); + protected IfFeatureStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularIfFeatureStatement(ctx.coerceRawStatementArgument(), ctx.coerceStatementArgument(), + substatements); } @Override - public EffectiveStatement>, IfFeatureStatement> createEffective( - final StmtContext>, IfFeatureStatement, - EffectiveStatement>, IfFeatureStatement>> ctx) { - return new IfFeatureEffectiveStatementImpl(ctx); + protected IfFeatureStatement createEmptyDeclared(final StmtContext ctx) { + return new EmptyIfFeatureStatement(ctx.coerceRawStatementArgument(), ctx.coerceStatementArgument()); } @Override - protected SubstatementValidator getSubstatementValidator() { - return SUBSTATEMENT_VALIDATOR; + protected IfFeatureEffectiveStatement createEffective( + final StmtContext ctx, + final IfFeatureStatement declared, final ImmutableList> substatements) { + return new RegularIfFeatureEffectiveStatement(declared, substatements); + } + + @Override + protected IfFeatureEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final IfFeatureStatement declared) { + return new EmptyIfFeatureEffectiveStatement(declared); } } \ No newline at end of file