Revert "Revert "Updated SchemaNodeIdentifier namespace handling.""
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / SubstatementContext.java
index 7a8d13031b944a9b519aea69b2d1f4b8bf63484d..04a01d17fceaebb6b1b913c071519724ea8cb489 100644 (file)
@@ -7,8 +7,11 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
+import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import java.util.List;
-
 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingUtils;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import java.util.Collection;
@@ -20,42 +23,57 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Namesp
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
-class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
-    extends StatementContextBase<A,D,E> {
+class SubstatementContext<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
+        extends StatementContextBase<A, D, E> {
 
-    private final StatementContextBase<?,?,?> parent;
+    private final StatementContextBase<?, ?, ?> parent;
     private final A argument;
 
-    SubstatementContext(StatementContextBase<?,?,?> parent,ContextBuilder<A,D,E> builder) throws SourceException {
+    SubstatementContext(StatementContextBase<?, ?, ?> parent,
+            ContextBuilder<A, D, E> builder) throws SourceException {
         super(builder);
-        this.parent = Preconditions.checkNotNull(parent, "Parent must not be null");
-        this.argument =   builder.getDefinition().parseArgumentValue(this, builder.getRawArgument());
+        this.parent = Preconditions.checkNotNull(parent,
+                "Parent must not be null");
+        this.argument = builder.getDefinition().parseArgumentValue(this,
+                builder.getRawArgument());
     }
 
-    SubstatementContext(SubstatementContext<A,D,E> original, QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
+    @SuppressWarnings("unchecked")
+    SubstatementContext(SubstatementContext<A, D, E> original,
+            QNameModule newQNameModule,
+            StatementContextBase<?, ?, ?> newParent, TypeOfCopy typeOfCopy)
+            throws SourceException {
         super(original);
         this.parent = newParent;
 
-        if(newQNameModule != null && original.argument instanceof QName) {
-            QName originalQName = (QName) original.argument;
-            this.argument =  (A) QName.create(newQNameModule,originalQName.getLocalName());
+        if (newQNameModule != null) {
+            if (original.argument instanceof QName) {
+                QName originalQName = (QName) original.argument;
+                this.argument = (A) QName.create(newQNameModule,
+                        originalQName.getLocalName());
+            } else if (StmtContextUtils.producesDeclared(original,
+                    KeyStatement.class)) {
+                this.argument = (A) StmtContextUtils
+                        .replaceModuleQNameForKey(
+                                (StmtContext<Collection<SchemaNodeIdentifier>, KeyStatement, ?>) original,
+                                newQNameModule);
+            } else {
+                this.argument = original.argument;
+            }
         } else {
             this.argument = original.argument;
         }
-
-        copyDeclaredStmts(original, newQNameModule);
-
-        copyEffectiveStmts(original, newQNameModule);
     }
 
     private void copyDeclaredStmts(SubstatementContext<A, D, E> original,
-            QNameModule newQNameModule) throws SourceException {
+            QNameModule newQNameModule, TypeOfCopy typeOfCopy)
+            throws SourceException {
         Collection<? extends StatementContextBase<?, ?, ?>> originalDeclaredSubstatements = original
                 .declaredSubstatements();
         for (StatementContextBase<?, ?, ?> stmtContext : originalDeclaredSubstatements) {
             if (GroupingUtils.needToCopyByUses(stmtContext)) {
-                StatementContextBase<?, ?, ?> copy = stmtContext
-                        .createCopy(newQNameModule,this);
+                StatementContextBase<?, ?, ?> copy = stmtContext.createCopy(
+                        newQNameModule, this, typeOfCopy);
                 this.addEffectiveSubstatement(copy);
             } else if (GroupingUtils.isReusedByUses(stmtContext)) {
                 this.addEffectiveSubstatement(stmtContext);
@@ -64,13 +82,14 @@ class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveS
     }
 
     private void copyEffectiveStmts(SubstatementContext<A, D, E> original,
-            QNameModule newQNameModule) throws SourceException {
+            QNameModule newQNameModule, TypeOfCopy typeOfCopy)
+            throws SourceException {
         Collection<? extends StatementContextBase<?, ?, ?>> originalEffectiveSubstatements = original
                 .effectiveSubstatements();
         for (StatementContextBase<?, ?, ?> stmtContext : originalEffectiveSubstatements) {
             if (GroupingUtils.needToCopyByUses(stmtContext)) {
-                StatementContextBase<?, ?, ?> copy = stmtContext
-                        .createCopy(newQNameModule,this);
+                StatementContextBase<?, ?, ?> copy = stmtContext.createCopy(
+                        newQNameModule, this, typeOfCopy);
                 this.addEffectiveSubstatement(copy);
             } else if (GroupingUtils.isReusedByUses(stmtContext)) {
                 this.addEffectiveSubstatement(stmtContext);
@@ -79,7 +98,7 @@ class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveS
     }
 
     @Override
-    public StatementContextBase<?,?,?> getParentContext() {
+    public StatementContextBase<?, ?, ?> getParentContext() {
         return parent;
     }
 
@@ -98,15 +117,39 @@ class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveS
         return parent.getRoot();
     }
 
-
     @Override
     public A getStatementArgument() {
         return argument;
     }
 
     @Override
-    public StatementContextBase<A, D, E>  createCopy(QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
-        return new SubstatementContext<>(this,newQNameModule, newParent);
+    public StatementContextBase<?, ?, ?> createCopy(
+            StatementContextBase<?, ?, ?> newParent, TypeOfCopy typeOfCopy)
+            throws SourceException {
+        return createCopy(null, newParent, typeOfCopy);
+    }
+
+    @Override
+    public StatementContextBase<A, D, E> createCopy(QNameModule newQNameModule,
+            StatementContextBase<?, ?, ?> newParent, TypeOfCopy typeOfCopy)
+            throws SourceException {
+        SubstatementContext<A, D, E> copy = new SubstatementContext<>(this,
+                newQNameModule, newParent, typeOfCopy);
+
+        copy.addAllToCopyHistory(this.getCopyHistory());
+        copy.addToCopyHistory(typeOfCopy);
+
+        if(this.getOriginalCtx() != null) {
+            copy.setOriginalCtx(this.getOriginalCtx());
+        } else {
+            copy.setOriginalCtx(this);
+        }
+
+        definition().onStatementAdded(copy);
+
+        copy.copyDeclaredStmts(this, newQNameModule, typeOfCopy);
+        copy.copyEffectiveStmts(this, newQNameModule, typeOfCopy);
+        return copy;
     }
 
     @Override
@@ -116,5 +159,16 @@ class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveS
         return argumentsFromRoot;
     }
 
+    @Override
+    public List<StmtContext<?, ?, ?>> getStmtContextsFromRoot() {
+        List<StmtContext<?, ?, ?>> stmtContextsList = parent
+                .getStmtContextsFromRoot();
+        stmtContextsList.add(this);
+        return stmtContextsList;
+    }
 
+    @Override
+    public boolean isRootContext() {
+        return false;
+    }
 }