X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2FUsesStatementImpl.java;h=92083c435ec472f1d68e4ab9bb321ad6604a3cb2;hb=97896a806e6a52a89ab385b93a06f180c3d6a529;hp=102ad007ff87b58aed7776614bef055331327802;hpb=5c3e87d88694d9f0bbb2ab872b4e68c7d6823dd3;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java index 102ad007ff..92083c435e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java @@ -7,10 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.FULL_DECLARATION; - +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; import java.util.Collection; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -23,13 +21,16 @@ import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; 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.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.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UsesEffectiveStatementImpl; @@ -38,10 +39,20 @@ import org.slf4j.LoggerFactory; public class UsesStatementImpl extends AbstractDeclaredStatement implements UsesStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .USES) + .add(Rfc6020Mapping.AUGMENT, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.REFINE, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); private static final Logger LOG = LoggerFactory.getLogger(UsesStatementImpl.class); - protected UsesStatementImpl(StmtContext context) { + protected UsesStatementImpl(final StmtContext context) { super(context); } @@ -53,57 +64,64 @@ public class UsesStatementImpl extends AbstractDeclaredStatement implemen } @Override - public QName parseArgumentValue(StmtContext ctx, String value) { + public QName parseArgumentValue(final StmtContext ctx, final String value) { return Utils.qNameFromArgument(ctx, value); } @Override public void onFullDefinitionDeclared( - final StmtContext.Mutable> usesNode) - throws SourceException { + final StmtContext.Mutable> usesNode) { + if (!StmtContextUtils.areFeaturesSupported(usesNode)) { + return; + } + + SUBSTATEMENT_VALIDATOR.validate(usesNode); - ModelActionBuilder usesAction = usesNode.newInferenceAction(FULL_DECLARATION); + if (StmtContextUtils.isInExtensionBody(usesNode)) { + return; + } + + ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL); final QName groupingName = usesNode.getStatementArgument(); final Prerequisite> sourceGroupingPre = usesAction.requiresCtx(usesNode, - GroupingNamespace.class, groupingName, FULL_DECLARATION); - final Prerequisite> targetNodePre = usesAction.mutatesCtx( - usesNode.getParentContext(), FULL_DECLARATION); + GroupingNamespace.class, groupingName, ModelProcessingPhase.EFFECTIVE_MODEL); + final Prerequisite> targetNodePre = usesAction.mutatesEffectiveCtx( + usesNode.getParentContext()); usesAction.apply(new InferenceAction() { @Override - public void apply() throws InferenceException { + public void apply() { StatementContextBase targetNodeStmtCtx = (StatementContextBase) targetNodePre.get(); StatementContextBase sourceGrpStmtCtx = (StatementContextBase) sourceGroupingPre.get(); try { - GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx); + GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx, usesNode); GroupingUtils.resolveUsesNode(usesNode, targetNodeStmtCtx); } catch (SourceException e) { LOG.warn(e.getMessage(), e); + throw e; } } @Override - public void prerequisiteFailed(Collection> failed) throws InferenceException { - if (failed.contains(sourceGroupingPre)) { - throw new InferenceException("Grouping " + groupingName + " was not resolved.", usesNode - .getStatementSourceReference()); - } + public void prerequisiteFailed(final Collection> failed) { + InferenceException.throwIf(failed.contains(sourceGroupingPre), + usesNode.getStatementSourceReference(), "Grouping '%s' was not resolved.", groupingName); throw new InferenceException("Unknown error occurred.", usesNode.getStatementSourceReference()); } }); } @Override - public UsesStatement createDeclared(StmtContext ctx) { + public UsesStatement createDeclared(final StmtContext ctx) { return new UsesStatementImpl(ctx); } @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + final StmtContext> ctx) { return new UsesEffectiveStatementImpl(ctx); }