Move more StatementContextBase methods 06/94006/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 2 Dec 2020 12:57:45 +0000 (13:57 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 2 Dec 2020 13:13:30 +0000 (14:13 +0100)
ReactStmtCtx is overtaking the role of baseline implementation,
hence we move forwarder final methods there.

JIRA: YANGTOOLS-1184
Change-Id: I4ac8b13b29ddd5db7b7960ae6e271fcd223a09d2
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/NamespaceStorageSupport.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java

index 94c74f25d1fc8a5caeb4d55de8e1a3cf1f0eb179..45fae8c56db8e366f8d763b4b379f16aed5a251a 100644 (file)
@@ -14,6 +14,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
@@ -47,7 +48,7 @@ abstract class NamespaceStorageSupport implements NamespaceStorageNode {
      *
      * @return registry of source context
      */
-    public abstract Registry getBehaviourRegistry();
+    public abstract @NonNull Registry getBehaviourRegistry();
 
     protected void checkLocalNamespaceAllowed(final Class<? extends IdentifierNamespace<?, ?>> type) {
         // NOOP
index 19c221af9d8580966b532b74f77ad30a4468894a..421d9e806b28779931db8e405dc47712ae04d174 100644 (file)
@@ -9,12 +9,23 @@ package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
 import static com.google.common.base.Verify.verify;
 
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.VerifyException;
 import java.util.Collection;
+import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+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.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+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.Registry;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -84,9 +95,123 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
 
     private @Nullable E effectiveInstance;
 
+    //
+    //
+    // Common public interface contracts with simple mechanics. Please keep this in one logical block, so we do not end
+    // up mixing concerns and simple details with more complex logic.
+    //
+    //
+
     @Override
     public abstract StatementContextBase<?, ?, ?> getParentContext();
 
+    @Override
+    public abstract RootStatementContext<?, ?, ?> getRoot();
+
+    @Override
+    public abstract Collection<? extends StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements();
+
+    @Override
+    public final @NonNull Registry getBehaviourRegistry() {
+        return getRoot().getBehaviourRegistryImpl();
+    }
+
+    @Override
+    public final YangVersion getRootVersion() {
+        return getRoot().getRootVersionImpl();
+    }
+
+    @Override
+    public final void setRootVersion(final YangVersion version) {
+        getRoot().setRootVersionImpl(version);
+    }
+
+    @Override
+    public final void addMutableStmtToSeal(final MutableStatement mutableStatement) {
+        getRoot().addMutableStmtToSealImpl(mutableStatement);
+    }
+
+    @Override
+    public final void addRequiredSource(final SourceIdentifier dependency) {
+        getRoot().addRequiredSourceImpl(dependency);
+    }
+
+    @Override
+    public final void setRootIdentifier(final SourceIdentifier identifier) {
+        getRoot().setRootIdentifierImpl(identifier);
+    }
+
+    @Override
+    public final boolean isEnabledSemanticVersioning() {
+        return getRoot().isEnabledSemanticVersioningImpl();
+    }
+
+    @Override
+    public final ModelActionBuilder newInferenceAction(final ModelProcessingPhase phase) {
+        return getRoot().getSourceContext().newInferenceAction(phase);
+    }
+
+    @Override
+    public final StatementDefinition publicDefinition() {
+        return definition().getPublicView();
+    }
+
+    @Override
+    public final String toString() {
+        return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
+    }
+
+    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
+        return toStringHelper.add("definition", definition()).add("rawArgument", rawArgument());
+    }
+
+    /**
+     * Return the context in which this statement was defined.
+     *
+     * @return statement definition
+     */
+    abstract @NonNull StatementDefinitionContext<A, D, E> definition();
+
+    //
+    //
+    // NamespaceStorageSupport/Mutable integration methods. Keep these together.
+    //
+    //
+
+    @Override
+    public final <K, V, T extends K, N extends IdentifierNamespace<K, V>> V getFromNamespace(
+            final Class<@NonNull N> type, final T key) {
+        return getBehaviourRegistry().getNamespaceBehaviour(type).getFrom(this, key);
+    }
+
+    @Override
+    public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromNamespace(final Class<N> type) {
+        return getNamespace(type);
+    }
+
+    @Override
+    public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromCurrentStmtCtxNamespace(
+            final Class<N> type) {
+        return getLocalNamespace(type);
+    }
+
+    @Override
+    protected final void checkLocalNamespaceAllowed(final Class<? extends IdentifierNamespace<?, ?>> type) {
+        definition().checkNamespaceAllowed(type);
+    }
+
+    @Override
+    protected <K, V, N extends IdentifierNamespace<K, V>> void onNamespaceElementAdded(final Class<N> type, final K key,
+            final V value) {
+        // definition().onNamespaceElementAdded(this, type, key, value);
+    }
+
+    //
+    //
+    // Statement build entry points -- both public and package-private.
+    //
+    //
+
     @Override
     public final E buildEffective() {
         final E existing;
index 83c810df69ee1c37b6be1d7c3da645ba39d48205..319031d81214fa7c111bf67736e0e65d3f7c8750 100644 (file)
@@ -14,8 +14,6 @@ import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
@@ -28,7 +26,6 @@ import java.util.EnumMap;
 import java.util.EventListener;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
@@ -37,7 +34,6 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 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.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -49,18 +45,14 @@ 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.meta.CopyHistory;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
 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.Registry;
 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceKeyCriterion;
-import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceNotAvailableException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport.CopyPolicy;
@@ -263,100 +255,12 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
         this.completedPhase = completedPhase;
     }
 
-    /**
-     * Returns the model root for this statement.
-     *
-     * @return root context of statement
-     */
-    @Override
-    public abstract RootStatementContext<?, ?, ?> getRoot();
-
-    @Override
-    public final @NonNull Registry getBehaviourRegistry() {
-        return getRoot().getBehaviourRegistryImpl();
-    }
-
-    @Override
-    public final YangVersion getRootVersion() {
-        return getRoot().getRootVersionImpl();
-    }
-
-    @Override
-    public final void setRootVersion(final YangVersion version) {
-        getRoot().setRootVersionImpl(version);
-    }
-
-    @Override
-    public final void addMutableStmtToSeal(final MutableStatement mutableStatement) {
-        getRoot().addMutableStmtToSealImpl(mutableStatement);
-    }
-
-    @Override
-    public final void addRequiredSource(final SourceIdentifier dependency) {
-        getRoot().addRequiredSourceImpl(dependency);
-    }
-
-    @Override
-    public final void setRootIdentifier(final SourceIdentifier identifier) {
-        getRoot().setRootIdentifierImpl(identifier);
-    }
-
-    @Override
-    public final boolean isEnabledSemanticVersioning() {
-        return getRoot().isEnabledSemanticVersioningImpl();
-    }
-
-    @Override
-    public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromCurrentStmtCtxNamespace(
-            final Class<N> type) {
-        return getLocalNamespace(type);
-    }
-
-    @Override
-    public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromNamespace(final Class<N> type) {
-        return getNamespace(type);
-    }
-
-    /**
-     * Associate a value with a key within a namespace.
-     *
-     * @param type Namespace type
-     * @param key Key
-     * @param value value
-     * @param <K> namespace key type
-     * @param <V> namespace value type
-     * @param <N> namespace type
-     * @param <T> key type
-     * @param <U> value type
-     * @throws NamespaceNotAvailableException when the namespace is not available.
-     */
     @Override
     public final <K, V, T extends K, U extends V, N extends IdentifierNamespace<K, V>> void addToNs(
             final Class<@NonNull N> type, final T key, final U value) {
         addToNamespace(type, key, value);
     }
 
-    @Override
-    public abstract Collection<? extends StatementContextBase<?, ?, ?>> mutableDeclaredSubstatements();
-
-    /**
-     * Return a value associated with specified key within a namespace.
-     *
-     * @param type Namespace type
-     * @param key Key
-     * @param <K> namespace key type
-     * @param <V> namespace value type
-     * @param <N> namespace type
-     * @param <T> key type
-     * @return Value, or null if there is no element
-     * @throws NamespaceNotAvailableException when the namespace is not available.
-     */
-    @Override
-    public final <K, V, T extends K, N extends IdentifierNamespace<K, V>> V getFromNamespace(
-            final Class<@NonNull N> type, final T key) {
-        return getBehaviourRegistry().getNamespaceBehaviour(type).getFrom(this, key);
-    }
-
     static final Collection<? extends Mutable<?, ?, ?>> mutableEffectiveSubstatements(
             final List<StatementContextBase<?, ?, ?>> effective) {
         return effective instanceof ImmutableCollection ? effective : Collections.unmodifiableCollection(effective);
@@ -658,24 +562,9 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
         definition.onDeclarationFinished(this, phase);
     }
 
-    /**
-     * Return the context in which this statement was defined.
-     *
-     * @return statement definition
-     */
-    protected final @NonNull StatementDefinitionContext<A, D, E> definition() {
-        return definition;
-    }
-
-    @Override
-    protected void checkLocalNamespaceAllowed(final Class<? extends IdentifierNamespace<?, ?>> type) {
-        definition.checkNamespaceAllowed(type);
-    }
-
     @Override
-    protected <K, V, N extends IdentifierNamespace<K, V>> void onNamespaceElementAdded(final Class<N> type, final K key,
-            final V value) {
-        // definition().onNamespaceElementAdded(this, type, key, value);
+    final StatementDefinitionContext<A, D, E> definition() {
+        return definition;
     }
 
     final <K, V, N extends IdentifierNamespace<K, V>> void onNamespaceItemAddedAction(final Class<N> type, final K key,
@@ -749,16 +638,6 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
         return (NamespaceBehaviourWithListeners<K, V, N>) behaviour;
     }
 
-    @Override
-    public final StatementDefinition publicDefinition() {
-        return definition.getPublicView();
-    }
-
-    @Override
-    public final ModelActionBuilder newInferenceAction(final ModelProcessingPhase phase) {
-        return getRoot().getSourceContext().newInferenceAction(phase);
-    }
-
     private static <T> Multimap<ModelProcessingPhase, T> newMultimap() {
         return Multimaps.newListMultimap(new EnumMap<>(ModelProcessingPhase.class), () -> new ArrayList<>(1));
     }
@@ -1087,13 +966,4 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
         // FIXME: this does not look right
         return maybeParentPath.orElse(null);
     }
-
-    @Override
-    public final String toString() {
-        return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
-    }
-
-    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
-        return toStringHelper.add("definition", definition).add("rawArgument", rawArgument());
-    }
 }
index 26b13ad0279c1faa58c8a73af8abd63474a464cb..24abd97787d1b5717716484ee2fd7e7d0163afa1 100644 (file)
@@ -139,6 +139,11 @@ public interface StmtContext<A, D extends DeclaredStatement<A>, E extends Effect
 
     <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAllFromCurrentStmtCtxNamespace(Class<N> type);
 
+    /**
+     * Returns the model root for this statement.
+     *
+     * @return root context of statement
+     */
     @NonNull RootStmtContext<?, ?, ?> getRoot();
 
     /**