Allow derived context to be reused 29/94829/8
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 26 Jan 2021 22:45:01 +0000 (23:45 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 27 Jan 2021 18:26:51 +0000 (19:26 +0100)
Passing the previously-built instance is a boon, as we can skip
re-creation of schema/data tree namespaces and instread just share
the maps.

As a matter of establishing a baseline the following statements are
also converted:
- action
- case
- container
- nofitication
- input
- output

Other statements will be updated in follow-up patches.

JIRA: YANGTOOLS-1213
Change-Id: Ic969fdf32932716ad18761f4da47ec41c3d07f2c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
25 files changed:
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractUndeclaredEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseImplicitStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseOperationContainerStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/case_/CaseStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/case_/DeclaredCaseEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/case_/UndeclaredCaseEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/container/ContainerEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/container/ContainerStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ModelDefinedStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/input/DeclaredInputEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/input/InputStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/input/UndeclaredInputEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/notification/AbstractNotificationStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/notification/NotificationEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/output/DeclaredOutputEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/output/OutputStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/output/UndeclaredOutputEffectiveStatement.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ForwardingStatementSupport.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementFactory.java

index f99a46b03ff18a647cb8894cff64af332277db66..2ef267c091e0a9a1d41223cedda16fd997d22ef2 100644 (file)
@@ -224,7 +224,7 @@ final class InferredStatementContext<A, D extends DeclaredStatement<A>, E extend
 
         // First check if we can reuse the entire prototype
         if (!factory.canReuseCurrent(this, prototype, origSubstatements)) {
-            return tryToReuseSubstatements(factory, origSubstatements);
+            return tryToReuseSubstatements(factory, origEffective);
         }
 
         // No substatements to deal with, we can freely reuse the original
@@ -269,22 +269,21 @@ final class InferredStatementContext<A, D extends DeclaredStatement<A>, E extend
         return factory.createEffective(this, declared.stream(), effective.stream());
     }
 
-    private @NonNull E tryToReuseSubstatements(final StatementFactory<A, D, E> factory,
-            final @NonNull Collection<? extends EffectiveStatement<?, ?>> origSubstatements) {
+    private @NonNull E tryToReuseSubstatements(final StatementFactory<A, D, E> factory, final @NonNull E original) {
         if (allSubstatementsContextIndependent()) {
             LOG.debug("Reusing substatements of: {}", prototype);
             // FIXME: can we skip this if !haveRef()?
             substatements = reusePrototypeReplicas();
             prototype.decRef();
-            return factory.createEffective(this, origSubstatements);
+            return factory.copyEffective(this, original);
         }
 
         // Fall back to full instantiation, which populates our substatements. Then check if we should be reusing
         // the substatement list, as this operation turned out to not affect them.
         final E effective = super.createEffective(factory);
-        if (sameSubstatements(origSubstatements, effective)) {
+        if (sameSubstatements(original.effectiveSubstatements(), effective)) {
             LOG.debug("Reusing unchanged substatements of: {}", prototype);
-            return factory.createEffective(this, origSubstatements);
+            return factory.copyEffective(this, original);
         }
         return effective;
     }
index b081d983ab6a2692bd66bd8a0ce710ba0c835048..dcf3d843fdcf6c842b643f346e2aa08bf32052af 100644 (file)
@@ -125,6 +125,10 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
             this.declared = requireNonNull(declared);
         }
 
+        protected Default(final Default<A, D> original) {
+            this.declared = original.declared;
+        }
+
         @Override
         public final D getDeclared() {
             return declared;
@@ -193,6 +197,11 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
                 this.substatements = maskList(substatements);
             }
 
+            protected WithSubstatements(final WithSubstatements<A, D> original) {
+                super(original);
+                this.substatements = original.substatements;
+            }
+
             @Override
             public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
                 return unmaskList(substatements);
@@ -203,6 +212,10 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
             super(declared);
         }
 
+        protected DefaultArgument(final DefaultArgument<A, D> original) {
+            super(original);
+        }
+
         @Override
         public final A argument() {
             return getDeclared().argument();
@@ -265,6 +278,11 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
                 this.substatements = maskList(substatements);
             }
 
+            protected WithSubstatements(final WithSubstatements<A, D, E> original) {
+                super(original);
+                this.substatements = original.substatements;
+            }
+
             @Override
             public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
                 return unmaskList(substatements);
