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=a5872bd614f440a02497893ed86210e1cd7359f7;hb=04fa25a4fe8957f6492618aa9a1e9a4f9af39df4;hp=a9bab4de76eca85c0fcb34443526d4e38736a172;hpb=c7c67c1ad9fbd77e2705345400f1db5b3d46e200;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 a9bab4de76..a5872bd614 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,16 +7,13 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +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.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; -import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement; @@ -24,6 +21,7 @@ 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; @@ -32,12 +30,29 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Infere 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.source.StatementSourceReference; +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; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class UsesStatementImpl extends AbstractDeclaredStatement implements UsesStatement { - protected UsesStatementImpl(StmtContext context) { +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(final StmtContext context) { super(context); } @@ -49,49 +64,62 @@ 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); } - public void onStatementDeclared(Mutable usesNode) throws InferenceException { - ModelActionBuilder modifier = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL); - final QName groupingName = usesNode.getStatementArgument(); - final StatementSourceReference usesSource = usesNode.getStatementSourceReference(); - final Prerequisite targetPre = modifier.mutatesEffectiveCtx(usesNode.getParentContext()); - final Prerequisite> sourcePre = modifier.requiresEffective( - usesNode, GroupingNamespace.class, groupingName); + @Override + public void onFullDefinitionDeclared( + final StmtContext.Mutable> usesNode) + throws SourceException { + SUBSTATEMENT_VALIDATOR.validate(usesNode); - modifier.apply(new InferenceAction() { + if (StmtContextUtils.isInExtensionBody(usesNode)) { + return; + } - @Override - public void apply() throws InferenceException { - Mutable targetCtx = (Mutable) targetPre.get(); - EffectiveStatement source = sourcePre.get(); + ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL); + final QName groupingName = usesNode.getStatementArgument(); - throw new UnsupportedOperationException("Copy of not not yet implemented."); - } + final Prerequisite> sourceGroupingPre = usesAction.requiresCtx(usesNode, + GroupingNamespace.class, groupingName, ModelProcessingPhase.EFFECTIVE_MODEL); + final Prerequisite> targetNodePre = usesAction.mutatesEffectiveCtx( + usesNode.getParentContext()); + + usesAction.apply(new InferenceAction() { @Override - public void prerequisiteFailed(Collection> failed) throws InferenceException { - if(failed.contains(sourcePre)) { - throw new InferenceException("Grouping " + groupingName + "was not found.", usesSource); + public void apply() { + StatementContextBase targetNodeStmtCtx = (StatementContextBase) targetNodePre.get(); + StatementContextBase sourceGrpStmtCtx = (StatementContextBase) sourceGroupingPre.get(); + + try { + GroupingUtils.copyFromSourceToTarget(sourceGrpStmtCtx, targetNodeStmtCtx, usesNode); + GroupingUtils.resolveUsesNode(usesNode, targetNodeStmtCtx); + } catch (SourceException e) { + LOG.warn(e.getMessage(), e); + throw e; } - throw new InferenceException("Unknown error occured.", usesSource); } + @Override + 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) { - throw new UnsupportedOperationException("Not implemented yet."); + final StmtContext> ctx) { + return new UsesEffectiveStatementImpl(ctx); } } @@ -135,35 +163,4 @@ public class UsesStatementImpl extends AbstractDeclaredStatement implemen public Collection getRefines() { return allDeclared(RefineStatement.class); } - - @Override - public QName argument() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String rawArgument() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Collection> declaredSubstatements() { - // TODO Auto-generated method stub - return null; - } - - @Override - public StatementDefinition statementDefinition() { - // TODO Auto-generated method stub - return null; - } - - @Override - public StatementSource getStatementSource() { - // TODO Auto-generated method stub - return null; - } - }