From bd36a9a4be114b70b4a8a82a1a5d4b1373513063 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 7 Jun 2017 23:31:40 +0200 Subject: [PATCH] BUG-7052: reduce StatementContextBase proliferation In some places we require StatementContextBase where only a simple StmtContext or Mutable is enough. Fix those places up and move mutator methods into Mutable. This frees up parser.spi from reactor imports and lowers rfc6020's reliance on reactor internals. A nice side-effect is that we do not leak the mutable aspect of StatementContextBase from StmtContext references. One violation of this contract is caching of 'supportedByFeatures', which is now costing an instanceof check. Since that is an optimization this is a fair thing. Change-Id: I6b4991264ef8c3322260f0962d41eeaa79b1b427 Signed-off-by: Robert Varga --- .../parser/spi/SubstatementValidator.java | 3 +- .../yang/parser/spi/meta/StmtContext.java | 63 +++++++++---------- .../parser/spi/meta/StmtContextUtils.java | 34 ++-------- .../stmt/reactor/RootStatementContext.java | 5 +- .../stmt/reactor/StatementContextBase.java | 39 +++++++----- .../stmt/reactor/SubstatementContext.java | 6 +- .../stmt/rfc6020/AnyxmlStatementImpl.java | 3 +- .../stmt/rfc6020/AugmentStatementImpl.java | 4 +- .../stmt/rfc6020/UsesStatementImpl.java | 9 ++- .../effective/CaseEffectiveStatementImpl.java | 14 ++--- .../effective/EffectiveStatementBase.java | 17 +++-- .../ExtensionEffectiveStatementImpl.java | 5 +- 12 files changed, 86 insertions(+), 116 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java index 43b1e9a426..7412af03f6 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java @@ -20,7 +20,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.InvalidSubstatementExcept import org.opendaylight.yangtools.yang.parser.spi.meta.MissingSubstatementException; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName; -import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; public final class SubstatementValidator { /** @@ -120,7 +119,7 @@ public final class SubstatementValidator { MissingSubstatementException { final Map stmtCounts = new HashMap<>(); - for (StatementContextBase stmtCtx : Iterables.concat(ctx.declaredSubstatements(), ctx.effectiveSubstatements())) { + for (StmtContext stmtCtx : Iterables.concat(ctx.declaredSubstatements(), ctx.effectiveSubstatements())) { stmtCounts.computeIfAbsent(stmtCtx.getPublicDefinition(), key -> new Counter()).increment(); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java index 52bd1aa1c9..b26b1d6349 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java @@ -21,7 +21,6 @@ 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.source.SourceException; import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; @@ -90,7 +89,7 @@ public interface StmtContext, E extends Effect * @return Collection of declared substatements */ @Nonnull - Collection> declaredSubstatements(); + Collection> declaredSubstatements(); /** * Return effective substatements. These are the statements which are added as this statement's substatements @@ -99,7 +98,7 @@ public interface StmtContext, E extends Effect * @return Collection of declared substatements */ @Nonnull - Collection> effectiveSubstatements(); + Collection> effectiveSubstatements(); /** * Builds {@link DeclaredStatement} for statement context. @@ -113,44 +112,23 @@ public interface StmtContext, E extends Effect boolean isSupportedToBuildEffective(); - void setIsSupportedToBuildEffective(boolean isSupportedToBuild); + Collection> getEffectOfStatement(); - Collection> getEffectOfStatement(); + StatementContextBase createCopy(StatementContextBase newParent, CopyType typeOfCopy); - void addAsEffectOfStatement(StatementContextBase ctx); - - void addAsEffectOfStatement(Collection> ctxs); - - StatementContextBase createCopy( - StatementContextBase newParent, CopyType typeOfCopy) - throws SourceException; - - StatementContextBase createCopy(QNameModule newQNameModule, - StatementContextBase newParent, CopyType typeOfCopy) - throws SourceException; + StatementContextBase createCopy(QNameModule newQNameModule, StatementContextBase newParent, + CopyType typeOfCopy); CopyHistory getCopyHistory(); - enum SupportedByFeatures { - UNDEFINED, SUPPORTED, NOT_SUPPORTED - } - - SupportedByFeatures getSupportedByFeatures(); - - void appendCopyHistory(CopyType typeOfCopy, CopyHistory toAppend); + boolean isSupportedByFeatures(); - StatementContextBase getOriginalCtx(); - - void setOriginalCtx(StatementContextBase originalCtx); + StmtContext getOriginalCtx(); boolean isRootContext(); - void setOrder(int order); - int getOrder(); - void setCompletedPhase(ModelProcessingPhase completedPhase); - ModelProcessingPhase getCompletedPhase(); /** @@ -174,6 +152,14 @@ public interface StmtContext, E extends Effect @Override StmtContext.Mutable getRoot(); + @Override + @Nonnull + Collection> declaredSubstatements(); + + @Override + @Nonnull + Collection> effectiveSubstatements(); + /** * Create a new inference action to be executed during specified phase. The action cannot be cancelled * and will be executed even if its definition remains incomplete. @@ -197,8 +183,6 @@ public interface StmtContext, E extends Effect > void addContext( Class namespace, KT key, StmtContext stmt); - void setSupportedByFeatures(boolean isSupported); - /** * Set version of root statement context. * @@ -226,6 +210,10 @@ public interface StmtContext, E extends Effect */ void addRequiredModule(ModuleIdentifier dependency); + void addAsEffectOfStatement(StmtContext ctx); + + void addAsEffectOfStatement(Collection> ctxs); + /** * Set identifier of current root context. * @@ -233,5 +221,16 @@ public interface StmtContext, E extends Effect * of current root context */ void setRootIdentifier(ModuleIdentifier identifier); + + void setIsSupportedToBuildEffective(boolean isSupportedToBuild); + + void appendCopyHistory(CopyType typeOfCopy, CopyHistory toAppend); + + void setOriginalCtx(StmtContext originalCtx); + + void setOrder(int order); + + // FIXME: this seems to be unused, but looks useful. + void setCompletedPhase(ModelProcessingPhase completedPhase); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java index ad3b07d84e..2877fc374f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java @@ -29,12 +29,14 @@ import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace; -import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace.SupportedFeatures; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.UnknownStatementImpl; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangDataStatementImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class StmtContextUtils { + private static final Logger LOG = LoggerFactory.getLogger(StmtContextUtils.class); + public static final Splitter LIST_KEY_SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults(); private StmtContextUtils() { @@ -241,33 +243,7 @@ public final class StmtContextUtils { return replaced ? builder.build() : keyStmtCtx.getStatementArgument(); } - public static boolean areFeaturesSupported(final StmtContext.Mutable stmtContext) { - switch (stmtContext.getSupportedByFeatures()) { - case SUPPORTED: - return true; - case NOT_SUPPORTED: - return false; - default: - break; - } - - final Set supportedFeatures = stmtContext.getFromNamespace(SupportedFeaturesNamespace.class, - SupportedFeatures.SUPPORTED_FEATURES); - /* - * If set of supported features has not been provided, all features are - * supported by default. - */ - if (supportedFeatures == null) { - stmtContext.setSupportedByFeatures(true); - return true; - } - - final boolean result = checkFeatureSupport(stmtContext, supportedFeatures); - stmtContext.setSupportedByFeatures(result); - return result; - } - - private static boolean checkFeatureSupport(final StmtContext.Mutable stmtContext, + public static boolean checkFeatureSupport(final StmtContext stmtContext, final Set supportedFeatures) { boolean isSupported = false; boolean containsIfFeature = false; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java index 0ecbd93df1..a86e7ecb2c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/RootStatementContext.java @@ -32,7 +32,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Namesp import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.IncludedModuleContext; import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; @@ -84,7 +83,7 @@ public class RootStatementContext, E extends E final Collection> buffer = new ArrayList<>(declared.size() + effective.size()); for (final StatementContextBase stmtContext : declared) { - if (StmtContextUtils.areFeaturesSupported(stmtContext)) { + if (stmtContext.isSupportedByFeatures()) { buffer.add(stmtContext.createCopy(newQNameModule, this, typeOfCopy)); } } @@ -144,7 +143,7 @@ public class RootStatementContext, E extends E * @throws org.opendaylight.yangtools.yang.parser.spi.source.SourceException instance of SourceException */ @Override - public StatementContextBase createCopy(final StatementContextBase newParent, + public StatementContextBase createCopy(final StatementContextBase newParent, final CopyType typeOfCopy) { return createCopy(null, newParent, typeOfCopy); } 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 6edf920343..eaf8aeb909 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 @@ -22,7 +22,9 @@ import java.util.EnumMap; import java.util.EventListener; import java.util.Iterator; import java.util.Optional; +import java.util.Set; import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.common.QName; 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; @@ -36,15 +38,17 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour; 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.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; +import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace; +import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace.SupportedFeatures; import org.opendaylight.yangtools.yang.parser.stmt.reactor.NamespaceBehaviourWithListeners.ValueAddedListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class StatementContextBase, E extends EffectiveStatement> extends NamespaceStorageSupport implements StmtContext.Mutable { - /** * event listener when an item is added to model namespace. */ @@ -82,14 +86,14 @@ public abstract class StatementContextBase, E private Multimap phaseListeners = ImmutableMultimap.of(); private Multimap phaseMutation = ImmutableMultimap.of(); private Collection> effective = ImmutableList.of(); - private Collection> effectOfStatement = ImmutableList.of(); + private Collection> effectOfStatement = ImmutableList.of(); private StatementMap substatements = StatementMap.empty(); - private SupportedByFeatures supportedByFeatures = SupportedByFeatures.UNDEFINED; + private Boolean supportedByFeatures = null; private CopyHistory copyHistory = CopyHistory.original(); private boolean isSupportedToBuildEffective = true; private ModelProcessingPhase completedPhase = null; - private StatementContextBase originalCtx; + private StmtContext originalCtx; private D declaredInstance; private E effectiveInstance; private int order = 0; @@ -111,12 +115,12 @@ public abstract class StatementContextBase, E } @Override - public Collection> getEffectOfStatement() { + public Collection> getEffectOfStatement() { return effectOfStatement; } @Override - public void addAsEffectOfStatement(final StatementContextBase ctx) { + public void addAsEffectOfStatement(final StmtContext ctx) { if (effectOfStatement.isEmpty()) { effectOfStatement = new ArrayList<>(1); } @@ -124,7 +128,7 @@ public abstract class StatementContextBase, E } @Override - public void addAsEffectOfStatement(final Collection> ctxs) { + public void addAsEffectOfStatement(final Collection> ctxs) { if (ctxs.isEmpty()) { return; } @@ -136,13 +140,16 @@ public abstract class StatementContextBase, E } @Override - public SupportedByFeatures getSupportedByFeatures() { - return supportedByFeatures; - } + public boolean isSupportedByFeatures() { + if (supportedByFeatures == null) { + final Set supportedFeatures = getFromNamespace(SupportedFeaturesNamespace.class, + SupportedFeatures.SUPPORTED_FEATURES); + // If the set of supported features has not been provided, all features are supported by default. + supportedByFeatures = supportedFeatures == null ? Boolean.TRUE + : StmtContextUtils.checkFeatureSupport(this, supportedFeatures); + } - @Override - public void setSupportedByFeatures(final boolean isSupported) { - this.supportedByFeatures = isSupported ? SupportedByFeatures.SUPPORTED : SupportedByFeatures.NOT_SUPPORTED; + return supportedByFeatures.booleanValue(); } @Override @@ -166,12 +173,12 @@ public abstract class StatementContextBase, E } @Override - public StatementContextBase getOriginalCtx() { + public StmtContext getOriginalCtx() { return originalCtx; } @Override - public void setOriginalCtx(final StatementContextBase originalCtx) { + public void setOriginalCtx(final StmtContext originalCtx) { this.originalCtx = originalCtx; } @@ -244,7 +251,7 @@ public abstract class StatementContextBase, E return Collections.unmodifiableCollection(effective); } - public void removeStatementsFromEffectiveSubstatements(final Collection> substatements) { + public void removeStatementsFromEffectiveSubstatements(final Collection> substatements) { if (!effective.isEmpty()) { effective.removeAll(substatements); shrinkEffective(); 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 b1adcde96e..3380a1e216 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 @@ -134,7 +134,7 @@ final class SubstatementContext, E extends Eff } @Override - public StatementContextBase createCopy(final StatementContextBase newParent, + public StatementContextBase createCopy(final StatementContextBase newParent, final CopyType typeOfCopy) { return createCopy(null, newParent, typeOfCopy); } @@ -168,7 +168,7 @@ final class SubstatementContext, E extends Eff final Collection> buffer = new ArrayList<>(declared.size() + effective.size()); for (final StatementContextBase stmtContext : declared) { - if (StmtContextUtils.areFeaturesSupported(stmtContext)) { + if (stmtContext.isSupportedByFeatures()) { copySubstatement(stmtContext, newQNameModule, typeOfCopy, buffer); } } @@ -255,7 +255,7 @@ final class SubstatementContext, E extends Eff } if (argument instanceof String) { // FIXME: This may yield illegal argument exceptions - final StatementContextBase originalCtx = getOriginalCtx(); + final StmtContext originalCtx = getOriginalCtx(); final QName qname = originalCtx != null ? Utils.qNameFromArgument(originalCtx, (String) argument) : Utils .qNameFromArgument(this, (String) argument); return parentPath.createChild(qname); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java index b057490b38..6a9d016de6 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java @@ -33,7 +33,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.source.AnyxmlSchemaLocationNamespace; -import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.AnyXmlEffectiveStatementImpl; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.YangModeledAnyXmlEffectiveStatementImpl; @@ -96,7 +95,7 @@ public class AnyxmlStatementImpl extends AbstractDeclaredStatement implem private static Optional getAnyXmlSchema( final StmtContext> ctx, final SchemaNodeIdentifier contentSchemaPath) { - final StatementContextBase findNode = Utils.findNode(ctx.getRoot(), contentSchemaPath); + final StmtContext findNode = Utils.findNode(ctx.getRoot(), contentSchemaPath); if (findNode != null) { final EffectiveStatement anyXmlSchemaNode = findNode.buildEffective(); if (anyXmlSchemaNode instanceof ContainerSchemaNode) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java index 0aaaaee548..7822c05c4c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java @@ -106,7 +106,7 @@ public class AugmentStatementImpl extends AbstractDeclaredStatement> augmentNode) { - if (!StmtContextUtils.areFeaturesSupported(augmentNode)) { + if (!augmentNode.isSupportedByFeatures()) { return; } @@ -216,7 +216,7 @@ public class AugmentStatementImpl extends AbstractDeclaredStatement> buffer = new ArrayList<>(declared.size() + effective.size()); for (final StatementContextBase originalStmtCtx : declared) { - if (StmtContextUtils.areFeaturesSupported(originalStmtCtx)) { + if (originalStmtCtx.isSupportedByFeatures()) { copyStatement(originalStmtCtx, targetCtx, typeOfCopy, buffer, skipCheckOfMandatoryNodes); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java index 6682a3ab54..283e72d97f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java @@ -84,7 +84,7 @@ public class UsesStatementImpl extends AbstractDeclaredStatement implemen @Override public void onFullDefinitionDeclared( final StmtContext.Mutable> usesNode) { - if (!StmtContextUtils.areFeaturesSupported(usesNode)) { + if (!usesNode.isSupportedByFeatures()) { return; } super.onFullDefinitionDeclared(usesNode); @@ -199,7 +199,7 @@ public class UsesStatementImpl extends AbstractDeclaredStatement implemen * @throws SourceException * instance of SourceException */ - private static void copyFromSourceToTarget(final StmtContext sourceGrpStmtCtx, + private static void copyFromSourceToTarget(final Mutable sourceGrpStmtCtx, final StatementContextBase targetCtx, final StmtContext.Mutable> usesNode) { final Collection> declared = sourceGrpStmtCtx.declaredSubstatements(); @@ -208,7 +208,7 @@ public class UsesStatementImpl extends AbstractDeclaredStatement implemen final QNameModule newQNameModule = getNewQNameModule(targetCtx, sourceGrpStmtCtx); for (final StatementContextBase original : declared) { - if (StmtContextUtils.areFeaturesSupported(original)) { + if (original.isSupportedByFeatures()) { copyStatement(original, targetCtx, newQNameModule, buffer); } } @@ -279,8 +279,7 @@ public class UsesStatementImpl extends AbstractDeclaredStatement implemen /* * In case of Yang 1.1, checks whether features are supported. */ - return !YangVersion.VERSION_1_1.equals(subStmtCtx.getRootVersion()) || StmtContextUtils - .areFeaturesSupported(subStmtCtx); + return !YangVersion.VERSION_1_1.equals(subStmtCtx.getRootVersion()) || subStmtCtx.isSupportedByFeatures(); } private static void performRefine(final StatementContextBase refineCtx, diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseEffectiveStatementImpl.java index 02caa69577..a5c8b3bf5d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/CaseEffectiveStatementImpl.java @@ -16,7 +16,6 @@ import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; public final class CaseEffectiveStatementImpl extends AbstractEffectiveSimpleDataNodeContainer implements ChoiceCaseNode, DerivableSchemaNode { @@ -30,20 +29,15 @@ public final class CaseEffectiveStatementImpl extends AbstractEffectiveSimpleDat this.original = ctx.getOriginalCtx() == null ? null : (ChoiceCaseNode) ctx.getOriginalCtx().buildEffective(); if (ctx.isConfiguration()) { - configuration = isAtLeastOneChildConfiguration(ctx.declaredSubstatements()) || - isAtLeastOneChildConfiguration(ctx.effectiveSubstatements()); + configuration = isAtLeastOneChildConfiguration(ctx.declaredSubstatements()) + || isAtLeastOneChildConfiguration(ctx.effectiveSubstatements()); } else { configuration = false; } } - private static boolean isAtLeastOneChildConfiguration(final Collection> substatements) { - for (StatementContextBase substatement : substatements) { - if (substatement.isConfiguration()) { - return true; - } - } - return false; + private static boolean isAtLeastOneChildConfiguration(final Collection> children) { + return children.stream().anyMatch(StmtContext::isConfiguration); } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java index 7307011f70..c83b347d36 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveStatementBase.java @@ -17,13 +17,12 @@ import java.util.Collection; import java.util.List; import java.util.Map; import javax.annotation.Nonnull; -import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; 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.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; public abstract class EffectiveStatementBase> implements EffectiveStatement { @@ -36,12 +35,12 @@ public abstract class EffectiveStatementBase> * context of statement. */ protected EffectiveStatementBase(final StmtContext ctx) { - final Collection> effectiveSubstatements = ctx.effectiveSubstatements(); - final Collection> substatementsInit = new ArrayList<>(); + final Collection> effectiveSubstatements = ctx.effectiveSubstatements(); + final Collection> substatementsInit = new ArrayList<>(); - final Collection> supportedDeclaredSubStmts = Collections2.filter( - ctx.declaredSubstatements(), StmtContextUtils::areFeaturesSupported); - for (final StatementContextBase declaredSubstatement : supportedDeclaredSubStmts) { + final Collection> supportedDeclaredSubStmts = Collections2.filter( + ctx.declaredSubstatements(), StmtContext::isSupportedByFeatures); + for (final StmtContext declaredSubstatement : supportedDeclaredSubStmts) { if (declaredSubstatement.getPublicDefinition().equals(YangStmtMapping.USES)) { substatementsInit.add(declaredSubstatement); substatementsInit.addAll(declaredSubstatement.getEffectOfStatement()); @@ -64,9 +63,9 @@ public abstract class EffectiveStatementBase> * @return Filtered substatements */ Collection> initSubstatements( - final Collection> substatementsInit) { + final Collection> substatementsInit) { return Collections2.transform(Collections2.filter(substatementsInit, - StmtContext::isSupportedToBuildEffective), StatementContextBase::buildEffective); + StmtContext::isSupportedToBuildEffective), StmtContext::buildEffective); } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java index 96689c9007..7b1ee58c60 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java @@ -22,7 +22,6 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.RecursiveObjectLeaker; public class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumentedNode @@ -112,7 +111,7 @@ public class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumented final ExtensionEffectiveStatementImpl existing = RecursiveObjectLeaker.lookup(ctx, ExtensionEffectiveStatementImpl.class); if (existing != null) { - // Careful! this not fully initialized! + // Careful! this object is not fully initialized! return existing; } @@ -127,7 +126,7 @@ public class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumented @Override Collection> initSubstatements( - final Collection> substatementsInit) { + final Collection> substatementsInit) { // WARNING: this leaks an incompletely-initialized object RecursiveObjectLeaker.inConstructor(this); -- 2.36.6