X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-reactor%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Freactor%2FSourceSpecificContext.java;h=7c733cbad7ce1d8287027e0c4ebd45c94d607ea8;hb=refs%2Fchanges%2F15%2F94015%2F7;hp=43eb2332aec630e6797356e58b08408bd5c4450c;hpb=c8668229ad6e73d5ae03a52f4b87e8e4d2a67c6e;p=yangtools.git diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java index 43eb2332ae..7c733cbad7 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java @@ -23,21 +23,16 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.Mutable; 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.meta.DeclaredStatement; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; -import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; -import org.opendaylight.yangtools.yang.parser.spi.meta.MutableStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType; @@ -62,9 +57,8 @@ import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBehaviour.Registry, Mutable { - - public enum PhaseCompletionProgress { +final class SourceSpecificContext implements NamespaceStorageNode, NamespaceBehaviour.Registry, Mutable { + enum PhaseCompletionProgress { NO_PROGRESS, PROGRESS, FINISHED @@ -75,8 +69,10 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh private final Multimap modifiers = HashMultimap.create(); private final QNameToStatementDefinitionMap qnameToStmtDefMap = new QNameToStatementDefinitionMap(); private final PrefixToModuleMap prefixToModuleMap = new PrefixToModuleMap(); - private final BuildGlobalContext currentContext; - private final StatementStreamSource source; + private final @NonNull BuildGlobalContext globalContext; + + // Freed as soon as we complete ModelProcessingPhase.EFFECTIVE_MODEL + private StatementStreamSource source; /* * "imported" namespaces in this source -- this points to RootStatementContexts of @@ -88,44 +84,29 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh private ModelProcessingPhase inProgressPhase; private RootStatementContext root; - SourceSpecificContext(final BuildGlobalContext currentContext, final StatementStreamSource source) { - this.currentContext = requireNonNull(currentContext); + SourceSpecificContext(final BuildGlobalContext globalContext, final StatementStreamSource source) { + this.globalContext = requireNonNull(globalContext); this.source = requireNonNull(source); } - boolean isEnabledSemanticVersioning() { - return currentContext.isEnabledSemanticVersioning(); + @NonNull BuildGlobalContext globalContext() { + return globalContext; } ModelProcessingPhase getInProgressPhase() { return inProgressPhase; } - Optional> lookupDeclaredChild(final StatementContextBase current, - final int childId) { - if (current == null) { - return Optional.empty(); - } - - // Fast path: we are entering a statement which was emitted in previous phase - StatementContextBase existing = current.lookupSubstatement(childId); - while (existing != null && StatementSource.CONTEXT == existing.getStatementSource()) { - existing = existing.lookupSubstatement(childId); - } - - return Optional.ofNullable(existing); - } - - StatementContextBase createDeclaredChild(final StatementContextBase current, final int childId, - final QName name, final String argument, final StatementSourceReference ref) { - StatementDefinitionContext def = currentContext.getStatementDefinition(getRootVersion(), name); + AbstractResumedStatement createDeclaredChild(final AbstractResumedStatement current, + final int childId, final QName name, final String argument, final StatementSourceReference ref) { + StatementDefinitionContext def = globalContext.getStatementDefinition(getRootVersion(), name); if (def == null) { - def = currentContext.getModelDefinedStatementDefinition(name); + def = globalContext.getModelDefinedStatementDefinition(name); if (def == null) { final StatementSupport extension = qnameToStmtDefMap.get(name); if (extension != null) { def = new StatementDefinitionContext<>(extension); - currentContext.putModelDefinedStatementDefinition(name, def); + globalContext.putModelDefinedStatementDefinition(name, def); } } } else if (current != null && StmtContextUtils.isUnrecognizedStatement(current)) { @@ -165,13 +146,13 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh */ if (root == null) { root = new RootStatementContext<>(this, def, ref, argument); - } else if (!RootStatementContext.DEFAULT_VERSION.equals(root.getRootVersion()) + } else if (!RootStatementContext.DEFAULT_VERSION.equals(root.yangVersion()) && inProgressPhase == ModelProcessingPhase.SOURCE_LINKAGE) { - root = new RootStatementContext<>(this, def, ref, argument, root.getRootVersion(), + root = new RootStatementContext<>(this, def, ref, argument, root.yangVersion(), root.getRootIdentifier()); } else { final QName rootStatement = root.definition().getStatementName(); - final String rootArgument = root.rawStatementArgument(); + final String rootArgument = root.rawArgument(); checkState(Objects.equals(def.getStatementName(), rootStatement) && Objects.equals(argument, rootArgument), "Root statement was already defined as '%s %s'.", rootStatement, rootArgument); @@ -189,15 +170,7 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh * @return version of root statement context */ YangVersion getRootVersion() { - return root != null ? root.getRootVersion() : RootStatementContext.DEFAULT_VERSION; - } - - DeclaredStatement buildDeclared() { - return root.buildDeclared(); - } - - EffectiveStatement buildEffective() { - return root.buildEffective(); + return root != null ? root.yangVersion() : RootStatementContext.DEFAULT_VERSION; } void startPhase(final ModelProcessingPhase phase) { @@ -287,12 +260,12 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh @Override public > NamespaceBehaviour getNamespaceBehaviour( final Class type) { - return currentContext.getNamespaceBehaviour(type); + return globalContext.getNamespaceBehaviour(type); } @Override - public NamespaceStorageNode getParentNamespaceStorage() { - return currentContext; + public BuildGlobalContext getParentNamespaceStorage() { + return globalContext; } PhaseCompletionProgress tryToCompletePhase(final ModelProcessingPhase phase) { @@ -307,8 +280,12 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh if (phaseCompleted && currentPhaseModifiers.isEmpty()) { finishedPhase = phase; LOG.debug("Source {} finished phase {}", source, phase); + if (phase == ModelProcessingPhase.EFFECTIVE_MODEL) { + // We have the effective model acquired, which is the final phase of source interaction. + LOG.trace("Releasing source {}", source); + source = null; + } return PhaseCompletionProgress.FINISHED; - } return hasProgressed ? PhaseCompletionProgress.PROGRESS : PhaseCompletionProgress.NO_PROGRESS; @@ -356,8 +333,7 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh } final String message = String.format("Yang model processing phase %s failed", identifier); - final InferenceException e = new InferenceException(message, root.getStatementSourceReference(), - exceptions.get(0)); + final InferenceException e = new InferenceException(message, root, exceptions.get(0)); exceptions.listIterator(1).forEachRemaining(e::addSuppressed); return Optional.of(e); @@ -419,7 +395,7 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh private QNameToStatementDefinition stmtDef() { // regular YANG statements and extension supports added - final StatementSupportBundle supportsForPhase = currentContext.getSupportsForPhase(inProgressPhase); + final StatementSupportBundle supportsForPhase = globalContext.getSupportsForPhase(inProgressPhase); qnameToStmtDefMap.putAll(supportsForPhase.getCommonDefinitions()); qnameToStmtDefMap.putAll(supportsForPhase.getDefinitionsSpecificForVersion(getRootVersion())); @@ -429,7 +405,7 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh } // We need to any and all extension statements which have been declared in the context - final Map> extensions = currentContext.getAllFromNamespace( + final Map> extensions = globalContext.getNamespace( StatementDefinitionNamespace.class); if (extensions != null) { extensions.forEach((qname, support) -> { @@ -445,14 +421,6 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh return qnameToStmtDefMap; } - public Set getSupportedVersions() { - return currentContext.getSupportedVersions(); - } - - void addMutableStmtToSeal(final MutableStatement mutableStatement) { - currentContext.addMutableStmtToSeal(mutableStatement); - } - Collection getRequiredSources() { return root.getRequiredSources(); }