BUG-579: memory improvements in parser's builders. 22/6922/5
authorMartin Vitez <mvitez@cisco.com>
Tue, 13 May 2014 07:37:02 +0000 (09:37 +0200)
committerRobert Varga <rovarga@cisco.com>
Wed, 14 May 2014 12:39:48 +0000 (12:39 +0000)
Change-Id: I8b7e660c79d55154693ba91ae061dcad4b5c2f63
Signed-off-by: Martin Vitez <mvitez@cisco.com>
22 files changed:
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java

index 1ec6a8417a88a9ee10cc9f5e7829af5eeaaa22a7..13f8d93b8fac022d0de647aca5bdd29e0fc92eeb 100644 (file)
@@ -24,9 +24,9 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException;
  * Basic implementation of DataNodeContainerBuilder.
  */
 public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder implements DataNodeContainerBuilder {
-    protected QName qname;
+    protected final QName qname;
 
-    protected final Set<DataSchemaNode> childNodes = new HashSet<>();
+    protected final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
     protected final Set<DataSchemaNodeBuilder> addedChildNodes = new HashSet<>();
 
     protected final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
@@ -105,6 +105,7 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i
         return groupings;
     }
 
+    @Override
     public Set<GroupingBuilder> getGroupingBuilders() {
         return addedGroupings;
     }
index ccf57f92bf32471dbe203443645d7fd43fa73ee1..3ff7fdf8c37aa4fd0e20d329c8535ed35e670b3c 100644 (file)
@@ -7,11 +7,11 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.api;
 
-import java.util.List;
-
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Status;
+
+import com.google.common.base.Preconditions;
 
 /**
  * Basic implementation of SchemaNodeBuilder.
@@ -19,12 +19,60 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implements SchemaNodeBuilder {
     protected final QName qname;
     protected SchemaPath schemaPath;
+    protected String description;
+    protected String reference;
+    protected Status status = Status.CURRENT;
 
     protected AbstractSchemaNodeBuilder(final String moduleName, final int line, final QName qname) {
         super(moduleName, line);
         this.qname = qname;
     }
 
+    @Override
+    public QName getQName() {
+        return qname;
+    }
+
+    @Override
+    public SchemaPath getPath() {
+        return schemaPath;
+    }
+
+    @Override
+    public void setPath(final SchemaPath path) {
+        this.schemaPath = path;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(final String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String getReference() {
+        return reference;
+    }
+
+    @Override
+    public void setReference(final String reference) {
+        this.reference = reference;
+    }
+
+    @Override
+    public Status getStatus() {
+        return status;
+    }
+
+    @Override
+    public void setStatus(Status status) {
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -66,13 +114,4 @@ public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implemen
         return true;
     }
 
-    @Override
-    public QName getQName() {
-        return qname;
-    }
-
-    public void setUnknownNodes(List<UnknownSchemaNode> unknownNodes) {
-        this.unknownNodes.addAll(unknownNodes);
-    }
-
 }
index 4dca5aead6bde954892bf40eba1baa713a025b39..cd0bb354e445270176947a3acdb00093f10051e9 100644 (file)
@@ -31,6 +31,13 @@ public interface SchemaNodeBuilder extends Builder {
      */
     SchemaPath getPath();
 
+    /**
+     * Set path to this node.
+     *
+     * @param path
+     */
+    void setPath(SchemaPath path);
+
     /**
      * Get description of this node.
      *
index 171390676964d685a4e6c27541f40ae8b1352da2..add703a0762b3ef68fd571f2142b0097c15f1765 100644 (file)
@@ -7,8 +7,6 @@
  */
 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.common.QName;
@@ -19,17 +17,21 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
+
+import com.google.common.collect.ImmutableList;
 
 public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder {
-    private boolean built;
-    private final AnyXmlSchemaNodeImpl instance;
+    private AnyXmlSchemaNodeImpl instance;
+
+    private boolean augmenting;
+    private boolean addedByUses;
+    private boolean configuration;
+
     private final ConstraintsBuilder constraints;
 
     public AnyXmlBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new AnyXmlSchemaNodeImpl(qname, schemaPath);
         constraints = new ConstraintsBuilder(moduleName, line);
     }
 
@@ -37,115 +39,76 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
             final AnyXmlSchemaNode base) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        this.instance = new AnyXmlSchemaNodeImpl(qname, schemaPath);
         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmenting = base.isAugmenting();
-        instance.addedByUses = base.isAddedByUses();
-        instance.configuration = base.isConfiguration();
-        instance.constraintsDef = base.getConstraints();
-        instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        augmenting = base.isAugmenting();
+        addedByUses = base.isAddedByUses();
+        configuration = base.isConfiguration();
+        unknownNodes.addAll(base.getUnknownSchemaNodes());
     }
 
     @Override
     public AnyXmlSchemaNode build() {
-        if (!built) {
-            instance.setConstraints(constraints.build());
-
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.setUnknownSchemaNodes(unknownNodes);
-
-            built = true;
+        if (instance != null) {
+            return instance;
         }
-        return instance;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return instance.path;
-    }
 
-    @Override
-    public void setPath(SchemaPath path) {
-        instance.path = path;
-    }
-
-    @Override
-    public ConstraintsBuilder getConstraints() {
-        return constraints;
-    }
-
-    @Override
-    public String getDescription() {
-        return instance.description;
-    }
+        instance = new AnyXmlSchemaNodeImpl(qname, schemaPath);
 
-    @Override
-    public void setDescription(final String description) {
         instance.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return instance.reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
         instance.reference = reference;
-    }
+        instance.status = status;
+        instance.augmenting = augmenting;
+        instance.addedByUses = addedByUses;
+        instance.configuration = configuration;
 
-    @Override
-    public Status getStatus() {
-        return instance.status;
-    }
+        instance.constraintsDef = constraints.build();
 
-    @Override
-    public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
+        return instance;
     }
 
