From 7c9b9c8e6056728e77f486f266cbccfece9d72eb Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 9 Jun 2017 01:38:56 +0200 Subject: [PATCH] BUG-6972: inline copy operation modifications Copy operations is really internal to StatementContextBase hence all the work of setting state can be done in the constructor. This allows us to make some of the state final. While it does not help the footprint issue, it is a stepping-stone to defining a proper set of copy operations. Change-Id: I0586ecb0757a3126b9e4ed3dbd0ea6c5a2547544 Signed-off-by: Robert Varga (cherry picked from commit e807a055a1f878b4e0fd74d5763caaa7ab16a8c7) --- .../yang/parser/spi/meta/CopyHistory.java | 10 ++++++-- .../stmt/reactor/StatementContextBase.java | 23 ++++++++++--------- .../stmt/reactor/SubstatementContext.java | 12 ++-------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/CopyHistory.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/CopyHistory.java index eb1e26765b..10eb0fa252 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/CopyHistory.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/CopyHistory.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.spi.meta; import com.google.common.annotations.Beta; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Verify; import org.opendaylight.yangtools.concepts.Immutable; @@ -42,6 +43,10 @@ public final class CopyHistory implements Immutable { return ORIGINAL; } + public static CopyHistory of(final CopyType copyType, final CopyHistory copyHistory) { + return ORIGINAL.append(copyType, copyHistory); + } + private static CopyHistory[] cacheArray(final CopyType lastOperation) { final int ordinal = lastOperation.ordinal(); CopyHistory[] ret = CACHE[ordinal]; @@ -82,7 +87,8 @@ public final class CopyHistory implements Immutable { return VALUES[lastOperation]; } - public CopyHistory append(final CopyType typeOfCopy, final CopyHistory toAppend) { + @VisibleForTesting + CopyHistory append(final CopyType typeOfCopy, final CopyHistory toAppend) { final int newOperations = operations | toAppend.operations | typeOfCopy.bit(); if (newOperations == operations && typeOfCopy.ordinal() == lastOperation) { return this; @@ -93,7 +99,7 @@ public final class CopyHistory implements Immutable { @Override public int hashCode() { - return Integer.hashCode(operations | (lastOperation << Short.SIZE)); + return Integer.hashCode(operations | lastOperation << Short.SIZE); } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java index 86236bb099..d394e2715e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java @@ -81,6 +81,8 @@ public abstract class StatementContextBase, E private final StatementDefinitionContext definition; private final StatementSourceReference statementDeclSource; + private final StmtContext originalCtx; + private final CopyHistory copyHistory; private final String rawArgument; private Multimap phaseListeners = ImmutableMultimap.of(); @@ -90,10 +92,8 @@ public abstract class StatementContextBase, E private StatementMap substatements = StatementMap.empty(); private Boolean supportedByFeatures = null; - private CopyHistory copyHistory = CopyHistory.original(); private boolean isSupportedToBuildEffective = true; private ModelProcessingPhase completedPhase = null; - private StmtContext originalCtx; private D declaredInstance; private E effectiveInstance; private int order = 0; @@ -103,15 +103,24 @@ public abstract class StatementContextBase, E this.definition = Preconditions.checkNotNull(def); this.statementDeclSource = Preconditions.checkNotNull(ref); this.rawArgument = def.internArgument(rawArgument); + this.copyHistory = CopyHistory.original(); + this.originalCtx = null; } - StatementContextBase(final StatementContextBase original) { + StatementContextBase(final StatementContextBase original, final CopyType copyType) { this.definition = Preconditions.checkNotNull(original.definition, "Statement context definition cannot be null copying from: %s", original.getStatementSourceReference()); this.statementDeclSource = Preconditions.checkNotNull(original.statementDeclSource, "Statement context statementDeclSource cannot be null copying from: %s", original.getStatementSourceReference()); this.rawArgument = original.rawArgument; + this.copyHistory = CopyHistory.of(copyType, original.getCopyHistory()); + + if (original.getOriginalCtx() != null) { + this.originalCtx = original.getOriginalCtx(); + } else { + this.originalCtx = original; + } } @Override @@ -167,19 +176,11 @@ public abstract class StatementContextBase, E return copyHistory; } - final void appendCopyHistory(final CopyType typeOfCopy, final CopyHistory toAppend) { - copyHistory = copyHistory.append(typeOfCopy, toAppend); - } - @Override public StmtContext getOriginalCtx() { return originalCtx; } - final void setOriginalCtx(final StmtContext originalCtx) { - this.originalCtx = originalCtx; - } - @Override public void setOrder(final int order) { this.order = order; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java index 59c3a650d3..08c53f156e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java @@ -80,8 +80,8 @@ final class SubstatementContext, E extends Eff @SuppressWarnings("unchecked") private SubstatementContext(final SubstatementContext original, final QNameModule newQNameModule, - final StatementContextBase newParent, final CopyType typeOfCopy) { - super(original); + final StatementContextBase newParent, final CopyType copyType) { + super(original, copyType); this.parent = Preconditions.checkNotNull(newParent); if (newQNameModule != null) { @@ -146,14 +146,6 @@ final class SubstatementContext, E extends Eff final SubstatementContext copy = new SubstatementContext<>(this, newQNameModule, newParent, typeOfCopy); - copy.appendCopyHistory(typeOfCopy, this.getCopyHistory()); - - if (this.getOriginalCtx() != null) { - copy.setOriginalCtx(this.getOriginalCtx()); - } else { - copy.setOriginalCtx(this); - } - definition().onStatementAdded(copy); copy.copyStatements(this, newQNameModule, typeOfCopy); -- 2.36.6