Do not use SchemaNodeIdentifierBuildNamespace prerequisites
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / augment / AbstractAugmentStatementSupport.java
index acecc59493e5ac57c266e191b9556665a673d757..18093dc432d9bf111c5e698d4357683d3e638f03 100644 (file)
@@ -24,7 +24,7 @@ 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.UsesStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace;
+import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
@@ -95,8 +95,8 @@ abstract class AbstractAugmentStatementSupport extends AbstractStatementSupport<
             EffectiveStatement<SchemaNodeIdentifier, AugmentStatement>>> sourceCtxPrereq =
                 augmentAction.requiresCtx(augmentNode, ModelProcessingPhase.EFFECTIVE_MODEL);
         final Prerequisite<Mutable<?, ?, EffectiveStatement<?, ?>>> target =
-                augmentAction.mutatesEffectiveCtx(getSearchRoot(augmentNode),
-                    SchemaNodeIdentifierBuildNamespace.class, augmentNode.getStatementArgument());
+                augmentAction.mutatesEffectiveCtxPath(getSearchRoot(augmentNode),
+                    ChildSchemaNodeNamespace.class, augmentNode.getStatementArgument().getPathFromRoot());
 
         augmentAction.apply(new ModelActionBuilder.InferenceAction() {
             @Override
@@ -147,7 +147,7 @@ abstract class AbstractAugmentStatementSupport extends AbstractStatementSupport<
                  * Do not fail, if it is an uses-augment to an unknown node.
                  */
                 if (YangStmtMapping.USES == augmentNode.getParentContext().getPublicDefinition()) {
-                    final Optional<StmtContext<?, ?, ?>> targetNode = SchemaNodeIdentifierBuildNamespace.findNode(
+                    final Optional<StmtContext<?, ?, ?>> targetNode = ChildSchemaNodeNamespace.findNode(
                         getSearchRoot(augmentNode), augmentNode.getStatementArgument());
                     if (targetNode.isPresent() && StmtContextUtils.isUnknownStatement(targetNode.get())) {
                         augmentNode.setIsSupportedToBuildEffective(false);
@@ -241,17 +241,20 @@ abstract class AbstractAugmentStatementSupport extends AbstractStatementSupport<
             checkForMandatoryNodes(sourceCtx);
         }
 
-        for (final StmtContext<?, ?, ?> subStatement : targetCtx.allSubstatements()) {
-            final boolean sourceIsDataNode = DataDefinitionStatement.class.isAssignableFrom(sourceCtx
-                    .getPublicDefinition().getDeclaredRepresentationClass());
-            final boolean targetIsDataNode = DataDefinitionStatement.class.isAssignableFrom(subStatement
-                    .getPublicDefinition().getDeclaredRepresentationClass());
-            final boolean qNamesEqual = sourceIsDataNode && targetIsDataNode
-                    && Objects.equals(sourceCtx.getStatementArgument(), subStatement.getStatementArgument());
-
-            InferenceException.throwIf(qNamesEqual, sourceCtx.getStatementSourceReference(),
-                    "An augment cannot add node named '%s' because this name is already used in target",
-                    sourceCtx.rawStatementArgument());
+        // Data definition statements must not collide on their namespace
+        if (DataDefinitionStatement.class.isAssignableFrom(
+            sourceCtx.getPublicDefinition().getDeclaredRepresentationClass())) {
+            for (final StmtContext<?, ?, ?> subStatement : targetCtx.allSubstatements()) {
+                if (DataDefinitionStatement.class.isAssignableFrom(
+                    subStatement.getPublicDefinition().getDeclaredRepresentationClass())) {
+
+                    InferenceException.throwIf(
+                        Objects.equals(sourceCtx.getStatementArgument(), subStatement.getStatementArgument()),
+                        sourceCtx.getStatementSourceReference(),
+                        "An augment cannot add node named '%s' because this name is already used in target",
+                        sourceCtx.rawStatementArgument());
+                }
+            }
         }
     }