-    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
-        return addedUnknownNodes;
+    @Override
+    public ConstraintsBuilder getConstraints() {
+        return constraints;
     }
 
     @Override
     public boolean isAugmenting() {
-        return instance.augmenting;
+        return augmenting;
     }
 
     @Override
     public void setAugmenting(final boolean augmenting) {
-        instance.augmenting = augmenting;
+        this.augmenting = augmenting;
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
     public boolean isConfiguration() {
-        return instance.configuration;
+        return configuration;
     }
 
     @Override
     public void setConfiguration(final boolean configuration) {
-        instance.configuration = configuration;
+        this.configuration = configuration;
     }
 
     @Override
@@ -192,15 +155,15 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
 
     private static final class AnyXmlSchemaNodeImpl implements AnyXmlSchemaNode {
         private final QName qname;
-        private SchemaPath path;
+        private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
+        private Status status;
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private boolean augmenting;
         private boolean addedByUses;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private AnyXmlSchemaNodeImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -252,19 +215,9 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
             return constraintsDef;
         }
 
-        private void setConstraints(ConstraintDefinition constraintsDef) {
-            this.constraintsDef = constraintsDef;
-        }
-
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index 8d272ce09bcfbf217c03796f81434b67b16f9912..224c45fcda060f1ba1904b66f2914599d2af2b79 100644 (file)
@@ -11,10 +11,8 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -35,19 +33,23 @@ import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-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.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContainerBuilder implements
         AugmentationSchemaBuilder {
-    private boolean built;
-    private final AugmentationSchemaImpl instance;
-
+    private AugmentationSchemaImpl instance;
     private String whenCondition;
 
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
+
     private final String augmentTargetStr;
     private final SchemaPath targetPath;
     private SchemaPath targetNodeSchemaPath;
@@ -59,7 +61,6 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
         super(moduleName, line, null);
         this.augmentTargetStr = augmentTargetStr;
         targetPath = ParserUtils.parseXPathString(augmentTargetStr);
-        instance = new AugmentationSchemaImpl(targetPath);
     }
 
     @Override
@@ -84,61 +85,65 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
 
     @Override
     public AugmentationSchema build() {
-        if (!built) {
+        if (instance != null) {
+            return instance;
+        }
 
-            Builder parent = getParent();
-            if(parent instanceof ModuleBuilder) {
-                ModuleBuilder moduleBuilder = (ModuleBuilder) parent;
-                instance.setNamespace(moduleBuilder.getNamespace());
-                instance.setRevision(moduleBuilder.getRevision());
-            }
+        instance = new AugmentationSchemaImpl(targetPath);
 
-            if (parent instanceof UsesNodeBuilder) {
-                ModuleBuilder mb = ParserUtils.getParentModule(this);
-                List<QName> newPath = new ArrayList<>();
-                List<QName> parsedPath = targetPath.getPath();
-                for (QName name : parsedPath) {
-                    newPath.add(new QName(mb.getNamespace(), mb.getRevision(), name.getPrefix(), name.getLocalName()));
-                }
-                instance.setTargetPath(new SchemaPath(newPath, false));
-            } else {
-                instance.setTargetPath(targetNodeSchemaPath);
-            }
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
 
-            if(copyOf != null) {
-                instance.setCopyOf(copyOf.build());
-            }
+        Builder parent = getParent();
+        if (parent instanceof ModuleBuilder) {
+            ModuleBuilder moduleBuilder = (ModuleBuilder) parent;
+            instance.namespace = moduleBuilder.getNamespace();
+            instance.revision = moduleBuilder.getRevision();
+        }
 
-            RevisionAwareXPath whenStmt;
-            if (whenCondition == null) {
-                whenStmt = null;
-            } else {
-                whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
+        if (parent instanceof UsesNodeBuilder) {
+            ModuleBuilder mb = ParserUtils.getParentModule(this);
+            List<QName> newPath = new ArrayList<>();
+            List<QName> parsedPath = targetPath.getPath();
+            for (QName name : parsedPath) {
+                newPath.add(new QName(mb.getNamespace(), mb.getRevision(), name.getPrefix(), name.getLocalName()));
             }
-            instance.setWhenCondition(whenStmt);
+            instance.targetPath = new SchemaPath(newPath, false);
+        } else {
+            instance.targetPath = targetNodeSchemaPath;
+        }
 
-            // CHILD NODES
-            for (DataSchemaNodeBuilder node : addedChildNodes) {
-                DataSchemaNode child = node.build();
-                childNodes.add(child);
-            }
-            instance.addChildNodes(childNodes);
+        if (copyOf != null) {
+            instance.setCopyOf(copyOf.build());
+        }
 
-            // USES
-            for (UsesNodeBuilder builder : addedUsesNodes) {
-                usesNodes.add(builder.build());
-            }
-            instance.addUses(usesNodes);
+        RevisionAwareXPath whenStmt;
+        if (whenCondition == null) {
+            whenStmt = null;
+        } else {
+            whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
+        }
+        instance.whenCondition = whenStmt;
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        // CHILD NODES
+        for (DataSchemaNodeBuilder node : addedChildNodes) {
+            childNodes.add(node.build());
+        }
+        instance.childNodes = ImmutableSet.copyOf(childNodes);
+
+        // USES
+        for (UsesNodeBuilder builder : addedUsesNodes) {
+            usesNodes.add(builder.build());
+        }
+        instance.uses = ImmutableSet.copyOf(usesNodes);
 
-            built = true;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
         return instance;
     }
 
@@ -174,34 +179,32 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
 
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+    public void setStatus(Status status) {
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
@@ -282,15 +285,15 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
     private static final class AugmentationSchemaImpl implements AugmentationSchema, NamespaceRevisionAware {
         private SchemaPath targetPath;
         private RevisionAwareXPath whenCondition;
-        private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<UsesNode> uses = new HashSet<>();
+        private ImmutableSet<DataSchemaNode> childNodes;
+        private ImmutableSet<UsesNode> uses;
         private String description;
         private String reference;
         private Status status;
 
         private URI namespace;
         private Date revision;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
         private AugmentationSchema copyOf;
 
         private AugmentationSchemaImpl(final SchemaPath targetPath) {
@@ -305,33 +308,20 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
         public Optional<AugmentationSchema> getOriginalDefinition() {
             return Optional.fromNullable(this.copyOf);
         }
+
         @Override
         public SchemaPath getTargetPath() {
             return targetPath;
         }
 
-        private void setTargetPath(final SchemaPath path) {
-            this.targetPath = path;
-        }
-
         @Override
         public RevisionAwareXPath getWhenCondition() {
             return whenCondition;
         }
 
-        private void setWhenCondition(final RevisionAwareXPath whenCondition) {
-            this.whenCondition = whenCondition;
-        }
-
         @Override
         public Set<DataSchemaNode> getChildNodes() {
-            return Collections.unmodifiableSet(childNodes);
-        }
-
-        private void addChildNodes(final Set<DataSchemaNode> childNodes) {
-            if (childNodes != null) {
-                this.childNodes.addAll(childNodes);
-            }
+            return childNodes;
         }
 
         /**
@@ -345,13 +335,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
 
         @Override
         public Set<UsesNode> getUses() {
-            return Collections.unmodifiableSet(uses);
-        }
-
-        private void addUses(final Set<UsesNode> uses) {
-            if (uses != null) {
-                this.uses.addAll(uses);
-            }
+            return uses;
         }
 
         /**
@@ -380,13 +364,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(final List<UnknownSchemaNode> unknownSchemaNodes) {
-            if (unknownSchemaNodes != null) {
-                this.unknownNodes.addAll(unknownSchemaNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
@@ -404,19 +382,11 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
             return namespace;
         }
 
-        protected void setNamespace(final URI namespace) {
-            this.namespace = namespace;
-        }
-
         @Override
         public Date getRevision() {
             return revision;
         }
 
-        protected void setRevision(final Date revision) {
-            this.revision = revision;
-        }
-
         @Override
         public int hashCode() {
             final int prime = 17;
index 47f39659c65d625defba748b2fd5c3649895169b..c38d0efd32399528195e33ca198a6ffe86bc36ae 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -33,13 +32,20 @@ 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;
+import com.google.common.collect.ImmutableSet;
+
 public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder,
         AugmentationTargetBuilder {
-    private boolean isBuilt;
-    private final ChoiceNodeImpl instance;
+    private ChoiceNodeImpl instance;
+
     // DataSchemaNode args
+    private boolean augmenting;
+    private boolean addedByUses;
+    private boolean configuration;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
+    private final Set<AugmentationSchema> augmentations = new HashSet<>();
     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
     // ChoiceNode args
     private final Set<ChoiceCaseBuilder> caseBuilders = new HashSet<>();
@@ -48,7 +54,6 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
     public ChoiceBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new ChoiceNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line);
     }
 
@@ -56,17 +61,15 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
             final ChoiceNode base) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new ChoiceNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmenting = base.isAugmenting();
-        instance.addedByUses = base.isAddedByUses();
-        instance.configuration = base.isConfiguration();
-        instance.constraints = base.getConstraints();
-        instance.augmentations.addAll(base.getAvailableAugmentations());
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        augmenting = base.isAugmenting();
+        addedByUses = base.isAddedByUses();
+        configuration = base.isConfiguration();
+        augmentations.addAll(base.getAvailableAugmentations());
 
         URI ns = qname.getNamespace();
         Date rev = qname.getRevision();
@@ -79,38 +82,47 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
             }
         }
 
-        instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
+        addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
+                rev, pref));
     }
 
     @Override
     public ChoiceNode build() {
-        if (!isBuilt) {
-            instance.setConstraints(constraints.build());
-            instance.setDefaultCase(defaultCase);
-
-            // CASES
-            final Set<ChoiceCaseNode> cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-            for (ChoiceCaseBuilder caseBuilder : caseBuilders) {
-                cases.add(caseBuilder.build());
-            }
-            instance.addCases(cases);
+        if (instance != null) {
+            return instance;
+        }
 
-            // AUGMENTATIONS
-            final Set<AugmentationSchema> augmentations = new HashSet<>();
-            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
-                augmentations.add(builder.build());
-            }
-            instance.addAvailableAugmentations(augmentations);
+        instance = new ChoiceNodeImpl(qname, schemaPath);
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
+        instance.augmenting = augmenting;
+        instance.addedByUses = addedByUses;
+        instance.configuration = configuration;
+
+        instance.constraints = constraints.build();
+        instance.defaultCase = defaultCase;
+
+        // CASES
+        final Set<ChoiceCaseNode> cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+        for (ChoiceCaseBuilder caseBuilder : caseBuilders) {
+            cases.add(caseBuilder.build());
+        }
+        instance.cases = ImmutableSet.copyOf(cases);
+
+        // AUGMENTATIONS
+        for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+            augmentations.add(builder.build());
+        }
+        instance.augmentations = ImmutableSet.copyOf(augmentations);
 
-            isBuilt = true;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
         return instance;
     }
 
@@ -118,16 +130,6 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
         return caseBuilders;
     }
 
-    @Override
-    public SchemaPath getPath() {
-        return instance.path;
-    }
-
-    @Override
-    public void setPath(final SchemaPath path) {
-        instance.path = path;
-    }
-
     /**
      * Get case by name.
      *
@@ -183,66 +185,34 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
         }
     }
 
-    @Override
-    public String getDescription() {
-        return instance.description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        instance.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return instance.reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
-        instance.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return instance.status;
-    }
-
-    @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
-    }
-
     @Override
     public boolean isAugmenting() {
-        return instance.augmenting;
+        return augmenting;
     }
 
     @Override
     public void setAugmenting(final boolean augmenting) {
-        instance.augmenting = augmenting;
+        this.augmenting = augmenting;
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
     public boolean isConfiguration() {
-        return instance.configuration;
+        return configuration;
     }
 
     @Override
     public void setConfiguration(final boolean configuration) {
-        instance.configuration = configuration;
+        this.configuration = configuration;
     }
 
     @Override
@@ -311,17 +281,17 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
 
     private static final class ChoiceNodeImpl implements ChoiceNode {
         private final QName qname;
-        private SchemaPath path;
+        private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
+        private Status status;
         private boolean augmenting;
         private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraints;
-        private final Set<ChoiceCaseNode> cases = new HashSet<>();
-        private final Set<AugmentationSchema> augmentations = new HashSet<>();
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableSet<ChoiceCaseNode> cases;
+        private ImmutableSet<AugmentationSchema> augmentations;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
         private String defaultCase;
 
         private ChoiceNodeImpl(final QName qname, final SchemaPath path) {
@@ -374,35 +344,19 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
             return constraints;
         }
 
-        private void setConstraints(final ConstraintDefinition constraints) {
-            this.constraints = constraints;
-        }
-
         @Override
         public Set<AugmentationSchema> getAvailableAugmentations() {
-            return Collections.unmodifiableSet(augmentations);
-        }
-
-        private void addAvailableAugmentations(final Set<AugmentationSchema> availableAugmentations) {
-            if (availableAugmentations != null) {
-                this.augmentations.addAll(availableAugmentations);
-            }
+            return augmentations;
         }
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(final List<UnknownSchemaNode> unknownSchemaNodes) {
-            if (unknownSchemaNodes != null) {
-                this.unknownNodes.addAll(unknownSchemaNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
         public Set<ChoiceCaseNode> getCases() {
-            return Collections.unmodifiableSet(cases);
+            return cases;
         }
 
         @Override
@@ -432,21 +386,11 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
             return null;
         }
 
-        private void addCases(final Set<ChoiceCaseNode> cases) {
-            if (cases != null) {
-                this.cases.addAll(cases);
-            }
-        }
-
         @Override
         public String getDefaultCase() {
             return defaultCase;
         }
 
-        private void setDefaultCase(final String defaultCase) {
-            this.defaultCase = defaultCase;
-        }
-
         @Override
         public int hashCode() {
             final int prime = 31;
index 8c39f6020422c5172fc23cea518b263bd15427c0..dd82fbef442f9c1994adcec94d5ce7e02d3bc755 100644 (file)
@@ -11,10 +11,8 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -33,149 +31,160 @@ import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuil
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-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.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
         AugmentationTargetBuilder {
-    private boolean isBuilt;
-    private final ChoiceCaseNodeImpl instance;
+    private ChoiceCaseNodeImpl instance;
     // SchemaNode args
-    private final SchemaPath schemaPath;
+    private SchemaPath schemaPath;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
+    // DataSchemaNode args
+    private boolean augmenting;
+    private boolean addedByUses;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
 
     public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new ChoiceCaseNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line);
     }
 
-    public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final ChoiceCaseNode base) {
+    public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
+            final ChoiceCaseNode base) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new ChoiceCaseNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmenting = base.isAugmenting();
-        instance.addedByUses = base.isAddedByUses();
-        instance.constraints = base.getConstraints();
-        instance.augmentations.addAll(base.getAvailableAugmentations());
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        augmenting = base.isAugmenting();
+        addedByUses = base.isAddedByUses();
 
         URI ns = qname.getNamespace();
         Date rev = qname.getRevision();
         String pref = qname.getPrefix();
         addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
         addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
+        addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
+                rev, pref));
 
-        instance.uses.addAll(base.getUses());
-        instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
+        augmentations.addAll(base.getAvailableAugmentations());
+        usesNodes.addAll(base.getUses());
     }
 
     @Override
     public ChoiceCaseNode build() {
-        if (!isBuilt) {
-            instance.setConstraints(constraints.build());
+        if (instance != null) {
+            return instance;
+        }
 
-            // CHILD NODES
-            for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childNodes.add(node.build());
-            }
-            instance.addChildNodes(childNodes);
+        instance = new ChoiceCaseNodeImpl(qname, schemaPath);
 
-            // USES
-            for (UsesNodeBuilder builder : addedUsesNodes) {
-                usesNodes.add(builder.build());
-            }
-            instance.addUses(usesNodes);
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
+        instance.augmenting = augmenting;
+        instance.addedByUses = addedByUses;
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        instance.constraints = constraints.build();
 
-            // AUGMENTATIONS
-            final Set<AugmentationSchema> augmentations = new HashSet<>();
-            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
-                augmentations.add(builder.build());
-            }
-            instance.addAvailableAugmentations(augmentations);
+        // CHILD NODES
+        for (DataSchemaNodeBuilder node : addedChildNodes) {
+            childNodes.add(node.build());
+        }
+        instance.childNodes = ImmutableSet.copyOf(childNodes);
 
-            isBuilt = true;
+        // USES
+        for (UsesNodeBuilder builder : addedUsesNodes) {
+            usesNodes.add(builder.build());
         }
+        instance.uses = ImmutableSet.copyOf(usesNodes);
+
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
+        }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
+        // AUGMENTATIONS
+        for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+            augmentations.add(builder.build());
+        }
+        instance.augmentations = ImmutableSet.copyOf(augmentations);
 
         return instance;
     }
 
-
     @Override
     public SchemaPath getPath() {
-        return instance.path;
+        return schemaPath;
     }
 
     @Override
     public void setPath(final SchemaPath path) {
-        instance.path = path;
+        this.schemaPath = path;
     }
 
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+    public void setStatus(Status status) {
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
     public boolean isAugmenting() {
-        return instance.augmenting;
+        return augmenting;
     }
 
     @Override
     public void setAugmenting(final boolean augmenting) {
-        instance.augmenting = augmenting;
+        this.augmenting = augmenting;
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
@@ -252,17 +261,17 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
 
     private static final class ChoiceCaseNodeImpl implements ChoiceCaseNode {
         private final QName qname;
-        private SchemaPath path;
+        private final SchemaPath path;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
         private boolean augmenting;
         private boolean addedByUses;
         private ConstraintDefinition constraints;
-        private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<AugmentationSchema> augmentations = new HashSet<>();
-        private final Set<UsesNode> uses = new HashSet<>();
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableSet<DataSchemaNode> childNodes;
+        private ImmutableSet<AugmentationSchema> augmentations;
+        private ImmutableSet<UsesNode> uses;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private ChoiceCaseNodeImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -304,10 +313,6 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
             return constraints;
         }
 
-        private void setConstraints(final ConstraintDefinition constraints) {
-            this.constraints = constraints;
-        }
-
         @Override
         public boolean isAugmenting() {
             return augmenting;
@@ -320,13 +325,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         /**
@@ -340,13 +339,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
 
         @Override
         public Set<DataSchemaNode> getChildNodes() {
-            return Collections.unmodifiableSet(childNodes);
-        }
-
-        private void addChildNodes(final Set<DataSchemaNode> childNodes) {
-            if (childNodes != null) {
-                this.childNodes.addAll(childNodes);
-            }
+            return childNodes;
         }
 
         @Override
@@ -366,24 +359,12 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
 
         @Override
         public Set<UsesNode> getUses() {
-            return Collections.unmodifiableSet(uses);
-        }
-
-        private void addUses(final Set<UsesNode> uses) {
-            if (uses != null) {
-                this.uses.addAll(uses);
-            }
+            return uses;
         }
 
         @Override
         public Set<AugmentationSchema> getAvailableAugmentations() {
-            return Collections.unmodifiableSet(augmentations);
-        }
-
-        private void addAvailableAugmentations(final Set<AugmentationSchema> augmentations) {
-            if (augmentations != null) {
-                this.augmentations.addAll(augmentations);
-            }
+            return augmentations;
         }
 
         @Override
index 4e1aab1bfb29cdcb531456dd13f512118b60f1b7..ccf31553a4efcea6b274c393d9e3adbc68eb293f 100644 (file)
@@ -9,12 +9,9 @@ package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.*;
@@ -25,25 +22,34 @@ import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-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.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements
         AugmentationTargetBuilder, DataSchemaNodeBuilder {
-    private boolean isBuilt;
-    private final ContainerSchemaNodeImpl instance;
-
-    private final SchemaPath path;
+    private ContainerSchemaNodeImpl instance;
+    private boolean presence;
+    // SchemaNode args
+    private SchemaPath path;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
     // DataSchemaNode args
+    private boolean augmenting;
+    private boolean addedByUses;
+    private boolean configuration;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
 
     public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.path = path;
-        this.instance = new ContainerSchemaNodeImpl(qname, path);
         this.constraints = new ConstraintsBuilder(moduleName, line);
     }
 
@@ -52,17 +58,15 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             final SchemaPath path, final ContainerSchemaNode base) {
         super(moduleName, line, qname);
         this.path = path;
-        instance = new ContainerSchemaNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmenting = base.isAugmenting();
-        instance.addedByUses = base.isAddedByUses();
-        instance.configuration = base.isConfiguration();
-        instance.constraints = base.getConstraints();
-        instance.augmentations.addAll(base.getAvailableAugmentations());
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        augmenting = base.isAugmenting();
+        addedByUses = base.isAddedByUses();
+        configuration = base.isConfiguration();
+        presence = base.isPresenceContainer();
 
         URI ns = qname.getNamespace();
         Date rev = qname.getRevision();
@@ -73,59 +77,63 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
         addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
                 rev, pref));
 
-        instance.uses.addAll(base.getUses());
-        instance.presence = base.isPresenceContainer();
-        instance.configuration = base.isConfiguration();
-        instance.configuration = base.isConfiguration();
+        augmentations.addAll(base.getAvailableAugmentations());
+        usesNodes.addAll(base.getUses());
     }
 
     @Override
     public ContainerSchemaNode build() {
-        if (!isBuilt) {
-            // USES
-            for (UsesNodeBuilder builder : addedUsesNodes) {
-                usesNodes.add(builder.build());
-            }
-            instance.addUses(usesNodes);
+        if (instance != null) {
+            return instance;
+        }
 
-            // CHILD NODES
-            for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childNodes.add(node.build());
-            }
-            instance.addChildNodes(childNodes);
+        instance = new ContainerSchemaNodeImpl(qname, path);
 
-            // GROUPINGS
-            for (GroupingBuilder builder : addedGroupings) {
-                groupings.add(builder.build());
-            }
-            instance.addGroupings(groupings);
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
+        instance.augmenting = augmenting;
+        instance.addedByUses = addedByUses;
+        instance.configuration = configuration;
+        instance.constraints = constraints.build();
+        instance.presence = presence;
 
-            // TYPEDEFS
-            for (TypeDefinitionBuilder entry : addedTypedefs) {
-                typedefs.add(entry.build());
-            }
-            instance.addTypeDefinitions(typedefs);
+        // CHILD NODES
+        for (DataSchemaNodeBuilder node : addedChildNodes) {
+            childNodes.add(node.build());
+        }
+        instance.childNodes = ImmutableSet.copyOf(childNodes);
 
-            // AUGMENTATIONS
-            final List<AugmentationSchema> augmentations = new ArrayList<>();
-            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
-                augmentations.add(builder.build());
-            }
-            instance.addAvailableAugmentations(new HashSet<>(augmentations));
+        // GROUPINGS
+        for (GroupingBuilder builder : addedGroupings) {
+            groupings.add(builder.build());
+        }
+        instance.groupings = ImmutableSet.copyOf(groupings);
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        // TYPEDEFS
+        for (TypeDefinitionBuilder entry : addedTypedefs) {
+            typedefs.add(entry.build());
+        }
+        instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
 
-            if (constraints != null) {
-                instance.setConstraints(constraints.build());
-            }
+        // USES
+        for (UsesNodeBuilder builder : addedUsesNodes) {
+            usesNodes.add(builder.build());
+        }
+        instance.uses = ImmutableSet.copyOf(usesNodes);
+
+        // AUGMENTATIONS
+        for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+            augmentations.add(builder.build());
+        }
+        instance.augmentations = ImmutableSet.copyOf(augmentations);
 
-            isBuilt = true;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
         return instance;
     }
 
@@ -157,74 +165,72 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
 
     @Override
     public SchemaPath getPath() {
-        return instance.path;
+        return path;
     }
 
     @Override
     public void setPath(SchemaPath path) {
-        instance.path = path;
+        this.path = path;
     }
 
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
     public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
     public boolean isAugmenting() {
-        return instance.augmenting;
+        return augmenting;
     }
 
     @Override
     public void setAugmenting(boolean augmenting) {
-        instance.augmenting = augmenting;
+        this.augmenting = augmenting;
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
     public boolean isConfiguration() {
-        return instance.configuration;
+        return configuration;
     }
 
     @Override
     public void setConfiguration(boolean configuration) {
-        instance.configuration = configuration;
+        this.configuration = configuration;
     }
 
     @Override
@@ -233,11 +239,11 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
     }
 
     public boolean isPresence() {
-        return instance.presence;
+        return presence;
     }
 
     public void setPresence(boolean presence) {
-        instance.presence = presence;
+        this.presence = presence;
     }
 
     @Override
@@ -284,20 +290,22 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
 
     private static final class ContainerSchemaNodeImpl implements ContainerSchemaNode {
         private final QName qname;
-        private SchemaPath path;
+        private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
+        private Status status;
         private boolean augmenting;
         private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraints;
-        private final Set<AugmentationSchema> augmentations = new HashSet<>();
-        private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<TypeDefinition<?>> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<UsesNode> uses = new HashSet<>();
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+
+        private ImmutableSet<AugmentationSchema> augmentations;
+        private ImmutableSet<DataSchemaNode> childNodes;
+        private ImmutableSet<GroupingDefinition> groupings;
+        private ImmutableSet<TypeDefinition<?>> typeDefinitions;
+        private ImmutableSet<UsesNode> uses;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
+
         private boolean presence;
 
         private ContainerSchemaNodeImpl(QName qname, SchemaPath path) {
@@ -350,41 +358,19 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             return constraints;
         }
 
-        private void setConstraints(ConstraintDefinition constraints) {
-            this.constraints = constraints;
-        }
-
         @Override
         public Set<AugmentationSchema> getAvailableAugmentations() {
-            return Collections.unmodifiableSet(augmentations);
-        }
-
-        private void addAvailableAugmentations(Set<AugmentationSchema> augmentations) {
-            if (augmentations != null) {
-                this.augmentations.addAll(augmentations);
-            }
+            return augmentations;
         }
 
         @Override
         public Set<DataSchemaNode> getChildNodes() {
-            return Collections.unmodifiableSet(childNodes);
-        }
-
-        private void addChildNodes(Set<DataSchemaNode> childNodes) {
-            if (childNodes != null) {
-                this.childNodes.addAll(childNodes);
-            }
+            return childNodes;
         }
 
         @Override
         public Set<GroupingDefinition> getGroupings() {
-            return Collections.unmodifiableSet(groupings);
-        }
-
-        private void addGroupings(Set<GroupingDefinition> groupings) {
-            if (groupings != null) {
-                this.groupings.addAll(groupings);
-            }
+            return groupings;
         }
 
         @Override
@@ -399,13 +385,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
 
         @Override
         public Set<UsesNode> getUses() {
-            return Collections.unmodifiableSet(uses);
-        }
-
-        private void addUses(Set<UsesNode> uses) {
-            if (uses != null) {
-                this.uses.addAll(uses);
-            }
+            return uses;
         }
 
         @Override
@@ -415,24 +395,12 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
 
         @Override
         public Set<TypeDefinition<?>> getTypeDefinitions() {
-            return Collections.unmodifiableSet(typeDefinitions);
-        }
-
-        private void addTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
-            if (typeDefinitions != null) {
-                this.typeDefinitions.addAll(typeDefinitions);
-            }
+            return typeDefinitions;
         }
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
-            if (unknownSchemaNodes != null) {
-                this.unknownNodes.addAll(unknownSchemaNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index 19d2cf35da159b7d434708eaa54509823c2f4d11..71d1f06ef5e453750aa2122e4a19231a76702624 100644 (file)
@@ -14,11 +14,14 @@ import org.opendaylight.yangtools.yang.model.api.Deviation.Deviate;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
 import org.opendaylight.yangtools.yang.parser.util.*;
 
+import com.google.common.collect.ImmutableList;
+
 public final class DeviationBuilder extends AbstractBuilder {
-    private boolean isBuilt;
-    private final DeviationImpl instance;
+    private DeviationImpl instance;
     private final String targetPathStr;
     private SchemaPath targetPath;
+    private Deviate deviate;
+    private String reference;
 
     DeviationBuilder(final String moduleName, final int line, final String targetPathStr) {
         super(moduleName, line);
@@ -28,7 +31,6 @@ public final class DeviationBuilder extends AbstractBuilder {
         }
         this.targetPathStr = targetPathStr;
         this.targetPath = ParserUtils.parseXPathString(targetPathStr);
-        instance = new DeviationImpl();
     }
 
     @Override
@@ -37,18 +39,20 @@ public final class DeviationBuilder extends AbstractBuilder {
             throw new YangParseException(moduleName, line, "Unresolved deviation target");
         }
 
-        if (!isBuilt) {
-            instance.setTargetPath(targetPath);
+        if (instance != null) {
+            return instance;
+        }
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(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;
     }
@@ -63,20 +67,20 @@ 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);
         }
     }
 
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
@@ -88,7 +92,7 @@ public final class DeviationBuilder extends AbstractBuilder {
         private SchemaPath targetPath;
         private Deviate deviate;
         private String reference;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private DeviationImpl() {
         }
@@ -98,19 +102,11 @@ 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;
@@ -118,13 +114,7 @@ public final class DeviationBuilder extends AbstractBuilder {
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
-            if (unknownSchemaNodes != null) {
-                this.unknownNodes.addAll(unknownSchemaNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index a051a1bc868c1aae6a87961bb0dadc6ee8f64ae1..9b48c9dc15d5f80925939eed75b0faf0d3178232 100644 (file)
@@ -7,8 +7,6 @@
  */
 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.common.QName;
@@ -17,77 +15,44 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
+
+import com.google.common.collect.ImmutableList;
 
 public final class ExtensionBuilder extends AbstractSchemaNodeBuilder {
-    private boolean isBuilt;
-    private final ExtensionDefinitionImpl instance;
+    private ExtensionDefinitionImpl instance;
+    private String argument;
+    private boolean yin;
 
     ExtensionBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new ExtensionDefinitionImpl(qname, path);
     }
 
     @Override
     public ExtensionDefinition build() {
-        if (!isBuilt) {
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder un : addedUnknownNodes) {
-                unknownNodes.add(un.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
-
-            isBuilt = true;
+        if (instance != null) {
+            return instance;
         }
 
-        return instance;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return instance.schemaPath;
-    }
-
-    @Override
-    public String getDescription() {
-        return instance.description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        instance.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return instance.reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
-        instance.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return instance.status;
-    }
+        instance = new ExtensionDefinitionImpl(qname, schemaPath);
+        instance.argument = argument;
+        instance.yin = yin;
 
-    @Override
-    public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
+        return instance;
     }
 
     public void setYinElement(boolean yin) {
-        instance.yin = yin;
+        this.yin = yin;
     }
 
     public void setArgument(String argument) {
-        instance.argument = argument;
+        this.argument = argument;
     }
 
     @Override
@@ -101,8 +66,8 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder {
         private final SchemaPath schemaPath;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private Status status;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
         private boolean yin;
 
         private ExtensionDefinitionImpl(QName qname, SchemaPath path) {
@@ -137,13 +102,7 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder {
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index 4b566d8ec076392121a4b8a55f18990dd84c69ba..0417dd4dba0edf50e04d489eff54bfb09960d82c 100644 (file)
@@ -7,8 +7,6 @@
  */
 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.common.QName;
@@ -17,68 +15,32 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
+
+import com.google.common.collect.ImmutableList;
 
 public final class FeatureBuilder extends AbstractSchemaNodeBuilder {
-    private boolean isBuilt;
-    private final FeatureDefinitionImpl instance;
+    private FeatureDefinitionImpl instance;
 
     FeatureBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new FeatureDefinitionImpl(qname, path);
     }
 
     @Override
     public FeatureDefinitionImpl build() {
-        if (!isBuilt) {
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
-
-            isBuilt = true;
+        if (instance != null) {
+            return instance;
         }
-        return instance;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return instance.path;
-    }
-
-    @Override
-    public String getDescription() {
-        return instance.description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        instance.description = description;
-    }
 
-    @Override
-    public String getReference() {
-        return instance.reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
-        instance.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return instance.status;
-    }
+        instance = new FeatureDefinitionImpl(qname, schemaPath);
 
-    @Override
-    public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
+        return instance;
     }
 
     @Override
@@ -91,8 +53,8 @@ public final class FeatureBuilder extends AbstractSchemaNodeBuilder {
         private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private Status status;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private FeatureDefinitionImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -126,13 +88,7 @@ public final class FeatureBuilder extends AbstractSchemaNodeBuilder {
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index e2bf02ce186bdd1886a1fddbbe57ed868e4b9196..90a49d1b196f30986c11d84713e3e4eb53a637b6 100644 (file)
@@ -8,13 +8,10 @@
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -30,31 +27,38 @@ import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.CopyUtils;
 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder implements GroupingBuilder {
-    private boolean isBuilt;
-    private final GroupingDefinitionImpl instance;
+    private GroupingDefinitionImpl instance;
+    // SchemaNode args
     private SchemaPath schemaPath;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
+    // DataSchemaNode args
+    private boolean addedByUses;
 
     public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         schemaPath = path;
-        instance = new GroupingDefinitionImpl(qname, path);
     }
 
-    public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path, final GroupingDefinition base) {
+    public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path,
+            final GroupingDefinition base) {
         super(moduleName, line, base.getQName());
         schemaPath = path;
-        instance = new GroupingDefinitionImpl(qname, path);
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.addedByUses = base.isAddedByUses();
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        addedByUses = base.isAddedByUses();
 
         URI ns = qname.getNamespace();
         Date rev = qname.getRevision();
@@ -65,45 +69,51 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
         addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
                 rev, pref));
 
-        instance.uses.addAll(base.getUses());
+        usesNodes.addAll(base.getUses());
     }
 
     @Override
     public GroupingDefinition build() {
-        if (!isBuilt) {
-            // CHILD NODES
-            for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childNodes.add(node.build());
-            }
-            instance.addChildNodes(childNodes);
+        if (instance != null) {
+            return instance;
+        }
 
-            // GROUPINGS
-            for (GroupingBuilder builder : addedGroupings) {
-                groupings.add(builder.build());
-            }
-            instance.addGroupings(groupings);
+        instance = new GroupingDefinitionImpl(qname, schemaPath);
 
-            // TYPEDEFS
-            for (TypeDefinitionBuilder entry : addedTypedefs) {
-                typedefs.add(entry.build());
-            }
-            instance.addTypeDefinitions(typedefs);
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
+        instance.addedByUses = addedByUses;
 
-            // USES
-            for (UsesNodeBuilder builder : addedUsesNodes) {
-                usesNodes.add(builder.build());
-            }
-            instance.addUses(usesNodes);
+        // CHILD NODES
+        for (DataSchemaNodeBuilder node : addedChildNodes) {
+            childNodes.add(node.build());
+        }
+        instance.childNodes = ImmutableSet.copyOf(childNodes);
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        // GROUPINGS
+        for (GroupingBuilder builder : addedGroupings) {
+            groupings.add(builder.build());
+        }
+        instance.groupings = ImmutableSet.copyOf(groupings);
+
+        // TYPEDEFS
+        for (TypeDefinitionBuilder entry : addedTypedefs) {
+            typedefs.add(entry.build());
+        }
+        instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
 
-            isBuilt = true;
+        // USES
+        for (UsesNodeBuilder builder : addedUsesNodes) {
+            usesNodes.add(builder.build());
         }
+        instance.uses = ImmutableSet.copyOf(usesNodes);
+
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
+        }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
 
         return instance;
     }
@@ -174,46 +184,49 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
         return schemaPath;
     }
 
+    @Override
+    public void setPath(final SchemaPath path) {
+        this.schemaPath = path;
+    }
+
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
     public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
@@ -262,7 +275,6 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
         return true;
     }
 
-
     private static final class GroupingDefinitionImpl implements GroupingDefinition {
         private final QName qname;
         private final SchemaPath path;
@@ -270,11 +282,11 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
         private String reference;
         private Status status;
         private boolean addedByUses;
-        private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<TypeDefinition<?>> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<UsesNode> uses = new HashSet<>();
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableSet<DataSchemaNode> childNodes;
+        private ImmutableSet<GroupingDefinition> groupings;
+        private ImmutableSet<TypeDefinition<?>> typeDefinitions;
+        private ImmutableSet<UsesNode> uses;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private GroupingDefinitionImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -313,57 +325,27 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
 
         @Override
         public Set<DataSchemaNode> getChildNodes() {
-            return Collections.unmodifiableSet(childNodes);
-        }
-
-        private void addChildNodes(Set<DataSchemaNode> childNodes) {
-            if (childNodes != null) {
-                this.childNodes.addAll(childNodes);
-            }
+            return childNodes;
         }
 
         @Override
         public Set<GroupingDefinition> getGroupings() {
-            return Collections.unmodifiableSet(groupings);
-        }
-
-        private void addGroupings(Set<GroupingDefinition> groupings) {
-            if (groupings != null) {
-                this.groupings.addAll(groupings);
-            }
+            return groupings;
         }
 
         @Override
         public Set<UsesNode> getUses() {
-            return Collections.unmodifiableSet(uses);
-        }
-
-        private void addUses(Set<UsesNode> uses) {
-            if (uses != null) {
-                this.uses.addAll(uses);
-            }
+            return uses;
         }
 
         @Override
         public Set<TypeDefinition<?>> getTypeDefinitions() {
-            return Collections.unmodifiableSet(typeDefinitions);
-        }
-
-        private void addTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
-            if (typeDefinitions != null) {
-                this.typeDefinitions.addAll(typeDefinitions);
-            }
+            return typeDefinitions;
         }
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index 909773d987dd360e17df8371cd8cb6b68dfa725d..d084ed0b7f7bb763dd03d16a2b752206adc366d3 100644 (file)
@@ -7,16 +7,20 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.*;
-
+import com.google.common.collect.ImmutableList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.*;
+import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
 
 public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
-    private boolean isBuilt;
-    private final IdentitySchemaNodeImpl instance;
+    private IdentitySchemaNodeImpl instance;
     private IdentitySchemaNode baseIdentity;
     private IdentitySchemaNodeBuilder baseIdentityBuilder;
     private final Set<IdentitySchemaNode> derivedIdentities = new HashSet<>();
@@ -24,8 +28,7 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
 
     IdentitySchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
-        this.schemaPath = path;
-        instance = new IdentitySchemaNodeImpl(qname, path, derivedIdentities);
+        schemaPath = path;
     }
 
     IdentitySchemaNodeBuilder(final String moduleName, IdentitySchemaNode base) {
@@ -33,66 +36,33 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
         schemaPath = base.getPath();
         derivedIdentities.addAll(base.getDerivedIdentities());
         unknownNodes.addAll(base.getUnknownSchemaNodes());
-        instance = new IdentitySchemaNodeImpl(qname, schemaPath, derivedIdentities);
     }
 
     @Override
     public IdentitySchemaNode build() {
-        if (!isBuilt) {
-            if(baseIdentityBuilder != null) {
-                baseIdentityBuilder.addDerivedIdentity(instance);
-                baseIdentity = baseIdentityBuilder.build();
-            }
-            instance.setBaseIdentity(baseIdentity);
-
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
-
-            isBuilt = true;
+        if (instance != null) {
+            return instance;
         }
 
-        return instance;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return instance.path;
-    }
-
-    @Override
-    public String getDescription() {
-        return instance.description;
-    }
+        instance = new IdentitySchemaNodeImpl(qname, schemaPath, derivedIdentities);
 
-    @Override
-    public void setDescription(final String description) {
         instance.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return instance.reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
         instance.reference = reference;
-    }
+        instance.status = status;
 
-    @Override
-    public Status getStatus() {
-        return instance.status;
-    }
+        if (baseIdentityBuilder != null) {
+            baseIdentityBuilder.addDerivedIdentity(instance);
+            baseIdentity = baseIdentityBuilder.build();
+        }
+        instance.baseIdentity = baseIdentity;
 
-    @Override
-    public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
+        return instance;
     }
 
     public String getBaseIdentityName() {
@@ -125,10 +95,11 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
         private final Set<IdentitySchemaNode> derivedIdentities;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private Status status;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
-        private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path, final Set<IdentitySchemaNode> derivedIdentities) {
+        private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path,
+                final Set<IdentitySchemaNode> derivedIdentities) {
             this.qname = qname;
             this.path = path;
             this.derivedIdentities = derivedIdentities;
@@ -144,10 +115,6 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
             return baseIdentity;
         }
 
-        private void setBaseIdentity(final IdentitySchemaNode baseIdentity) {
-            this.baseIdentity = baseIdentity;
-        }
-
         @Override
         public Set<IdentitySchemaNode> getDerivedIdentities() {
             return Collections.unmodifiableSet(derivedIdentities);
@@ -175,13 +142,7 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
-            if (unknownSchemaNodes != null) {
-                this.unknownNodes.addAll(unknownSchemaNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index e61097366cb3edab4d1ff2fbaaced7a068c4b4ae..fca44fb1efd266598758f2ffbda9cb79d2ae4fd6 100644 (file)
@@ -26,7 +26,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple
     private static final String NAME = "identityref";
 
     private final String baseString;
-    private final SchemaPath schemaPath;
+    private SchemaPath schemaPath;
     private IdentitySchemaNodeBuilder baseIdentity;
 
     public IdentityrefTypeBuilder(final String moduleName, final int line, final String baseString,
@@ -114,6 +114,11 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple
         return schemaPath;
     }
 
+    @Override
+    public void setPath(SchemaPath path) {
+        this.schemaPath = path;
+    }
+
     @Override
     public String getDescription() {
         return null;
index 3f9f7ae8ca45526290047e188c4ec59679b159d4..c5f9732d2fb194dab6022118df32b8d7732e9504 100644 (file)
@@ -7,8 +7,6 @@
  */
 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.common.QName;
@@ -20,61 +18,76 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 
 public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder {
-    private boolean isBuilt;
-    private final LeafListSchemaNodeImpl instance;
+    private LeafListSchemaNodeImpl instance;
+    private boolean userOrdered;
     // SchemaNode args
     private SchemaPath schemaPath;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
     // DataSchemaNode args
+    private boolean augmenting;
+    private boolean addedByUses;
+    private boolean configuration;
     private final ConstraintsBuilder constraints;
 
     public LeafListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new LeafListSchemaNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line);
     }
 
-    public LeafListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final LeafListSchemaNode base) {
+    public LeafListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
+            final LeafListSchemaNode base) {
         super(moduleName, line, qname);
         schemaPath = path;
-        instance = new LeafListSchemaNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmenting = base.isAugmenting();
-        instance.addedByUses = base.isAddedByUses();
-        instance.configuration = base.isConfiguration();
-        instance.constraintsDef = base.getConstraints();
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        augmenting = base.isAugmenting();
+        addedByUses = base.isAddedByUses();
+        configuration = base.isConfiguration();
         this.type = base.getType();
-        instance.userOrdered = base.isUserOrdered();
-        instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
+        userOrdered = base.isUserOrdered();
+        unknownNodes.addAll(base.getUnknownSchemaNodes());
     }
 
     @Override
     public LeafListSchemaNode build() {
-        if (!isBuilt) {
-            instance.setConstraints(constraints.build());
+        if (instance != null) {
+            return instance;
+        }
 
-            if (type == null) {
-                instance.setType(typedef.build());
-            } else {
-                instance.setType(type);
-            }
+        instance = new LeafListSchemaNodeImpl(qname, schemaPath);
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
+        instance.augmenting = augmenting;
+        instance.addedByUses = addedByUses;
+        instance.configuration = configuration;
+        instance.constraintsDef = constraints.build();
+        instance.userOrdered = userOrdered;
 
-            isBuilt = true;
+        if (type == null) {
+            instance.type = typedef.build();
+        } else {
+            instance.type = type;
         }
+
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
+        }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
         return instance;
     }
 
@@ -85,69 +98,67 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
 
     @Override
     public void setPath(SchemaPath path) {
-        instance.path = path;
+        this.schemaPath = path;
     }
 
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
     public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
     public boolean isAugmenting() {
-        return instance.augmenting;
+        return augmenting;
     }
 
     @Override
     public void setAugmenting(boolean augmenting) {
-        instance.augmenting = augmenting;
+        this.augmenting = augmenting;
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
     public boolean isConfiguration() {
-        return instance.configuration;
+        return configuration;
     }
 
     @Override
     public void setConfiguration(boolean configuration) {
-        instance.configuration = configuration;
+        this.configuration = configuration;
     }
 
     @Override
@@ -156,11 +167,11 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
     }
 
     public boolean isUserOrdered() {
-        return instance.userOrdered;
+        return userOrdered;
     }
 
     public void setUserOrdered(final boolean userOrdered) {
-        instance.userOrdered = userOrdered;
+        this.userOrdered = userOrdered;
     }
 
     @Override
@@ -207,17 +218,17 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
 
     private static final class LeafListSchemaNodeImpl implements LeafListSchemaNode {
         private final QName qname;
-        private SchemaPath path;
+        private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
+        private Status status;
         private boolean augmenting;
         private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private TypeDefinition<?> type;
         private boolean userOrdered;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private LeafListSchemaNodeImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -269,19 +280,11 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
             return constraintsDef;
         }
 
-        private void setConstraints(ConstraintDefinition constraintsDef) {
-            this.constraintsDef = constraintsDef;
-        }
-
         @Override
         public TypeDefinition<?> getType() {
             return type;
         }
 
-        public void setType(TypeDefinition<? extends TypeDefinition<?>> type) {
-            this.type = type;
-        }
-
         @Override
         public boolean isUserOrdered() {
             return userOrdered;
@@ -289,13 +292,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index e0303dce26b86a90a0c978854fa9c99fbf283111..f82cbac1bce717711938b722cfe12370dceb9d8e 100644 (file)
@@ -7,8 +7,6 @@
  */
 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.common.QName;
@@ -20,72 +18,88 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
 public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder {
-    private boolean isBuilt;
-    private final LeafSchemaNodeImpl instance;
+    private LeafSchemaNodeImpl instance;
+    private String defaultStr;
+    private String unitsStr;
     // SchemaNode args
     private SchemaPath schemaPath;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
     // DataSchemaNode args
+    private boolean augmenting;
+    private boolean addedByUses;
+    private boolean configuration;
     private final ConstraintsBuilder constraints;
 
     public LeafSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath schemaPath) {
         super(moduleName, line, qname);
         this.schemaPath = schemaPath;
-        instance = new LeafSchemaNodeImpl(qname, schemaPath);
         constraints = new ConstraintsBuilder(moduleName, line);
     }
 
     public LeafSchemaNodeBuilder(String moduleName, int line, QName qname, SchemaPath path, LeafSchemaNode base) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new LeafSchemaNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmenting = base.isAugmenting();
-        instance.addedByUses = base.isAddedByUses();
-        instance.configuration = base.isConfiguration();
-        instance.constraintsDef = base.getConstraints();
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        augmenting = base.isAugmenting();
+        addedByUses = base.isAddedByUses();
+        configuration = base.isConfiguration();
         this.type = base.getType();
-        instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
-        instance.defaultStr = base.getDefault();
-        instance.unitsStr = base.getUnits();
+        unknownNodes.addAll(base.getUnknownSchemaNodes());
+
+        defaultStr = base.getDefault();
+        unitsStr = base.getUnits();
     }
 
     @Override
     public LeafSchemaNode build() {
-        if (!isBuilt) {
-            instance.setConstraints(constraints.build());
+        if (instance != null) {
+            return instance;
+        }
 
-            if (type == null && typedef == null) {
-                throw new YangParseException(moduleName, line, "Failed to resolve leaf type.");
-            }
+        instance = new LeafSchemaNodeImpl(qname, schemaPath);
 
-            // TYPE
-            if (type == null) {
-                instance.setType(typedef.build());
-            } else {
-                instance.setType(type);
-            }
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
+        instance.augmenting = augmenting;
+        instance.addedByUses = addedByUses;
+        instance.configuration = configuration;
+        instance.constraintsDef = constraints.build();
+        instance.defaultStr = defaultStr;
+        instance.unitsStr = unitsStr;
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        if (type == null && typedef == null) {
+            throw new YangParseException(moduleName, line, "Failed to resolve leaf type.");
+        }
+
+        // TYPE
+        if (type == null) {
+            instance.type = typedef.build();
+        } else {
+            instance.type = type;
+        }
 
-            isBuilt = true;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
         return instance;
     }
 
-
     @Override
     public SchemaPath getPath() {
         return schemaPath;
@@ -93,7 +107,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
 
     @Override
     public void setPath(SchemaPath path) {
-        instance.path = path;
+        this.schemaPath = path;
     }
 
     @Override
@@ -103,80 +117,78 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
 
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
     public void setStatus(Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
     public boolean isAugmenting() {
-        return instance.augmenting;
+        return augmenting;
     }
 
     @Override
     public void setAugmenting(final boolean augmenting) {
-        instance.augmenting = augmenting;
+        this.augmenting = augmenting;
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
     public boolean isConfiguration() {
-        return instance.configuration;
+        return configuration;
     }
 
     @Override
     public void setConfiguration(final boolean configuration) {
-        instance.configuration = configuration;
+        this.configuration = configuration;
     }
 
     public String getDefaultStr() {
-        return instance.defaultStr;
+        return defaultStr;
     }
 
     public void setDefaultStr(String defaultStr) {
-        instance.defaultStr = defaultStr;
+        this.defaultStr = defaultStr;
     }
 
     public String getUnits() {
-        return instance.unitsStr;
+        return unitsStr;
     }
 
     public void setUnits(String unitsStr) {
-        instance.unitsStr = unitsStr;
+        this.unitsStr = unitsStr;
     }
 
     @Override
@@ -223,16 +235,16 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
 
     private static final class LeafSchemaNodeImpl implements LeafSchemaNode {
         private final QName qname;
-        private SchemaPath path;
+        private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
+        private Status status;
         private boolean augmenting;
         private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private TypeDefinition<?> type;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
         private String defaultStr;
         private String unitsStr;
 
@@ -286,28 +298,14 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
             return constraintsDef;
         }
 
-        private void setConstraints(ConstraintDefinition constraintsDef) {
-            this.constraintsDef = constraintsDef;
-        }
-
         @Override
         public TypeDefinition<?> getType() {
             return type;
         }
 
-        private void setType(TypeDefinition<? extends TypeDefinition<?>> type) {
-            this.type = type;
-        }
-
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index bddaf9f2ce00ffda652e506297b487fd4ec3e41c..c50feeeab01bc6eece4dba0f7720f917ac25af85 100644 (file)
@@ -9,12 +9,9 @@ package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -34,47 +31,54 @@ import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-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.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
         AugmentationTargetBuilder {
-    private boolean isBuilt;
-    private final ListSchemaNodeImpl instance;
+    private ListSchemaNodeImpl instance;
+    private boolean userOrdered;
     private List<String> keys;
+    private List<QName> keyDefinition;
     // SchemaNode args
-    private final SchemaPath schemaPath;
+    private SchemaPath schemaPath;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
     // DataSchemaNode args
+    private boolean augmenting;
+    private boolean addedByUses;
+    private boolean configuration;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
 
-
     public ListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new ListSchemaNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line);
     }
 
-    public ListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final ListSchemaNode base) {
+    public ListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
+            final ListSchemaNode base) {
         super(moduleName, line, qname);
         schemaPath = path;
-        instance = new ListSchemaNodeImpl(qname, path);
         constraints = new ConstraintsBuilder(moduleName, line, base.getConstraints());
 
-        instance.keyDefinition = base.getKeyDefinition();
-        instance.userOrdered = base.isUserOrdered();
+        keyDefinition = ImmutableList.copyOf(base.getKeyDefinition());
+        userOrdered = base.isUserOrdered();
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmenting = base.isAugmenting();
-        instance.addedByUses = base.isAddedByUses();
-        instance.configuration = base.isConfiguration();
-        instance.constraints = base.getConstraints();
-        instance.augmentations.addAll(base.getAvailableAugmentations());
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
+        augmenting = base.isAugmenting();
+        addedByUses = base.isAddedByUses();
+        configuration = base.isConfiguration();
 
         URI ns = qname.getNamespace();
         Date rev = qname.getRevision();
@@ -85,65 +89,74 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
                 rev, pref));
 
-        instance.uses.addAll(base.getUses());
+        augmentations.addAll(base.getAvailableAugmentations());
+        usesNodes.addAll(base.getUses());
     }
 
     @Override
     public ListSchemaNode build() {
-        if (!isBuilt) {
-            // CHILD NODES
-            for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childNodes.add(node.build());
-            }
-            instance.addChildNodes(childNodes);
-
-            // KEY
-            if (keys == null) {
-                instance.keyDefinition = Collections.<QName> emptyList();
-            } else {
-                List<QName> qnames = new ArrayList<>();
-                for (String key : keys) {
-                    qnames.add(instance.getDataChildByName(key).getQName());
-                }
-                instance.keyDefinition = qnames;
-            }
+        if (instance != null) {
+            return instance;
+        }
 
-            // TYPEDEFS
-            for (TypeDefinitionBuilder entry : addedTypedefs) {
-                typedefs.add(entry.build());
-            }
-            instance.addTypeDefinitions(typedefs);
+        instance = new ListSchemaNodeImpl(qname, schemaPath);
 
-            // USES
-            for (UsesNodeBuilder builder : addedUsesNodes) {
-                usesNodes.add(builder.build());
-            }
-            instance.addUses(usesNodes);
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
+        instance.augmenting = augmenting;
+        instance.addedByUses = addedByUses;
+        instance.configuration = configuration;
+        instance.constraints = constraints.build();
+        instance.userOrdered = userOrdered;
 
-            // GROUPINGS
-            for (GroupingBuilder builder : addedGroupings) {
-                groupings.add(builder.build());
-            }
-            instance.addGroupings(groupings);
+        // CHILD NODES
+        for (DataSchemaNodeBuilder node : addedChildNodes) {
+            childNodes.add(node.build());
+        }
+        instance.childNodes = ImmutableSet.copyOf(childNodes);
 
-            // AUGMENTATIONS
-            final Set<AugmentationSchema> augmentations = new HashSet<>();
-            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
-                augmentations.add(builder.build());
+        // KEY
+        if (keys == null) {
+            instance.keyDefinition = ImmutableList.of();
+        } else {
+            keyDefinition = new ArrayList<>();
+            for (String key : keys) {
+                keyDefinition.add(instance.getDataChildByName(key).getQName());
             }
-            instance.addAvailableAugmentations(augmentations);
+            instance.keyDefinition = ImmutableList.copyOf(keyDefinition);
+        }
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        // GROUPINGS
+        for (GroupingBuilder builder : addedGroupings) {
+            groupings.add(builder.build());
+        }
+        instance.groupings = ImmutableSet.copyOf(groupings);
 
-            instance.setConstraints(constraints.build());
+        // TYPEDEFS
+        for (TypeDefinitionBuilder entry : addedTypedefs) {
+            typedefs.add(entry.build());
+        }
+        instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
 
-            isBuilt = true;
+        // USES
+        for (UsesNodeBuilder builder : addedUsesNodes) {
+            usesNodes.add(builder.build());
         }
+        instance.uses = ImmutableSet.copyOf(usesNodes);
+
+        // AUGMENTATIONS
+        for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+            augmentations.add(builder.build());
+        }
+        instance.augmentations = ImmutableSet.copyOf(augmentations);
+
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
+        }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
         return instance;
     }
 
@@ -166,44 +179,42 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
 
     @Override
     public SchemaPath getPath() {
-        return instance.path;
+        return schemaPath;
     }
 
     @Override
-    public void setPath(final SchemaPath path) {
-        instance.path = path;
+    public void setPath(SchemaPath path) {
+        this.schemaPath = path;
     }
 
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+    public void setStatus(Status status) {
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
@@ -225,32 +236,32 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
 
     @Override
     public boolean isAugmenting() {
-        return instance.augmenting;
+        return augmenting;
     }
 
     @Override
-    public void setAugmenting(final boolean augmenting) {
-        instance.augmenting = augmenting;
+    public void setAugmenting(boolean augmenting) {
+        this.augmenting = augmenting;
     }
 
     @Override
     public boolean isAddedByUses() {
-        return instance.addedByUses;
+        return addedByUses;
     }
 
     @Override
     public void setAddedByUses(final boolean addedByUses) {
-        instance.addedByUses = addedByUses;
+        this.addedByUses = addedByUses;
     }
 
     @Override
     public boolean isConfiguration() {
-        return instance.configuration;
+        return configuration;
     }
 
     @Override
-    public void setConfiguration(final boolean configuration) {
-        instance.configuration = configuration;
+    public void setConfiguration(boolean configuration) {
+        this.configuration = configuration;
     }
 
     @Override
@@ -259,11 +270,11 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     }
 
     public boolean isUserOrdered() {
-        return instance.userOrdered;
+        return userOrdered;
     }
 
     public void setUserOrdered(final boolean userOrdered) {
-        instance.userOrdered = userOrdered;
+        this.userOrdered = userOrdered;
     }
 
     @Override
@@ -310,22 +321,22 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
 
     private static final class ListSchemaNodeImpl implements ListSchemaNode {
         private final QName qname;
-        private SchemaPath path;
+        private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
-        private List<QName> keyDefinition = Collections.emptyList();
+        private Status status;
+        private ImmutableList<QName> keyDefinition;
         private boolean augmenting;
         private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraints;
-        private final Set<AugmentationSchema> augmentations = new HashSet<>();
-        private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<TypeDefinition<?>> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<UsesNode> uses = new HashSet<>();
+        private ImmutableSet<AugmentationSchema> augmentations;
+        private ImmutableSet<DataSchemaNode> childNodes;
+        private ImmutableSet<GroupingDefinition> groupings;
+        private ImmutableSet<TypeDefinition<?>> typeDefinitions;
+        private ImmutableSet<UsesNode> uses;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
         private boolean userOrdered;
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
 
         private ListSchemaNodeImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -382,63 +393,29 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             return constraints;
         }
 
-        private void setConstraints(final ConstraintDefinition constraints) {
-            this.constraints = constraints;
-        }
-
         @Override
         public Set<AugmentationSchema> getAvailableAugmentations() {
-            return Collections.unmodifiableSet(augmentations);
-        }
-
-        private void addAvailableAugmentations(final Set<AugmentationSchema> augmentations) {
-            if (augmentations != null) {
-                this.augmentations.addAll(augmentations);
-            }
+            return augmentations;
         }
 
         @Override
         public Set<DataSchemaNode> getChildNodes() {
-            return Collections.unmodifiableSet(childNodes);
-        }
-
-        private void addChildNodes(final Set<DataSchemaNode> childNodes) {
-            if (childNodes != null) {
-                this.childNodes.addAll(childNodes);
-            }
+            return childNodes;
         }
 
         @Override
         public Set<GroupingDefinition> getGroupings() {
-            return Collections.unmodifiableSet(groupings);
-        }
-
-        private void addGroupings(final Set<GroupingDefinition> groupings) {
-            if (groupings != null) {
-                this.groupings.addAll(groupings);
-            }
+            return groupings;
         }
 
         @Override
         public Set<TypeDefinition<?>> getTypeDefinitions() {
-            return Collections.unmodifiableSet(typeDefinitions);
-        }
-
-        private void addTypeDefinitions(final Set<TypeDefinition<?>> typeDefinitions) {
-            if (typeDefinitions != null) {
-                this.typeDefinitions.addAll(typeDefinitions);
-            }
+            return typeDefinitions;
         }
 
         @Override
         public Set<UsesNode> getUses() {
-            return Collections.unmodifiableSet(uses);
-        }
-
-        private void addUses(final Set<UsesNode> uses) {
-            if (uses != null) {
-                this.uses.addAll(uses);
-            }
+            return uses;
         }
 
         @Override
@@ -458,13 +435,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void addUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index 9ad6fe0322e899cc8de5248f4f1c910d004db60a..824bd1a262cc2cf8a1cef670ab5435a288de7252 100644 (file)
@@ -9,12 +9,9 @@ package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -34,43 +31,49 @@ import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-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.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class NotificationBuilder extends AbstractDataNodeContainerBuilder implements SchemaNodeBuilder,
         AugmentationTargetBuilder {
-    private boolean isBuilt;
-    private final NotificationDefinitionImpl instance;
-    private final SchemaPath schemaPath;
+    private NotificationDefinitionImpl instance;
+    // SchemaNode args
+    private SchemaPath schemaPath;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
+    // AugmentationTarget args
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
 
     NotificationBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new NotificationDefinitionImpl(qname, path);
     }
 
     NotificationBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final NotificationDefinition base) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        instance = new NotificationDefinitionImpl(qname, path);
 
-        instance.description = base.getDescription();
-        instance.reference = base.getReference();
-        instance.status = base.getStatus();
-        instance.augmentations.addAll(base.getAvailableAugmentations());
+        description = base.getDescription();
+        reference = base.getReference();
+        status = base.getStatus();
 
         URI ns = qname.getNamespace();
         Date rev = qname.getRevision();
         String pref = qname.getPrefix();
         addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
         addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
+        addedTypedefs.addAll(ParserUtils.wrapTypedefs(moduleName, line, base, path, ns, rev, pref));
+        addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
+                rev, pref));
 
-        instance.groupings.addAll(base.getGroupings());
-        instance.typeDefinitions.addAll(base.getTypeDefinitions());
-        instance.uses.addAll(base.getUses());
-        instance.unknownNodes.addAll(base.getUnknownSchemaNodes());
+        augmentations.addAll(base.getAvailableAugmentations());
+        usesNodes.addAll(base.getUses());
     }
 
     @Override
@@ -78,47 +81,51 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
         if (!(parentBuilder instanceof ModuleBuilder)) {
             throw new YangParseException(moduleName, line, "Notification can be defined only under module (was " + parentBuilder + ")");
         }
-        if (!isBuilt) {
-            // CHILD NODES
-            for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childNodes.add(node.build());
-            }
-            instance.setChildNodes(childNodes);
+        if (instance != null) {
+            return instance;
+        }
 
-            // GROUPINGS
-            for (GroupingBuilder builder : addedGroupings) {
-                groupings.add(builder.build());
-            }
-            instance.setGroupings(groupings);
+        instance = new NotificationDefinitionImpl(qname, schemaPath);
 
-            // TYPEDEFS
-            for (TypeDefinitionBuilder entry : addedTypedefs) {
-                typedefs.add(entry.build());
-            }
-            instance.setTypeDefinitions(typedefs);
+        instance.description = description;
+        instance.reference = reference;
+        instance.status = status;
 
-            // USES
-            for (UsesNodeBuilder builder : addedUsesNodes) {
-                usesNodes.add(builder.build());
-            }
-            instance.setUses(usesNodes);
+        // CHILD NODES
+        for (DataSchemaNodeBuilder node : addedChildNodes) {
+            childNodes.add(node.build());
+        }
+        instance.childNodes = ImmutableSet.copyOf(childNodes);
 
-            // AUGMENTATIONS
-            final Set<AugmentationSchema> augmentations = new HashSet<>();
-            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
-                augmentations.add(builder.build());
-            }
-            instance.setAvailableAugmentations(augmentations);
+        // GROUPINGS
+        for (GroupingBuilder builder : addedGroupings) {
+            groupings.add(builder.build());
+        }
+        instance.groupings = ImmutableSet.copyOf(groupings);
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.setUnknownSchemaNodes(unknownNodes);
+        // TYPEDEFS
+        for (TypeDefinitionBuilder entry : addedTypedefs) {
+            typedefs.add(entry.build());
+        }
+        instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
+
+        // USES
+        for (UsesNodeBuilder builder : addedUsesNodes) {
+            usesNodes.add(builder.build());
+        }
+        instance.uses = ImmutableSet.copyOf(usesNodes);
+
+        // AUGMENTATIONS
+        for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+            augmentations.add(builder.build());
+        }
+        instance.augmentations = ImmutableSet.copyOf(augmentations);
 
-            isBuilt = true;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
 
         return instance;
     }
@@ -139,36 +146,39 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
         return schemaPath;
     }
 
