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%2Faugment%2FAbstractAugmentStatementSupport.java;h=5c85334c3cdaf196a7fe16bf0e9df12f60de89f7;hb=6682a8e2a8c02ed7a66bddb8b7a86009ffbbb98d;hp=fe53eb46e009e3b466ff834ee51885599919087b;hpb=9c43a3b292862dd7f39c5fe302bbcf297c92ab84;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java index fe53eb46e0..5c85334c3c 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java @@ -32,11 +32,11 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; +import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; @@ -78,7 +78,8 @@ abstract class AbstractAugmentStatementSupport public final void onFullDefinitionDeclared( final Mutable augmentNode) { if (!augmentNode.isSupportedByFeatures()) { - return; + // We need this augment node to be present, but it should not escape to effective world + augmentNode.setIsSupportedToBuildEffective(false); } super.onFullDefinitionDeclared(augmentNode); @@ -90,7 +91,7 @@ abstract class AbstractAugmentStatementSupport final ModelActionBuilder augmentAction = augmentNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL); augmentAction.requiresCtx(augmentNode, ModelProcessingPhase.EFFECTIVE_MODEL); final Prerequisite>> target = augmentAction.mutatesEffectiveCtxPath( - getSearchRoot(augmentNode), ChildSchemaNodeNamespace.class, + getSearchRoot(augmentNode), SchemaTreeNamespace.class, augmentNode.coerceStatementArgument().getNodeIdentifiers()); augmentAction.apply(new InferenceAction() { @@ -130,7 +131,7 @@ abstract class AbstractAugmentStatementSupport */ if (YangStmtMapping.USES == augmentNode.coerceParentContext().getPublicDefinition()) { final SchemaNodeIdentifier augmentArg = augmentNode.coerceStatementArgument(); - final Optional> targetNode = ChildSchemaNodeNamespace.findNode( + final Optional> targetNode = SchemaTreeNamespace.findNode( getSearchRoot(augmentNode), augmentArg); if (targetNode.isPresent() && StmtContextUtils.isUnknownStatement(targetNode.get())) { augmentNode.setIsSupportedToBuildEffective(false); @@ -149,13 +150,14 @@ abstract class AbstractAugmentStatementSupport @Override protected final AugmentStatement createDeclared(final StmtContext ctx, final ImmutableList> substatements) { - return new RegularAugmentStatement(ctx, substatements); + return new RegularAugmentStatement(ctx.coerceRawStatementArgument(), ctx.coerceStatementArgument(), + substatements); } @Override protected final AugmentStatement createEmptyDeclared( final StmtContext ctx) { - return new EmptyAugmentStatement(ctx); + return new EmptyAugmentStatement(ctx.coerceRawStatementArgument(), ctx.coerceStatementArgument()); } @Override @@ -201,27 +203,26 @@ abstract class AbstractAugmentStatementSupport static void copyFromSourceToTarget(final StatementContextBase sourceCtx, final StatementContextBase targetCtx) { - final CopyType typeOfCopy = UsesStatement.class.equals(sourceCtx.coerceParentContext().getPublicDefinition() - .getDeclaredRepresentationClass()) ? CopyType.ADDED_BY_USES_AUGMENTATION - : CopyType.ADDED_BY_AUGMENTATION; + final CopyType typeOfCopy = sourceCtx.coerceParentContext().producesDeclared(UsesStatement.class) + ? CopyType.ADDED_BY_USES_AUGMENTATION : CopyType.ADDED_BY_AUGMENTATION; /* * Since Yang 1.1, if an augmentation is made conditional with a * "when" statement, it is allowed to add mandatory nodes. */ final boolean skipCheckOfMandatoryNodes = YangVersion.VERSION_1_1.equals(sourceCtx.getRootVersion()) && isConditionalAugmentStmt(sourceCtx); + final boolean unsupported = !sourceCtx.isSupportedByFeatures(); final Collection> declared = sourceCtx.mutableDeclaredSubstatements(); final Collection> effective = sourceCtx.mutableEffectiveSubstatements(); final Collection> buffer = new ArrayList<>(declared.size() + effective.size()); for (final Mutable originalStmtCtx : declared) { - if (originalStmtCtx.isSupportedByFeatures()) { - copyStatement(originalStmtCtx, targetCtx, typeOfCopy, buffer, skipCheckOfMandatoryNodes); - } + copyStatement(originalStmtCtx, targetCtx, typeOfCopy, buffer, skipCheckOfMandatoryNodes, + unsupported || !originalStmtCtx.isSupportedByFeatures()); } for (final Mutable originalStmtCtx : effective) { - copyStatement(originalStmtCtx, targetCtx, typeOfCopy, buffer, skipCheckOfMandatoryNodes); + copyStatement(originalStmtCtx, targetCtx, typeOfCopy, buffer, skipCheckOfMandatoryNodes, unsupported); } targetCtx.addEffectiveSubstatements(buffer); @@ -242,17 +243,23 @@ abstract class AbstractAugmentStatementSupport } private static boolean hasWhenSubstatement(final StmtContext ctx) { - return StmtContextUtils.findFirstSubstatement(ctx, WhenStatement.class) != null; + return ctx.hasSubstatement(WhenEffectiveStatement.class); } private static void copyStatement(final Mutable original, final StatementContextBase target, final CopyType typeOfCopy, final Collection> buffer, - final boolean skipCheckOfMandatoryNodes) { + final boolean skipCheckOfMandatoryNodes, final boolean unsupported) { + // We always copy statements, but if either the source statement or the augmentation which causes it are not + // supported to build we also mark the target as such. if (needToCopyByAugment(original)) { validateNodeCanBeCopiedByAugment(original, target, typeOfCopy, skipCheckOfMandatoryNodes); - buffer.add(target.childCopyOf(original, typeOfCopy)); - } else if (isReusedByAugment(original)) { + final Mutable copy = target.childCopyOf(original, typeOfCopy); + if (unsupported) { + copy.setIsSupportedToBuildEffective(false); + } + buffer.add(copy); + } else if (isReusedByAugment(original) && !unsupported) { buffer.add(original); } } @@ -260,23 +267,15 @@ abstract class AbstractAugmentStatementSupport private static void validateNodeCanBeCopiedByAugment(final StmtContext sourceCtx, final StatementContextBase targetCtx, final CopyType typeOfCopy, final boolean skipCheckOfMandatoryNodes) { - - if (WhenStatement.class.equals(sourceCtx.getPublicDefinition().getDeclaredRepresentationClass())) { - return; - } - if (!skipCheckOfMandatoryNodes && typeOfCopy == CopyType.ADDED_BY_AUGMENTATION && requireCheckOfMandatoryNodes(sourceCtx, targetCtx)) { checkForMandatoryNodes(sourceCtx); } // Data definition statements must not collide on their namespace - if (DataDefinitionStatement.class.isAssignableFrom( - sourceCtx.getPublicDefinition().getDeclaredRepresentationClass())) { + if (sourceCtx.producesDeclared(DataDefinitionStatement.class)) { for (final StmtContext subStatement : targetCtx.allSubstatements()) { - if (DataDefinitionStatement.class.isAssignableFrom( - subStatement.getPublicDefinition().getDeclaredRepresentationClass())) { - + if (subStatement.producesDeclared(DataDefinitionStatement.class)) { InferenceException.throwIf( Objects.equals(sourceCtx.getStatementArgument(), subStatement.getStatementArgument()), sourceCtx.getStatementSourceReference(),