Merge "Bug 981: Make sure QName is not null in RPC case."
authorRobert Varga <rovarga@cisco.com>
Sat, 17 May 2014 16:10:45 +0000 (16:10 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Sat, 17 May 2014 16:10:45 +0000 (16:10 +0000)
25 files changed:
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java
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 b3bb7425754fb996bc774980c25af7fb157f8965..1adbe05d3300cf587c4b8df4712f0f07747a840b 100644 (file)
@@ -80,7 +80,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     protected abstract T thisInstance();
 
     @Override
-    public GeneratedTOBuilder addEnclosingTransferObject(String name) {
+    public GeneratedTOBuilder addEnclosingTransferObject(final String name) {
         if (name == null) {
             throw new IllegalArgumentException("Name for Enclosing Generated Transfer Object cannot be null!");
         }
@@ -99,7 +99,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public T addComment(String comment) {
+    public T addComment(final String comment) {
         this.comment = comment;
         return thisInstance();
     }
@@ -119,13 +119,13 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public T setAbstract(boolean isAbstract) {
+    public T setAbstract(final boolean isAbstract) {
         this.isAbstract = isAbstract;
         return thisInstance();
     }
 
     @Override
-    public T addImplementsType(Type genType) {
+    public T addImplementsType(final Type genType) {
         if (genType == null) {
             throw new IllegalArgumentException("Type cannot be null");
         }
@@ -134,7 +134,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public Constant addConstant(Type type, String name, Object value) {
+    public Constant addConstant(final Type type, final String name, final Object value) {
         if (type == null) {
             throw new IllegalArgumentException("Returning Type for Constant cannot be null!");
         }
@@ -148,7 +148,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public EnumBuilder addEnumeration(String name) {
+    public EnumBuilder addEnumeration(final String name) {
         if (name == null) {
             throw new IllegalArgumentException("Name of enumeration cannot be null!");
         }
@@ -158,7 +158,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public MethodSignatureBuilder addMethod(String name) {
+    public MethodSignatureBuilder addMethod(final String name) {
         if (name == null) {
             throw new IllegalArgumentException("Name of method cannot be null!");
         }
@@ -170,7 +170,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public boolean containsMethod(String name) {
+    public boolean containsMethod(final String name) {
         if (name == null) {
             throw new IllegalArgumentException("Parameter name can't be null");
         }
@@ -183,7 +183,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public GeneratedPropertyBuilder addProperty(String name) {
+    public GeneratedPropertyBuilder addProperty(final String name) {
         final GeneratedPropertyBuilder builder = new GeneratedPropertyBuilderImpl(name);
         builder.setAccessModifier(AccessModifier.PUBLIC);
         properties.add(builder);
@@ -191,7 +191,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public boolean containsProperty(String name) {
+    public boolean containsProperty(final String name) {
         if (name == null) {
             throw new IllegalArgumentException("Parameter name can't be null");
         }
@@ -213,7 +213,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(final Object obj) {
         if (this == obj) {
             return true;
         }
@@ -223,7 +223,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         if (getClass() != obj.getClass()) {
             return false;
         }
-        AbstractGeneratedTypeBuilder<T> other = (AbstractGeneratedTypeBuilder<T>) obj;
+        AbstractGeneratedTypeBuilder<?> other = (AbstractGeneratedTypeBuilder<?>) obj;
         if (getName() == null) {
             if (other.getName() != null) {
                 return false;
index db0a31b8bdf8845c55bdb2d4b8cc7a8804d78315..7d954465df34d83b3234563e28d66c7065d81462 100644 (file)
@@ -207,6 +207,8 @@ class BuilderTemplate extends BaseTemplate {
 
             «generateFields(false)»
 
+            «generateAugmentField(true)»
+
             «generateConstructorsFromIfcs(type)»
 
             «generateMethodFieldsFrom(type)»
@@ -225,6 +227,8 @@ class BuilderTemplate extends BaseTemplate {
 
                 «generateFields(true)»
 
+                «generateAugmentField(false)»
+
                 «generateConstructor»
 
                 «generateGetters(true)»
@@ -256,7 +260,7 @@ class BuilderTemplate extends BaseTemplate {
     /**
      * Generate constructor with argument of given type.
      */
-    def private generateConstructorFromIfc(Type impl) '''
+    def private Object generateConstructorFromIfc(Type impl) '''
         «IF (impl instanceof GeneratedType)»
             «val implType = impl as GeneratedType»
 
@@ -271,7 +275,7 @@ class BuilderTemplate extends BaseTemplate {
         «ENDIF»
     '''
 
-    def private printConstructorPropertySetter(Type implementedIfc) '''
+    def private Object printConstructorPropertySetter(Type implementedIfc) '''
         «IF (implementedIfc instanceof GeneratedType && !(implementedIfc instanceof GeneratedTransferObject))»
             «val ifc = implementedIfc as GeneratedType»
             «FOR getter : ifc.methodDefinitions»
@@ -398,8 +402,11 @@ class BuilderTemplate extends BaseTemplate {
                 private«IF _final» final«ENDIF» «f.returnType.importedName» «f.fieldName»;
             «ENDFOR»
         «ENDIF»
+    '''
+
+    def private generateAugmentField(boolean init) '''
         «IF augmentField != null»
-            private «Map.importedName»<Class<? extends «augmentField.returnType.importedName»>, «augmentField.returnType.importedName»> «augmentField.name» = new «HashMap.importedName»<>();
+            private final «Map.importedName»<Class<? extends «augmentField.returnType.importedName»>, «augmentField.returnType.importedName»> «augmentField.name»«IF init» = new «HashMap.importedName»<>()«ENDIF»;
         «ENDIF»
     '''
 
@@ -467,7 +474,17 @@ class BuilderTemplate extends BaseTemplate {
                 this.«field.fieldName» = builder.«field.getterMethodName»();
             «ENDFOR»
             «IF augmentField != null»
-                this.«augmentField.name».putAll(builder.«augmentField.name»);
+               switch (builder.«augmentField.name».size()) {
+                case 0:
+                    this.«augmentField.name» = «Collections.importedName».emptyMap();
+                    break;
+                case 1:
+                    final «Map.importedName».Entry<Class<? extends «augmentField.returnType.importedName»>, «augmentField.returnType.importedName»> e = builder.«augmentField.name».entrySet().iterator().next();
+                    this.«augmentField.name» = «Collections.importedName».<Class<? extends «augmentField.returnType.importedName»>, «augmentField.returnType.importedName»>singletonMap(e.getKey(), e.getValue());
+                    break;
+                default :
+                    this.«augmentField.name» = new «HashMap.importedName»<>(builder.«augmentField.name»);
+                }
             «ENDIF»
         }
     '''
index 14f495058152d09fcac15b1ce5edd490f3003b59..0dc0c19e6b19d2b7e539052d2c15bab45848a6b7 100644 (file)
@@ -15,14 +15,32 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.LinkedList;
 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.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
+import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
+import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.ModuleImport;
+import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 
-import java.util.Set;
-
 /**
  * The Schema Context Util contains support methods for searching through Schema
  * Context modules for specified schema nodes via Schema Path or Revision Aware
@@ -30,7 +48,8 @@ import java.util.Set;
  * instantiable.
  *
  */
-public class SchemaContextUtil {
+public final class SchemaContextUtil {
+    private static final Logger LOG = LoggerFactory.getLogger(SchemaContextUtil.class);
 
     private SchemaContextUtil() {
     }
@@ -53,14 +72,18 @@ public class SchemaContextUtil {
      * @return SchemaNode from the end of the Schema Path or <code>null</code>
      *         if the Node is not present.
      */
-    public static SchemaNode findDataSchemaNode(SchemaContext context, SchemaPath schemaPath) {
+    public static SchemaNode findDataSchemaNode(final SchemaContext context, final SchemaPath schemaPath) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
         Preconditions.checkArgument(schemaPath != null, "Schema Path reference cannot be NULL");
-        List<QName> prefixedPath = (schemaPath.getPath());
-        if (prefixedPath != null) {
-            return findNodeInSchemaContext(context, prefixedPath);
+
+        final List<QName> prefixedPath = (schemaPath.getPath());
+        if (prefixedPath == null) {
+            LOG.debug("Schema path {} has null path", schemaPath);
+            return null;
         }
-        return null;
+
+        LOG.trace("Looking for path {} in context {}", schemaPath, context);
+        return findNodeInSchemaContext(context, prefixedPath);
     }
 
     /**
@@ -93,16 +116,14 @@ public class SchemaContextUtil {
      *         Non-conditional Revision Aware XPath, or <code>null</code> if the
      *         DataSchemaNode is not present in Schema Context.
      */
-    public static SchemaNode findDataSchemaNode(SchemaContext context, Module module, RevisionAwareXPath nonCondXPath) {
+    public static SchemaNode findDataSchemaNode(final SchemaContext context, final Module module, final RevisionAwareXPath nonCondXPath) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
         Preconditions.checkArgument(module != null, "Module reference cannot be NULL");
         Preconditions.checkArgument(nonCondXPath != null, "Non Conditional Revision Aware XPath cannot be NULL");
 
         String strXPath = nonCondXPath.toString();
         if (strXPath != null) {
-            if (strXPath.contains("[")) {
-                throw new IllegalArgumentException("Revision Aware XPath cannot contains condition");
-            }
+            Preconditions.checkArgument(strXPath.indexOf('[') == -1, "Revision Aware XPath may not contain a condition");
             if (nonCondXPath.isAbsolute()) {
                 List<QName> qnamedPath = xpathToQNamePath(context, module, strXPath);
                 if (qnamedPath != null) {
@@ -152,8 +173,8 @@ public class SchemaContextUtil {
      *         given relative Revision Aware XPath, otherwise will return
      *         <code>null</code>.
      */
-    public static SchemaNode findDataSchemaNodeForRelativeXPath(SchemaContext context, Module module,
-            SchemaNode actualSchemaNode, RevisionAwareXPath relativeXPath) {
+    public static SchemaNode findDataSchemaNodeForRelativeXPath(final SchemaContext context, final Module module,
+            final SchemaNode actualSchemaNode, final RevisionAwareXPath relativeXPath) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
         Preconditions.checkArgument(module != null, "Module reference cannot be NULL");
         Preconditions.checkArgument(actualSchemaNode != null, "Actual Schema Node reference cannot be NULL");
@@ -190,7 +211,7 @@ public class SchemaContextUtil {
      *         Schema Node is NOT present, the method will returns
      *         <code>null</code>
      */
-    public static Module findParentModule(SchemaContext context, SchemaNode schemaNode) {
+    public static Module findParentModule(final SchemaContext context, final SchemaNode schemaNode) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL!");
         Preconditions.checkArgument(schemaNode != null, "Schema Node cannot be NULL!");
         Preconditions.checkState(schemaNode.getPath() != null, "Schema Path for Schema Node is not "
@@ -206,15 +227,20 @@ public class SchemaContextUtil {
         return context.findModuleByNamespaceAndRevision(qname.getNamespace(), qname.getRevision());
     }
 
-    public static SchemaNode findNodeInSchemaContext(SchemaContext context, List<QName> path) {
-        QName current = path.get(0);
-        Module module = context.findModuleByNamespaceAndRevision(current.getNamespace(), current.getRevision());
-        if (module == null)
+    public static SchemaNode findNodeInSchemaContext(final SchemaContext context, final List<QName> path) {
+        final QName current = path.get(0);
+
+        LOG.trace("Looking up module {} in context {}", current, path);
+        final Module module = context.findModuleByNamespaceAndRevision(current.getNamespace(), current.getRevision());
+        if (module == null) {
+            LOG.debug("Module {} not found", current);
             return null;
+        }
+
         return findNodeInModule(module, path);
     }
 
-    public static GroupingDefinition findGrouping(SchemaContext context, Module module, List<QName> path) {
+    public static GroupingDefinition findGrouping(final SchemaContext context, final Module module, final List<QName> path) {
         QName first = path.get(0);
         Module m = context.findModuleByNamespace(first.getNamespace()).iterator().next();
         DataNodeContainer currentParent = m;
@@ -233,124 +259,189 @@ public class SchemaContextUtil {
                 found = true;
                 currentParent = node;
             }
-            if (!found) {
-                throw new IllegalArgumentException("Failed to find referenced grouping: " + path + "("
-                        + qname.getLocalName() + ")");
-            }
+
+            Preconditions.checkArgument(found, "Failed to find referenced grouping: %s(%s)", path, qname.getLocalName());
         }
 
         return (GroupingDefinition) currentParent;
     }
 
-    private static SchemaNode findNodeInModule(Module module, List<QName> path) {
-        QName current = path.get(0);
-        SchemaNode node = module.getDataChildByName(current);
-        if (node != null)
-            return findNode((DataSchemaNode) node, nextLevel(path));
-        node = getRpcByName(module, current);
-        if (node != null)
-            return findNodeInRpc((RpcDefinition) node, nextLevel(path));
-        node = getNotificationByName(module, current);
-        if (node != null)
-            return findNodeInNotification((NotificationDefinition) node, nextLevel(path));
-        node = getGroupingByName(module, current);
-        if (node != null)
-            return findNodeInGrouping((GroupingDefinition) node, nextLevel(path));
-        return node;
+    private static SchemaNode findNodeInModule(final Module module, final List<QName> path) {
+        final QName current = path.get(0);
+
+        LOG.trace("Looking for data container {} in module {}", current, module);
+        SchemaNode parent = module.getDataChildByName(current);
+        if (parent != null) {
+            final SchemaNode ret = findNode((DataSchemaNode) parent, nextLevel(path));
+            if (ret != null) {
+                return ret;
+            }
+        }
+
+        LOG.trace("Looking for RPC {} in module {}", current, module);
+        parent = getRpcByName(module, current);
+        if (parent != null) {
+            final SchemaNode ret = findNodeInRpc((RpcDefinition) parent, nextLevel(path));
+            if (ret != null) {
+                return ret;
+            }
+        }
+
+        LOG.trace("Looking for notification {} in module {}", current, module);
+        parent = getNotificationByName(module, current);
+        if (parent != null) {
+            final SchemaNode ret = findNodeInNotification((NotificationDefinition) parent, nextLevel(path));
+            if (ret != null) {
+                return ret;
+            }
+        }
+
+        LOG.trace("Looking for grouping {} in module {}", current, module);
+        parent = getGroupingByName(module, current);
+        if (parent != null) {
+            final SchemaNode ret = findNodeInGrouping((GroupingDefinition) parent, nextLevel(path));
+            if (ret != null) {
+                return ret;
+            }
+        }
+
+        LOG.debug("No node matching {} found in module {}", path, module);
+        return null;
     }
 
-    private static SchemaNode findNodeInGrouping(GroupingDefinition grouping, List<QName> path) {
-        if (path.isEmpty())
+    private static SchemaNode findNodeInGrouping(final GroupingDefinition grouping, final List<QName> path) {
+        if (path.isEmpty()) {
+            LOG.debug("Found grouping {}", grouping);
             return grouping;
-        QName current = path.get(0);
-        DataSchemaNode node = grouping.getDataChildByName(current);
-        if (node != null)
-            return findNode(node, nextLevel(path));
-        return null;
+        }
+
+        LOG.trace("Looking for path {} in grouping {}", path, grouping);
+        final QName current = path.get(0);
+        final DataSchemaNode node = grouping.getDataChildByName(current);
+        if (node == null) {
+            LOG.debug("No node matching {} found in grouping {}", current, grouping);
+            return null;
+        }
+
+        return findNode(node, nextLevel(path));
     }
 
-    private static SchemaNode findNodeInRpc(RpcDefinition rpc, List<QName> path) {
-        if (path.isEmpty())
+    private static SchemaNode findNodeInRpc(final RpcDefinition rpc, final List<QName> path) {
+        if (path.isEmpty()) {
+            LOG.debug("Found RPC {}", rpc);
             return rpc;
-        QName current = path.get(0);
+        }
+
+        LOG.trace("Looking for path {} in rpc {}", path, rpc);
+        final QName current = path.get(0);
         switch (current.getLocalName()) {
         case "input":
             return findNode(rpc.getInput(), nextLevel(path));
         case "output":
             return findNode(rpc.getOutput(), nextLevel(path));
+        default:
+            LOG.debug("Invalid component {} of path {} in RPC {}", current, path, rpc);
+            return null;
         }
-        return null;
     }
 
-    private static SchemaNode findNodeInNotification(NotificationDefinition rpc, List<QName> path) {
-        if (path.isEmpty())
-            return rpc;
-        QName current = path.get(0);
-        DataSchemaNode node = rpc.getDataChildByName(current);
-        if (node != null)
-            return findNode(node, nextLevel(path));
-        return null;
+    private static SchemaNode findNodeInNotification(final NotificationDefinition ntf, final List<QName> path) {
+        if (path.isEmpty()) {
+            LOG.debug("Found notification {}", ntf);
+            return ntf;
+        }
+
+        LOG.trace("Looking for path {} in notification {}", path, ntf);
+        final QName current = path.get(0);
+        DataSchemaNode node = ntf.getDataChildByName(current);
+        if (node == null) {
+            LOG.debug("No node matching {} found in notification {}", current, ntf);
+            return null;
+        }
+
+        return findNode(node, nextLevel(path));
     }
 
-    private static SchemaNode findNode(ChoiceNode parent, List<QName> path) {
-        if (path.isEmpty())
+    private static SchemaNode findNode(final ChoiceNode parent, final List<QName> path) {
+        if (path.isEmpty()) {
             return parent;
+        }
         QName current = path.get(0);
         ChoiceCaseNode node = parent.getCaseNodeByName(current);
-        if (node != null)
+        if (node != null) {
             return findNodeInCase(node, nextLevel(path));
+        }
         return null;
     }
 
-    private static SchemaNode findNode(ContainerSchemaNode parent, List<QName> path) {
-        if (path.isEmpty())
+    private static SchemaNode findNode(final ContainerSchemaNode parent, final List<QName> path) {
+        if (path.isEmpty()) {
             return parent;
-        QName current = path.get(0);
-        DataSchemaNode node = parent.getDataChildByName(current);
-        if (node != null)
-            return findNode(node, nextLevel(path));
-        return null;
+        }
+
+        final QName current = path.get(0);
+        final DataSchemaNode node = parent.getDataChildByName(current);
+        if (node == null) {
+            LOG.debug("Failed to find {} in parent {}", path, parent);
+            return null;
+        }
+
+        return findNode(node, nextLevel(path));
     }
 
-    private static SchemaNode findNode(ListSchemaNode parent, List<QName> path) {
-        if (path.isEmpty())
+    private static SchemaNode findNode(final ListSchemaNode parent, final List<QName> path) {
+        if (path.isEmpty()) {
             return parent;
+        }
+
         QName current = path.get(0);
         DataSchemaNode node = parent.getDataChildByName(current);
-        if (node != null)
-            return findNode(node, nextLevel(path));
-        return null;
+        if (node == null) {
+            LOG.debug("Failed to find {} in parent {}", path, parent);
+            return null;
+        }
+        return findNode(node, nextLevel(path));
     }
 
-    private static SchemaNode findNode(DataSchemaNode parent, List<QName> path) {
-        SchemaNode result = null;
-        if (path.isEmpty()) {
-            result = parent;
-        } else {
+    private static SchemaNode findNode(final DataSchemaNode parent, final List<QName> path) {
+        final SchemaNode node;
+        if (!path.isEmpty()) {
             if (parent instanceof ContainerSchemaNode) {
-                result = findNode((ContainerSchemaNode) parent, path);
+                node = findNode((ContainerSchemaNode) parent, path);
             } else if (parent instanceof ListSchemaNode) {
-                result = findNode((ListSchemaNode) parent, path);
+                node = findNode((ListSchemaNode) parent, path);
             } else if (parent instanceof ChoiceNode) {
-                result = findNode((ChoiceNode) parent, path);
+                node = findNode((ChoiceNode) parent, path);
             } else {
-                throw new IllegalArgumentException("Path nesting violation");
+                throw new IllegalArgumentException(
+                        String.format("Path nesting violation in parent %s path %s", parent, path));
             }
+        } else {
+            node = parent;
         }
-        return result;
+
+        if (node == null) {
+            LOG.debug("Failed to find {} in parent {}", path, parent);
+            return null;
+        }
+        return node;
     }
 
-    public static SchemaNode findNodeInCase(ChoiceCaseNode parent, List<QName> path) {
-        if (path.isEmpty())
+    public static SchemaNode findNodeInCase(final ChoiceCaseNode parent, final List<QName> path) {
+        if (path.isEmpty()) {
             return parent;
+        }
+
         QName current = path.get(0);
         DataSchemaNode node = parent.getDataChildByName(current);
-        if (node != null)
-            return findNode(node, nextLevel(path));
-        return null;
+        if (node == null) {
+            LOG.debug("Failed to find {} in parent {}", path, parent);
+            return null;
+        }
+        return findNode(node, nextLevel(path));
     }
 
-    public static RpcDefinition getRpcByName(Module module, QName name) {
+    public static RpcDefinition getRpcByName(final Module module, final QName name) {
         for (RpcDefinition rpc : module.getRpcs()) {
             if (rpc.getQName().equals(name)) {
                 return rpc;
@@ -359,11 +450,11 @@ public class SchemaContextUtil {
         return null;
     }
 
-    private static List<QName> nextLevel(List<QName> path) {
+    private static List<QName> nextLevel(final List<QName> path) {
         return path.subList(1, path.size());
     }
 
-    public static NotificationDefinition getNotificationByName(Module module, QName name) {
+    public static NotificationDefinition getNotificationByName(final Module module, final QName name) {
         for (NotificationDefinition notification : module.getNotifications()) {
             if (notification.getQName().equals(name)) {
                 return notification;
@@ -372,7 +463,7 @@ public class SchemaContextUtil {
         return null;
     }
 
-    public static GroupingDefinition getGroupingByName(Module module, QName name) {
+    public static GroupingDefinition getGroupingByName(final Module module, final QName name) {
         for (GroupingDefinition grouping : module.getGroupings()) {
             if (grouping.getQName().equals(name)) {
                 return grouping;
@@ -387,7 +478,7 @@ public class SchemaContextUtil {
      * @param node
      * @return
      */
-    public static DataSchemaNode findOriginal(DataSchemaNode node, SchemaContext ctx) {
+    public static DataSchemaNode findOriginal(final DataSchemaNode node, final SchemaContext ctx) {
         DataSchemaNode result = findCorrectTargetFromGrouping(node, ctx);
         if (result == null) {
             result = findCorrectTargetFromAugment(node, ctx);
@@ -400,7 +491,7 @@ public class SchemaContextUtil {
         return result;
     }
 
-    private static DataSchemaNode findCorrectTargetFromGrouping(DataSchemaNode node, SchemaContext ctx) {
+    private static DataSchemaNode findCorrectTargetFromGrouping(final DataSchemaNode node, final SchemaContext ctx) {
         if (node.getPath().getPath().size() == 1) {
             // uses is under module statement
             Module m = findParentModule(ctx, node);
@@ -408,7 +499,7 @@ public class SchemaContextUtil {
             for (UsesNode u : m.getUses()) {
                 SchemaNode targetGrouping = findNodeInSchemaContext(ctx, u.getGroupingPath().getPath());
                 if (!(targetGrouping instanceof GroupingDefinition)) {
-                    throw new IllegalArgumentException("Failed to generate code for augment in " + u);
+                    throw new IllegalArgumentException(String.format("Failed to generate code for augment in %s", u));
                 }
                 GroupingDefinition gr = (GroupingDefinition) targetGrouping;
                 result = gr.getDataChildByName(node.getQName().getLocalName());
@@ -466,7 +557,7 @@ public class SchemaContextUtil {
         }
     }
 
-    private static DataSchemaNode findCorrectTargetFromAugment(DataSchemaNode node, SchemaContext ctx) {
+    private static DataSchemaNode findCorrectTargetFromAugment(final DataSchemaNode node, final SchemaContext ctx) {
         if (!node.isAugmenting()) {
             return null;
         }
@@ -523,23 +614,23 @@ public class SchemaContextUtil {
         }
     }
 
-    private static DataSchemaNode getResultFromUses(UsesNode u, String currentName, SchemaContext ctx) {
+    private static DataSchemaNode getResultFromUses(final UsesNode u, final String currentName, final SchemaContext ctx) {
         SchemaNode targetGrouping = findNodeInSchemaContext(ctx, u.getGroupingPath().getPath());
-        if (!(targetGrouping instanceof GroupingDefinition)) {
-            throw new IllegalArgumentException("Failed to generate code for augment in " + u);
-        }
+
+        Preconditions.checkArgument(targetGrouping instanceof GroupingDefinition,
+                "Failed to generate code for augment in %s", u);
         GroupingDefinition gr = (GroupingDefinition) targetGrouping;
         return gr.getDataChildByName(currentName);
     }
 
-    private static Module getParentModule(SchemaNode node, SchemaContext ctx) {
+    private static Module getParentModule(final SchemaNode node, final SchemaContext ctx) {
         QName qname = node.getPath().getPath().get(0);
         URI namespace = qname.getNamespace();
         Date revision = qname.getRevision();
         return ctx.findModuleByNamespaceAndRevision(namespace, revision);
     }
 
-    private static DataSchemaNode getTargetNode(List<QName> tmpPath, DataSchemaNode node, SchemaContext ctx) {
+    private static DataSchemaNode getTargetNode(final List<QName> tmpPath, final DataSchemaNode node, final SchemaContext ctx) {
         DataSchemaNode result = node;
         if (tmpPath.size() == 1) {
             if (result != null && result.isAddedByUses()) {
@@ -570,7 +661,7 @@ public class SchemaContextUtil {
         }
     }
 
-    private static AugmentationSchema findNodeInAugment(Collection<AugmentationSchema> augments, QName name) {
+    private static AugmentationSchema findNodeInAugment(final Collection<AugmentationSchema> augments, final QName name) {
         for (AugmentationSchema augment : augments) {
             DataSchemaNode node = augment.getDataChildByName(name);
             if (node != null) {
@@ -580,8 +671,8 @@ public class SchemaContextUtil {
         return null;
     }
 
-    private static DataSchemaNode findCorrectTargetFromAugmentGrouping(DataSchemaNode node,
-            AugmentationSchema parentNode, List<SchemaNode> dataTree, SchemaContext ctx) {
+    private static DataSchemaNode findCorrectTargetFromAugmentGrouping(final DataSchemaNode node,
+            final AugmentationSchema parentNode, final List<SchemaNode> dataTree, final SchemaContext ctx) {
 
         DataSchemaNode result = null;
         QName currentName = node.getQName();
@@ -636,7 +727,7 @@ public class SchemaContextUtil {
      *            XPath String
      * @return return a list of QName
      */
-    private static List<QName> xpathToQNamePath(SchemaContext context, Module parentModule, String xpath) {
+    private static List<QName> xpathToQNamePath(final SchemaContext context, final Module parentModule, final String xpath) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
         Preconditions.checkArgument(parentModule != null, "Parent Module reference cannot be NULL");
         Preconditions.checkArgument(xpath != null, "XPath string reference cannot be NULL");
@@ -672,7 +763,7 @@ public class SchemaContextUtil {
      *            Prefixed Path Part string
      * @return QName from prefixed Path Part String.
      */
-    private static QName stringPathPartToQName(SchemaContext context, Module parentModule, String prefixedPathPart) {
+    private static QName stringPathPartToQName(final SchemaContext context, final Module parentModule, final String prefixedPathPart) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
         Preconditions.checkArgument(parentModule != null, "Parent Module reference cannot be NULL");
         Preconditions.checkArgument(prefixedPathPart != null, "Prefixed Path Part cannot be NULL!");
@@ -680,12 +771,9 @@ public class SchemaContextUtil {
         if (prefixedPathPart.contains(":")) {
             String[] prefixedName = prefixedPathPart.split(":");
             Module module = resolveModuleForPrefix(context, parentModule, prefixedName[0]);
-            if (module == null) {
-                throw new IllegalArgumentException("Failed to resolve xpath: no module found for prefix "
-                        + prefixedName[0] + " in module " + parentModule.getName());
-            } else {
-                return new QName(module.getNamespace(), module.getRevision(), prefixedName[1]);
-            }
+            Preconditions.checkArgument(module != null, "Failed to resolve xpath: no module found for prefix %s in module %s",
+                    prefixedName[0], parentModule.getName());
+            return new QName(module.getNamespace(), module.getRevision(), prefixedName[1]);
         } else {
             return new QName(parentModule.getNamespace(), parentModule.getRevision(), prefixedPathPart);
         }
@@ -715,7 +803,7 @@ public class SchemaContextUtil {
      * @return Module for given prefix in specified Schema Context if is
      *         present, otherwise returns <code>null</code>
      */
-    private static Module resolveModuleForPrefix(SchemaContext context, Module module, String prefix) {
+    private static Module resolveModuleForPrefix(final SchemaContext context, final Module module, final String prefix) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
         Preconditions.checkArgument(module != null, "Module reference cannot be NULL");
         Preconditions.checkArgument(prefix != null, "Prefix string cannot be NULL");
@@ -746,8 +834,8 @@ public class SchemaContextUtil {
      *            Schema Path for Leafref
      * @return list of QName
      */
-    private static List<QName> resolveRelativeXPath(SchemaContext context, Module module,
-            RevisionAwareXPath relativeXPath, SchemaNode leafrefParentNode) {
+    private static List<QName> resolveRelativeXPath(final SchemaContext context, final Module module,
+            final RevisionAwareXPath relativeXPath, final SchemaNode leafrefParentNode) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL");
         Preconditions.checkArgument(module != null, "Module reference cannot be NULL");
         Preconditions.checkArgument(relativeXPath != null, "Non Conditional Revision Aware XPath cannot be NULL");
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