Bug 6867: Extend yang statement parser to support different yang versions
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / SubstatementContext.java
index ce49764dab2eb53384d3ba9c5fbbfe481a0d26b1..aa64a559364d48fb31858e6573cd9e81787421ae 100644 (file)
@@ -14,8 +14,10 @@ import com.google.common.collect.ImmutableSet;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Set;
+import javax.annotation.Nonnull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
@@ -30,6 +32,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
 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.ModelProcessingPhase;
 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.meta.QNameCacheNamespace;
@@ -63,8 +66,9 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         this.parent = newParent;
 
         if (newQNameModule != null) {
-            if (original.argument instanceof QName) {
-                final QName originalQName = (QName) original.argument;
+            final A originalArg = original.argument;
+            if (originalArg instanceof QName) {
+                final QName originalQName = (QName) originalArg;
                 this.argument = (A) getFromNamespace(QNameCacheNamespace.class,
                         QName.create(newQNameModule, originalQName.getLocalName()));
             } else if (StmtContextUtils.producesDeclared(original, KeyStatement.class)) {
@@ -93,6 +97,7 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         return parent.getBehaviourRegistry();
     }
 
+    @Nonnull
     @Override
     public RootStatementContext<?, ?, ?> getRoot() {
         return parent.getRoot();
@@ -112,6 +117,9 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
     @Override
     public StatementContextBase<A, D, E> createCopy(final QNameModule newQNameModule,
             final StatementContextBase<?, ?, ?> newParent, final CopyType typeOfCopy) {
+        Preconditions.checkState(getCompletedPhase() == ModelProcessingPhase.EFFECTIVE_MODEL,
+                "Attempted to copy statement {} which has completed phase {}", this, getCompletedPhase());
+
         final SubstatementContext<A, D, E> copy = new SubstatementContext<>(this, newQNameModule, newParent, typeOfCopy);
 
         copy.appendCopyHistory(typeOfCopy, this.getCopyHistory());
@@ -238,6 +246,7 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
         return maybeParentPath.orNull();
     }
 
+    @Nonnull
     @Override
     public Optional<SchemaPath> getSchemaPath() {
         SchemaPath local = schemaPath;
@@ -298,4 +307,14 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
     public boolean isEnabledSemanticVersioning() {
         return parent.isEnabledSemanticVersioning();
     }
+
+    @Override
+    public YangVersion getRootVersion() {
+        return getRoot().getRootVersion();
+    }
+
+    @Override
+    public void setRootVersion(final YangVersion version) {
+        getRoot().setRootVersion(version);
+    }
 }