StmtContext should not care about semantic versions 86/95886/5
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 22 Apr 2021 15:04:04 +0000 (17:04 +0200)
committerRobert Varga <nite@hq.sk>
Fri, 23 Apr 2021 04:48:02 +0000 (04:48 +0000)
Semantic version imports are part of configuration, not an explicit
build mode. Move them out, so that participating supports just pick them
up from configuration -- and hence we do not need to wire them through
StmtContext.

Change-Id: I020f50964484a72103123de57854924b1d3760f6
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/DefaultYangParserFactory.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/CrossSourceStatementReactor.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/StmtTestUtils.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java

index 0ded26deca7c370d679adc4236ff9c876e5e4146..9898b8d85717be4b6016e502db7828ad85148b80 100644 (file)
@@ -68,8 +68,6 @@ public final class DefaultYangParserFactory implements YangParserFactory {
     public @NonNull YangParser createParser(final YangParserConfiguration configuration) {
         final ImportResolutionMode importMode = configuration.importResolutionMode();
         checkArgument(SUPPORTED_MODES.contains(importMode), "Unsupported import resolution mode %s", importMode);
-
-        final CrossSourceStatementReactor reactor = reactors.computeIfAbsent(configuration, reactorFactory);
-        return new DefaultYangParser(reactor.newBuild(importMode));
+        return new DefaultYangParser(reactors.computeIfAbsent(configuration, reactorFactory).newBuild());
     }
 }
index 9dd1210799206a889f198e047b5695183916e820..cd8604df4061d0530c6a55d7ad1d994d524f4fa2 100644 (file)
@@ -38,7 +38,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.parser.api.ImportResolutionMode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedNamespaceBehaviour;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement;
@@ -86,40 +85,19 @@ final class BuildGlobalContext extends NamespaceStorageSupport implements Regist
     private final Set<SourceSpecificContext> sources = new HashSet<>();
     private final ImmutableSet<YangVersion> supportedVersions;
 
-    // FIXME: 7.0.0: this flag should really be passed to  {Import,Module}StatementSupport's bootstrap to wire the
-    //               appropriate behaviour. That requires a change in StatementSupport lifecycle, as statement supports
-    //               would no longer be stateless singletons.
-    private final boolean enabledSemanticVersions;
-
     private Set<SourceSpecificContext> libSources = new HashSet<>();
     private ModelProcessingPhase currentPhase = ModelProcessingPhase.INIT;
     private ModelProcessingPhase finishedPhase = ModelProcessingPhase.INIT;
 
     BuildGlobalContext(final ImmutableMap<ModelProcessingPhase, StatementSupportBundle> supports,
-            final ImmutableMap<ValidationBundleType, Collection<?>> supportedValidation,
-            final ImportResolutionMode statementParserMode) {
+            final ImmutableMap<ValidationBundleType, Collection<?>> supportedValidation) {
         this.supports = requireNonNull(supports, "BuildGlobalContext#supports cannot be null");
 
-        switch (statementParserMode) {
-            case DEFAULT:
-                enabledSemanticVersions = false;
-                break;
-            case OPENCONFIG_SEMVER:
-                enabledSemanticVersions = true;
-                break;
-            default:
-                throw new IllegalArgumentException("Unhandled parser mode " + statementParserMode);
-        }
-
         addToNamespace(ValidationBundlesNamespace.class, supportedValidation);
 
         this.supportedVersions = ImmutableSet.copyOf(supports.get(ModelProcessingPhase.INIT).getSupportedVersions());
     }
 
-    boolean isEnabledSemanticVersioning() {
-        return enabledSemanticVersions;
-    }
-
     StatementSupportBundle getSupportsForPhase(final ModelProcessingPhase phase) {
         return supports.get(phase);
     }