+    @Override
+    public void setPath(SchemaPath path) {
+        this.schemaPath = path;
+    }
+
     @Override
     public String getDescription() {
-        return instance.description;
+        return description;
     }
 
     @Override
     public void setDescription(final String description) {
-        instance.description = description;
+        this.description = description;
     }
 
     @Override
     public String getReference() {
-        return instance.reference;
+        return reference;
     }
 
     @Override
     public void setReference(final String reference) {
-        instance.reference = reference;
+        this.reference = reference;
     }
 
     @Override
     public Status getStatus() {
-        return instance.status;
+        return status;
     }
 
     @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            instance.status = status;
-        }
+    public void setStatus(Status status) {
+        this.status = Preconditions.checkNotNull(status, "status cannot be null");
     }
 
     @Override
@@ -186,13 +196,13 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
         private final SchemaPath path;
         private String description;
         private String reference;
-        private Status status = Status.CURRENT;
-        private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-        private final Set<GroupingDefinition> groupings = new HashSet<>();
-        private final Set<TypeDefinition<?>> typeDefinitions = new HashSet<>();
-        private final Set<UsesNode> uses = new HashSet<>();
-        private final Set<AugmentationSchema> augmentations = new HashSet<>();
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private Status status;
+        private ImmutableSet<AugmentationSchema> augmentations;
+        private ImmutableSet<DataSchemaNode> childNodes;
+        private ImmutableSet<GroupingDefinition> groupings;
+        private ImmutableSet<TypeDefinition<?>> typeDefinitions;
+        private ImmutableSet<UsesNode> uses;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private NotificationDefinitionImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -226,68 +236,32 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
 
         @Override
         public Set<DataSchemaNode> getChildNodes() {
-            return Collections.unmodifiableSet(childNodes);
-        }
-
-        private void setChildNodes(final Set<DataSchemaNode> childNodes) {
-            if (childNodes != null) {
-                this.childNodes.addAll(childNodes);
-            }
+            return childNodes;
         }
 
         @Override
         public Set<GroupingDefinition> getGroupings() {
-            return Collections.unmodifiableSet(groupings);
-        }
-
-        private void setGroupings(final Set<GroupingDefinition> groupings) {
-            if (groupings != null) {
-                this.groupings.addAll(groupings);
-            }
+            return groupings;
         }
 
         @Override
         public Set<UsesNode> getUses() {
-            return Collections.unmodifiableSet(uses);
-        }
-
-        private void setUses(final Set<UsesNode> uses) {
-            if (uses != null) {
-                this.uses.addAll(uses);
-            }
+            return uses;
         }
 
         @Override
         public Set<TypeDefinition<?>> getTypeDefinitions() {
-            return Collections.unmodifiableSet(typeDefinitions);
-        }
-
-        private void setTypeDefinitions(final Set<TypeDefinition<?>> typeDefinitions) {
-            if (typeDefinitions != null) {
-                this.typeDefinitions.addAll(typeDefinitions);
-            }
+            return typeDefinitions;
         }
 
         @Override
         public Set<AugmentationSchema> getAvailableAugmentations() {
-            return Collections.unmodifiableSet(augmentations);
-        }
-
-        private void setAvailableAugmentations(final Set<AugmentationSchema> augmentations) {
-            if (augmentations != null) {
-                this.augmentations.addAll(augmentations);
-            }
+            return augmentations;
         }
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void setUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index 23b7aed4043e7348d5ad4e3f004684b93e54d93f..2be0209ac5a23ac5c070a0a6ec175cdb66ac4ccf 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -27,9 +25,11 @@ import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
-    private boolean isBuilt;
-    private final RpcDefinitionImpl instance;
+    private RpcDefinitionImpl instance;
     private ContainerSchemaNodeBuilder inputBuilder;
     private ContainerSchemaNodeBuilder outputBuilder;
     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<>();