@@ -280,6 +298,11 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
             this.schemaTree = ImmutableMap.copyOf(createSchemaTreeNamespace(substatements));
         }
 
+        protected DefaultWithSchemaTree(final DefaultWithSchemaTree<A, D, E> original) {
+            this.declared = original.declared;
+            this.schemaTree = original.schemaTree;
+        }
+
         @Override
         public final D getDeclared() {
             return declared;
@@ -311,6 +334,11 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
                 this.substatements = maskList(substatements);
             }
 
+            protected WithSubstatements(final WithSubstatements<A, D, E> original) {
+                super(original);
+                this.substatements = original.substatements;
+            }
+
             @Override
             public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
                 return unmaskList(substatements);
@@ -329,6 +357,12 @@ public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredSt
             this.dataTree = createDataTreeNamespace(schema.values(), schemaTree);
         }
 
+        protected DefaultWithDataTree(final DefaultWithDataTree<A, D, E> original) {
+            this.declared = original.declared;
+            this.schemaTree = original.schemaTree;
+            this.dataTree = original.dataTree;
+        }
+
         @Override
         public final D getDeclared() {
             return declared;
index 842cbd2c4f215fc11a9729f388ba77c31435e393..3fc7a798aee8beb5f95c839d89af36ed2ecd8f25 100644 (file)
@@ -116,6 +116,11 @@ public abstract class AbstractUndeclaredEffectiveStatement<A, D extends Declared
                 this.substatements = maskList(substatements);
             }
 
+            protected WithSubstatements(final WithSubstatements<A, D, E> original) {
+                super(original);
+                this.substatements = original.substatements;
+            }
+
             @Override
             public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
                 return unmaskList(substatements);
@@ -128,6 +133,10 @@ public abstract class AbstractUndeclaredEffectiveStatement<A, D extends Declared
             this.schemaTree = ImmutableMap.copyOf(createSchemaTreeNamespace(substatements));
         }
 
+        protected DefaultWithSchemaTree(final DefaultWithSchemaTree<A, D, E> original) {
+            this.schemaTree = original.schemaTree;
+        }
+
         @Override
         protected final Map<QName, SchemaTreeEffectiveStatement<?>> schemaTreeNamespace() {
             return schemaTree;
@@ -153,6 +162,11 @@ public abstract class AbstractUndeclaredEffectiveStatement<A, D extends Declared
                 this.substatements = maskList(substatements);
             }
 
+            protected WithSubstatements(final WithSubstatements<A, D, E> original) {
+                super(original);
+                this.substatements = original.substatements;
+            }
+
             @Override
             public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
                 return unmaskList(substatements);
@@ -168,6 +182,11 @@ public abstract class AbstractUndeclaredEffectiveStatement<A, D extends Declared
             this.dataTree = createDataTreeNamespace(schema.values(), schemaTree);
         }
 
+        protected DefaultWithDataTree(final DefaultWithDataTree<A, D, E> original) {
+            this.schemaTree = original.schemaTree;
+            this.dataTree = original.dataTree;
+        }
+
         @Override
         protected final Map<QName, SchemaTreeEffectiveStatement<?>> schemaTreeNamespace() {
             return schemaTree;
index 34d9bce92365d34ff0c3b8d0a8e7945dd2cfb2bf..9410bd93bfb2a689808da405f81b62afd75090f0 100644 (file)
@@ -33,6 +33,19 @@ public abstract class BaseImplicitStatementSupport<D extends DeclaredStatement<Q
         super(publicDefinition, policy);
     }
 
+    @Override
+    public final E copyEffective(final Current<QName, D> stmt, final E original) {
+        final StatementSource source = stmt.source();
+        switch (source) {
+            case CONTEXT:
+                return copyUndeclaredEffective(stmt, original);
+            case DECLARATION:
+                return copyDeclaredEffective(stmt, original);
+            default:
+                throw new IllegalStateException("Unhandled statement source " + source);
+        }
+    }
+
     @Override
     protected E createEffective(final Current<QName, D> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
@@ -47,6 +60,10 @@ public abstract class BaseImplicitStatementSupport<D extends DeclaredStatement<Q
         }
     }
 
