Added getParent() method to DataSchemaNode and DataNodeContainer. Fixed Bugs.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / util / GroupingUtils.java
index 14718e6a4bcf132cf4abe378ed06a44a52c22094..7faef14300e84d598ceed097fadd8aafb53f9c2a 100644 (file)
@@ -192,6 +192,20 @@ public final class GroupingUtils {
         return null;
     }
 
+    private static void setNodeAugmenting(DataSchemaNodeBuilder node) {
+        node.setAugmenting(true);
+        if (node instanceof DataNodeContainerBuilder) {
+            for (DataSchemaNodeBuilder child : ((DataNodeContainerBuilder)node).getChildNodeBuilders()) {
+                setNodeAugmenting(child);
+            }
+        }
+        if (node instanceof ChoiceBuilder) {
+            for (ChoiceCaseBuilder child : ((ChoiceBuilder)node).getCases()) {
+                setNodeAugmenting(child);
+            }
+        }
+    }
+
     /**
      * Add nodes defined in uses target grouping to uses parent.
      *
@@ -212,29 +226,19 @@ public final class GroupingUtils {
 
         // child nodes
         for (DataSchemaNodeBuilder child : usesNode.getTargetChildren()) {
-            if (child instanceof GroupingMember) {
-                ((GroupingMember) child).setAddedByUses(true);
-            }
+            setAddedByUsesToNode(child);
 
-            if (child instanceof GroupingMember) {
-                GroupingMember gm = (GroupingMember) child;
-                if (gm.isAddedByUses()) {
-                    if (usesNode.isAugmenting()) {
-                        child.setAugmenting(true);
-                    }
-                    if (usesNode.isAugmenting()
-                            && !(usesNode.getParentAugment().getParent() instanceof UsesNodeBuilder)) {
-                        AugmentationSchemaBuilder parentAugment = usesNode.getParentAugment();
-                        ModuleBuilder m = ParserUtils.getParentModule(parentAugment);
-                        correctNodePathForUsesNodes(child, parentPath, m);
-                    } else {
-                        child.setQName(new QName(ns, rev, prefix, child.getQName().getLocalName()));
-                        correctNodePathForUsesNodes(child, parentPath, module);
-                    }
-                }
+            if (usesNode.isAugmenting()) {
+                //child.setAugmenting(true);
+                setNodeAugmenting(child);
+            }
+            if (usesNode.isAugmenting() && !(usesNode.getParentAugment().getParent() instanceof UsesNodeBuilder)) {
+                AugmentationSchemaBuilder parentAugment = usesNode.getParentAugment();
+                ModuleBuilder m = ParserUtils.getParentModule(parentAugment);
+                correctNodePathForUsesNodes(child, parentPath, m);
             } else {
-                throw new YangParseException(module.getName(), usesNode.getLine(),
-                        "Failed to process uses node: unresolved child node");
+                child.setQName(new QName(ns, rev, prefix, child.getQName().getLocalName()));
+                correctNodePathForUsesNodes(child, parentPath, module);
             }
 
             parent.addChildNode(child);
@@ -242,7 +246,7 @@ public final class GroupingUtils {
 
         // groupings
         for (GroupingBuilder gb : usesNode.getTargetGroupings()) {
-            gb.setAddedByUses(true);
+            setAddedByUsesToNode(gb);
             gb.setQName(new QName(ns, rev, prefix, gb.getQName().getLocalName()));
             correctNodePathForUsesNodes(gb, parentPath, module);
             parent.addGrouping(gb);
@@ -250,7 +254,7 @@ public final class GroupingUtils {
 
         // typedefs
         for (TypeDefinitionBuilder tdb : usesNode.getTargetTypedefs()) {
-            tdb.setAddedByUses(true);
+            setAddedByUsesToNode(tdb);
             tdb.setQName(new QName(ns, rev, prefix, tdb.getQName().getLocalName()));
             correctNodePathForUsesNodes(tdb, parentPath, module);
             parent.addTypedef(tdb);
@@ -265,6 +269,20 @@ public final class GroupingUtils {
         }
     }
 
+    private static void setAddedByUsesToNode(GroupingMember node) {
+        node.setAddedByUses(true);
+        if (node instanceof DataNodeContainerBuilder) {
+            for (DataSchemaNodeBuilder child : ((DataNodeContainerBuilder) node).getChildNodeBuilders()) {
+                setAddedByUsesToNode(child);
+
+            }
+        } else if (node instanceof ChoiceBuilder) {
+            for (ChoiceCaseBuilder caseNode : ((ChoiceBuilder) node).getCases()) {
+                setAddedByUsesToNode((caseNode));
+            }
+        }
+    }
+
     /**
      * Read data defined in target grouping builder, make a copy and add them to
      * uses node builder.
@@ -324,6 +342,7 @@ public final class GroupingUtils {
             }
             if (!exists) {
                 DataSchemaNodeBuilder copy = CopyUtils.copy(childNode, parent, true);
+                setAddedByUsesToNode(copy);
                 collection.add(copy);
             }
         }