@@ -46,78 +46,46 @@ public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
     RpcDefinitionBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
         super(moduleName, line, qname);
         this.schemaPath = path;
-        this.instance = new RpcDefinitionImpl(qname, path);
     }
 
     @Override
     public RpcDefinition build() {
-        if (!isBuilt) {
-            final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build();
-            final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build();
-            instance.setInput(input);
-            instance.setOutput(output);
-
-            // TYPEDEFS
-            final Set<TypeDefinition<?>> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-            for (TypeDefinitionBuilder entry : addedTypedefs) {
-                typedefs.add(entry.build());
-            }
-            instance.setTypeDefinitions(typedefs);
-
-            // GROUPINGS
-            final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-            for (GroupingBuilder entry : addedGroupings) {
-                groupings.add(entry.build());
-            }
-            instance.setGroupings(groupings);
-
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.setUnknownSchemaNodes(unknownNodes);
-
-            isBuilt = true;
+        if (instance != null) {
+            return instance;
         }
-        return instance;
-    }
 
-    @Override
-    public SchemaPath getPath() {
-        return instance.path;
-    }
+        instance = new RpcDefinitionImpl(qname, schemaPath);
 
-    @Override
-    public String getDescription() {
-        return instance.description;
-    }
+        final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build();
+        final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build();
+        instance.setInput(input);
+        instance.setOutput(output);
 
-    @Override
-    public void setDescription(final String description) {
         instance.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return instance.reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
         instance.reference = reference;
-    }
+        instance.status = status;
 
-    @Override
-    public Status getStatus() {
-        return instance.status;
-    }
+        // TYPEDEFS
+        final Set<TypeDefinition<?>> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+        for (TypeDefinitionBuilder entry : addedTypedefs) {
+            typedefs.add(entry.build());
+        }
+        instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
 
-    @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            instance.status = status;
+        // GROUPINGS
+        final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+        for (GroupingBuilder builder : addedGroupings) {
+            groupings.add(builder.build());
+        }
+        instance.groupings = ImmutableSet.copyOf(groupings);
+
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
+
+        return instance;
     }
 
     void setInput(final ContainerSchemaNodeBuilder inputBuilder) {
@@ -192,9 +160,9 @@ public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
         private Status status;
         private ContainerSchemaNode input;
         private ContainerSchemaNode output;
-        private final Set<TypeDefinition<?>> typeDefinitions = new HashSet<>();
-        private final Set<GroupingDefinition> groupings = new HashSet<>();
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableSet<TypeDefinition<?>> typeDefinitions;
+        private ImmutableSet<GroupingDefinition> groupings;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private RpcDefinitionImpl(final QName qname, final SchemaPath path) {
             this.qname = qname;
@@ -246,31 +214,17 @@ public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
 
         @Override
         public Set<TypeDefinition<?>> getTypeDefinitions() {
-            return Collections.unmodifiableSet(typeDefinitions);
-        }
-
-        private void setTypeDefinitions(final Set<TypeDefinition<?>> typeDefinitions) {
-            this.typeDefinitions.addAll(typeDefinitions);
+            return typeDefinitions;
         }
 
         @Override
         public Set<GroupingDefinition> getGroupings() {
-            return Collections.unmodifiableSet(groupings);
-        }
-
-        private void setGroupings(final Set<GroupingDefinition> groupings) {
-            this.groupings.addAll(groupings);
+            return groupings;
         }
 
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return Collections.unmodifiableList(unknownNodes);
-        }
-
-        private void setUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes.addAll(unknownNodes);
-            }
+            return unknownNodes;
         }
 
         @Override
