Bug 981: Removed direct access to parent fields.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / DeviationBuilder.java
index af1f7998913c4bdca8cbb80556af53e8c0d39361..7d9805761391cfb4158a0ba642c08548a347873e 100644 (file)
@@ -7,28 +7,24 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 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.model.api.YangNode;
 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.util.YangParseException;
 
+import com.google.common.collect.ImmutableList;
+
 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);
@@ -38,28 +34,28 @@ public final class DeviationBuilder extends AbstractBuilder {
         }
         this.targetPathStr = targetPathStr;
         this.targetPath = ParserUtils.parseXPathString(targetPathStr);
-        instance = new DeviationImpl();
     }
 
     @Override
-    public Deviation build(YangNode parent) {
+    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
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build(instance));
-            }
-            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 +70,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 +91,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 +105,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;