Merge "Refactored ModuleBuilder to avoid name conflicts. Fixed implementation of...
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / main / java / org / opendaylight / controller / yang / parser / builder / impl / AugmentationSchemaBuilderImpl.java
index 29c38dfa0e727eaaba4c61adf7320f8893bb90c8..e5ba8b17ccfe1f872070e491cf9c6396d8623557 100644 (file)
@@ -29,8 +29,10 @@ import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
 import org.opendaylight.controller.yang.parser.util.YangModelBuilderUtil;
+import org.opendaylight.controller.yang.parser.util.YangParseException;
 
-public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder {
+public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder {
+    private boolean built;
     private final AugmentationSchemaImpl instance;
     private final int line;
     private final String augmentTargetStr;
@@ -94,37 +96,40 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
 
     @Override
     public AugmentationSchema build() {
-        instance.setTargetPath(finalAugmentTarget);
+        if (!built) {
+            instance.setTargetPath(finalAugmentTarget);
 
-        RevisionAwareXPath whenStmt;
-        if (whenCondition == null) {
-            whenStmt = null;
-        } else {
-            whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
-        }
-        instance.setWhenCondition(whenStmt);
+            RevisionAwareXPath whenStmt;
+            if (whenCondition == null) {
+                whenStmt = null;
+            } else {
+                whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
+            }
+            instance.setWhenCondition(whenStmt);
 
-        // CHILD NODES
-        final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
-        for (DataSchemaNodeBuilder node : childNodes) {
-            childs.put(node.getQName(), node.build());
-        }
-        instance.setChildNodes(childs);
+            // CHILD NODES
+            final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
+            for (DataSchemaNodeBuilder node : childNodes) {
+                childs.put(node.getQName(), node.build());
+            }
+            instance.setChildNodes(childs);
 
-        // GROUPINGS
-        final Set<GroupingDefinition> groupingDefinitions = new HashSet<GroupingDefinition>();
-        for (GroupingBuilder builder : groupings) {
-            groupingDefinitions.add(builder.build());
-        }
-        instance.setGroupings(groupingDefinitions);
+            // GROUPINGS
+            final Set<GroupingDefinition> groupingDefinitions = new HashSet<GroupingDefinition>();
+            for (GroupingBuilder builder : groupings) {
+                groupingDefinitions.add(builder.build());
+            }
+            instance.setGroupings(groupingDefinitions);
 
-        // USES
-        final Set<UsesNode> usesNodeDefinitions = new HashSet<UsesNode>();
-        for (UsesNodeBuilder builder : usesNodes) {
-            usesNodeDefinitions.add(builder.build());
-        }
-        instance.setUses(usesNodeDefinitions);
+            // USES
+            final Set<UsesNode> usesNodeDefinitions = new HashSet<UsesNode>();
+            for (UsesNodeBuilder builder : usesNodes) {
+                usesNodeDefinitions.add(builder.build());
+            }
+            instance.setUses(usesNodeDefinitions);
 
+            built = true;
+        }
         return instance;
     }
 
@@ -146,9 +151,14 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
         this.whenCondition = whenCondition;
     }
 
+    @Override
+    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
+        return Collections.emptySet();
+    }
+
     @Override
     public void addTypedef(TypeDefinitionBuilder type) {
-        throw new UnsupportedOperationException(
+        throw new YangParseException(line,
                 "Augmentation can not contains type definitions");
     }
 
@@ -186,10 +196,13 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
     public int hashCode() {
         final int prime = 17;
         int result = 1;
-        result = prime * result
+        result = prime
+                * result
                 + ((augmentTargetStr == null) ? 0 : augmentTargetStr.hashCode());
         result = prime * result
                 + ((whenCondition == null) ? 0 : whenCondition.hashCode());
+        result = prime * result
+                + ((childNodes == null) ? 0 : childNodes.hashCode());
         return result;
     }
 
@@ -219,11 +232,17 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
         } else if (!whenCondition.equals(other.whenCondition)) {
             return false;
         }
+        if (childNodes == null) {
+            if (other.childNodes != null) {
+                return false;
+            }
+        } else if (!childNodes.equals(other.childNodes)) {
+            return false;
+        }
         return true;
     }
 
-
-    private static class AugmentationSchemaImpl implements AugmentationSchema {
+    private final class AugmentationSchemaImpl implements AugmentationSchema {
         private SchemaPath targetPath;
         private RevisionAwareXPath whenCondition;
         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
@@ -350,6 +369,8 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
                     + ((targetPath == null) ? 0 : targetPath.hashCode());
             result = prime * result
                     + ((whenCondition == null) ? 0 : whenCondition.hashCode());
+            result = prime * result
+                    + ((childNodes == null) ? 0 : childNodes.hashCode());
             return result;
         }
 
@@ -379,6 +400,13 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
             } else if (!whenCondition.equals(other.whenCondition)) {
                 return false;
             }
+            if (childNodes == null) {
+                if (other.childNodes != null) {
+                    return false;
+                }
+            } else if (!childNodes.equals(other.childNodes)) {
+                return false;
+            }
             return true;
         }