Use statementContextBase when creating effecive 02/94002/6
authormiroslav.kovac <miroslav.kovac@pantheon.tech>
Wed, 2 Dec 2020 10:21:42 +0000 (11:21 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 3 Dec 2020 01:36:48 +0000 (02:36 +0100)
StatementContextBase is now implementing EffectiveStmtCtx.Current
and hence it can be used in createEffective. This saves us an object
allocation during buildEffective() time.

JIRA: YANGTOOLS-1185
Change-Id: Iffc02f7aa222070d750dbb9628894a891fb17a0c
Signed-off-by: miroslav.kovac <miroslav.kovac@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BaseCurrentEffectiveStmtCtx.java [deleted file]
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.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/ReplicaStatementContext.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java

diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BaseCurrentEffectiveStmtCtx.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/BaseCurrentEffectiveStmtCtx.java
deleted file mode 100644 (file)
index bdbbe0d..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.parser.stmt.reactor;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.Map;
-import java.util.Optional;
-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.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.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CommonStmtCtx;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
-import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
-
-// FIXME: YANGTOOLS-1185: integrate this into StatementContextBase
-final class BaseCurrentEffectiveStmtCtx<A, D extends DeclaredStatement<A>> implements EffectiveStmtCtx.Current<A, D> {
-    static final Object NULL_OBJ = new Object();
-
-    private final @NonNull StatementContextBase<A, D, ?> delegate;
-
-    private @Nullable Object parent;
-
-    BaseCurrentEffectiveStmtCtx(final StatementContextBase<A, D, ?> delegate) {
-        this.delegate = requireNonNull(delegate);
-        this.parent = null;
-    }
-
-    BaseCurrentEffectiveStmtCtx(final StatementContextBase<A, D, ?> delegate, final Parent parent) {
-        this.delegate = requireNonNull(delegate);
-        this.parent = requireNonNull(parent);
-    }
-
-    @Override
-    public StatementSource source() {
-        return delegate.source();
-    }
-
-    @Override
-    public StatementSourceReference sourceReference() {
-        return delegate.sourceReference();
-    }
-
-    @Override
-    public CommonStmtCtx root() {
-        return delegate.getRoot();
-    }
-
-    @Override
-    public CopyHistory history() {
-        return delegate.history();
-    }
-
-    @Override
-    public D declared() {
-        return delegate.declared();
-    }
-
-    @Override
-    public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> localNamespace(final Class<@NonNull N> nsType) {
-        return delegate.localNamespace(nsType);
-    }
-
-    @Override
-    public <K, V, N extends IdentifierNamespace<K, V>> @Nullable Map<K, V> namespace(final Class<@NonNull N> nsType) {
-        return delegate.namespace(nsType);
-    }
-
-    @Override
-    public <K, V, T extends K, N extends IdentifierNamespace<K, V>> V namespaceItem(final Class<@NonNull N> type,
-            final T key) {
-        return delegate.namespaceItem(type, key);
-    }
-
-    @Override
-    public boolean effectiveConfig() {
-        return delegate.isConfiguration();
-    }
-
-    @Override
-    @Deprecated
-    public Optional<SchemaPath> schemaPath() {
-        return delegate.schemaPath();
-    }
-
-    @Override
-    public StatementDefinition publicDefinition() {
-        return delegate.publicDefinition();
-    }
-
-    @Override
-    public Parent effectiveParent() {
-        final Object local = parent;
-        if (local instanceof Parent) {
-            return (Parent) local;
-        } else if (NULL_OBJ.equals(local)) {
-            return null;
-        } else {
-            return loadParent();
-        }
-    }
-
-    // FIXME: YANGTOOLS-1185: this should be rendered unnecessary
-    private Parent loadParent() {
-        final StatementContextBase<?, ?, ?> parentDelegate = delegate.getParentContext();
-        if (parentDelegate == null) {
-            parent = NULL_OBJ;
-            return null;
-        }
-
-        final Parent ret = new BaseCurrentEffectiveStmtCtx<>(parentDelegate);
-        parent = ret;
-        return ret;
-    }
-
-    @Override
-    public A argument() {
-        return delegate.argument();
-    }
-
-    @Override
-    public String rawArgument() {
-        return delegate.rawArgument();
-    }
-
-    @Override
-    public EffectiveStatement<?, ?> original() {
-        return delegate.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
-    }
-
-    @Override
-    public YangVersion yangVersion() {
-        return delegate.yangVersion();
-    }
-
-    @Override
-    @Deprecated
-    @SuppressWarnings("unchecked")
-    public <Z extends EffectiveStatement<A, D>> StmtContext<A, D, Z> caerbannog() {
-        return (StmtContext<A, D, Z>) delegate;
-    }
-}
\ No newline at end of file
index 14efedcb21d43373a336eee294c085367c2f580c..9de44e07c898fc6b783ff9c7d5c863857d33f120 100644 (file)
@@ -422,7 +422,7 @@ final class InferredStatementContext<A, D extends DeclaredStatement<A>, E extend
      */
     @Override
     @Deprecated
-    Optional<SchemaPath> schemaPath() {
+    public Optional<SchemaPath> schemaPath() {
         return substatementGetSchemaPath();
     }
 
@@ -452,7 +452,7 @@ final class InferredStatementContext<A, D extends DeclaredStatement<A>, E extend
     }
 
     @Override
-    public boolean isConfiguration() {
+    public boolean effectiveConfig() {
         return isConfiguration(parent);
     }
 
index 2abf8315b1416d61747bb220199ed63506cad827..e4b0dd37a25d214a6f1f7a37e5906dfdb5c5272f 100644 (file)
@@ -32,6 +32,8 @@ 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.CommonStmtCtx;
+import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 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;
@@ -53,7 +55,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> {
+        extends NamespaceStorageSupport implements Mutable<A, D, E>, Current<A, D> {
     private static final Logger LOG = LoggerFactory.getLogger(ReactorStmtCtx.class);
 
     /**
@@ -217,6 +219,28 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
         return definition().getPublicView();
     }
 
+    @Override
+    public final Parent effectiveParent() {
+        return getParentContext();
+    }
+
+    @Override
+    public final CommonStmtCtx root() {
+        return getRoot();
+    }
+
+    @Override
+    public final EffectiveStatement<?, ?> original() {
+        return getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
+    }
+
+    @Override
+    @Deprecated
+    @SuppressWarnings("unchecked")
+    public final <Z extends EffectiveStatement<A, D>> StmtContext<A, D, Z> caerbannog() {
+        return (StmtContext<A, D, Z>) this;
+    }
+
     @Override
     public final String toString() {
         return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
@@ -373,12 +397,12 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
             isConfig = optConfig.orElseThrow();
             if (isConfig) {
                 // Validity check: if parent is config=false this cannot be a config=true
-                InferenceException.throwIf(!parent.isConfiguration(), sourceReference(),
+                InferenceException.throwIf(!parent.effectiveConfig(), sourceReference(),
                         "Parent node has config=false, this node must not be specifed as config=true");
             }
         } else {
             // If "config" statement is not specified, the default is the same as the parent's "config" value.
-            isConfig = parent.isConfiguration();
+            isConfig = parent.effectiveConfig();
         }
 
         // Resolved, make sure we cache this return
@@ -448,8 +472,6 @@ abstract class ReactorStmtCtx<A, D extends DeclaredStatement<A>, E extends Effec
     //
     //
 
-    abstract @NonNull Optional<SchemaPath> schemaPath();
-
     // Exists only to support {SubstatementContext,InferredStatementContext}.schemaPath()
     @Deprecated
     final @NonNull Optional<SchemaPath> substatementGetSchemaPath() {
index c6ae880d95c9fcbd5c1801d36795a54191f2d57c..071b73b37ae87469b9afa029bc716df3177f79f1 100644 (file)
@@ -48,8 +48,8 @@ final class ReplicaStatementContext<A, D extends DeclaredStatement<A>, E extends
     }
 
     @Override
-    public boolean isConfiguration() {
-        return source.isConfiguration();
+    public boolean effectiveConfig() {
+        return source.effectiveConfig();
     }
 
     @Override
@@ -154,7 +154,7 @@ final class ReplicaStatementContext<A, D extends DeclaredStatement<A>, E extends
      */
     @Override
     @Deprecated
-    Optional<SchemaPath> schemaPath() {
+    public Optional<SchemaPath> schemaPath() {
         return substatementGetSchemaPath();
     }
 
index a5333688f27a2f5fcbba6ebdba496f0e7c2042fb..abd74e1ce3bda435419056ddee133418d49734e5 100644 (file)
@@ -120,12 +120,12 @@ public final class RootStatementContext<A, D extends DeclaredStatement<A>, E ext
 
     @Override
     @Deprecated
-    Optional<SchemaPath> schemaPath() {
+    public Optional<SchemaPath> schemaPath() {
         return Optional.of(SchemaPath.ROOT);
     }
 
     @Override
-    public boolean isConfiguration() {
+    public boolean effectiveConfig() {
         return true;
     }
 
index f742cee5ca13702be2d5bef465e313ff86f43bcd..46697255a863e15ac2faa37f435c253ea7ed971e 100644 (file)
@@ -351,8 +351,7 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
     // Exposed for ReplicaStatementContext
     @Override
     E createEffective() {
-        return definition.getFactory().createEffective(new BaseCurrentEffectiveStmtCtx<>(this), streamDeclared(),
-            streamEffective());
+        return definition.getFactory().createEffective(this, streamDeclared(), streamEffective());
     }
 
     abstract Stream<? extends StmtContext<?, ?, ?>> streamDeclared();
index d84283efcaf03ba7f4039052398119b9632e2d2a..d7015a52cf9b8f659e646e7f62b7ddb0f7960c36 100644 (file)
@@ -58,7 +58,7 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
      */
     @Override
     @Deprecated
-    Optional<SchemaPath> schemaPath() {
+    public Optional<SchemaPath> schemaPath() {
         return substatementGetSchemaPath();
     }
 
@@ -88,7 +88,7 @@ final class SubstatementContext<A, D extends DeclaredStatement<A>, E extends Eff
     }
 
     @Override
-    public boolean isConfiguration() {
+    public boolean effectiveConfig() {
         return isConfiguration(parent);
     }
 
index 706a3aa4974f0d744d03759d272d09af4395e7f0..1f090b3c0f26040cea7e6a2bf4e0f2cdf9c9bc36 100644 (file)
@@ -115,8 +115,6 @@ public interface StmtContext<A, D extends DeclaredStatement<A>, E extends Effect
         return verifyNotNull(getParentContext(), "Root context %s does not have a parent", this);
     }
 
-    boolean isConfiguration();
-
     boolean isEnabledSemanticVersioning();
 
     /**