*/
package org.opendaylight.yangtools.yang.parser.stmt.reactor;
+import com.google.common.base.Optional;
+import java.util.ArrayList;
import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QNameModule;
+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.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.source.SourceException;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
+import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.IncludedModuleContext;
/**
* root statement class for a Yang source
StatementContextBase<A, D, E> {
private final SourceSpecificContext sourceContext;
+ private final Collection<NamespaceStorageNode> includedContexts = new ArrayList<>();
private final A argument;
- RootStatementContext(ContextBuilder<A, D, E> builder, SourceSpecificContext sourceContext) throws SourceException {
+ RootStatementContext(final ContextBuilder<A, D, E> builder, final SourceSpecificContext sourceContext) {
super(builder);
this.sourceContext = sourceContext;
this.argument = builder.getDefinition().parseArgumentValue(this, builder.getRawArgument());
}
- RootStatementContext(RootStatementContext<A, D, E> original, QNameModule newQNameModule, TypeOfCopy typeOfCopy)
- throws SourceException {
+ RootStatementContext(final RootStatementContext<A, D, E> original, final QNameModule newQNameModule,
+ final CopyType typeOfCopy) {
super(original);
sourceContext = original.sourceContext;
*
* @param typeOfCopy
* determines whether copy is used by augmentation or uses
- * @throws SourceException
+ * @throws org.opendaylight.yangtools.yang.parser.spi.source.SourceException
*/
- private void copyDeclaredStmts(RootStatementContext<A, D, E> original, QNameModule newQNameModule,
- TypeOfCopy typeOfCopy) throws SourceException {
- Collection<? extends StmtContext<?, ?, ?>> originalDeclaredSubstatements = original.declaredSubstatements();
- for (StmtContext<?, ?, ?> stmtContext : originalDeclaredSubstatements) {
+ private void copyDeclaredStmts(final RootStatementContext<A, D, E> original, final QNameModule newQNameModule,
+ final CopyType typeOfCopy) {
+ final Collection<StatementContextBase<?, ?, ?>> originalDeclaredSubstatements = original.declaredSubstatements();
+ for (final StatementContextBase<?, ?, ?> stmtContext : originalDeclaredSubstatements) {
+ if (!StmtContextUtils.areFeaturesSupported(stmtContext)) {
+ continue;
+ }
this.addEffectiveSubstatement(stmtContext.createCopy(newQNameModule, this, typeOfCopy));
}
}
*
* @param typeOfCopy
* determines whether copy is used by augmentation or uses
- * @throws SourceException
+ * @throws org.opendaylight.yangtools.yang.parser.spi.source.SourceException
*/
- private void copyEffectiveStmts(RootStatementContext<A, D, E> original, QNameModule newQNameModule,
- TypeOfCopy typeOfCopy) throws SourceException {
- Collection<? extends StmtContext<?, ?, ?>> originalEffectiveSubstatements = original.effectiveSubstatements();
- for (StmtContext<?, ?, ?> stmtContext : originalEffectiveSubstatements) {
+ private void copyEffectiveStmts(final RootStatementContext<A, D, E> original, final QNameModule newQNameModule,
+ final CopyType typeOfCopy) {
+ final Collection<? extends StmtContext<?, ?, ?>> originalEffectiveSubstatements = original.effectiveSubstatements();
+ for (final StmtContext<?, ?, ?> stmtContext : originalEffectiveSubstatements) {
this.addEffectiveSubstatement(stmtContext.createCopy(newQNameModule, this, typeOfCopy));
}
}
return sourceContext;
}
+ @Override
+ public StorageNodeType getStorageNodeType() {
+ return StorageNodeType.ROOT_STATEMENT_LOCAL;
+ }
/**
* @return this as its own root
*/
}
/**
- * @return copy of this considering {@link TypeOfCopy} (augment, uses)
+ * @return copy of this considering {@link CopyType} (augment, uses)
*
- * @throws SourceException instance of SourceException
+ * @throws org.opendaylight.yangtools.yang.parser.spi.source.SourceException instance of SourceException
*/
@Override
- public StatementContextBase<?, ?, ?> createCopy(StatementContextBase<?, ?, ?> newParent, TypeOfCopy typeOfCopy)
- throws SourceException {
+ public StatementContextBase<?, ?, ?> createCopy(final StatementContextBase<?, ?, ?> newParent,
+ final CopyType typeOfCopy) {
return createCopy(null, newParent, typeOfCopy);
}
/**
- * @return copy of this considering {@link TypeOfCopy} (augment, uses)
+ * @return copy of this considering {@link CopyType} (augment, uses)
*
- * @throws SourceException instance of SourceException
+ * @throws org.opendaylight.yangtools.yang.parser.spi.source.SourceException instance of SourceException
*/
@Override
- public StatementContextBase<A, D, E> createCopy(QNameModule newQNameModule,
- StatementContextBase<?, ?, ?> newParent, TypeOfCopy typeOfCopy) throws SourceException {
- RootStatementContext<A, D, E> copy = new RootStatementContext<>(this, newQNameModule, typeOfCopy);
+ public StatementContextBase<A, D, E> createCopy(final QNameModule newQNameModule,
+ final StatementContextBase<?, ?, ?> newParent, final CopyType typeOfCopy) {
+ final RootStatementContext<A, D, E> copy = new RootStatementContext<>(this, newQNameModule, typeOfCopy);
- copy.addAllToCopyHistory(this.getCopyHistory());
- copy.addToCopyHistory(typeOfCopy);
+ copy.appendCopyHistory(typeOfCopy, this.getCopyHistory());
- if(this.getOriginalCtx() != null) {
+ if (this.getOriginalCtx() != null) {
copy.setOriginalCtx(this.getOriginalCtx());
} else {
copy.setOriginalCtx(this);
return copy;
}
- /**
- * @return this' argument as it is the only from root (this)
- */
@Override
- public List<Object> getArgumentsFromRoot() {
- List<Object> argumentList = new LinkedList<>();
- argumentList.add(argument);
- return argumentList;
+ public Optional<SchemaPath> getSchemaPath() {
+ return Optional.of(SchemaPath.ROOT);
}
/**
- * @return this as it is the only\context from root (this)
+ * @return true
*/
@Override
- public List<StmtContext<?, ?, ?>> getStmtContextsFromRoot() {
- List<StmtContext<?, ?, ?>> stmtContextsList = new LinkedList<>();
- stmtContextsList.add(this);
- return stmtContextsList;
+ public boolean isRootContext() {
+ return true;
}
- /**
- * @return true
- */
@Override
- public boolean isRootContext() {
+ public boolean isConfiguration() {
return true;
}
+ @Override
+ public boolean isEnabledSemanticVersioning() {
+ return sourceContext.isEnabledSemanticVersioning();
+ }
+
+ @Override
+ public <K, V, N extends IdentifierNamespace<K, V>> void addToLocalStorage(final Class<N> type, final K key,
+ final V value) {
+ if (IncludedModuleContext.class.isAssignableFrom(type)) {
+ includedContexts.add((NamespaceStorageNode) value);
+ }
+ super.addToLocalStorage(type, key, value);
+ }
+
+ @Override
+ public <K, V, N extends IdentifierNamespace<K, V>> V getFromLocalStorage(final Class<N> type, final K key) {
+ final V potentialLocal = super.getFromLocalStorage(type, key);
+ if (potentialLocal != null) {
+ return potentialLocal;
+ }
+ for (final NamespaceStorageNode includedSource : includedContexts) {
+ final V potential = includedSource.getFromLocalStorage(type, key);
+ if (potential != null) {
+ return potential;
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromLocalStorage(final Class<N> type) {
+ final Map<K, V> potentialLocal = super.getAllFromLocalStorage(type);
+ if (potentialLocal != null) {
+ return potentialLocal;
+ }
+ for (final NamespaceStorageNode includedSource : includedContexts) {
+ final Map<K, V> potential = includedSource.getAllFromLocalStorage(type);
+ if (potential != null) {
+ return potential;
+ }
+ }
+ return null;
+ }
}