Decouple choice/case statements 59/98759/2
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 30 Nov 2021 21:52:39 +0000 (22:52 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 30 Nov 2021 21:59:21 +0000 (22:59 +0100)
Use StatementSupportNamespace to perform on-demand lookup of
CaseStatementSupport instead of hard-wiring it at instantiation time.

JIRA: YANGTOOLS-1371
Change-Id: Id6d2b8185918c206659447b58341edfb4860f349
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java
parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/meta/ChoiceStatementSupport.java
parser/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ImplicitParentAwareStatementSupport.java

index c73b58559290cdb4c568f60014e7014f5d8ebf7d..89df4c0852eca9126ef55db136316b94a9b28398 100644 (file)
@@ -172,11 +172,10 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         checkState(inProgressPhase != ModelProcessingPhase.EFFECTIVE_MODEL,
                 "Declared statement cannot be added in effective phase at: %s", sourceReference());
 
-        final Optional<StatementSupport<?, ?, ?>> implicitParent =
-                definition().getImplicitParentFor(def.getPublicView());
+        final var implicitParent = definition().getImplicitParentFor(this, def.getPublicView());
         if (implicitParent.isPresent()) {
-            return createImplicitParent(offset, implicitParent.get(), ref, argument).createSubstatement(offset, def,
-                    ref, argument);
+            return createImplicitParent(offset, implicitParent.orElseThrow(), ref, argument)
+                .createSubstatement(offset, def, ref, argument);
         }
 
         final AbstractResumedStatement<X, Y, Z> ret = new SubstatementContext<>(this, def, ref, argument);
index c797dacaf5a1d3ac5464d0baff0f9e329bfdc375..3e9405d829b1c314889efa61c860269c3b0c9c13 100644 (file)
@@ -819,8 +819,7 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
 
     private <X, Y extends DeclaredStatement<X>, Z extends EffectiveStatement<X, Y>> Mutable<X, Y, Z> childCopyOf(
             final StatementContextBase<X, Y, Z> original, final CopyType type, final QNameModule targetModule) {
-        final Optional<StatementSupport<?, ?, ?>> implicitParent = definition.getImplicitParentFor(
-            original.publicDefinition());
+        final var implicitParent = definition.getImplicitParentFor(this, original.publicDefinition());
 
         final StatementContextBase<X, Y, Z> result;
         final InferredStatementContext<X, Y, Z> copy;
@@ -873,13 +872,12 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
 
     @Beta
     public final StatementContextBase<?, ?, ?> wrapWithImplicit(final StatementContextBase<?, ?, ?> original) {
-        final Optional<StatementSupport<?, ?, ?>> optImplicit = definition.getImplicitParentFor(
-            original.publicDefinition());
+        final var optImplicit = definition.getImplicitParentFor(this, original.publicDefinition());
         if (optImplicit.isEmpty()) {
             return original;
         }
 
-        final StatementDefinitionContext<?, ?, ?> def = new StatementDefinitionContext<>(optImplicit.get());
+        final StatementDefinitionContext<?, ?, ?> def = new StatementDefinitionContext<>(optImplicit.orElseThrow());
         final CopyType type = original.history().getLastOperation();
         final SubstatementContext<?, ?, ?> result = new SubstatementContext(original.getParentContext(), def,
             original.sourceReference(), original.rawArgument(), original.argument(), type);
index 8e50390ce880467300f13c9dee064f22a1b6f092..5eaa0ac8097ca751b1bad4aadc4a249bff95f114 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceStmtCtx;
 import org.opendaylight.yangtools.yang.parser.spi.meta.OverrideChildStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementFactory;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
@@ -55,9 +56,11 @@ final class StatementDefinitionContext<A, D extends DeclaredStatement<A>, E exte
         return support.getPublicView();
     }
 
-    Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final StatementDefinition stmtDef) {
+    Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final NamespaceStmtCtx parent,
+            final StatementDefinition stmtDef) {
         return support instanceof ImplicitParentAwareStatementSupport
-                ? ((ImplicitParentAwareStatementSupport) support).getImplicitParentFor(stmtDef) : Optional.empty();
+                ? ((ImplicitParentAwareStatementSupport) support).getImplicitParentFor(parent, stmtDef)
+                    : Optional.empty();
     }
 
     void onStatementAdded(final Mutable<A, D, E> stmt) {
index 1d13c6b6690a23885b75724b280fec87289be450..b4f5cb3fbad05074d83cb2dd28523794d25c4f4a 100644 (file)
@@ -375,19 +375,16 @@ public final class RFC7950Reactors {
 
     private static @NonNull StatementSupportBundle fullDeclarationBundle(final StatementSupportBundle stmtDefBundle,
             final XPathSupport xpathSupport, final YangParserConfiguration config) {
-        final CaseStatementSupport rfc6020case = CaseStatementSupport.rfc6020Instance(config);
-        final CaseStatementSupport rfc7950case = CaseStatementSupport.rfc7950Instance(config);
-
         return StatementSupportBundle.derivedFrom(stmtDefBundle)
             .addSupport(new LeafStatementSupport(config))
             .addSupport(new ConfigStatementSupport(config))
             .addSupport(new DeviationStatementSupport(config))
             .addVersionSpecificSupport(VERSION_1, new DeviateStatementRFC6020Support(config))
             .addVersionSpecificSupport(VERSION_1_1, new DeviateStatementRFC7950Support(config))
-            .addVersionSpecificSupport(VERSION_1, ChoiceStatementSupport.rfc6020Instance(config, rfc6020case))
-            .addVersionSpecificSupport(VERSION_1_1, ChoiceStatementSupport.rfc7950Instance(config, rfc7950case))
-            .addVersionSpecificSupport(VERSION_1, rfc6020case)
-            .addVersionSpecificSupport(VERSION_1_1, rfc7950case)
+            .addVersionSpecificSupport(VERSION_1, ChoiceStatementSupport.rfc6020Instance(config))
+            .addVersionSpecificSupport(VERSION_1_1, ChoiceStatementSupport.rfc7950Instance(config))
+            .addVersionSpecificSupport(VERSION_1, CaseStatementSupport.rfc6020Instance(config))
+            .addVersionSpecificSupport(VERSION_1_1, CaseStatementSupport.rfc7950Instance(config))
             .addSupport(new MustStatementSupport(xpathSupport, config))
             .addSupport(new MandatoryStatementSupport(config))
             .addSupport(new AnyxmlStatementSupport(config))
index 04c04b79372ed3bff8a37f31eec6691d6feaecb0..0905efcb047849ed4e736f8f9e77a28fbf6e3f16 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta;
 
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
@@ -39,7 +40,9 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractSchemaTreeStateme
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ImplicitParentAwareStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
+import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceStmtCtx;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
@@ -83,28 +86,26 @@ public final class ChoiceStatementSupport
             .addOptional(YangStmtMapping.WHEN)
             .build();
 
-    private final CaseStatementSupport implicitCase;
-
-    private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator,
-            final CaseStatementSupport implicitCase) {
+    private ChoiceStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator) {
         super(YangStmtMapping.CHOICE, instantiatedPolicy(), config, requireNonNull(validator));
-        this.implicitCase = requireNonNull(implicitCase);
     }
 
-    public static @NonNull ChoiceStatementSupport rfc6020Instance(final YangParserConfiguration config,
-            final CaseStatementSupport implicitCase) {
-        return new ChoiceStatementSupport(config, RFC6020_VALIDATOR, implicitCase);
+    public static @NonNull ChoiceStatementSupport rfc6020Instance(final YangParserConfiguration config) {
+        return new ChoiceStatementSupport(config, RFC6020_VALIDATOR);
     }
 
-    public static @NonNull ChoiceStatementSupport rfc7950Instance(final YangParserConfiguration config,
-            final CaseStatementSupport implicitCase) {
-        return new ChoiceStatementSupport(config, RFC7950_VALIDATOR, implicitCase);
+    public static @NonNull ChoiceStatementSupport rfc7950Instance(final YangParserConfiguration config) {
+        return new ChoiceStatementSupport(config, RFC7950_VALIDATOR);
     }
 
     @Override
-    public Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final StatementDefinition stmtDef) {
-        return YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(stmtDef) ? Optional.of(implicitCase)
-            : Optional.empty();
+    public Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(final NamespaceStmtCtx parent,
+            final StatementDefinition stmtDef) {
+        if (!YangValidationBundles.SUPPORTED_CASE_SHORTHANDS.contains(stmtDef)) {
+            return Optional.empty();
+        }
+        return Optional.of(verifyNotNull(parent.getFromNamespace(StatementSupportNamespace.class,
+            YangStmtMapping.CASE.getStatementName())));
     }
 
     @Override
index 73e0952cfa4954daf0a504b73802ee4c877c690b..b6f5b3341d61399bd0fcd6cd6c903de85326ea04 100644 (file)
@@ -15,8 +15,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
  * {@link StatementSupport} trait for statements which create intermediate parent node for some of its child nodes.
  * An example of this is RFC6020/RFC7950 choice statement, which creates implicit case statements for child containers
  * and others.
- *
- * @author Robert Varga
  */
 @Beta
 public interface ImplicitParentAwareStatementSupport {
@@ -25,9 +23,9 @@ public interface ImplicitParentAwareStatementSupport {
      * implementations of this interface add implicit parent to the build context hierarchy before a substatement
      * is created.
      *
+     * @param parent parent statement context
      * @param stmtDef statement definition of substatement
      * @return optional of implicit parent statement support
      */
-    // FIXME: YANGTOOLS-1371: pass a NamespaceStmtCtx here, so choice/case can be decoupled
-    Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(StatementDefinition stmtDef);
+    Optional<StatementSupport<?, ?, ?>> getImplicitParentFor(NamespaceStmtCtx parent, StatementDefinition stmtDef);
 }