From 39a6b7575fc8f0a0041082c9f8a722c03ecf2e51 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 22 Apr 2021 17:04:04 +0200 Subject: [PATCH] StmtContext should not care about semantic versions 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 --- .../parser/impl/DefaultYangParserFactory.java | 4 +-- .../stmt/reactor/BuildGlobalContext.java | 26 +------------------ .../reactor/CrossSourceStatementReactor.java | 19 +++----------- .../parser/stmt/reactor/ReactorStmtCtx.java | 5 ---- .../stmt/reactor/RootStatementContext.java | 4 --- .../stmt/import_/ImportStatementSupport.java | 5 +++- .../stmt/module/ModuleStatementSupport.java | 5 +++- .../yangtools/yang/stmt/StmtTestUtils.java | 18 ++++++++----- .../yang/parser/spi/meta/StmtContext.java | 2 -- 9 files changed, 24 insertions(+), 64 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/DefaultYangParserFactory.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/DefaultYangParserFactory.java index 0ded26deca..9898b8d857 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/DefaultYangParserFactory.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/DefaultYangParserFactory.java @@ -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()); } } diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java index 9dd1210799..cd8604df40 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BuildGlobalContext.java @@ -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 sources = new HashSet<>(); private final ImmutableSet 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 libSources = new HashSet<>(); private ModelProcessingPhase currentPhase = ModelProcessingPhase.INIT; private ModelProcessingPhase finishedPhase = ModelProcessingPhase.INIT; BuildGlobalContext(final ImmutableMap supports, - final ImmutableMap> supportedValidation, - final ImportResolutionMode statementParserMode) { + final ImmutableMap> 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)); diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/CrossSourceStatementReactor.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/CrossSourceStatementReactor.java index e02481883e..20716d9732 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/CrossSourceStatementReactor.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/CrossSourceStatementReactor.java @@ -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 { @@ -95,9 +83,8 @@ public final class CrossSourceStatementReactor { private boolean modulesDeviatedByModulesSet = false; BuildAction(final ImmutableMap supportedTerminology, - final ImmutableMap> supportedValidation, - final ImportResolutionMode statementParserMode) { - this.context = new BuildGlobalContext(supportedTerminology, supportedValidation, statementParserMode); + final ImmutableMap> supportedValidation) { + this.context = new BuildGlobalContext(supportedTerminology, supportedValidation); } /** diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java index f292bab919..a32710dcd9 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java @@ -222,11 +222,6 @@ abstract class ReactorStmtCtx, 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); diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java index 62fd544365..31655861d6 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java @@ -235,10 +235,6 @@ public final class RootStatementContext, E ext return sourceContext; } - boolean isEnabledSemanticVersioningImpl() { - return sourceContext.globalContext().isEnabledSemanticVersioning(); - } - @NonNull YangVersion getRootVersionImpl() { return rootVersion == null ? DEFAULT_VERSION : rootVersion; } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java index 3ddd8bfebf..25e5592ffd 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java @@ -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 stmt) { - if (stmt.isEnabledSemanticVersioning()) { + if (semanticVersioning) { SemanticVersionImport.onLinkageDeclared(stmt); } else { RevisionImport.onLinkageDeclared(stmt); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java index f533a20840..b05def0186 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/module/ModuleStatementSupport.java @@ -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); } } diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/StmtTestUtils.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/StmtTestUtils.java index 2168820fb7..916b8f9d5f 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/StmtTestUtils.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/StmtTestUtils.java @@ -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 supportedFeatures, final Collection 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(); + } } diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java index 719fdace38..d71972a441 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java @@ -114,8 +114,6 @@ public interface StmtContext, E extends Effect return verifyNotNull(getParentContext(), "Root context %s does not have a parent", this); } - boolean isEnabledSemanticVersioning(); - /** * Returns the model root for this statement. * -- 2.36.6