+    protected abstract @NonNull E copyDeclaredEffective(@NonNull Current<QName, D> stmt, @NonNull E original);
+
+    protected abstract @NonNull E copyUndeclaredEffective(@NonNull Current<QName, D> stmt, @NonNull E original);
+
     protected abstract @NonNull E createDeclaredEffective(@NonNull Current<QName, D> stmt,
             @NonNull ImmutableList<? extends EffectiveStatement<?, ?>> substatements);
 
index e5d0027189c49487da950376925d27b03e23ce5f..498d311c9b58c676fb9082317b1471b874096aac 100644 (file)
@@ -47,6 +47,26 @@ public abstract class BaseOperationContainerStatementSupport<D extends DeclaredS
         return createArgument.apply(StmtContextUtils.getRootModuleQName(ctx));
     }
 
+    @Override
+    protected final @NonNull E copyDeclaredEffective(final Current<QName, D> stmt, final E original) {
+        return copyDeclaredEffective(
+            EffectiveStatementMixins.historyAndStatusFlags(stmt.history(), original.effectiveSubstatements()),
+            stmt, original);
+    }
+
+    protected abstract @NonNull E copyDeclaredEffective(int flags, @NonNull Current<QName, D> stmt,
+        @NonNull E original);
+
+    @Override
+    protected final @NonNull E copyUndeclaredEffective(final Current<QName, D> stmt, final E original) {
+        return copyUndeclaredEffective(
+            EffectiveStatementMixins.historyAndStatusFlags(stmt.history(), original.effectiveSubstatements()),
+            stmt, original);
+    }
+
+    protected abstract @NonNull E copyUndeclaredEffective(int flags, @NonNull Current<QName, D> stmt,
+        @NonNull E original);
+
     @Override
     protected final @NonNull E createDeclaredEffective(final Current<QName, D> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
index 3eb78f0488bd4a1d2a9dba1b1488f9ae7b061c3c..9182b2bb8f634ee86d19386f9b5c88f656ea6db9 100644 (file)
@@ -11,7 +11,6 @@ import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
 import com.google.common.collect.Collections2;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
 import java.util.Optional;
@@ -576,7 +575,7 @@ public final class EffectiveStatementMixins {
     }
 
     public static int historyAndStatusFlags(final CopyHistory history,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
         return new FlagsBuilder()
                 .setHistory(history)
                 .setStatus(AbstractStatementSupport.findFirstArgument(substatements,
index 7dd27025869a1434b68424bfc1336f969732b74d..ddc44ad380773f0b4cf3062c259ea267ae405e81 100644 (file)
@@ -33,6 +33,12 @@ final class ActionEffectiveStatementImpl extends WithSubstatements<QName, Action
         this.flags = flags;
     }
 
+    ActionEffectiveStatementImpl(final ActionEffectiveStatementImpl original, final SchemaPath path, final int flags) {
+        super(original);
+        this.path = path;
+        this.flags = flags;
+    }
+
     @Override
     @Deprecated
     public SchemaPath getPath() {
index 9af9e29914c4cc61ecf506fa21f4a5bb34228e64..7a661f2fd40479e0d03e3b2241526aed6f3d29c1 100644 (file)
@@ -119,4 +119,11 @@ public final class ActionStatementSupport extends
             throw new SourceException(e.getMessage(), stmt, e);
         }
     }
+
+    @Override
+    public ActionEffectiveStatement copyEffective(final Current<QName, ActionStatement> stmt,
+            final ActionEffectiveStatement original) {
+        return new ActionEffectiveStatementImpl((ActionEffectiveStatementImpl) original, stmt.wrapSchemaPath(),
+            EffectiveStatementMixins.historyAndStatusFlags(stmt.history(), original.effectiveSubstatements()));
+    }
 }
index 3903e503eaa2e0f4221cec05e7a658ef5ffbe75c..ee2b0ae29377ae6556c9d93121ec26432dd2f8f1 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.util.Collection;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
@@ -117,6 +118,20 @@ public final class CaseStatementSupport
         }
     }
 
