Merge "Introduce InstanceIdToNodes into yang-data-impl"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / RootStatementContext.java
index 295d2cc8ca3ea6c5df4d1738920e52404a9476f2..695251f369a89f78a36f2a961306f368ae4e2733 100644 (file)
@@ -7,26 +7,67 @@
  */
 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
+import java.util.List;
+
+import java.util.LinkedList;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import java.util.Collection;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
-
 class RootStatementContext<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
-    extends StatementContextBase<A, D,E> {
-
+        extends StatementContextBase<A, D, E> {
 
     private final SourceSpecificContext sourceContext;
+    private final A argument;
 
-    RootStatementContext(ContextBuilder<A, D,E> builder, SourceSpecificContext sourceContext) throws SourceException {
+    RootStatementContext(ContextBuilder<A, D, E> builder,
+            SourceSpecificContext sourceContext) throws SourceException {
         super(builder);
         this.sourceContext = sourceContext;
+        this.argument = builder.getDefinition().parseArgumentValue(this,
+                builder.getRawArgument());
+    }
+
+    RootStatementContext(RootStatementContext<A, D, E> original,
+            QNameModule newQNameModule) throws SourceException {
+        super(original);
+
+        sourceContext = original.sourceContext;
+        this.argument = original.argument;
+
+        copyDeclaredStmts(original, newQNameModule);
+
+        copyEffectiveStmts(original, newQNameModule);
+
+    }
+
+    private void copyDeclaredStmts(RootStatementContext<A, D, E> original,
+            QNameModule newQNameModule) throws SourceException {
+        Collection<? extends StmtContext<?, ?, ?>> originalDeclaredSubstatements = original
+                .declaredSubstatements();
+        for (StmtContext<?, ?, ?> stmtContext : originalDeclaredSubstatements) {
+            this.addEffectiveSubstatement(stmtContext
+                    .createCopy(newQNameModule,this));
+        }
+    }
+
+    private void copyEffectiveStmts(RootStatementContext<A, D, E> original,
+            QNameModule newQNameModule) throws SourceException {
+        Collection<? extends StmtContext<?, ?, ?>> originalEffectiveSubstatements = original
+                .effectiveSubstatements();
+        for (StmtContext<?, ?, ?> stmtContext : originalEffectiveSubstatements) {
+            this.addEffectiveSubstatement(stmtContext
+                    .createCopy(newQNameModule,this));
+        }
     }
 
     @Override
-    public StatementContextBase<?,?, ?> getParentContext() {
+    public StatementContextBase<?, ?, ?> getParentContext() {
         return null;
     }
 
@@ -41,7 +82,7 @@ class RootStatementContext<A, D extends DeclaredStatement<A>, E extends Effectiv
     }
 
     @Override
-    public RootStatementContext<?,?,?> getRoot() {
+    public RootStatementContext<?, ?, ?> getRoot() {
         return this;
     }
 
@@ -49,6 +90,23 @@ class RootStatementContext<A, D extends DeclaredStatement<A>, E extends Effectiv
         return sourceContext;
     }
 
+    @Override
+    public A getStatementArgument() {
+        return argument;
+    }
+
+    @Override
+    public StatementContextBase<A, D, E> createCopy(QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent)
+            throws SourceException {
+
+        return new RootStatementContext<>(this, newQNameModule);
+    }
 
+    @Override
+    public List<Object> getArgumentsFromRoot() {
+        List<Object> argumentList = new LinkedList<Object>();
+        argumentList.add(argument);
+        return argumentList;
+    }
 
 }