Remove schemaNode.getPath reference 05/95405/1
authormiroslav.kovac <miroslav.kovac@pantheon.tech>
Tue, 2 Mar 2021 13:43:49 +0000 (14:43 +0100)
committermiroslav.kovac <miroslav.kovac@pantheon.tech>
Tue, 2 Mar 2021 13:43:49 +0000 (14:43 +0100)
Signed-off-by: miroslav.kovac <miroslav.kovac@pantheon.tech>
Change-Id: I8ea9b155ec61bec6be2ebaa6c3f6343779842aed

yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java

index 14fb033f62cd438fb6e7e192394140036740d0e3..9a983b82f029769b370ec6ef09d7d6c8772c41ee 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 final class LeafRefContextTreeBuilder {
     private final List<LeafRefContext> leafRefs = new LinkedList<>();
@@ -34,23 +35,27 @@ final class LeafRefContextTreeBuilder {
     }
 
     LeafRefContext buildLeafRefContextTree() throws LeafRefYangSyntaxErrorException {
+        final SchemaInferenceStack stack = SchemaInferenceStack.of(schemaContext);
         final LeafRefContextBuilder rootBuilder = new LeafRefContextBuilder(SchemaContext.NAME, SchemaPath.ROOT,
             schemaContext);
 
         final Collection<? extends Module> modules = schemaContext.getModules();
         for (final Module module : modules) {
             for (final DataSchemaNode childNode : module.getChildNodes()) {
-                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(childNode, module);
+                stack.enterSchemaTree(childNode.getQName());
+                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(childNode, stack);
+                stack.exit();
                 if (childLeafRefContext.hasReferencingChild() || childLeafRefContext.isReferencing()) {
                     rootBuilder.addReferencingChild(childLeafRefContext, childLeafRefContext.getNodeName());
                 }
             }
         }
-
         for (final Module module : modules) {
             for (final DataSchemaNode childNode : module.getChildNodes()) {
-                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(childNode, module);
-
+                stack.enterSchemaTree(childNode.getQName());
+                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(childNode, module,
+                        stack);
+                stack.exit();
                 if (childLeafRefContext.hasReferencedChild() || childLeafRefContext.isReferenced()) {
                     rootBuilder.addReferencedByChild(childLeafRefContext, childLeafRefContext.getNodeName());
                 }
@@ -63,13 +68,16 @@ final class LeafRefContextTreeBuilder {
         return rootBuilder.build();
     }
 
-    private LeafRefContext buildLeafRefContextReferencingTree(final DataSchemaNode node, final Module currentModule) {
+    private LeafRefContext buildLeafRefContextReferencingTree(final DataSchemaNode node,
+            final SchemaInferenceStack stack) {
         final LeafRefContextBuilder currentLeafRefContextBuilder = new LeafRefContextBuilder(node.getQName(),
-            node.getPath(), schemaContext);
+            stack.toSchemaPath(), schemaContext);
 
         if (node instanceof DataNodeContainer) {
             for (final DataSchemaNode childNode : ((DataNodeContainer) node).getChildNodes()) {
-                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(childNode, currentModule);
+                stack.enterSchemaTree(childNode.getQName());
+                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(childNode, stack);
+                stack.exit();
                 if (childLeafRefContext.hasReferencingChild() || childLeafRefContext.isReferencing()) {
                     currentLeafRefContextBuilder.addReferencingChild(childLeafRefContext,
                         childLeafRefContext.getNodeName());
@@ -78,7 +86,9 @@ final class LeafRefContextTreeBuilder {
         } else if (node instanceof ChoiceSchemaNode) {
             // :FIXME choice without case
             for (final CaseSchemaNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
-                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(caseNode, currentModule);
+                stack.enterSchemaTree(caseNode.getQName());
+                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(caseNode, stack);
+                stack.exit();
                 if (childLeafRefContext.hasReferencingChild() || childLeafRefContext.isReferencing()) {
                     currentLeafRefContextBuilder.addReferencingChild(childLeafRefContext,
                         childLeafRefContext.getNodeName());
@@ -109,14 +119,16 @@ final class LeafRefContextTreeBuilder {
         return currentLeafRefContextBuilder.build();
     }
 
-    private LeafRefContext buildLeafRefContextReferencedByTree(final DataSchemaNode node, final Module currentModule)
-            throws LeafRefYangSyntaxErrorException {
+    private LeafRefContext buildLeafRefContextReferencedByTree(final DataSchemaNode node, final Module currentModule,
+            final SchemaInferenceStack stack) {
         final LeafRefContextBuilder currentLeafRefContextBuilder = new LeafRefContextBuilder(node.getQName(),
-            node.getPath(), schemaContext);
+                stack.toSchemaPath(), schemaContext);
         if (node instanceof DataNodeContainer) {
             for (final DataSchemaNode childNode : ((DataNodeContainer) node).getChildNodes()) {
+                stack.enterSchemaTree(childNode.getQName());
                 final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(childNode,
-                    currentModule);
+                        currentModule, stack);
+                stack.exit();
                 if (childLeafRefContext.hasReferencedChild() || childLeafRefContext.isReferenced()) {
                     currentLeafRefContextBuilder.addReferencedByChild(childLeafRefContext,
                         childLeafRefContext.getNodeName());
@@ -124,14 +136,17 @@ final class LeafRefContextTreeBuilder {
             }
         } else if (node instanceof ChoiceSchemaNode) {
             for (final CaseSchemaNode caseNode : ((ChoiceSchemaNode) node).getCases()) {
-                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(caseNode, currentModule);
+                stack.enterSchemaTree(caseNode.getQName());
+                final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(caseNode, currentModule,
+                        stack);
+                stack.exit();
                 if (childLeafRefContext.hasReferencedChild() || childLeafRefContext.isReferenced()) {
                     currentLeafRefContextBuilder.addReferencedByChild(childLeafRefContext,
                         childLeafRefContext.getNodeName());
                 }
             }
         } else if (node instanceof LeafSchemaNode || node instanceof LeafListSchemaNode) {
-            final List<LeafRefContext> foundLeafRefs = getLeafRefsFor(node, currentModule);
+            final List<LeafRefContext> foundLeafRefs = getLeafRefsFor(currentModule, stack);
             if (!foundLeafRefs.isEmpty()) {
                 currentLeafRefContextBuilder.setReferencedBy(true);
                 for (final LeafRefContext leafRef : foundLeafRefs) {
@@ -143,8 +158,8 @@ final class LeafRefContextTreeBuilder {
         return currentLeafRefContextBuilder.build();
     }
 
-    private List<LeafRefContext> getLeafRefsFor(final DataSchemaNode node, final Module module) {
-        final LeafRefPath nodeXPath = LeafRefUtils.schemaPathToLeafRefPath(node.getPath(), module);
+    private List<LeafRefContext> getLeafRefsFor(final Module module, final SchemaInferenceStack stack) {
+        final LeafRefPath nodeXPath = LeafRefUtils.schemaPathToLeafRefPath(stack.toSchemaPath(), module);
         final List<LeafRefContext> foundLeafRefs = new LinkedList<>();
         for (final LeafRefContext leafref : leafRefs) {
             final LeafRefPath leafRefTargetPath = leafref.getAbsoluteLeafRefTargetPath();