+    @Override
+    protected CaseEffectiveStatement copyDeclaredEffective(final Current<QName, CaseStatement> stmt,
+            final CaseEffectiveStatement original) {
+        return new DeclaredCaseEffectiveStatement((DeclaredCaseEffectiveStatement) original,
+            computeFlags(stmt, original.effectiveSubstatements()), stmt.wrapSchemaPath(), findOriginal(stmt));
+    }
+
+    @Override
+    protected CaseEffectiveStatement copyUndeclaredEffective(final Current<QName, CaseStatement> stmt,
+            final CaseEffectiveStatement original) {
+        return new UndeclaredCaseEffectiveStatement((UndeclaredCaseEffectiveStatement) original,
+            computeFlags(stmt, original.effectiveSubstatements()), stmt.wrapSchemaPath(), findOriginal(stmt));
+    }
+
     @Override
     protected CaseEffectiveStatement createDeclaredEffective(final Current<QName, CaseStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
@@ -144,7 +159,7 @@ public final class CaseStatementSupport
     }
 
     private static int computeFlags(final Current<?, ?> stmt,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
         final Boolean config;
         final EffectiveConfig effective = stmt.effectiveConfig();
         switch (effective) {
@@ -174,7 +189,7 @@ public final class CaseStatementSupport
 
     @SuppressFBWarnings(value = "NP_BOOLEAN_RETURN_NULL", justification = "Internal use tagged with @Nullable")
     private static @Nullable Boolean substatementEffectiveConfig(
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
         for (EffectiveStatement<?, ?> stmt : substatements) {
             if (stmt instanceof DataSchemaNode) {
                 final Optional<Boolean> opt = ((DataSchemaNode) stmt).effectiveConfig();
index 65e18af5d91484b4aa4364b7a6f107140b25b4e9..4976a38dae37c9a02e01fb4106d7ff1b2d776ac8 100644 (file)
@@ -35,6 +35,14 @@ final class DeclaredCaseEffectiveStatement extends WithSubstatements<QName, Case
         this.original = original;
     }
 
+    DeclaredCaseEffectiveStatement(final DeclaredCaseEffectiveStatement origEffective, final int flags,
+            final SchemaPath path, final @Nullable CaseSchemaNode original) {
+        super(origEffective);
+        this.flags = flags;
+        this.path = path;
+        this.original = original;
+    }
+
     @Override
     public int flags() {
         return flags;
index 9ec6ba1f5c7468a7802a3506a31b20bee0a33010..d9ab1a93f3d2bf397999cc47217fe355178733e0 100644 (file)
@@ -34,6 +34,14 @@ final class UndeclaredCaseEffectiveStatement extends WithSubstatements<QName, Ca
         this.original = original;
     }
 
+    UndeclaredCaseEffectiveStatement(final UndeclaredCaseEffectiveStatement origEffective, final int flags,
+            final SchemaPath path, final @Nullable CaseSchemaNode original) {
+        super(origEffective);
+        this.path = path;
+        this.flags = flags;
+        this.original = original;
+    }
+
     @Override
     public int flags() {
         return flags;
index 05226aad863bcf6fdaeab21b592e88c4355dcd11..b3b2aee641a291248d14eebdd028db4ca6821be4 100644 (file)
@@ -49,9 +49,17 @@ final class ContainerEffectiveStatementImpl
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final int flags,
             final SchemaPath path, final ContainerSchemaNode original) {
         super(declared, substatements);
+        this.original = original;
+        this.flags = flags;
         this.path = path;
+    }
+
+    ContainerEffectiveStatementImpl(final ContainerEffectiveStatementImpl origEffective,
+            final ContainerSchemaNode original, final int flags, final @Nullable SchemaPath path) {
+        super(origEffective);
         this.original = original;
         this.flags = flags;
+        this.path = path;
     }
 
     @Override
index 91a6cdbf5da150e4a91301495bff2227821cc7b9..99e4294d528f021d2b8d3f864914090088f333a7 100644 (file)
@@ -11,10 +11,10 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
+import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
@@ -114,23 +114,34 @@ public final class ContainerStatementSupport
     @Override
     protected ContainerEffectiveStatement createEffective(final Current<QName, ContainerStatement> stmt,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-        final int flags = new FlagsBuilder()
-                .setHistory(stmt.history())
-                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
-                .setConfiguration(stmt.effectiveConfig().asNullable())
-                .setPresence(findFirstStatement(substatements, PresenceEffectiveStatement.class) != null)
-                .toFlags();
-
         EffectiveStmtUtils.checkUniqueGroupings(stmt, substatements);
         EffectiveStmtUtils.checkUniqueTypedefs(stmt, substatements);
         EffectiveStmtUtils.checkUniqueUses(stmt, substatements);
 
-        final SchemaPath path = stmt.wrapSchemaPath();
         try {
-            return new ContainerEffectiveStatementImpl(stmt.declared(), substatements, flags, path,
-                (ContainerSchemaNode) stmt.original());
+            return new ContainerEffectiveStatementImpl(stmt.declared(), substatements, createFlags(stmt, substatements),
+                stmt.wrapSchemaPath(), (ContainerSchemaNode) stmt.original());
         } catch (SubstatementIndexingException e) {
             throw new SourceException(e.getMessage(), stmt, e);
         }
     }
+
+    @Override
+    public ContainerEffectiveStatement copyEffective(final Current<QName, ContainerStatement> stmt,
+            final ContainerEffectiveStatement original) {
+        return new ContainerEffectiveStatementImpl((ContainerEffectiveStatementImpl) original,
+            (ContainerSchemaNode) stmt.original(), createFlags(stmt, original.effectiveSubstatements()),
+            stmt.wrapSchemaPath());
+    }
+
+    private static int createFlags(final Current<?, ?> stmt,
+            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+            .setHistory(stmt.history())
+            .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+            .setConfiguration(stmt.effectiveConfig().asNullable())
+            .setPresence(findFirstStatement(substatements, PresenceEffectiveStatement.class) != null)
+            .toFlags();
+    }
 }
+
index 104f6a3f1d881b88643c2875adea722526c0abc6..8ac5148b0b22f1cc6865df35e6c3bb5e40c3d02f 100644 (file)
@@ -7,10 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension;
 
-import java.util.Collection;
 import java.util.Optional;
 import java.util.stream.Stream;
-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.stmt.UnrecognizedEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
@@ -47,9 +45,9 @@ final class ModelDefinedStatementSupport
     }
 
     @Override
-    public UnrecognizedEffectiveStatement createEffective(final Current<String, UnrecognizedStatement> stmt,
-            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
-        return definition.createEffective(stmt, substatements);
+    public UnrecognizedEffectiveStatement copyEffective(final Current<String, UnrecognizedStatement> stmt,
+            final UnrecognizedEffectiveStatement original) {
+        return definition.copyEffective(stmt, original);
     }
 
     @Override
index a50542a2083a1702b131fcf5e6ea4c608ac6c267..cd11bcb306218893bc57873038e151b39de3c7d8 100644 (file)
@@ -32,6 +32,13 @@ final class DeclaredInputEffectiveStatement extends WithSubstatements<QName, Inp
         this.path = path;
     }
 
+    DeclaredInputEffectiveStatement(final int flags, final DeclaredInputEffectiveStatement original,
+            final SchemaPath path) {
+        super(original);
+        this.flags = flags;
+        this.path = path;
+    }
+
     @Override
     @Deprecated
     public SchemaPath getPath() {
index 08864a13e5f1a84c1123b0e572d876ffb52e00fa..dff94f5a5557348fe9a9cfa0ff1bcd6617b6fb6b 100644 (file)
@@ -104,6 +104,20 @@ public final class InputStatementSupport
         }
     }
 
+    @Override
+    protected InputEffectiveStatement copyDeclaredEffective(final int flags,
+            final Current<QName, InputStatement> stmt, final InputEffectiveStatement original) {
+        return new DeclaredInputEffectiveStatement(flags, (DeclaredInputEffectiveStatement) original,
+            stmt.wrapSchemaPath());
+    }
+
+    @Override
+    protected InputEffectiveStatement copyUndeclaredEffective(final int flags,
+            final Current<QName, InputStatement> stmt, final InputEffectiveStatement original) {
+        return new UndeclaredInputEffectiveStatement(flags, (UndeclaredInputEffectiveStatement) original,
+            stmt.wrapSchemaPath());
+    }
+
     @Override
     protected InputEffectiveStatement createDeclaredEffective(final int flags,
             final Current<QName, InputStatement> stmt,
index 2d19ee60053c2c3373b615430acf841c024212df..85ecb79190e8636e55a527d062a64521f76deb5a 100644 (file)
@@ -33,6 +33,13 @@ final class UndeclaredInputEffectiveStatement
         this.flags = flags;
     }
 
+    UndeclaredInputEffectiveStatement(final int flags, final UndeclaredInputEffectiveStatement original,
+            final SchemaPath path) {
+        super(original);
+        this.path = path;
+        this.flags = flags;
+    }
+
     @Override
     @Deprecated
     public SchemaPath getPath() {
index dfe4a374c0612e23e2bfacb2029d6cfb50b92d1b..51ab5b62c26834860cf6fd0a0ea8e7ef59750cdf 100644 (file)
@@ -48,4 +48,12 @@ abstract class AbstractNotificationStatementSupport
             throw new SourceException(e.getMessage(), stmt, e);
         }
     }
+
+    @Override
+    public final NotificationEffectiveStatement copyEffective(final Current<QName, NotificationStatement> stmt,
+            final NotificationEffectiveStatement original) {
+        return new NotificationEffectiveStatementImpl((NotificationEffectiveStatementImpl) original,
+            EffectiveStatementMixins.historyAndStatusFlags(stmt.history(), original.effectiveSubstatements()),
+            stmt.wrapSchemaPath());
+    }
 }
\ No newline at end of file
index 3c93a076950bb9a61321e1be585c4b57cd8b7bd8..9e83524c9f451c617c2119b5e9fe5fe7ace6e173 100644 (file)
@@ -38,8 +38,15 @@ final class NotificationEffectiveStatementImpl
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final int flags,
             final SchemaPath path) {
         super(declared, substatements);
+        this.flags = flags;
         this.path = path;
+    }
+
+    NotificationEffectiveStatementImpl(final NotificationEffectiveStatementImpl original, final int flags,
+            final SchemaPath path) {
+        super(original);
         this.flags = flags;
+        this.path = path;
     }
 
     @Override
index 5a3bfb712898102464db94b2098bc24885e68a5f..285c4e1927a3884e58ec79f1a144569587ea4852 100644 (file)
@@ -32,6 +32,13 @@ final class DeclaredOutputEffectiveStatement extends WithSubstatements<QName, Ou
         this.path = path;
     }
 
