From: Robert Varga Date: Wed, 3 Feb 2021 18:41:15 +0000 (+0100) Subject: Clarify StatementFactory.createEffective() X-Git-Tag: v7.0.0~218 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=485db12bb79d299e44957dc66d96f23e1239c857;p=yangtools.git Clarify StatementFactory.createEffective() There is a wide-scale confusion about declared/effective and what it means where. Document StatementFactory to use different terminology. This flushes out the need to document StatementContextBase.stream{Declared,Effective}, which is updated with the logical requirement to support buildEffective(). JIRA: YANGTOOLS-1150 Change-Id: I2d455fd9c328f97995d88e37b903145b2e45f793 Signed-off-by: Robert Varga --- diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java index b470a569a8..025198a35e 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java @@ -204,12 +204,12 @@ abstract class AbstractResumedStatement, E ext @Override final Stream> streamDeclared() { - return declaredSubstatements().stream(); + return declaredSubstatements().stream().filter(StmtContext::isSupportedToBuildEffective); } @Override final Stream> streamEffective() { - return effective.stream(); + return effective.stream().filter(StmtContext::isSupportedToBuildEffective); } @Override diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java index e3ffc8003c..b05c0f636d 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java @@ -235,7 +235,6 @@ final class InferredStatementContext, E extend // We can reuse this statement let's see if all the statements agree final List declCopy = prototype.streamDeclared() - .filter(StmtContext::isSupportedByFeatures) .map(sub -> effectiveCopy((ReactorStmtCtx) sub)) .filter(Objects::nonNull) .collect(Collectors.toUnmodifiableList()); @@ -288,8 +287,7 @@ final class InferredStatementContext, E extend private List> reusePrototypeReplicas() { return reusePrototypeReplicas(Streams.concat( - prototype.streamDeclared().filter(StmtContext::isSupportedByFeatures), - prototype.streamEffective())); + prototype.streamDeclared(), prototype.streamEffective())); } private List> reusePrototypeReplicas(final Stream> stream) { @@ -460,7 +458,7 @@ final class InferredStatementContext, E extend @Override Stream> streamEffective() { accessSubstatements(); - return ensureEffectiveSubstatements().stream(); + return ensureEffectiveSubstatements().stream().filter(StmtContext::isSupportedToBuildEffective); } private void accessSubstatements() { diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java index d26a8e9adf..fc83c28ed3 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java @@ -358,9 +358,23 @@ public abstract class StatementContextBase, E return factory.createEffective(ctx, ctx.streamDeclared(), ctx.streamEffective()); } - abstract Stream> streamDeclared(); + /** + * Return a stream of declared statements which can be built into an {@link EffectiveStatement}, as per + * {@link StmtContext#buildEffective()} contract. + * + * @return Stream of supported declared statements. + */ + // FIXME: we really want to unify this with streamEffective(), under its name + abstract Stream> streamDeclared(); - abstract Stream> streamEffective(); + /** + * Return a stream of inferred statements which can be built into an {@link EffectiveStatement}, as per + * {@link StmtContext#buildEffective()} contract. + * + * @return Stream of supported effective statements. + */ + // FIXME: this method is currently a misnomer, but unifying with streamDeclared() would make this accurate again + abstract Stream> streamEffective(); @Override final boolean doTryToCompletePhase(final ModelProcessingPhase phase) { diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java index 6e4c432779..66c995bf30 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java @@ -99,7 +99,7 @@ public final class ExtensionStatementSupport @Override public ExtensionEffectiveStatement createEffective(final Current stmt, final Stream> declaredSubstatements, - final Stream> effectiveSubstatements) { + final Stream> inferredSubstatements) { Map, ExtensionEffectiveStatementImpl> tl = TL_BUILDERS.get(); if (tl == null) { tl = new IdentityHashMap<>(); @@ -117,7 +117,7 @@ public final class ExtensionStatementSupport stmt.optionalPath()); verify(tl.put(stmt, created) == null); try { - return super.createEffective(stmt, declaredSubstatements, effectiveSubstatements); + return super.createEffective(stmt, declaredSubstatements, inferredSubstatements); } finally { verify(tl.remove(stmt) == created); } diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java index acc2f2880b..694a91860e 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractStatementSupport.java @@ -54,10 +54,10 @@ public abstract class AbstractStatementSupport @Override public E createEffective(final Current stmt, final Stream> declaredSubstatements, - final Stream> effectiveSubstatements) { + final Stream> inferredSubstatements) { final ImmutableList> substatements = buildEffectiveSubstatements(stmt, statementsToBuild(stmt, - declaredSubstatements(declaredSubstatements, effectiveSubstatements))); + declaredSubstatements(declaredSubstatements, inferredSubstatements))); return createEffective(stmt, substatements); } @@ -112,15 +112,7 @@ public abstract class AbstractStatementSupport */ protected @NonNull ImmutableList> buildEffectiveSubstatements( final Current stmt, final List> substatements) { - return defaultBuildEffectiveSubstatements(substatements); - } - - private static @NonNull ImmutableList> defaultBuildEffectiveSubstatements( - final List> substatements) { - return substatements.stream() - .filter(StmtContext::isSupportedToBuildEffective) - .map(StmtContext::buildEffective) - .collect(ImmutableList.toImmutableList()); + return substatements.stream().map(StmtContext::buildEffective).collect(ImmutableList.toImmutableList()); } private static @NonNull List> declaredSubstatements( diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ForwardingStatementSupport.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ForwardingStatementSupport.java index 5e8d619bbf..61f30ed0c8 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ForwardingStatementSupport.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ForwardingStatementSupport.java @@ -42,8 +42,8 @@ public abstract class ForwardingStatementSupport stmt, final Stream> declaredSubstatements, - final Stream> effectiveSubstatements) { - return delegate.createEffective(stmt, declaredSubstatements, effectiveSubstatements); + final Stream> inferredSubstatements) { + return delegate.createEffective(stmt, declaredSubstatements, inferredSubstatements); } @Override diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementFactory.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementFactory.java index 279e933696..777227f45c 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementFactory.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementFactory.java @@ -35,11 +35,14 @@ public interface StatementFactory, E extends E * Create a {@link EffectiveStatement} for specified context. * * @param stmt Effective capture of this statement's significant state + * @param declaredSubstatements effectively-visible declared substatements + * @param inferredSubstatements effectively-visible inferred substatements * @return An effective statement instance */ + // FIXME: we really want a single coherent 'effectiveSubstatements' stream @NonNull E createEffective(@NonNull Current stmt, Stream> declaredSubstatements, - Stream> effectiveSubstatements); + Stream> inferredSubstatements); /** * Create a {@link EffectiveStatement} copy of provided original for specified context.