Introduced ChildSchemaNodes namespace to parser
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / SubstatementContext.java
index aafdfca824a378e1b94af00106b6ef354e5b001a..4c3be3e9a2e16ad4fb2696d60a8ba9f67d6af180 100644 (file)
@@ -7,6 +7,15 @@
  */
 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;
+import org.opendaylight.yangtools.yang.common.QName;
 import com.google.common.base.Preconditions;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -14,18 +23,86 @@ 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.parent = Preconditions.checkNotNull(parent,
+                "Parent must not be null");
+        this.argument = builder.getDefinition().parseArgumentValue(this,
+                builder.getRawArgument());
+    }
+
+    @SuppressWarnings("unchecked")
+    SubstatementContext(SubstatementContext<A, D, E> original,
+            QNameModule newQNameModule,
+            StatementContextBase<?, ?, ?> newParent, TypeOfCopy typeOfCopy)
+            throws SourceException {
+        super(original);
+        this.parent = newParent;
+
+        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, typeOfCopy);
+
+        copyEffectiveStmts(original, newQNameModule, typeOfCopy);
+    }
+
+    private void copyDeclaredStmts(SubstatementContext<A, D, E> original,
+            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, typeOfCopy);
+                this.addEffectiveSubstatement(copy);
+            } else if (GroupingUtils.isReusedByUses(stmtContext)) {
+                this.addEffectiveSubstatement(stmtContext);
+            }
+        }
+    }
+
+    private void copyEffectiveStmts(SubstatementContext<A, D, E> original,
+            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, typeOfCopy);
+                this.addEffectiveSubstatement(copy);
+            } else if (GroupingUtils.isReusedByUses(stmtContext)) {
+                this.addEffectiveSubstatement(stmtContext);
+            }
+        }
     }
 
     @Override
-    public StatementContextBase<?,?,?> getParentContext() {
+    public StatementContextBase<?, ?, ?> getParentContext() {
         return parent;
     }
 
@@ -44,4 +121,55 @@ class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveS
         return parent.getRoot();
     }
 
+    @Override
+    public A getStatementArgument() {
+        return argument;
+    }
+
+    @Override
+    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);
+        return copy;
+    }
+
+    @Override
+    public List<Object> getArgumentsFromRoot() {
+        List<Object> argumentsFromRoot = parent.getArgumentsFromRoot();
+        argumentsFromRoot.add(argument);
+        return argumentsFromRoot;
+    }
+
+    @Override
+    public List<StmtContext<?, ?, ?>> getStmtContextsFromRoot() {
+        List<StmtContext<?, ?, ?>> stmtContextsList = parent
+                .getStmtContextsFromRoot();
+        stmtContextsList.add(this);
+        return stmtContextsList;
+    }
+
+    @Override
+    public boolean isRootContext() {
+        return false;
+    }
 }