+    DeclaredOutputEffectiveStatement(final int flags, final DeclaredOutputEffectiveStatement original,
+            final SchemaPath path) {
+        super(original);
+        this.flags = flags;
+        this.path = path;
+    }
+
     @Override
     @Deprecated
     public SchemaPath getPath() {
index 9ac6b4a7c6fd8b5446313f3303624f3a1b3b7490..07848beb732edb67fff8e823af569ca28603fc38 100644 (file)
@@ -104,6 +104,20 @@ public final class OutputStatementSupport
         }
     }
 
+    @Override
+    protected OutputEffectiveStatement copyDeclaredEffective(final int flags,
+            final Current<QName, OutputStatement> stmt, final OutputEffectiveStatement original) {
+        return new DeclaredOutputEffectiveStatement(flags, (DeclaredOutputEffectiveStatement) original,
+            stmt.wrapSchemaPath());
+    }
+
+    @Override
+    protected OutputEffectiveStatement copyUndeclaredEffective(final int flags,
+            final Current<QName, OutputStatement> stmt, final OutputEffectiveStatement original) {
+        return new UndeclaredOutputEffectiveStatement(flags, (UndeclaredOutputEffectiveStatement) original,
+            stmt.wrapSchemaPath());
+    }
+
     @Override
     protected OutputEffectiveStatement createDeclaredEffective(final int flags,
             final Current<QName, OutputStatement> stmt,
index 8c4f8e79a0d2eec8e6546eaf56fa3d9e265abb20..8e4443ada3aa6d9d66fbe5a1f55fa2049aa65258 100644 (file)
@@ -29,8 +29,15 @@ final class UndeclaredOutputEffectiveStatement
     UndeclaredOutputEffectiveStatement(final int flags,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final SchemaPath path) {
         super(substatements);
+        this.flags = flags;
         this.path = path;
+    }
+
+    UndeclaredOutputEffectiveStatement(final int flags, final UndeclaredOutputEffectiveStatement original,
+            final SchemaPath path) {
+        super(original);
         this.flags = flags;
+        this.path = path;
     }
 
     @Override
index ba8b61fed58a870f9295135352f84f35f1db7701..acc2f2880be740ce69b9463ec0e1db9f05a02d92 100644 (file)
@@ -61,16 +61,15 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
         return createEffective(stmt, substatements);
     }
 
