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%2Fuses%2FUsesStatementSupport.java;h=e094d9d3d8e06007cb2f0e1fe75828912e98c762;hb=refs%2Fchanges%2F88%2F94088%2F7;hp=902910298fd6b3940247bd066186cdff3dc0a4f2;hpb=56c97b2f83cf8e0785c196b1cc39de7f26bec4d4;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java index 902910298f..e094d9d3d8 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java @@ -26,6 +26,7 @@ import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference; 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; @@ -36,12 +37,16 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Desce import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement; +import org.opendaylight.yangtools.yang.model.parser.api.YangParserConfiguration; +import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators; +import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatements; +import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins; import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine.RefineEffectiveStatementImpl; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine.RefineTargetNamespace; import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace; import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -63,7 +68,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class UsesStatementSupport - extends BaseQNameStatementSupport { + extends AbstractQNameStatementSupport { private static final Logger LOG = LoggerFactory.getLogger(UsesStatementSupport.class); private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .USES) @@ -75,14 +80,9 @@ public final class UsesStatementSupport .addOptional(YangStmtMapping.STATUS) .addOptional(YangStmtMapping.WHEN) .build(); - private static final UsesStatementSupport INSTANCE = new UsesStatementSupport(); - private UsesStatementSupport() { - super(YangStmtMapping.USES, CopyPolicy.DECLARED_COPY); - } - - public static UsesStatementSupport getInstance() { - return INSTANCE; + public UsesStatementSupport(final YangParserConfiguration config) { + super(YangStmtMapping.USES, StatementPolicy.exactReplica(), config); } @Override @@ -137,20 +137,23 @@ public final class UsesStatementSupport @Override protected UsesStatement createDeclared(final StmtContext ctx, final ImmutableList> substatements) { - return new RegularUsesStatement(ctx.getRawArgument(), ctx.getArgument(), substatements); + return DeclaredStatements.createUses(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected UsesStatement createEmptyDeclared(final StmtContext ctx) { - return new EmptyUsesStatement(ctx.getRawArgument(), ctx.getArgument()); + protected UsesStatement attachDeclarationReference(final UsesStatement stmt, final DeclarationReference reference) { + return DeclaredStatementDecorators.decorateUses(stmt, reference); } @Override protected UsesEffectiveStatement createEffective(final Current stmt, final ImmutableList> substatements) { - final GroupingDefinition sourceGrouping = (GroupingDefinition) + final EffectiveStatement source = verifyNotNull(stmt.getFromNamespace(SourceGroupingNamespace.class, Empty.getInstance())).buildEffective(); - final int flags = historyAndStatusFlags(stmt.history(), substatements); + verify(source instanceof GroupingDefinition, "Unexpected source %s", source); + final GroupingDefinition sourceGrouping = (GroupingDefinition) source; + + final int flags = EffectiveStatementMixins.historyAndStatusFlags(stmt.history(), substatements); final QName argument = stmt.getArgument(); final UsesStatement declared = stmt.declared(); @@ -317,7 +320,13 @@ public final class UsesStatementSupport addOrReplaceNodes(subStmtCtx, (StatementContextBase) refineTargetNodeCtx); } - subStmtCtx.addToNs(RefineTargetNamespace.class, Empty.getInstance(), refineTargetNodeCtx); + // Target is a prerequisite for the 'refine', hence if the target is not supported, the refine is not supported + // as well. Otherwise add a pointer to the target into refine's local namespace. + if (refineTargetNodeCtx.isSupportedToBuildEffective()) { + subStmtCtx.addToNs(RefineTargetNamespace.class, Empty.getInstance(), refineTargetNodeCtx); + } else { + subStmtCtx.setIsSupportedToBuildEffective(false); + } } private static void addOrReplaceNodes(final Mutable subStmtCtx, @@ -340,14 +349,13 @@ public final class UsesStatementSupport refineSubstatementCtx.getRoot().rawArgument(), refineSubstatementCtx.coerceParentContext().argument(), refineSubstatementCtx.publicDefinition(), refineTargetNodeCtx.publicDefinition()); - if (isAllowedToAddByRefine(refineSubstatementDef)) { - refineTargetNodeCtx.addEffectiveSubstatement(refineSubstatementCtx); - } else { + if (!isAllowedToAddByRefine(refineSubstatementDef)) { refineTargetNodeCtx.removeStatementFromEffectiveSubstatements(refineSubstatementDef); - refineTargetNodeCtx.addEffectiveSubstatement(refineSubstatementCtx); } + refineTargetNodeCtx.addEffectiveSubstatement(refineSubstatementCtx.replicaAsChildOf(refineTargetNodeCtx)); } + // FIXME: clarify this and inline into single caller private static boolean isAllowedToAddByRefine(final StatementDefinition publicDefinition) { return YangStmtMapping.MUST.equals(publicDefinition); }