Introduce yangtools.binding.meta
[yangtools.git] / parser / yang-parser-reactor / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / ReactorStmtCtx.java
index fdf91cf7d631eb066f00d7c57e882076d6018cd8..c875f520a722df8be92841844ad03caf8593cf7f 100644 (file)
@@ -16,25 +16,22 @@ import com.google.common.base.VerifyException;
 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;
@@ -42,7 +39,6 @@ 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.ModelProcessingPhase.ExecutionOrder;
-import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType;
 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;
@@ -60,7 +56,7 @@ import org.slf4j.LoggerFactory;
  * @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);
 
     /**
@@ -188,8 +184,8 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
     public abstract Collection<? extends @NonNull StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements();
 
     @Override
-    final NamespaceBehaviourRegistry getBehaviourRegistry() {
-        return getRoot().getBehaviourRegistryImpl();
+    final <K, V> NamespaceAccess<K, V> accessNamespace(final ParserNamespace<K, V> type) {
+        return getRoot().getSourceContext().accessNamespace(type);
     }
 
     @Override
@@ -309,19 +305,19 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
 
     //
     //
-    // NamespaceStorageSupport/Mutable integration methods. Keep these together.
+    // AbstractNamespaceStorage/Mutable integration methods. Keep these together.
     //
     //
 
     @Override
-    public StorageNodeType getStorageNodeType() {
+    public StorageType getStorageType() {
         // Common to all subclasses except RootStatementContext
-        return StorageNodeType.STATEMENT_LOCAL;
+        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
@@ -486,16 +482,10 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
             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
@@ -503,6 +493,14 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
         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();
 
     /**