index c8ff64102713aa779c903fc82dc0aa473547dd5d..94987086ba3c47f590745ff7d389af8344023db1 100644 (file)
@@ -21,7 +21,7 @@ import org.opendaylight.yangtools.yang.parser.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder implements TypeDefinitionBuilder {
-    private final SchemaPath schemaPath;
+    private SchemaPath schemaPath;
     private List<RangeConstraint> ranges = Collections.emptyList();
     private List<LengthConstraint> lengths = Collections.emptyList();
     private List<PatternConstraint> patterns = Collections.emptyList();
@@ -100,6 +100,11 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder im
         return schemaPath;
     }
 
+    @Override
+    public void setPath(SchemaPath path) {
+        this.schemaPath = path;
+    }
+
     @Override
     public String getDescription() {
         return description;
index 3b32e2c49affd02a7917467b85eb69c40d558872..1edf0b8543551bedc4479bc359611fa762a0439b 100644 (file)
@@ -119,6 +119,11 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements
         return BaseTypes.schemaPath(QNAME);
     }
 
+    @Override
+    public void setPath(SchemaPath path) {
+        throw new YangParseException(moduleName, line, "Can not set path to " + NAME);
+    }
+
     @Override
     public String getDescription() {
         return null;
index fe89819864270ea24b1ceef17d7c1d8c1e60ab7d..91c5e9a994e9acb2221a9ed1c0b7a79703655077 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -29,12 +28,14 @@ import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
 public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder {
-    private boolean isBuilt;
     private UsesNodeImpl instance;
     private DataNodeContainerBuilder parentBuilder;
     private final String groupingPathString;
@@ -44,11 +45,10 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
     private boolean addedByUses;
     private boolean augmenting;
     private boolean resolved;
-    private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<>();
+    private final Set<AugmentationSchemaBuilder> augmentationBuilders = new HashSet<>();
     private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<>();
     private final List<RefineHolder> refines = new ArrayList<>();
 
-
     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {
         super(moduleName, line);
         this.groupingPathString = groupingName;
@@ -56,34 +56,33 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
 
     @Override
     public UsesNode build() {
-        if (!isBuilt) {
-            instance = new UsesNodeImpl(groupingPath);
-            instance.setAddedByUses(addedByUses);
-
-            // AUGMENTATIONS
-            final Set<AugmentationSchema> augments = new HashSet<>();
-            for (AugmentationSchemaBuilder builder : addedAugments) {
-                augments.add(builder.build());
-            }
-            instance.setAugmentations(augments);
+        if (instance != null) {
+            return instance;
+        }
 
-            // REFINES
-            final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<>();
-            for (SchemaNodeBuilder refineBuilder : refineBuilders) {
-                SchemaNode refineNode = refineBuilder.build();
-                refineNodes.put(refineNode.getPath(), refineNode);
-            }
-            instance.setRefines(refineNodes);
+        instance = new UsesNodeImpl(groupingPath);
+        instance.setAddedByUses(addedByUses);
 
-            // UNKNOWN NODES
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
-            instance.addUnknownSchemaNodes(unknownNodes);
+        // AUGMENTATIONS
+        final Set<AugmentationSchema> augments = new HashSet<>();
+        for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+            augments.add(builder.build());
+        }
+        instance.augmentations = ImmutableSet.copyOf(augments);
+
+        // REFINES
+        final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<>();
+        for (SchemaNodeBuilder refineBuilder : refineBuilders) {
+            SchemaNode refineNode = refineBuilder.build();
+            refineNodes.put(refineNode.getPath(), refineNode);
+        }
+        instance.refines = ImmutableMap.copyOf(refineNodes);
 
-            isBuilt = true;
+        // UNKNOWN NODES
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
         }
+        instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
 
         return instance;
     }
@@ -140,18 +139,19 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
 
     @Override
     public Set<AugmentationSchemaBuilder> getAugmentations() {
-        return addedAugments;
+        return augmentationBuilders;
     }
 
     @Override
     public void addAugment(final AugmentationSchemaBuilder augmentBuilder) {
-        addedAugments.add(augmentBuilder);
+        augmentationBuilders.add(augmentBuilder);
     }
 
     @Override
     public boolean isAddedByUses() {
         return addedByUses;
     }
+
     @Override
     public void setAddedByUses(final boolean addedByUses) {
         this.addedByUses = addedByUses;
@@ -242,10 +242,10 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
 
     private static final class UsesNodeImpl implements UsesNode {
         private final SchemaPath groupingPath;
-        private Set<AugmentationSchema> augmentations = Collections.emptySet();
+        private ImmutableSet<AugmentationSchema> augmentations;
         private boolean addedByUses;
-        private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();
-        private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+        private ImmutableMap<SchemaPath, SchemaNode> refines;
+        private ImmutableList<UnknownSchemaNode> unknownNodes;
 
         private UsesNodeImpl(final SchemaPath groupingPath) {
             this.groupingPath = groupingPath;
@@ -261,12 +261,6 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
             return augmentations;
         }
 
-        private void setAugmentations(final Set<AugmentationSchema> augmentations) {
-            if (augmentations != null) {
-                this.augmentations = augmentations;
-            }
-        }
-
         @Override
         public boolean isAugmenting() {
             return false;
@@ -286,16 +280,9 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
             return refines;
         }
 
-        private void setRefines(final Map<SchemaPath, SchemaNode> refines) {
-            if (refines != null) {
-                this.refines = refines;
-            }
-        }
-
-        private void addUnknownSchemaNodes(final List<UnknownSchemaNode> unknownSchemaNodes) {
-            if (unknownSchemaNodes != null) {
-                this.unknownNodes.addAll(unknownSchemaNodes);
-            }
+        @SuppressWarnings("unused")
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+            return unknownNodes;
         }
 
         @Override