From: Robert Varga Date: Sat, 17 May 2014 16:10:45 +0000 (+0000) Subject: Merge "Bug 981: Make sure QName is not null in RPC case." X-Git-Tag: release/helium~554 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=49423f30f3759958b5706dd78743f06f9c1475ce;hp=e4105f3c14b72e9aa2797d125a738b00040ea331;p=yangtools.git Merge "Bug 981: Make sure QName is not null in RPC case." --- diff --git a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java index b3bb742575..1adbe05d33 100644 --- a/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java +++ b/code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java @@ -80,7 +80,7 @@ abstract class AbstractGeneratedTypeBuilder other = (AbstractGeneratedTypeBuilder) obj; + AbstractGeneratedTypeBuilder other = (AbstractGeneratedTypeBuilder) obj; if (getName() == null) { if (other.getName() != null) { return false; diff --git a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend index db0a31b8bd..7d954465df 100644 --- a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend +++ b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend @@ -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», «augmentField.returnType.importedName»> «augmentField.name» = new «HashMap.importedName»<>(); + private final «Map.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, «augmentField.returnType.importedName»> e = builder.«augmentField.name».entrySet().iterator().next(); + this.«augmentField.name» = «Collections.importedName»., «augmentField.returnType.importedName»>singletonMap(e.getKey(), e.getValue()); + break; + default : + this.«augmentField.name» = new «HashMap.importedName»<>(builder.«augmentField.name»); + } «ENDIF» } ''' diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java index 14f4950581..0dc0c19e6b 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java @@ -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 null * 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 prefixedPath = (schemaPath.getPath()); - if (prefixedPath != null) { - return findNodeInSchemaContext(context, prefixedPath); + + final List 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 null 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 qnamedPath = xpathToQNamePath(context, module, strXPath); if (qnamedPath != null) { @@ -152,8 +173,8 @@ public class SchemaContextUtil { * given relative Revision Aware XPath, otherwise will return * null. */ - 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 * null */ - 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 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 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 path) { + public static GroupingDefinition findGrouping(final SchemaContext context, final Module module, final List 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 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 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 path) { - if (path.isEmpty()) + private static SchemaNode findNodeInGrouping(final GroupingDefinition grouping, final List 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 path) { - if (path.isEmpty()) + private static SchemaNode findNodeInRpc(final RpcDefinition rpc, final List 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 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 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 path) { - if (path.isEmpty()) + private static SchemaNode findNode(final ChoiceNode parent, final List 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 path) { - if (path.isEmpty()) + private static SchemaNode findNode(final ContainerSchemaNode parent, final List 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 path) { - if (path.isEmpty()) + private static SchemaNode findNode(final ListSchemaNode parent, final List 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 path) { - SchemaNode result = null; - if (path.isEmpty()) { - result = parent; - } else { + private static SchemaNode findNode(final DataSchemaNode parent, final List 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 path) { - if (path.isEmpty()) + public static SchemaNode findNodeInCase(final ChoiceCaseNode parent, final List 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 nextLevel(List path) { + private static List nextLevel(final List 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 tmpPath, DataSchemaNode node, SchemaContext ctx) { + private static DataSchemaNode getTargetNode(final List 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 augments, QName name) { + private static AugmentationSchema findNodeInAugment(final Collection 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 dataTree, SchemaContext ctx) { + private static DataSchemaNode findCorrectTargetFromAugmentGrouping(final DataSchemaNode node, + final AugmentationSchema parentNode, final List 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 xpathToQNamePath(SchemaContext context, Module parentModule, String xpath) { + private static List 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 null */ - 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 resolveRelativeXPath(SchemaContext context, Module module, - RevisionAwareXPath relativeXPath, SchemaNode leafrefParentNode) { + private static List 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"); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java index 1ec6a8417a..13f8d93b8f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java @@ -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 childNodes = new HashSet<>(); + protected final Set childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); protected final Set addedChildNodes = new HashSet<>(); protected final Set groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); @@ -105,6 +105,7 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i return groupings; } + @Override public Set getGroupingBuilders() { return addedGroupings; } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java index ccf57f92bf..3ff7fdf8c3 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java @@ -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 unknownNodes) { - this.unknownNodes.addAll(unknownNodes); - } - } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java index 4dca5aead6..cd0bb354e4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java @@ -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. * diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java index 1713906769..add703a076 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java @@ -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 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 unknownNodes = new ArrayList<>(); + private ImmutableList 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 getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void setUnknownSchemaNodes(List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java index 8d272ce09b..224c45fcda 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java @@ -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 newPath = new ArrayList<>(); - List 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 newPath = new ArrayList<>(); + List 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 childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set uses = new HashSet<>(); + private ImmutableSet childNodes; + private ImmutableSet uses; private String description; private String reference; private Status status; private URI namespace; private Date revision; - private final List unknownNodes = new ArrayList<>(); + private ImmutableList unknownNodes; private AugmentationSchema copyOf; private AugmentationSchemaImpl(final SchemaPath targetPath) { @@ -305,33 +308,20 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain public Optional 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 getChildNodes() { - return Collections.unmodifiableSet(childNodes); - } - - private void addChildNodes(final Set childNodes) { - if (childNodes != null) { - this.childNodes.addAll(childNodes); - } + return childNodes; } /** @@ -345,13 +335,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain @Override public Set getUses() { - return Collections.unmodifiableSet(uses); - } - - private void addUses(final Set uses) { - if (uses != null) { - this.uses.addAll(uses); - } + return uses; } /** @@ -380,13 +364,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(final List 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; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java index 47f39659c6..c38d0efd32 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java @@ -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 augmentations = new HashSet<>(); private final List augmentationBuilders = new ArrayList<>(); // ChoiceNode args private final Set 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 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 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 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 cases = new HashSet<>(); - private final Set augmentations = new HashSet<>(); - private final List unknownNodes = new ArrayList<>(); + private ImmutableSet cases; + private ImmutableSet augmentations; + private ImmutableList 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 getAvailableAugmentations() { - return Collections.unmodifiableSet(augmentations); - } - - private void addAvailableAugmentations(final Set availableAugmentations) { - if (availableAugmentations != null) { - this.augmentations.addAll(availableAugmentations); - } + return augmentations; } @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(final List unknownSchemaNodes) { - if (unknownSchemaNodes != null) { - this.unknownNodes.addAll(unknownSchemaNodes); - } + return unknownNodes; } @Override public Set 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 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; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java index 8c39f60204..dd82fbef44 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java @@ -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 augmentations = new ArrayList<>(); private final List 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 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 childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set augmentations = new HashSet<>(); - private final Set uses = new HashSet<>(); - private final List unknownNodes = new ArrayList<>(); + private ImmutableSet childNodes; + private ImmutableSet augmentations; + private ImmutableSet uses; + private ImmutableList 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 getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(final List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } /** @@ -340,13 +339,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im @Override public Set getChildNodes() { - return Collections.unmodifiableSet(childNodes); - } - - private void addChildNodes(final Set 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 getUses() { - return Collections.unmodifiableSet(uses); - } - - private void addUses(final Set uses) { - if (uses != null) { - this.uses.addAll(uses); - } + return uses; } @Override public Set getAvailableAugmentations() { - return Collections.unmodifiableSet(augmentations); - } - - private void addAvailableAugmentations(final Set augmentations) { - if (augmentations != null) { - this.augmentations.addAll(augmentations); - } + return augmentations; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java index 4e1aab1bfb..ccf31553a4 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java @@ -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 augmentations = new ArrayList<>(); private final List 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 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 augmentations = new HashSet<>(); - private final Set childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set uses = new HashSet<>(); - private final List unknownNodes = new ArrayList<>(); + + private ImmutableSet augmentations; + private ImmutableSet childNodes; + private ImmutableSet groupings; + private ImmutableSet> typeDefinitions; + private ImmutableSet uses; + private ImmutableList 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 getAvailableAugmentations() { - return Collections.unmodifiableSet(augmentations); - } - - private void addAvailableAugmentations(Set augmentations) { - if (augmentations != null) { - this.augmentations.addAll(augmentations); - } + return augmentations; } @Override public Set getChildNodes() { - return Collections.unmodifiableSet(childNodes); - } - - private void addChildNodes(Set childNodes) { - if (childNodes != null) { - this.childNodes.addAll(childNodes); - } + return childNodes; } @Override public Set getGroupings() { - return Collections.unmodifiableSet(groupings); - } - - private void addGroupings(Set groupings) { - if (groupings != null) { - this.groupings.addAll(groupings); - } + return groupings; } @Override @@ -399,13 +385,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB @Override public Set getUses() { - return Collections.unmodifiableSet(uses); - } - - private void addUses(Set uses) { - if (uses != null) { - this.uses.addAll(uses); - } + return uses; } @Override @@ -415,24 +395,12 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB @Override public Set> getTypeDefinitions() { - return Collections.unmodifiableSet(typeDefinitions); - } - - private void addTypeDefinitions(Set> typeDefinitions) { - if (typeDefinitions != null) { - this.typeDefinitions.addAll(typeDefinitions); - } + return typeDefinitions; } @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(List unknownSchemaNodes) { - if (unknownSchemaNodes != null) { - this.unknownNodes.addAll(unknownSchemaNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java index 19d2cf35da..71d1f06ef5 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java @@ -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 unknownNodes = new ArrayList<>(); + private ImmutableList 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 getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(List unknownSchemaNodes) { - if (unknownSchemaNodes != null) { - this.unknownNodes.addAll(unknownSchemaNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java index a051a1bc86..9b48c9dc15 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java @@ -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 unknownNodes = new ArrayList<>(); + private Status status; + private ImmutableList unknownNodes; private boolean yin; private ExtensionDefinitionImpl(QName qname, SchemaPath path) { @@ -137,13 +102,7 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder { @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java index 4b566d8ec0..0417dd4dba 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java @@ -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 unknownNodes = new ArrayList<>(); + private Status status; + private ImmutableList 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 getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(final List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java index e2bf02ce18..90a49d1b19 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java @@ -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 childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set uses = new HashSet<>(); - private final List unknownNodes = new ArrayList<>(); + private ImmutableSet childNodes; + private ImmutableSet groupings; + private ImmutableSet> typeDefinitions; + private ImmutableSet uses; + private ImmutableList 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 getChildNodes() { - return Collections.unmodifiableSet(childNodes); - } - - private void addChildNodes(Set childNodes) { - if (childNodes != null) { - this.childNodes.addAll(childNodes); - } + return childNodes; } @Override public Set getGroupings() { - return Collections.unmodifiableSet(groupings); - } - - private void addGroupings(Set groupings) { - if (groupings != null) { - this.groupings.addAll(groupings); - } + return groupings; } @Override public Set getUses() { - return Collections.unmodifiableSet(uses); - } - - private void addUses(Set uses) { - if (uses != null) { - this.uses.addAll(uses); - } + return uses; } @Override public Set> getTypeDefinitions() { - return Collections.unmodifiableSet(typeDefinitions); - } - - private void addTypeDefinitions(Set> typeDefinitions) { - if (typeDefinitions != null) { - this.typeDefinitions.addAll(typeDefinitions); - } + return typeDefinitions; } @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java index 909773d987..d084ed0b7f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java @@ -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 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 derivedIdentities; private String description; private String reference; - private Status status = Status.CURRENT; - private final List unknownNodes = new ArrayList<>(); + private Status status; + private ImmutableList unknownNodes; - private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path, final Set derivedIdentities) { + private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path, + final Set 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 getDerivedIdentities() { return Collections.unmodifiableSet(derivedIdentities); @@ -175,13 +142,7 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder { @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(List unknownSchemaNodes) { - if (unknownSchemaNodes != null) { - this.unknownNodes.addAll(unknownSchemaNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java index e61097366c..fca44fb1ef 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java @@ -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; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java index 3f9f7ae8ca..c5f9732d2f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java @@ -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 unknownNodes = new ArrayList<>(); + private ImmutableList 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> type) { - this.type = type; - } - @Override public boolean isUserOrdered() { return userOrdered; @@ -289,13 +292,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java index e0303dce26..f82cbac1bc 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java @@ -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 unknownNodes = new ArrayList<>(); + private ImmutableList 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> type) { - this.type = type; - } - @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java index bddaf9f2ce..c50feeeab0 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java @@ -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 keys; + private List 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 augmentations = new ArrayList<>(); private final List 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. emptyList(); - } else { - List 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 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 keyDefinition = Collections.emptyList(); + private Status status; + private ImmutableList keyDefinition; private boolean augmenting; private boolean addedByUses; private boolean configuration; private ConstraintDefinition constraints; - private final Set augmentations = new HashSet<>(); - private final Set childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set uses = new HashSet<>(); + private ImmutableSet augmentations; + private ImmutableSet childNodes; + private ImmutableSet groupings; + private ImmutableSet> typeDefinitions; + private ImmutableSet uses; + private ImmutableList unknownNodes; private boolean userOrdered; - private final List 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 getAvailableAugmentations() { - return Collections.unmodifiableSet(augmentations); - } - - private void addAvailableAugmentations(final Set augmentations) { - if (augmentations != null) { - this.augmentations.addAll(augmentations); - } + return augmentations; } @Override public Set getChildNodes() { - return Collections.unmodifiableSet(childNodes); - } - - private void addChildNodes(final Set childNodes) { - if (childNodes != null) { - this.childNodes.addAll(childNodes); - } + return childNodes; } @Override public Set getGroupings() { - return Collections.unmodifiableSet(groupings); - } - - private void addGroupings(final Set groupings) { - if (groupings != null) { - this.groupings.addAll(groupings); - } + return groupings; } @Override public Set> getTypeDefinitions() { - return Collections.unmodifiableSet(typeDefinitions); - } - - private void addTypeDefinitions(final Set> typeDefinitions) { - if (typeDefinitions != null) { - this.typeDefinitions.addAll(typeDefinitions); - } + return typeDefinitions; } @Override public Set getUses() { - return Collections.unmodifiableSet(uses); - } - - private void addUses(final Set uses) { - if (uses != null) { - this.uses.addAll(uses); - } + return uses; } @Override @@ -458,13 +435,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void addUnknownSchemaNodes(final List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java index 9ad6fe0322..824bd1a262 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java @@ -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 augmentations = new ArrayList<>(); private final List 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 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 childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set groupings = new HashSet<>(); - private final Set> typeDefinitions = new HashSet<>(); - private final Set uses = new HashSet<>(); - private final Set augmentations = new HashSet<>(); - private final List unknownNodes = new ArrayList<>(); + private Status status; + private ImmutableSet augmentations; + private ImmutableSet childNodes; + private ImmutableSet groupings; + private ImmutableSet> typeDefinitions; + private ImmutableSet uses; + private ImmutableList 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 getChildNodes() { - return Collections.unmodifiableSet(childNodes); - } - - private void setChildNodes(final Set childNodes) { - if (childNodes != null) { - this.childNodes.addAll(childNodes); - } + return childNodes; } @Override public Set getGroupings() { - return Collections.unmodifiableSet(groupings); - } - - private void setGroupings(final Set groupings) { - if (groupings != null) { - this.groupings.addAll(groupings); - } + return groupings; } @Override public Set getUses() { - return Collections.unmodifiableSet(uses); - } - - private void setUses(final Set uses) { - if (uses != null) { - this.uses.addAll(uses); - } + return uses; } @Override public Set> getTypeDefinitions() { - return Collections.unmodifiableSet(typeDefinitions); - } - - private void setTypeDefinitions(final Set> typeDefinitions) { - if (typeDefinitions != null) { - this.typeDefinitions.addAll(typeDefinitions); - } + return typeDefinitions; } @Override public Set getAvailableAugmentations() { - return Collections.unmodifiableSet(augmentations); - } - - private void setAvailableAugmentations(final Set augmentations) { - if (augmentations != null) { - this.augmentations.addAll(augmentations); - } + return augmentations; } @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void setUnknownSchemaNodes(final List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java index 23b7aed404..2be0209ac5 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java @@ -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 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> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - for (TypeDefinitionBuilder entry : addedTypedefs) { - typedefs.add(entry.build()); - } - instance.setTypeDefinitions(typedefs); - - // GROUPINGS - final Set 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> 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 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> typeDefinitions = new HashSet<>(); - private final Set groupings = new HashSet<>(); - private final List unknownNodes = new ArrayList<>(); + private ImmutableSet> typeDefinitions; + private ImmutableSet groupings; + private ImmutableList 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> getTypeDefinitions() { - return Collections.unmodifiableSet(typeDefinitions); - } - - private void setTypeDefinitions(final Set> typeDefinitions) { - this.typeDefinitions.addAll(typeDefinitions); + return typeDefinitions; } @Override public Set getGroupings() { - return Collections.unmodifiableSet(groupings); - } - - private void setGroupings(final Set groupings) { - this.groupings.addAll(groupings); + return groupings; } @Override public List getUnknownSchemaNodes() { - return Collections.unmodifiableList(unknownNodes); - } - - private void setUnknownSchemaNodes(final List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } + return unknownNodes; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java index c8ff641027..94987086ba 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java @@ -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 ranges = Collections.emptyList(); private List lengths = Collections.emptyList(); private List 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; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java index 3b32e2c49a..1edf0b8543 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java @@ -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; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java index fe89819864..91c5e9a994 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java @@ -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 addedAugments = new HashSet<>(); + private final Set augmentationBuilders = new HashSet<>(); private final List refineBuilders = new ArrayList<>(); private final List 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 augments = new HashSet<>(); - for (AugmentationSchemaBuilder builder : addedAugments) { - augments.add(builder.build()); - } - instance.setAugmentations(augments); + if (instance != null) { + return instance; + } - // REFINES - final Map 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 augments = new HashSet<>(); + for (AugmentationSchemaBuilder builder : augmentationBuilders) { + augments.add(builder.build()); + } + instance.augmentations = ImmutableSet.copyOf(augments); + + // REFINES + final Map 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 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 augmentations = Collections.emptySet(); + private ImmutableSet augmentations; private boolean addedByUses; - private Map refines = Collections.emptyMap(); - private final List unknownNodes = new ArrayList<>(); + private ImmutableMap refines; + private ImmutableList 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 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 refines) { - if (refines != null) { - this.refines = refines; - } - } - - private void addUnknownSchemaNodes(final List unknownSchemaNodes) { - if (unknownSchemaNodes != null) { - this.unknownNodes.addAll(unknownSchemaNodes); - } + @SuppressWarnings("unused") + public List getUnknownSchemaNodes() { + return unknownNodes; } @Override