Added more descriptive parsing exceptions.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / parser / builder / impl / UsesNodeBuilderImpl.java
index 6943b661564302f337e2a525a51678f60c6819e2..ee07e8be4603ac99d14f68f2c0fbaf33abc97db6 100644 (file)
@@ -15,38 +15,55 @@ import java.util.List;
 import java.util.Map;\r
 import java.util.Set;\r
 \r
-import org.opendaylight.controller.yang.common.QName;\r
 import org.opendaylight.controller.yang.model.api.AugmentationSchema;\r
 import org.opendaylight.controller.yang.model.api.SchemaNode;\r
 import org.opendaylight.controller.yang.model.api.SchemaPath;\r
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;\r
 import org.opendaylight.controller.yang.model.api.UsesNode;\r
+import org.opendaylight.controller.yang.parser.builder.api.AbstractBuilder;\r
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;\r
+import org.opendaylight.controller.yang.parser.builder.api.Builder;\r
+import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder;\r
 import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;\r
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;\r
 import org.opendaylight.controller.yang.parser.util.RefineHolder;\r
-\r
-public final class UsesNodeBuilderImpl implements UsesNodeBuilder {\r
-    private boolean built;\r
-    private final UsesNodeImpl instance;\r
-    private final int line;\r
-    private final String groupingPathStr;\r
-    private final SchemaPath groupingPath;\r
+import org.opendaylight.controller.yang.parser.util.YangParseException;\r
+\r
+public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder {\r
+    private boolean isBuilt;\r
+    private UsesNodeImpl instance;\r
+    private DataNodeContainerBuilder parent;\r
+    private final String groupingName;\r
+    private SchemaPath groupingPath;\r
     private boolean augmenting;\r
+    private boolean addedByUses;\r
     private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<AugmentationSchemaBuilder>();\r
-    private List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();\r
-    private List<RefineHolder> refines = new ArrayList<RefineHolder>();\r
+    private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();\r
+    private final List<RefineHolder> refines = new ArrayList<RefineHolder>();\r
+\r
+    public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {\r
+        super(moduleName, line);\r
+        this.groupingName = groupingName;\r
+    }\r
 \r
-    public UsesNodeBuilderImpl(final String groupingPathStr, final int line) {\r
-        this.groupingPathStr = groupingPathStr;\r
-        this.groupingPath = parseUsesPath(groupingPathStr);\r
-        this.line = line;\r
-        instance = new UsesNodeImpl(groupingPath);\r
+    public UsesNodeBuilderImpl(UsesNodeBuilder b) {\r
+        super(b.getModuleName(), b.getLine());\r
+        groupingName = b.getGroupingName();\r
+        parent = b.getParent();\r
+        groupingPath = b.getGroupingPath();\r
+        augmenting = b.isAugmenting();\r
+        addedByUses = b.isAddedByUses();\r
+        addedAugments.addAll(b.getAugmentations());\r
+        refineBuilders.addAll(b.getRefineNodes());\r
+        refines.addAll(b.getRefines());\r
     }\r
 \r
     @Override\r
     public UsesNode build() {\r
-        if (!built) {\r
+        if (!isBuilt) {\r
+            instance = new UsesNodeImpl(groupingPath);\r
             instance.setAugmenting(augmenting);\r
+            instance.setAddedByUses(addedByUses);\r
 \r
             // AUGMENTATIONS\r
             final Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();\r
@@ -63,19 +80,29 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             }\r
             instance.setRefines(refineNodes);\r
 \r
-            built = true;\r
+            // UNKNOWN NODES\r
+            List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();\r
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {\r
+                unknownNodes.add(b.build());\r
+            }\r
+            instance.setUnknownSchemaNodes(unknownNodes);\r
+\r
+            isBuilt = true;\r
         }\r
         return instance;\r
     }\r
 \r
     @Override\r
-    public int getLine() {\r
-        return line;\r
+    public DataNodeContainerBuilder getParent() {\r
+        return parent;\r
     }\r
 \r
     @Override\r
-    public String getGroupingPathString() {\r
-        return groupingPathStr;\r
+    public void setParent(Builder parent) {\r
+        if (!(parent instanceof DataNodeContainerBuilder)) {\r
+            throw new YangParseException(moduleName, line, "Unresolved parent of uses '" + groupingName + "'.");\r
+        }\r
+        this.parent = (DataNodeContainerBuilder) parent;\r
     }\r
 \r
     @Override\r
@@ -83,6 +110,16 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
         return groupingPath;\r
     }\r
 \r
+    @Override\r
+    public void setGroupingPath(SchemaPath groupingPath) {\r
+        this.groupingPath = groupingPath;\r
+    }\r
+\r
+    @Override\r
+    public String getGroupingName() {\r
+        return groupingName;\r
+    }\r
+\r
     @Override\r
     public Set<AugmentationSchemaBuilder> getAugmentations() {\r
         return addedAugments;\r
@@ -103,6 +140,16 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
         this.augmenting = augmenting;\r
     }\r
 \r
+    @Override\r
+    public boolean isAddedByUses() {\r
+        return addedByUses;\r
+    }\r
+\r
+    @Override\r
+    public void setAddedByUses(final boolean addedByUses) {\r
+        this.addedByUses = addedByUses;\r
+    }\r
+\r
     @Override\r
     public List<SchemaNodeBuilder> getRefineNodes() {\r
         return refineBuilders;\r
@@ -123,29 +170,54 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
         refines.add(refine);\r
     }\r
 \r
-    private SchemaPath parseUsesPath(final String groupingPathStr) {\r
-        final String[] splittedPath = groupingPathStr.split("/");\r
-        final List<QName> path = new ArrayList<QName>();\r
-        QName name;\r
-        for (String pathElement : splittedPath) {\r
-            final String[] splittedElement = pathElement.split(":");\r
-            if (splittedElement.length == 1) {\r
-                name = new QName(null, null, null, splittedElement[0]);\r
-            } else {\r
-                name = new QName(null, null, splittedElement[0],\r
-                        splittedElement[1]);\r
-            }\r
-            path.add(name);\r
-        }\r
-        final boolean absolute = groupingPathStr.startsWith("/");\r
-        return new SchemaPath(path, absolute);\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode());\r
+        return result;\r
     }\r
 \r
-    private final class UsesNodeImpl implements UsesNode {\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj)\r
+            return true;\r
+        if (obj == null)\r
+            return false;\r
+        if (getClass() != obj.getClass())\r
+            return false;\r
+        UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj;\r
+        if (groupingName == null) {\r
+            if (other.groupingName != null)\r
+                return false;\r
+        } else if (!groupingName.equals(other.groupingName))\r
+            return false;\r
+\r
+        if (parent == null) {\r
+            if (other.parent != null)\r
+                return false;\r
+        } else if (!parent.equals(other.parent))\r
+            return false;\r
+        if (refines == null) {\r
+            if (other.refines != null)\r
+                return false;\r
+        } else if (!refines.equals(other.refines))\r
+            return false;\r
+        return true;\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+        return "uses '" + groupingName + "'";\r
+    }\r
+\r
+    public final class UsesNodeImpl implements UsesNode {\r
         private final SchemaPath groupingPath;\r
         private Set<AugmentationSchema> augmentations = Collections.emptySet();\r
         private boolean augmenting;\r
+        private boolean addedByUses;\r
         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();\r
+        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();\r
 \r
         private UsesNodeImpl(final SchemaPath groupingPath) {\r
             this.groupingPath = groupingPath;\r
@@ -161,8 +233,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             return augmentations;\r
         }\r
 \r
-        private void setAugmentations(\r
-                final Set<AugmentationSchema> augmentations) {\r
+        private void setAugmentations(final Set<AugmentationSchema> augmentations) {\r
             if (augmentations != null) {\r
                 this.augmentations = augmentations;\r
             }\r
@@ -177,6 +248,15 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             this.augmenting = augmenting;\r
         }\r
 \r
+        @Override\r
+        public boolean isAddedByUses() {\r
+            return addedByUses;\r
+        }\r
+\r
+        private void setAddedByUses(final boolean addedByUses) {\r
+            this.addedByUses = addedByUses;\r
+        }\r
+\r
         @Override\r
         public Map<SchemaPath, SchemaNode> getRefines() {\r
             return refines;\r
@@ -188,14 +268,26 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             }\r
         }\r
 \r
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {\r
+            return unknownNodes;\r
+        }\r
+\r
+        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {\r
+            if (unknownSchemaNodes != null) {\r
+                this.unknownNodes = unknownSchemaNodes;\r
+            }\r
+        }\r
+\r
+        public UsesNodeBuilder toBuilder() {\r
+            return UsesNodeBuilderImpl.this;\r
+        }\r
+\r
         @Override\r
         public int hashCode() {\r
             final int prime = 31;\r
             int result = 1;\r
-            result = prime * result\r
-                    + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
-            result = prime * result\r
-                    + ((augmentations == null) ? 0 : augmentations.hashCode());\r
+            result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
+            result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode());\r
             result = prime * result + (augmenting ? 1231 : 1237);\r
             return result;\r
         }\r
@@ -234,10 +326,10 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
 \r
         @Override\r
         public String toString() {\r
-            StringBuilder sb = new StringBuilder(\r
-                    UsesNodeImpl.class.getSimpleName());\r
+            StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName());\r
             sb.append("[groupingPath=" + groupingPath + "]");\r
             return sb.toString();\r
         }\r
     }\r
+\r
 }\r