Added support to generate interfaces from Choices and Cases.
[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..b18f2558f74e6f559c023693c480708c7d3d6668 100644 (file)
@@ -7,9 +7,11 @@
  */
 package org.opendaylight.controller.yang.parser.builder.impl;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -21,33 +23,46 @@ import org.opendaylight.controller.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.model.api.UsesNode;
 import org.opendaylight.controller.yang.model.util.RevisionAwareXPathImpl;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.Builder;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
 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 Builder parent;
+
+    private String whenCondition;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
+
     private final String augmentTargetStr;
-    private SchemaPath augmentTarget;
+    private SchemaPath dirtyAugmentTarget;
     private SchemaPath finalAugmentTarget;
-    private String whenCondition;
+
     private final Set<DataSchemaNodeBuilder> childNodes = new HashSet<DataSchemaNodeBuilder>();
     private final Set<GroupingBuilder> groupings = new HashSet<GroupingBuilder>();
     private final Set<UsesNodeBuilder> usesNodes = new HashSet<UsesNodeBuilder>();
+    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     private boolean resolved;
 
-    AugmentationSchemaBuilderImpl(final String augmentTargetStr, final int line) {
+    AugmentationSchemaBuilderImpl(final String augmentTargetStr, final int line, final Builder parent) {
         this.augmentTargetStr = augmentTargetStr;
         this.line = line;
+        this.parent = parent;
         final SchemaPath targetPath = YangModelBuilderUtil
                 .parseAugmentPath(augmentTargetStr);
-        augmentTarget = targetPath;
+        dirtyAugmentTarget = targetPath;
         instance = new AugmentationSchemaImpl(targetPath);
     }
 
@@ -56,16 +71,37 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
         return line;
     }
 
+    @Override
+    public Builder getParent() {
+        return parent;
+    }
+
+
     @Override
     public void addChildNode(DataSchemaNodeBuilder childNode) {
         childNodes.add(childNode);
     }
 
     @Override
-    public Set<DataSchemaNodeBuilder> getChildNodes() {
+    public Set<DataSchemaNode> getChildNodes() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<DataSchemaNodeBuilder> getChildNodeBuilders() {
         return childNodes;
     }
 
+    @Override
+    public Set<GroupingDefinition> getGroupings() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<GroupingBuilder> getGroupingBuilders() {
+        return groupings;
+    }
+
     @Override
     public void addGrouping(GroupingBuilder grouping) {
         groupings.add(grouping);
@@ -94,37 +130,50 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
 
     @Override
     public AugmentationSchema build() {
-        instance.setTargetPath(finalAugmentTarget);
+        if (!built) {
+            instance.setDescription(description);
+            instance.setReference(reference);
+            instance.setStatus(status);
+            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);
+
+            // UNKNOWN NODES
+            List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build());
+            }
+            instance.setUnknownSchemaNodes(unknownNodes);
 
+            built = true;
+        }
         return instance;
     }
 
@@ -146,30 +195,37 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
         this.whenCondition = whenCondition;
     }
 
+    @Override
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
+        return Collections.emptySet();
+    }
+
     @Override
     public void addTypedef(TypeDefinitionBuilder type) {
-        throw new UnsupportedOperationException(
-                "Augmentation can not contains type definitions");
+        throw new YangParseException(line,
+                "Augmentation can not contains typedef statement.");
     }
 
     @Override
     public void setDescription(String description) {
-        instance.setDescription(description);
+        this.description = description;
     }
 
     @Override
     public void setReference(String reference) {
-        instance.setReference(reference);
+        this.reference = reference;
     }
 
     @Override
     public void setStatus(Status status) {
-        instance.setStatus(status);
+        if(status != null) {
+            this.status = status;
+        }
     }
 
     @Override
     public SchemaPath getTargetPath() {
-        return augmentTarget;
+        return dirtyAugmentTarget;
     }
 
     @Override
@@ -182,14 +238,26 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
         return augmentTargetStr;
     }
 
+    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
+        return addedUnknownNodes;
+    }
+
+    @Override
+    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
+        addedUnknownNodes.add(unknownNode);
+    }
+
     @Override
     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,20 +287,26 @@ 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();
         private Set<GroupingDefinition> groupings = Collections.emptySet();
         private Set<UsesNode> uses = Collections.emptySet();
-
         private String description;
         private String reference;
         private Status status;
+        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
 
         private AugmentationSchemaImpl(SchemaPath targetPath) {
             this.targetPath = targetPath;
@@ -325,6 +399,17 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
             this.status = status;
         }
 
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+            return unknownNodes;
+        }
+
+        private void setUnknownSchemaNodes(
+                List<UnknownSchemaNode> unknownSchemaNodes) {
+            if (unknownSchemaNodes != null) {
+                this.unknownNodes = unknownSchemaNodes;
+            }
+        }
+
         @Override
         public DataSchemaNode getDataChildByName(QName name) {
             return childNodes.get(name);
@@ -350,6 +435,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 +466,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;
         }
 
@@ -388,9 +482,7 @@ public class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder
                     AugmentationSchemaImpl.class.getSimpleName());
             sb.append("[");
             sb.append("targetPath=" + targetPath);
-            sb.append(", childNodes=" + childNodes.values());
-            sb.append(", groupings=" + groupings);
-            sb.append(", uses=" + uses);
+            sb.append(", when=" + whenCondition);
             sb.append("]");
             return sb.toString();
         }