import java.util.Collection;
import java.util.Map;
import java.util.Optional;
-import java.util.Set;
import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.common.Empty;
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.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
-import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.parser.spi.ParserNamespaces;
import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStatementState;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
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.ModelProcessingPhase.ExecutionOrder;
-import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
import org.opendaylight.yangtools.yang.parser.spi.meta.ParserNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementFactory;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
* @param <E> Effective Statement representation
*/
abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
- extends NamespaceStorageSupport implements Mutable<A, D, E>, Current<A, D> {
+ extends AbstractNamespaceStorage implements Mutable<A, D, E>, Current<A, D> {
private static final Logger LOG = LoggerFactory.getLogger(ReactorStmtCtx.class);
/**
public abstract Collection<? extends @NonNull StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements();
@Override
- public final Registry getBehaviourRegistry() {
- return getRoot().getBehaviourRegistryImpl();
+ final <K, V> NamespaceAccess<K, V> accessNamespace(final ParserNamespace<K, V> type) {
+ return getRoot().getSourceContext().accessNamespace(type);
}
@Override
//
//
- // NamespaceStorageSupport/Mutable integration methods. Keep these together.
+ // AbstractNamespaceStorage/Mutable integration methods. Keep these together.
//
//
+ @Override
+ public StorageType getStorageType() {
+ // Common to all subclasses except RootStatementContext
+ return StorageType.STATEMENT_LOCAL;
+ }
+
@Override
public final <K, V> V namespaceItem(final ParserNamespace<K, V> namespace, final K key) {
- return getBehaviourRegistry().getNamespaceBehaviour(namespace).getFrom(this, key);
+ return accessNamespace(namespace).valueFrom(this, key);
}
@Override
return true;
}
- /*
- * If parent is supported, we need to check if-features statements of this context.
- */
- if (isParentSupportedByFeatures()) {
- // If the set of supported features has not been provided, all features are supported by default.
- final Set<QName> supportedFeatures = namespaceItem(ParserNamespaces.SUPPORTED_FEATURES, Empty.value());
- if (supportedFeatures == null || StmtContextUtils.checkFeatureSupport(this, supportedFeatures)) {
- flags |= SET_SUPPORTED_BY_FEATURES;
- return true;
- }
+ // If parent is supported, we need to check if-features statements of this context.
+ if (isParentSupportedByFeatures() && computeSupportedByFeatures()) {
+ flags |= SET_SUPPORTED_BY_FEATURES;
+ return true;
}
// Either parent is not supported or this statement is not supported
return false;
}
+ /**
+ * Compute whether this statement is supported by features. Returned value is combined with
+ * {@link #isParentSupportedByFeatures()} and cached.
+ *
+ * @return {@code true} if the current feature set matches {@code if-feature} of this statement
+ */
+ abstract boolean computeSupportedByFeatures();
+
protected abstract boolean isParentSupportedByFeatures();
/**