Refactored uses statement handling in parser.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / util / ParserUtils.xtend
index ed54a6aa278e4dbd3c7863986d278672dc6defe9..e3d3a4898ae78dde32e621a091e1253763a38cf4 100644 (file)
@@ -43,6 +43,8 @@ import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.NotificationBuilder.NotificationDefinitionImpl;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget
 import org.opendaylight.yangtools.yang.parser.builder.impl.RpcDefinitionBuilder
+import java.net.URI
+import org.opendaylight.yangtools.yang.parser.builder.api.GroupingMember
 
 public final class ParserUtils {
 
@@ -62,6 +64,14 @@ public final class ParserUtils {
         return new SchemaPath(path, schemaPath.isAbsolute());
     }
 
+    public static def SchemaPath correctSchemaPath(SchemaPath old, URI ns, Date revision, String prefix) {
+        val List<QName> newPath = new ArrayList();
+        for (name : old.path) {
+            newPath.add(new QName(ns, revision, prefix, name.localName))
+        }
+        return new SchemaPath(newPath, old.absolute) 
+    }
+
     /**
      * Get module import referenced by given prefix.
      *
@@ -205,7 +215,10 @@ public final class ParserUtils {
     public static def void fillAugmentTarget(AugmentationSchemaBuilder augment, DataNodeContainerBuilder target) {
         for (DataSchemaNodeBuilder child : augment.getChildNodeBuilders()) {
             val childCopy = CopyUtils.copy(child, target, false);
-            setNodeAugmenting(childCopy, augment);
+            if (augment.parent instanceof UsesNodeBuilder) {
+                setNodeAddedByUses(childCopy);
+            }
+            setNodeAugmenting(childCopy);
             correctNodePath(child, target.getPath());
             correctNodePath(childCopy, target.getPath());
             try {
@@ -216,22 +229,34 @@ public final class ParserUtils {
                     "Failed to perform augmentation: " + e.getMessage());
             }
         }
-        for (UsesNodeBuilder usesNode : augment.getUsesNodes()) {
-            val copy = CopyUtils.copyUses(usesNode, target);
-            target.addUsesNode(copy);
-        }
     }
 
-    private static def void setNodeAugmenting(DataSchemaNodeBuilder child, AugmentationSchemaBuilder augment) {
+    private static def void setNodeAugmenting(DataSchemaNodeBuilder child) {
         child.setAugmenting(true);
         if (child instanceof DataNodeContainerBuilder) {
             val DataNodeContainerBuilder dataNodeChild = child as DataNodeContainerBuilder;
             for (inner : dataNodeChild.getChildNodeBuilders()) {
-                setNodeAugmenting(inner, augment);
+                setNodeAugmenting(inner);
+            }
+        } else if (child instanceof ChoiceBuilder) {
+            val ChoiceBuilder choiceChild = child as ChoiceBuilder;
+            for (inner : choiceChild.cases) {
+                setNodeAugmenting(inner);
+            }
+        }
+    }
+
+    public static def void setNodeAddedByUses(GroupingMember child) {
+        child.setAddedByUses(true);
+        if (child instanceof DataNodeContainerBuilder) {
+            val DataNodeContainerBuilder dataNodeChild = child as DataNodeContainerBuilder;
+            for (inner : dataNodeChild.getChildNodeBuilders()) {
+                setNodeAddedByUses(inner);
             }
-            for (uses : dataNodeChild.getUsesNodes()) {
-                uses.setParentAugment(augment);
-                uses.setAugmenting(true);
+        } else if (child instanceof ChoiceBuilder) {
+            val ChoiceBuilder choiceChild = child as ChoiceBuilder;
+            for (inner : choiceChild.cases) {
+                setNodeAddedByUses(inner);
             }
         }
     }
@@ -247,7 +272,10 @@ public final class ParserUtils {
     public static def void fillAugmentTarget(AugmentationSchemaBuilder augment, ChoiceBuilder target) {
         for (DataSchemaNodeBuilder builder : augment.getChildNodeBuilders()) {
             val childCopy = CopyUtils.copy(builder, target, false);
-            setNodeAugmenting(childCopy, augment)
+            if (augment.parent instanceof UsesNodeBuilder) {
+                setNodeAddedByUses(childCopy);
+            }
+            setNodeAugmenting(childCopy)
             correctNodePath(builder, target.getPath());
             correctNodePath(childCopy, target.getPath());
             target.addCase(childCopy);
@@ -387,7 +415,7 @@ public final class ParserUtils {
     }
     
     public static def getRpc(ModuleBuilder module,String name) {
-        for(rpc : module.rpcs) {
+        for(rpc : module.getRpcs()) {
             if(name == rpc.QName.localName) {
                 return rpc;
             }
@@ -396,7 +424,7 @@ public final class ParserUtils {
     }
     
     public static def getNotification(ModuleBuilder module,String name) {
-        for(notification : module.notifications) {
+        for(notification : module.getNotifications()) {
             if(name == notification.QName.localName) {
                 return notification;
             }
@@ -663,5 +691,6 @@ public final class ParserUtils {
             }
             return parent as ModuleBuilder;
         }
-    }
-    
\ No newline at end of file
+
+}
+