-    @Override
-    public final E createEffective(final Current<A, D> stmt,
-            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
-        // This copy should be a no-op
-        return createEffective(stmt, ImmutableList.copyOf(substatements));
-    }
-
     protected abstract @NonNull E createEffective(@NonNull Current<A, D> stmt,
             @NonNull ImmutableList<? extends EffectiveStatement<?, ?>> substatements);
 
+    @Override
+    public E copyEffective(final Current<A, D> stmt, final E original) {
+        // Most implementations are only interested in substatements. copyOf() here should be a no-op
+        return createEffective(stmt, ImmutableList.copyOf(original.effectiveSubstatements()));
+    }
+
     /**
      * Give statement support a hook to transform statement contexts before they are built. Default implementation
      * does nothing, but note {@code augment} statement performs a real transformation.
@@ -86,7 +85,7 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
 
     // FIXME: add documentation
     public static final <E extends EffectiveStatement<?, ?>> @Nullable E findFirstStatement(
-            final ImmutableList<? extends EffectiveStatement<?, ?>> statements, final Class<E> type) {
+            final Collection<? extends EffectiveStatement<?, ?>> statements, final Class<E> type) {
         for (EffectiveStatement<?, ?> stmt : statements) {
             if (type.isInstance(stmt)) {
                 return type.cast(stmt);
@@ -97,7 +96,7 @@ public abstract class AbstractStatementSupport<A, D extends DeclaredStatement<A>
 
     // FIXME: add documentation
     public static final <A, E extends EffectiveStatement<A, ?>> A findFirstArgument(
-            final ImmutableList<? extends EffectiveStatement<?, ?>> statements, final Class<@NonNull E> type,
+            final Collection<? extends EffectiveStatement<?, ?>> statements, final Class<@NonNull E> type,
                     final A defValue) {
         final @Nullable E stmt = findFirstStatement(statements, type);
         return stmt != null ? stmt.argument() : defValue;
index 4dd0634ccaccb1e4cbd17f116ce37077da6999d3..5e8d619bbf083b8dccb07f5a705699cdbc3f6bb8 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.parser.spi.meta;
 
 import com.google.common.annotations.Beta;
-import java.util.Collection;
 import java.util.stream.Stream;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
@@ -48,9 +47,8 @@ public abstract class ForwardingStatementSupport<A, D extends DeclaredStatement<
     }
 
     @Override
-    public E createEffective(final Current<A, D> stmt,
-            final Collection<? extends EffectiveStatement<?, ?>> substatements) {
-        return delegate.createEffective(stmt, substatements);
+    public E copyEffective(final Current<A, D> stmt, final E original) {
+        return delegate.copyEffective(stmt, original);
     }
 
     @Override
index 239644a158742adfcdc43a6bf0c10fdf10067c67..279e9336965ab8d857723cbdae97557666efaacf 100644 (file)
@@ -37,20 +37,19 @@ public interface StatementFactory<A, D extends DeclaredStatement<A>, E extends E
      * @param stmt Effective capture of this statement's significant state
      * @return An effective statement instance
      */
-    @NonNull E createEffective(EffectiveStmtCtx.@NonNull Current<A, D> stmt,
+    @NonNull E createEffective(@NonNull Current<A, D> stmt,
         Stream<? extends StmtContext<?, ?, ?>> declaredSubstatements,
         Stream<? extends StmtContext<?, ?, ?>> effectiveSubstatements);
 
     /**
-     * Create a {@link EffectiveStatement} for specified context and substatements.
+     * Create a {@link EffectiveStatement} copy of provided original for specified context.
      *
      * @param stmt Effective capture of this statement's significant state
-     * @param substatements Current effective substatements
+     * @param original Original effective statement
      * @return An effective statement instance
      * @throws NullPointerException if any argument is null
      */
-    @NonNull E createEffective(EffectiveStmtCtx.@NonNull Current<A, D> stmt,
-        @NonNull Collection<? extends EffectiveStatement<?, ?>> substatements);
+    @NonNull E copyEffective(@NonNull Current<A, D> stmt, @NonNull E original);
 
     /**
      * Determine reactor copy behaviour of a statement instance. Implementations classes are required to determine