@@ -129,8 +107,6 @@ final class BuildGlobalContext extends NamespaceStorageSupport implements Regist
     }
 
     void addLibSource(final @NonNull StatementStreamSource libSource) {
-        checkState(!isEnabledSemanticVersioning(),
-            "Library sources are not supported in semantic version mode currently.");
         checkState(currentPhase == ModelProcessingPhase.INIT,
                 "Add library source is allowed in ModelProcessingPhase.INIT only");
         libSources.add(new SourceSpecificContext(this, libSource));
index e02481883e9fd2da44f78fcbc71064252b38b9ae..20716d9732d5fb7a84b77ba3d1dbcbd497cc9d42 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.parser.api.ImportResolutionMode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle;
@@ -52,18 +51,7 @@ public final class CrossSourceStatementReactor {
      * @return A new {@link BuildAction}.
      */
     public @NonNull BuildAction newBuild() {
-        return newBuild(ImportResolutionMode.DEFAULT);
-    }
-
-    /**
-     * Start a new reactor build using the specified statement parser mode and enabling all features and deviations.
-     *
-     * @param statementParserMode Parser mode to use
-     * @return A new {@link BuildAction}.
-     * @throws NullPointerException if statementParserMode is null
-     */
-    public @NonNull BuildAction newBuild(final ImportResolutionMode statementParserMode) {
-        return new BuildAction(supportedTerminology, supportedValidation, requireNonNull(statementParserMode));
+        return new BuildAction(supportedTerminology, supportedValidation);
     }
 
     public static class Builder implements org.opendaylight.yangtools.concepts.Builder<CrossSourceStatementReactor> {
@@ -95,9 +83,8 @@ public final class CrossSourceStatementReactor {
         private boolean modulesDeviatedByModulesSet = false;
 
         BuildAction(final ImmutableMap<ModelProcessingPhase, StatementSupportBundle> supportedTerminology,
-                final ImmutableMap<ValidationBundleType, Collection<?>> supportedValidation,
-                final ImportResolutionMode statementParserMode) {
-            this.context = new BuildGlobalContext(supportedTerminology, supportedValidation, statementParserMode);
+                final ImmutableMap<ValidationBundleType, Collection<?>> supportedValidation) {
+            this.context = new BuildGlobalContext(supportedTerminology, supportedValidation);
         }
 
         /**
index f292bab919fbef8adf8685190b89a4aca9161226..a32710dcd950912c0839dd53270676d54f069dcd 100644 (file)
@@ -222,11 +222,6 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
         getRoot().setRootIdentifierImpl(identifier);
     }
 
-    @Override
-    public final boolean isEnabledSemanticVersioning() {
-        return getRoot().isEnabledSemanticVersioningImpl();
-    }
-
     @Override
     public final ModelActionBuilder newInferenceAction(final ModelProcessingPhase phase) {
         return getRoot().getSourceContext().newInferenceAction(phase);
index 62fd544365de0a10142c230c2a85ac3c177b3377..31655861d6d7cc2933b3eb6d43814cf1fca20cad 100644 (file)
@@ -235,10 +235,6 @@ public final class RootStatementContext<A, D extends DeclaredStatement<A>, E ext
         return sourceContext;
     }
 
-    boolean isEnabledSemanticVersioningImpl() {
-        return sourceContext.globalContext().isEnabledSemanticVersioning();
-    }
-
     @NonNull YangVersion getRootVersionImpl() {
         return rootVersion == null ? DEFAULT_VERSION : rootVersion;
     }
index 3ddd8bfebf1f05e3f37075c65731e13fe7f9c06f..25e5592ffd1c3586c87f7f52c67ea0dc0bb3250b 100644 (file)
@@ -30,6 +30,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators;
 import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatements;
 import org.opendaylight.yangtools.yang.model.ri.stmt.EffectiveStatements;
+import org.opendaylight.yangtools.yang.parser.api.ImportResolutionMode;
 import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
 import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport;
@@ -65,10 +66,12 @@ public final class ImportStatementSupport
             .build();
 
     private final SubstatementValidator validator;
+    private final boolean semanticVersioning;
 
     private ImportStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator) {
         super(YangStmtMapping.IMPORT, StatementPolicy.reject(), config);
         this.validator = requireNonNull(validator);
+        semanticVersioning = config.importResolutionMode() == ImportResolutionMode.OPENCONFIG_SEMVER;
     }
 
     public static @NonNull ImportStatementSupport rfc6020Instance(final YangParserConfiguration config) {
@@ -118,7 +121,7 @@ public final class ImportStatementSupport
 
     @Override
     public void onLinkageDeclared(final Mutable<String, ImportStatement, ImportEffectiveStatement> stmt) {
-        if (stmt.isEnabledSemanticVersioning()) {
+        if (semanticVersioning) {
             SemanticVersionImport.onLinkageDeclared(stmt);
         } else {
             RevisionImport.onLinkageDeclared(stmt);
index f533a2084044867b10c296d6f3d4737b90644d07..b05def018614cf4f94aafc72b5264acffd1c0875 100644 (file)
@@ -43,6 +43,7 @@ import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators;
 import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatements;
 import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException;
+import org.opendaylight.yangtools.yang.parser.api.ImportResolutionMode;
 import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
 import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule;
@@ -132,10 +133,12 @@ public final class ModuleStatementSupport
         .build();
 
     private final SubstatementValidator validator;
+    private final boolean semanticVersioning;
 
     private ModuleStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator) {
         super(YangStmtMapping.MODULE, StatementPolicy.reject(), config);
         this.validator = requireNonNull(validator);
+        semanticVersioning = config.importResolutionMode() == ImportResolutionMode.OPENCONFIG_SEMVER;
     }
 
     public static @NonNull ModuleStatementSupport rfc6020Instance(final YangParserConfiguration config) {
@@ -212,7 +215,7 @@ public final class ModuleStatementSupport
         stmt.addToNs(ModuleQNameToModuleName.class, qNameModule, moduleName);
         stmt.addToNs(ImportPrefixToModuleCtx.class, modulePrefix, stmt);
 
-        if (stmt.isEnabledSemanticVersioning()) {
+        if (semanticVersioning) {
             addToSemVerModuleNamespace(stmt, moduleIdentifier);
         }
     }
index 2168820fb7a2dd52323c080f4713a05b9ed125c5..916b8f9d5ff243737eaa3a6451e002ccd2a7363e 100644 (file)
@@ -43,6 +43,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YinStatementStreamSou
 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YinTextToDomTransformer;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor.BuildAction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -139,13 +140,11 @@ public final class StmtTestUtils {
     public static EffectiveModelContext parseYangSources(final YangParserConfiguration config,
             final Set<QName> supportedFeatures, final Collection<? extends StatementStreamSource> sources)
             throws ReactorException {
-        final BuildAction reactor = RFC7950Reactors.defaultReactor().newBuild(config.importResolutionMode())
-                .addSources(sources);
+        final BuildAction build = getReactor(config).newBuild().addSources(sources);
         if (supportedFeatures != null) {
-            reactor.setSupportedFeatures(supportedFeatures);
+            build.setSupportedFeatures(supportedFeatures);
         }
-
-        return reactor.buildEffective();
+        return build.buildEffective();
     }
 
     public static EffectiveModelContext parseYangSources(final File... files) throws ReactorException, IOException,
@@ -262,8 +261,8 @@ public final class StmtTestUtils {
 
     public static EffectiveModelContext parseYinSources(final YangParserConfiguration config,
             final StatementStreamSource... sources) throws ReactorException {
-        return RFC7950Reactors.defaultReactor()
-            .newBuild(config.importResolutionMode())
+        return getReactor(config)
+            .newBuild()
             .addSources(sources)
             .buildEffective();
     }
@@ -301,4 +300,9 @@ public final class StmtTestUtils {
         }
         assertEquals(expected, actual);
     }
+
+    private static CrossSourceStatementReactor getReactor(final YangParserConfiguration config) {
+        return YangParserConfiguration.DEFAULT.equals(config) ? RFC7950Reactors.defaultReactor()
+            : RFC7950Reactors.defaultReactorBuilder(config).build();
+    }
 }
index 719fdace3839502b58d17019772c87180069cddf..d71972a441b150118e881609deb8f44543cb07a4 100644 (file)
@@ -114,8 +114,6 @@ public interface StmtContext<A, D extends DeclaredStatement<A>, E extends Effect
         return verifyNotNull(getParentContext(), "Root context %s does not have a parent", this);
     }
 
-    boolean isEnabledSemanticVersioning();
-
     /**
      * Returns the model root for this statement.
      *