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 / RootStatementContext.java
index ff139209b2f5964228d9391c52972e2c06579468..7c8b2d5877d44e16bba09744e3fbe44dd4568467 100644 (file)
@@ -17,6 +17,7 @@ import java.util.Map;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -36,9 +37,13 @@ import org.opendaylight.yangtools.yang.parser.spi.source.IncludedModuleContext;
 public class RootStatementContext<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> extends
         StatementContextBase<A, D, E> {
 
+    public static final YangVersion DEFAULT_VERSION = YangVersion.VERSION_1;
+
     private final SourceSpecificContext sourceContext;
     private final A argument;
 
+    private YangVersion version;
+
     /**
      * References to RootStatementContext of submodules which are included in this source.
      */
@@ -50,6 +55,12 @@ public class RootStatementContext<A, D extends DeclaredStatement<A>, E extends E
         this.argument = builder.getDefinition().parseArgumentValue(this, builder.getRawArgument());
     }
 
+    RootStatementContext(final ContextBuilder<A, D, E> builder, final SourceSpecificContext sourceContext,
+            final YangVersion version) {
+        this(builder, sourceContext);
+        this.setRootVersion(version);
+    }
+
     RootStatementContext(final RootStatementContext<A, D, E> original, final QNameModule newQNameModule,
         final CopyType typeOfCopy) {
         super(original);
@@ -218,4 +229,18 @@ public class RootStatementContext<A, D extends DeclaredStatement<A>, E extends E
         }
         return null;
     }
+
+    @Override
+    public YangVersion getRootVersion() {
+        return version == null ? DEFAULT_VERSION : version;
+    }
+
+    @Override
+    public void setRootVersion(final YangVersion version) {
+        Preconditions.checkArgument(sourceContext.getSupportedVersions().contains(version),
+                "Unsupported yang version %s in %s", version, getStatementSourceReference());
+        Preconditions.checkState(this.version == null, "Version of root %s has been already set to %s", argument,
+                this.version);
+        this.version = Preconditions.checkNotNull(version);
+    }
 }