Update DataTreeAwareEffectiveStatements 33/95133/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 11 Feb 2021 16:54:07 +0000 (17:54 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 11 Feb 2021 19:11:55 +0000 (20:11 +0100)
Choice/Case/Grouping should all support walks across data tree
namespace. Update their definition and their implementations.

This allows SchemaInferenceStack users more flexibility, as they
now can use a better mix of enter statements to suit their needs.

JIRA: YANGTOOLS-1234
Change-Id: I9162b183fa3b43af19646b9d507994c161a97c20
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/CaseEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ChoiceEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/GroupingEffectiveStatement.java
yang/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractEffectiveStatement.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/choice/ChoiceEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingEffectiveStatementImpl.java

index 0fd818834b1f52376d2ae391ece2d1c2d0f2f9d1..fe8a98fed353b7d101162531a72d4de919c78943 100644 (file)
@@ -14,7 +14,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface CaseEffectiveStatement extends SchemaTreeEffectiveStatement<CaseStatement>,
-        SchemaTreeAwareEffectiveStatement<QName, CaseStatement> {
+        DataTreeAwareEffectiveStatement<QName, CaseStatement> {
     @Override
     default StatementDefinition statementDefinition() {
         return YangStmtMapping.CASE;
index 3bb503d37b53f2d8639e120fa353c627cc12aacc..56dcb14e788e18685abae7d91f9d0831e466cc9b 100644 (file)
@@ -14,7 +14,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface ChoiceEffectiveStatement extends SchemaTreeEffectiveStatement<ChoiceStatement>,
-        SchemaTreeAwareEffectiveStatement<QName, ChoiceStatement> {
+        DataTreeAwareEffectiveStatement<QName, ChoiceStatement> {
     @Override
     default StatementDefinition statementDefinition() {
         return YangStmtMapping.CHOICE;
index 2a2e3d609823165999f554622cb32f6ef667c3f6..a2f58b3bc12225d7e3986bec4a4fe3f455216f58 100644 (file)
@@ -13,7 +13,7 @@ import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
-public interface GroupingEffectiveStatement extends SchemaTreeAwareEffectiveStatement<QName, GroupingStatement> {
+public interface GroupingEffectiveStatement extends DataTreeAwareEffectiveStatement<QName, GroupingStatement> {
     @Override
     default StatementDefinition statementDefinition() {
         return YangStmtMapping.GROUPING;
index 7c37cdd64046df44ea89b035d1ecb9cd4a3d136d..9f3f3412673b61420368c1afe4a96e2752dce74b 100644 (file)
@@ -99,12 +99,7 @@ abstract class AbstractEffectiveStatement<A, D extends DeclaredStatement<A>>
         boolean sameAsSchema = true;
 
         for (SchemaTreeEffectiveStatement<?> child : schemaTreeStatements) {
-            if (child instanceof DataTreeEffectiveStatement) {
-                putChild(dataChildren, (DataTreeEffectiveStatement<?>) child, "data");
-            } else {
-                sameAsSchema = false;
-                putChoiceDataChildren(dataChildren, child);
-            }
+            sameAsSchema = indexDataTree(dataChildren, child);
         }
 
         // This is a mighty hack to lower memory usage: if we consumed all schema tree children as data nodes,
@@ -112,6 +107,32 @@ abstract class AbstractEffectiveStatement<A, D extends DeclaredStatement<A>>
         return sameAsSchema ? (ImmutableMap) schemaTreeNamespace : ImmutableMap.copyOf(dataChildren);
     }
 
+    private static boolean indexDataTree(final Map<QName, DataTreeEffectiveStatement<?>> map,
+            final EffectiveStatement<?, ?> stmt) {
+        if (stmt instanceof DataTreeEffectiveStatement) {
+            putChild(map, (DataTreeEffectiveStatement<?>) stmt, "data");
+            return true;
+        } else if (stmt instanceof ChoiceEffectiveStatement) {
+            // For choice statements go through all their cases and fetch their data children
+            for (EffectiveStatement<?, ?> choiceChild : stmt.effectiveSubstatements()) {
+                if (choiceChild instanceof CaseEffectiveStatement) {
+                    for (EffectiveStatement<?, ?> caseChild : choiceChild.effectiveSubstatements()) {
+                        indexDataTree(map, caseChild);
+                    }
+                }
+            }
+            return false;
+        } else if (stmt instanceof CaseEffectiveStatement) {
+            // For case statements go through all their statements
+            for (EffectiveStatement<?, ?> child : stmt.effectiveSubstatements()) {
+                indexDataTree(map, child);
+            }
+            return false;
+        } else {
+            return true;
+        }
+    }
+
     private static <T extends SchemaTreeEffectiveStatement<?>> void putChild(final Map<QName, T> map, final T child,
             final String tree) {
         final QName id = child.getIdentifier();
@@ -121,19 +142,4 @@ abstract class AbstractEffectiveStatement<A, D extends DeclaredStatement<A>>
                 "Cannot add " + tree + " tree child with name " + id + ", a conflicting child already exists");
         }
     }
-
-    private static void putChoiceDataChildren(final Map<QName, DataTreeEffectiveStatement<?>> map,
-            final SchemaTreeEffectiveStatement<?> child) {
-        // For choice statements go through all their cases and fetch their data children
-        if (child instanceof ChoiceEffectiveStatement) {
-            child.streamEffectiveSubstatements(CaseEffectiveStatement.class).forEach(
-                caseStmt -> caseStmt.streamEffectiveSubstatements(SchemaTreeEffectiveStatement.class).forEach(stmt -> {
-                    if (stmt instanceof DataTreeEffectiveStatement) {
-                        putChild(map, (DataTreeEffectiveStatement<?>) stmt, "data");
-                    } else {
-                        putChoiceDataChildren(map, stmt);
-                    }
-                }));
-        }
-    }
 }
index c64c97fda52c4cce7b36d0aabc9713b75a204c39..62c44131a615ece6fb411db35ec1b8278168a064 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithSchemaTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveSchemaTreeStatementState;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStatementState;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStatementStateAware;
index 39b81621a74695b644c158fafd968968f22b1562..99147c398b0d7362f62f6d54e8dcb6870f972097 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractUndeclaredEffectiveStatement.DefaultWithSchemaTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractUndeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveSchemaTreeStatementState;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStatementState;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStatementStateAware;
index c633f44832c2b1e7eeb8a191feecc528edf93447..d93eff461e2b937101a7e2e82e819e61cda3c2a4 100644 (file)
@@ -23,7 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithSchemaTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.AugmentationTargetMixin;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataSchemaNodeMixin;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.MandatoryMixin;
index e77635e8553dacaaacc570743608a90ff5013dd5..e7bf3e5f240d9e93f42ba9f9b03acd0ed630a83f 100644 (file)
@@ -18,7 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithSchemaTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.ActionNodeContainerMixin;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.AddedByUsesMixin;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataNodeContainerMixin;