Merge "BUG-597: removed dependency on GeneratedTOBuilderImpl from BindingGeneratorUti...
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / DeviationBuilder.java
index 6cef6238d5cdf9284a031d2c0fffb384007bbd37..8b18ba41b78d7cae18069c5c4736ee06e08a02a3 100644 (file)
@@ -7,27 +7,22 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
+import com.google.common.collect.ImmutableList;
 import java.util.List;
-
 import org.opendaylight.yangtools.yang.model.api.Deviation;
 import org.opendaylight.yangtools.yang.model.api.Deviation.Deviate;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
-import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
+import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.util.AbstractBuilder;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 public final class DeviationBuilder extends AbstractBuilder {
+    private DeviationImpl instance;
     private final String targetPathStr;
-    private boolean isBuilt;
-    private final DeviationImpl instance;
-
     private SchemaPath targetPath;
+    private Deviate deviate;
     private String reference;
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     DeviationBuilder(final String moduleName, final int line, final String targetPathStr) {
         super(moduleName, line);
@@ -36,30 +31,29 @@ public final class DeviationBuilder extends AbstractBuilder {
                     "Deviation argument string must be an absolute schema node identifier.");
         }
         this.targetPathStr = targetPathStr;
-        this.targetPath = ParserUtils.parseXPathString(targetPathStr);
-        instance = new DeviationImpl();
+        this.targetPath = BuilderUtils.parseXPathString(targetPathStr);
     }
 
     @Override
     public Deviation build() {
         if (targetPath == null) {
-            throw new YangParseException(moduleName, line, "Unresolved deviation target");
+            throw new YangParseException(getModuleName(), getLine(), "Unresolved deviation target");
         }
 
-        if (!isBuilt) {
-            instance.setTargetPath(targetPath);
-            instance.setReference(reference);
+        if (instance != null) {
+            return instance;
+        }
 
-            // UNKNOWN NODES
-            List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.setUnknownSchemaNodes(unknownNodes);
+        instance = new DeviationImpl();
+        instance.targetPath = targetPath;
+        instance.deviate = deviate;
+        instance.reference = reference;
 
-            isBuilt = true;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
 
         return instance;
     }
@@ -74,15 +68,15 @@ public final class DeviationBuilder extends AbstractBuilder {
 
     public void setDeviate(final String deviate) {
         if ("not-supported".equals(deviate)) {
-            instance.setDeviate(Deviate.NOT_SUPPORTED);
+            this.deviate = Deviate.NOT_SUPPORTED;
         } else if ("add".equals(deviate)) {
-            instance.setDeviate(Deviate.ADD);
+            this.deviate = Deviate.ADD;
         } else if ("replace".equals(deviate)) {
-            instance.setDeviate(Deviate.REPLACE);
+            this.deviate = Deviate.REPLACE;
         } else if ("delete".equals(deviate)) {
-            instance.setDeviate(Deviate.DELETE);
+            this.deviate = Deviate.DELETE;
         } else {
-            throw new YangParseException(moduleName, line, "Unsupported type of 'deviate' statement: " + deviate);
+            throw new YangParseException(getModuleName(), getLine(), "Unsupported type of 'deviate' statement: " + deviate);
         }
     }
 
@@ -95,11 +89,11 @@ public final class DeviationBuilder extends AbstractBuilder {
         return "deviation " + targetPathStr;
     }
 
-    private final class DeviationImpl implements Deviation {
+    private static final class DeviationImpl implements Deviation {
         private SchemaPath targetPath;
         private Deviate deviate;
         private String reference;
-        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private DeviationImpl() {
         }
@@ -109,39 +103,21 @@ public final class DeviationBuilder extends AbstractBuilder {
             return targetPath;
         }
 
-        private void setTargetPath(final SchemaPath targetPath) {
-            this.targetPath = targetPath;
-        }
-
         @Override
         public Deviate getDeviate() {
             return deviate;
         }
 
-        private void setDeviate(final Deviate deviate) {
-            this.deviate = deviate;
-        }
-
         @Override
         public String getReference() {
             return reference;
         }
 
-        private void setReference(final String reference) {
-            this.reference = reference;
-        }
-
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
             return unknownNodes;
         }
 
-        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
-            if (unknownSchemaNodes != null) {
-                this.unknownNodes = unknownSchemaNodes;
-            }
-        }
-
         @Override
         public int hashCode() {
             final int prime = 31;
@@ -192,9 +168,9 @@ public final class DeviationBuilder extends AbstractBuilder {
         public String toString() {
             StringBuilder sb = new StringBuilder(DeviationImpl.class.getSimpleName());
             sb.append("[");
-            sb.append("targetPath=" + targetPath);
-            sb.append(", deviate=" + deviate);
-            sb.append(", reference=" + reference);
+            sb.append("targetPath=").append(targetPath);
+            sb.append(", deviate=").append(deviate);
+            sb.append(", reference=").append(reference);
             sb.append("]");
             return sb.toString();
         }