X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Freactor%2FRootStatementContext.java;h=7bb341e73c5dc633de57bb2f739d5b800316a736;hb=12880a5876c644243ba46ce8c674f29a7d0c773a;hp=7c8b2d5877d44e16bba09744e3fbe44dd4568467;hpb=fa1ed213acc06358d9b759fa871e2b360605734e;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java index 7c8b2d5877..7bb341e73c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java @@ -11,24 +11,29 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; 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.ModuleIdentifier; 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; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType; +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.NamespaceStorageNode; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.IncludedModuleContext; +import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; /** * Root statement class for a YANG source. All statements defined in that YANG source are mapped underneath an instance @@ -43,22 +48,27 @@ public class RootStatementContext, E extends E private final A argument; private YangVersion version; + private Collection requiredModules = ImmutableSet.of(); + private ModuleIdentifier identifier; /** * References to RootStatementContext of submodules which are included in this source. */ private Collection> includedContexts = ImmutableList.of(); - RootStatementContext(final ContextBuilder builder, final SourceSpecificContext sourceContext) { - super(builder); + RootStatementContext(final SourceSpecificContext sourceContext, final StatementDefinitionContext def, + final StatementSourceReference ref, final String rawArgument) { + super(def, ref, rawArgument); this.sourceContext = Preconditions.checkNotNull(sourceContext); - this.argument = builder.getDefinition().parseArgumentValue(this, builder.getRawArgument()); + this.argument = def.parseArgumentValue(this, rawStatementArgument()); } - RootStatementContext(final ContextBuilder builder, final SourceSpecificContext sourceContext, - final YangVersion version) { - this(builder, sourceContext); + RootStatementContext(final SourceSpecificContext sourceContext, final StatementDefinitionContext def, + final StatementSourceReference ref, final String rawArgument, final YangVersion version, + final ModuleIdentifier identifier) { + this(sourceContext, def, ref, rawArgument); this.setRootVersion(version); + this.setRootIdentifier(identifier); } RootStatementContext(final RootStatementContext original, final QNameModule newQNameModule, @@ -68,12 +78,12 @@ public class RootStatementContext, E extends E sourceContext = Preconditions.checkNotNull(original.sourceContext); this.argument = original.argument; - final Collection> declared = original.declaredSubstatements(); - final Collection> effective = original.effectiveSubstatements(); - final Collection> buffer = new ArrayList<>(declared.size() + effective.size()); + final Collection> declared = original.mutableDeclaredSubstatements(); + final Collection> effective = original.mutableEffectiveSubstatements(); + final Collection> buffer = new ArrayList<>(declared.size() + effective.size()); - for (final StatementContextBase stmtContext : declared) { - if (StmtContextUtils.areFeaturesSupported(stmtContext)) { + for (final Mutable stmtContext : declared) { + if (stmtContext.isSupportedByFeatures()) { buffer.add(stmtContext.createCopy(newQNameModule, this, typeOfCopy)); } } @@ -100,9 +110,6 @@ public class RootStatementContext, E extends E return sourceContext; } - /** - * @return registry of source context - */ @Override public Registry getBehaviourRegistry() { return sourceContext; @@ -136,7 +143,7 @@ public class RootStatementContext, E extends E * @throws org.opendaylight.yangtools.yang.parser.spi.source.SourceException instance of SourceException */ @Override - public StatementContextBase createCopy(final StatementContextBase newParent, + public StatementContextBase createCopy(final StatementContextBase newParent, final CopyType typeOfCopy) { return createCopy(null, newParent, typeOfCopy); } @@ -181,13 +188,18 @@ public class RootStatementContext, E extends E return true; } + @Override + public boolean isInYangDataExtensionBody() { + return false; + } + @Override public boolean isEnabledSemanticVersioning() { return sourceContext.isEnabledSemanticVersioning(); } @Override - public > void addToLocalStorage(final Class type, final K key, + public > V putToLocalStorage(final Class type, final K key, final V value) { if (IncludedModuleContext.class.isAssignableFrom(type)) { if (includedContexts.isEmpty()) { @@ -196,17 +208,33 @@ public class RootStatementContext, E extends E Verify.verify(value instanceof RootStatementContext); includedContexts.add((RootStatementContext) value); } - super.addToLocalStorage(type, key, value); + return super.putToLocalStorage(type, key, value); } + @Nullable @Override public > V getFromLocalStorage(final Class type, final K key) { + return getFromLocalStorage(type, key, new HashSet<>()); + } + + /* + * We need to track already checked RootStatementContexts due to possible + * circular chains of includes between submodules + */ + @Nullable + private > V getFromLocalStorage(final Class type, final K key, + final HashSet> alreadyChecked) { final V potentialLocal = super.getFromLocalStorage(type, key); if (potentialLocal != null) { return potentialLocal; } - for (final NamespaceStorageNode includedSource : includedContexts) { - final V potential = includedSource.getFromLocalStorage(type, key); + + alreadyChecked.add(this); + for (final RootStatementContext includedSource : includedContexts) { + if (alreadyChecked.contains(includedSource)) { + continue; + } + final V potential = includedSource.getFromLocalStorage(type, key, alreadyChecked); if (potential != null) { return potential; } @@ -217,12 +245,27 @@ public class RootStatementContext, E extends E @Nullable @Override public > Map getAllFromLocalStorage(final Class type) { + return getAllFromLocalStorage(type, new HashSet<>()); + } + + /* + * We need to track already checked RootStatementContexts due to possible + * circular chains of includes between submodules + */ + @Nullable + private > Map getAllFromLocalStorage(final Class type, + final HashSet> alreadyChecked) { final Map potentialLocal = super.getAllFromLocalStorage(type); if (potentialLocal != null) { return potentialLocal; } - for (final NamespaceStorageNode includedSource : includedContexts) { - final Map potential = includedSource.getAllFromLocalStorage(type); + + alreadyChecked.add(this); + for (final RootStatementContext includedSource : includedContexts) { + if (alreadyChecked.contains(includedSource)) { + continue; + } + final Map potential = includedSource.getAllFromLocalStorage(type, alreadyChecked); if (potential != null) { return potential; } @@ -243,4 +286,33 @@ public class RootStatementContext, E extends E this.version); this.version = Preconditions.checkNotNull(version); } + + @Override + public void addMutableStmtToSeal(final MutableStatement mutableStatement) { + sourceContext.addMutableStmtToSeal(mutableStatement); + } + + @Override + public void addRequiredModule(final ModuleIdentifier dependency) { + Preconditions.checkState(sourceContext.getInProgressPhase() == ModelProcessingPhase.SOURCE_PRE_LINKAGE, + "Add required module is allowed only in ModelProcessingPhase.SOURCE_PRE_LINKAGE phase"); + if (requiredModules.isEmpty()) { + requiredModules = new HashSet<>(); + } + requiredModules.add(dependency); + } + + Collection getRequiredModules() { + return ImmutableSet.copyOf(requiredModules); + } + + @Override + public void setRootIdentifier(final ModuleIdentifier identifier) { + Preconditions.checkNotNull(identifier); + this.identifier = identifier; + } + + ModuleIdentifier getRootIdentifier() { + return identifier; + } }