Added getParent() method to DataSchemaNode and DataNodeContainer. Fixed Bugs. 87/2087/2
authorMartin Vitez <mvitez@cisco.com>
Tue, 22 Oct 2013 20:54:19 +0000 (22:54 +0200)
committerMartin Vitez <mvitez@cisco.com>
Tue, 22 Oct 2013 21:09:26 +0000 (23:09 +0200)
Fix for Bug 119.
Fix for Bug 120.
Fix for Bug 121.

Added more tests.

Change-Id: I7a88a1dc4b0ff8c277afab0560c89e91c8ff1a21
Signed-off-by: Martin Vitez <mvitez@cisco.com>
67 files changed:
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend
code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/ChoiceCaseGenTypesTest.java
code-generator/binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/SupportTestUtil.java
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/bar.yang [new file with mode: 0644]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/baz.yang [new file with mode: 0644]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/foo.yang [new file with mode: 0644]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/bar.yang [new file with mode: 0644]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/foo.yang [new file with mode: 0644]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/test.yang [deleted file]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/bar.yang [new file with mode: 0644]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/baz.yang [new file with mode: 0644]
code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/foo.yang [new file with mode: 0644]
code-generator/binding-type-provider/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataSchemaNode.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Deviation.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Module.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/RpcDefinition.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangNode.java [new file with mode: 0644]
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/DataNodeIterator.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AbstractSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/AugmentationSchemaBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/Builder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataNodeContainerBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/GroupingBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/SchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/TypeDefinitionBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/UsesNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ConstraintsBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/DeviationBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ExtensionBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/FeatureBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/IdentityrefTypeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/RpcDefinitionBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnionTypeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineHolder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineUtils.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/GroupingTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/util/BitImplTest.java
yang/yang-parser-impl/src/test/resources/model/foo.yang
yang/yang-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang

index 1cc3fb6a37d7d641953a01cc80b81af2b44948d7..c0802aecc5be43e0d8d794bc13be66a219966724 100644 (file)
@@ -61,13 +61,15 @@ import static org.opendaylight.yangtools.binding.generator.util.BindingGenerator
 import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.*;\r
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.*;\r
 import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort\r
-import org.opendaylight.yangtools.yang.model.util.ExtendedType;\rimport org.opendaylight.yangtools.yang.common.QName
-import org.opendaylight.yangtools.yang.model.api.UsesNode
-import java.util.HashSet
-import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext
-import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder
-import org.opendaylight.yangtools.yang.model.api.ModuleImport
-import org.opendaylight.yangtools.yang.binding.DataContainer
+import org.opendaylight.yangtools.yang.model.util.ExtendedType;\r
+import org.opendaylight.yangtools.yang.model.api.UsesNode\r
+import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext\r
+import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder\r
+import org.opendaylight.yangtools.yang.model.api.ModuleImport\r
+import org.opendaylight.yangtools.yang.binding.DataContainer\rimport java.util.Iterator
+import org.opendaylight.yangtools.yang.model.api.AugmentationTarget
+import java.util.Collection
+import org.opendaylight.yangtools.yang.model.api.YangNode
 
 public class BindingGeneratorImpl implements BindingGenerator {\r
     /**\r
@@ -225,7 +227,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
     private def List<Type> allTypeDefinitionsToGenTypes(Module module) {\r
         checkArgument(module !== null, "Module reference cannot be NULL.");\r
         checkArgument(module.name !== null, "Module name cannot be NULL.");\r
-        val Set<TypeDefinition<?>> typeDefinitions = module.typeDefinitions;\r
+        val it = new DataNodeIterator(module);\r
+        val List<TypeDefinition<?>> typeDefinitions = it.allTypedefs;\r
         checkState(typeDefinitions !== null, '''Type Definitions for module Â«module.name» cannot be NULL.''');\r
 \r
         val List<Type> generatedTypes = new ArrayList();\r
@@ -284,7 +287,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 \r
         for (usesNode : node.uses) {\r
             for (augment : usesNode.augmentations) {\r
-                result.addAll(augmentationToGenTypes(basePackageName, augment, module, true));\r
+                result.addAll(augmentationToGenTypes(basePackageName, augment, module, usesNode));\r
                 result.addAll(processUsesAugments(augment, module));\r
             }\r
         }\r
@@ -433,7 +436,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         val basePackageName = moduleNamespaceToPackageName(module);\r
         val List<AugmentationSchema> augmentations = resolveAugmentations(module);\r
         for (augment : augmentations) {\r
-            generatedTypes.addAll(augmentationToGenTypes(basePackageName, augment, module, false));\r
+            generatedTypes.addAll(augmentationToGenTypes(basePackageName, augment, module, null));\r
         }\r
         return generatedTypes;\r
     }\r
@@ -916,90 +919,225 @@ public class BindingGeneratorImpl implements BindingGenerator {
      *             <li>if target path of <code>augSchema</code> equals null</li>\r
      *             </ul>\r
      */\r
-    private def List<Type> augmentationToGenTypes(String augmentPackageName, AugmentationSchema augSchema, Module module, boolean addedByUses) {\r
-        checkArgument(augmentPackageName !== null, "Package Name cannot be NULL.");\r
-        checkArgument(augSchema !== null, "Augmentation Schema cannot be NULL.");\r
-        checkState(augSchema.targetPath !== null,\r
-            "Augmentation Schema does not contain Target Path (Target Path is NULL).");\r
-        val List<Type> genTypes = new ArrayList();\r
-        genTypes.addAll(processUsesAugments(augSchema, module));\r
-\r
+    private def List<Type> augmentationToGenTypes(String augmentPackageName, AugmentationSchema augSchema, Module module,
+        UsesNode parentUsesNode) {
+        checkArgument(augmentPackageName !== null, "Package Name cannot be NULL.");
+        checkArgument(augSchema !== null, "Augmentation Schema cannot be NULL.");
+        checkState(augSchema.targetPath !== null,
+            "Augmentation Schema does not contain Target Path (Target Path is NULL).");
+        val List<Type> genTypes = new ArrayList();
+        genTypes.addAll(processUsesAugments(augSchema, module));
+
         // EVERY augmented interface will extends Augmentation<T> interface\r
         // and DataObject interface!!!\r
-        val targetPath = augSchema.targetPath;\r
-        var targetSchemaNode = findDataSchemaNode(schemaContext, targetPath);\r
+        val targetPath = augSchema.targetPath;
+        var targetSchemaNode = findDataSchemaNode(schemaContext, targetPath);
         if (targetSchemaNode instanceof DataSchemaNode && (targetSchemaNode as DataSchemaNode).isAddedByUses()) {\r
-                       targetSchemaNode = findOriginalTargetFromGrouping(targetPath, module, targetSchemaNode as DataSchemaNode);\r
-        }\r
-\r
-        if(targetSchemaNode !== null) {\r
-            var targetType = yangToJavaMapping.get(targetSchemaNode.path);\r
-            if(targetType == null) {\r
-\r
+            if (parentUsesNode == null) {\r
+                targetSchemaNode = findOriginal(targetSchemaNode as DataSchemaNode);\r
+            } else {\r
+                targetSchemaNode = findOriginalTargetFromGrouping(targetSchemaNode.QName.localName, parentUsesNode);\r
+            }\r
+            if (targetSchemaNode == null) {\r
+                throw new NullPointerException(\r
+                    "Failed to find target node from grouping for augmentation " + augSchema + " in module " + module.name);\r
+            }
+        }
+\r
+        if (targetSchemaNode !== null) {
+            var targetType = yangToJavaMapping.get(targetSchemaNode.path);
+            if (targetType == null) {
                 // FIXME: augmentation should be added as last, all types should already be generated\r
                 // and have assigned Java Types,\r
-                val targetModule = findParentModule(schemaContext, targetSchemaNode);\r
-                val targetBasePackage = moduleNamespaceToPackageName(targetModule);\r
-                val typePackage = packageNameForGeneratedType(targetBasePackage, targetSchemaNode.getPath());\r
-                val targetSchemaNodeName = targetSchemaNode.getQName().getLocalName();\r
-                val typeName = parseToClassName(targetSchemaNodeName);\r
-                targetType = new ReferencedTypeImpl(typePackage, typeName);\r
-            }\r
-            val augChildNodes = augSchema.childNodes;\r
+                val targetModule = findParentModule(schemaContext, targetSchemaNode);
+                val targetBasePackage = moduleNamespaceToPackageName(targetModule);
+                val typePackage = packageNameForGeneratedType(targetBasePackage, targetSchemaNode.getPath());
+                val targetSchemaNodeName = targetSchemaNode.getQName().getLocalName();
+                val typeName = parseToClassName(targetSchemaNodeName);
+                targetType = new ReferencedTypeImpl(typePackage, typeName);
+            }
+            val augChildNodes = augSchema.childNodes;
+
+            if (!(targetSchemaNode instanceof ChoiceNode)) {
+                var packageName = augmentPackageName;
+                if (parentUsesNode != null) {
+                    packageName = packageNameForGeneratedType(augmentPackageName, augSchema.targetPath);
+                }
+                val augTypeBuilder = addRawAugmentGenTypeDefinition(packageName, augmentPackageName, targetType,
+                    augSchema);
+                val augType = augTypeBuilder.toInstance();
+                genTypes.add(augType);
+            } else {
+                genTypes.addAll(
+                    generateTypesFromAugmentedChoiceCases(augmentPackageName, targetType, augChildNodes,
+                        targetSchemaNode as ChoiceNode));
+            }
+            genTypes.addAll(augmentationBodyToGenTypes(augmentPackageName, augChildNodes, module));
+        }
+
+        return genTypes;
+    }\r
 \r
-            if(!(targetSchemaNode instanceof ChoiceNode)) {\r
-                var packageName = augmentPackageName;\r
-                if (addedByUses) {\r
-                    packageName = packageNameForGeneratedType(augmentPackageName, augSchema.targetPath);\r
+    /**\r
+     * Utility method which search for original node defined in grouping.\r
+     */\r
+    private def DataSchemaNode findOriginal(DataSchemaNode node) {\r
+        var DataSchemaNode result = findCorrectTargetFromGrouping(node);\r
+        if (result == null) {\r
+            result = findCorrectTargetFromAugment(node);\r
+            if (result != null) {\r
+                if (result.addedByUses) {\r
+                    result = findOriginal(result);\r
                 }\r
-                val augTypeBuilder = addRawAugmentGenTypeDefinition(packageName, augmentPackageName, targetType, augSchema);\r
-                val augType = augTypeBuilder.toInstance();\r
-                genTypes.add(augType);\r
-            } else {\r
-                genTypes.addAll(generateTypesFromAugmentedChoiceCases(augmentPackageName, targetType, augChildNodes, targetSchemaNode as ChoiceNode));\r
             }\r
-            genTypes.addAll(augmentationBodyToGenTypes(augmentPackageName, augChildNodes, module));\r
         }\r
-               \r
-        return genTypes;\r
+        return result;\r
     }\r
 \r
-    private def DataSchemaNode findOriginalTargetFromGrouping(SchemaPath targetPath, Module module, DataSchemaNode targetSchemaNode) {\r
-        val path = new ArrayList<QName>(targetPath.getPath());\r
-        path.remove(path.size()-1);\r
-        var DataNodeContainer parent = null;\r
+    private def DataSchemaNode findCorrectTargetFromAugment(DataSchemaNode node) {\r
+        if (!node.augmenting) {\r
+            return null;\r
+        }\r
 \r
-        if (path.isEmpty()) {\r
-            parent = module;\r
+        var String currentName = node.QName.localName;\r
+        var tmpPath = new ArrayList<String>();\r
+        var YangNode parent = node;\r
+        var AugmentationSchema augment = null;\r
+        do {\r
+            parent = (parent as DataSchemaNode).parent;\r
+            if (parent instanceof AugmentationTarget) {\r
+                tmpPath.add(currentName);\r
+                augment = findNodeInAugment((parent as AugmentationTarget).availableAugmentations, currentName);\r
+                if (augment == null) {\r
+                    currentName = (parent as DataSchemaNode).QName.localName; \r
+                }\r
+            }\r
+        } while ((parent as DataSchemaNode).augmenting && augment == null);\r
+\r
+        if (augment == null) {\r
+            return null;\r
         } else {\r
-            parent = findNodeInSchemaContext(schemaContext, path) as DataNodeContainer;\r
+            Collections.reverse(tmpPath);\r
+            var Object actualParent = augment;\r
+            var DataSchemaNode result = null;\r
+            for (name : tmpPath) {\r
+                if (actualParent instanceof DataNodeContainer) {\r
+                    result = (actualParent as DataNodeContainer).getDataChildByName(name);\r
+                    actualParent = (actualParent as DataNodeContainer).getDataChildByName(name);\r
+                } else {\r
+                    if (actualParent instanceof ChoiceNode) {\r
+                        result = (actualParent as ChoiceNode).getCaseNodeByName(name);\r
+                        actualParent = (actualParent as ChoiceNode).getCaseNodeByName(name); \r
+                    }\r
+                }\r
+            }\r
+\r
+            if (result.addedByUses) {\r
+                result = findCorrectTargetFromGrouping(result);\r
+            }\r
+\r
+            return result;\r
         }\r
+    }\r
 \r
-        val Set<UsesNode> usesNodes = parent.getUses();\r
-        if (usesNodes == null || usesNodes.isEmpty()) {\r
-            return targetSchemaNode;\r
+    private def AugmentationSchema findNodeInAugment(Collection<AugmentationSchema> augments, String name) {\r
+        for (augment : augments) {\r
+            if (augment.getDataChildByName(name) != null) {\r
+                return augment;\r
+            }\r
         }\r
-        val Set<SchemaPath> groupingPaths = new HashSet<SchemaPath>();\r
-        for (uses : usesNodes) {\r
-            groupingPaths.add(uses.getGroupingPath());\r
+        return null;\r
+    }\r
+\r
+    private def DataSchemaNode findCorrectTargetFromGrouping(DataSchemaNode node) {\r
+        if (node.path.path.size == 1) {\r
+            // uses is under module statement\r
+            val Module m = findParentModule(schemaContext, node);\r
+            var DataSchemaNode result = null;\r
+            for (u : m.uses) {\r
+                var SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, u.groupingPath.path);\r
+                if (!(targetGrouping instanceof GroupingDefinition)) {\r
+                    throw new IllegalArgumentException("Failed to generate code for augment in " + u);\r
+                }\r
+                var gr = targetGrouping as GroupingDefinition;\r
+                result = gr.getDataChildByName(node.QName.localName);\r
+            }\r
+            if (result == null) {\r
+                throw new IllegalArgumentException("Failed to generate code for augment");\r
+            }\r
+            return result;\r
+        } else {\r
+            var DataSchemaNode result = null;\r
+            var String currentName = node.QName.localName;\r
+            var tmpPath = new ArrayList<String>();\r
+            var YangNode parent = node.parent; \r
+            do {\r
+                tmpPath.add(currentName);\r
+                val dataNodeParent = parent as DataNodeContainer;\r
+                for (u : dataNodeParent.uses) {\r
+                    var SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, u.groupingPath.path);\r
+                    if (!(targetGrouping instanceof GroupingDefinition)) {\r
+                        throw new IllegalArgumentException("Failed to generate code for augment in " + u);\r
+                    }\r
+                    var gr = targetGrouping as GroupingDefinition;\r
+                    result = gr.getDataChildByName(currentName);\r
+                }\r
+                if (result == null) {\r
+                    currentName = (parent as SchemaNode).QName.localName;\r
+                    if (parent instanceof DataSchemaNode) {\r
+                        parent = (parent as DataSchemaNode).parent;\r
+                    } else {\r
+                        parent = (parent as DataNodeContainer).parent;\r
+                    }\r
+                }\r
+            } while (result == null && !(parent instanceof Module));\r
+\r
+            if (result != null) {\r
+                if (tmpPath.size == 1) {\r
+                    return result;\r
+                } else {\r
+                    var DataSchemaNode newParent = result;\r
+                    Collections.reverse(tmpPath);\r
+                    tmpPath.remove(0);\r
+                    for (name : tmpPath) {\r
+                        newParent = (newParent as DataNodeContainer).getDataChildByName(name);\r
+                    }\r
+                    return newParent;\r
+                }\r
+            }\r
+\r
+            return result;\r
         }\r
-        val Set<GroupingDefinition> groupings = new HashSet<GroupingDefinition>();\r
-        for (gp : groupingPaths) {\r
-            groupings.add(findGrouping(schemaContext, module, gp.getPath()));\r
+    }\r
+\r
+    /**\r
+     * Convenient method to find node added by uses statement.\r
+     */\r
+    private def DataSchemaNode findOriginalTargetFromGrouping(String targetSchemaNodeName, UsesNode parentUsesNode) {\r
+        var SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, parentUsesNode.groupingPath.path);\r
+        if (!(targetGrouping instanceof GroupingDefinition)) {\r
+            throw new IllegalArgumentException("Failed to generate code for augment in " + parentUsesNode);\r
         }\r
 \r
-        var DataSchemaNode result = findNodeInGroupings(groupings, targetSchemaNode.getQName().localName);\r
-        return result;\r
-    }\r
+        var grouping = targetGrouping as GroupingDefinition;\r
+        var result = grouping.getDataChildByName(targetSchemaNodeName);\r
+        if (result == null) {\r
+            return null;\r
+        }\r
+        var boolean fromUses = result.addedByUses;\r
 \r
-    private def DataSchemaNode findNodeInGroupings(Set<GroupingDefinition> groupings, String name) {\r
-        for (gr : groupings) {\r
-            var DataSchemaNode node = gr.getDataChildByName(name);\r
-            if (node != null) {\r
-               return node;\r
+        var Iterator<UsesNode> groupingUses = grouping.uses.iterator;\r
+        while (fromUses) {\r
+            if (groupingUses.hasNext()) {\r
+                grouping = findNodeInSchemaContext(schemaContext, groupingUses.next().groupingPath.path) as GroupingDefinition;\r
+                result = grouping.getDataChildByName(targetSchemaNodeName);\r
+                fromUses = result.addedByUses;\r
+            } else {\r
+                throw new NullPointerException("Failed to generate code for augment in " + parentUsesNode);\r
             }\r
         }\r
-        return null;\r
+\r
+        return result;\r
     }\r
 \r
     /**\r
@@ -1021,31 +1159,31 @@ public class BindingGeneratorImpl implements BindingGenerator {
      *            and uses of augment\r
      * @return generated type builder for augment\r
      */\r
-    private def GeneratedTypeBuilder addRawAugmentGenTypeDefinition(String augmentPackageName, String basePackageName,
-               Type targetTypeRef, AugmentationSchema augSchema) {
-               var Map<String, GeneratedTypeBuilder> augmentBuilders = genTypeBuilders.get(augmentPackageName);
-               if (augmentBuilders === null) {
-                       augmentBuilders = new HashMap();
-                       genTypeBuilders.put(augmentPackageName, augmentBuilders);
-               }
-               val augIdentifier = getAugmentIdentifier(augSchema.unknownSchemaNodes);
-
-               val augTypeName = if (augIdentifier !== null) {
-                               parseToClassName(augIdentifier)
-                       } else {
-                               augGenTypeName(augmentBuilders, targetTypeRef.name);
-                       }
-
-               val augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augTypeName);
-
-               augTypeBuilder.addImplementsType(DATA_OBJECT);
-               augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef));
-               addImplementedInterfaceFromUses(augSchema, augTypeBuilder);
-
-               augSchemaNodeToMethods(basePackageName, augTypeBuilder, augSchema.childNodes);
-               augmentBuilders.put(augTypeName, augTypeBuilder);
-               return augTypeBuilder;
-       }\r
+    private def GeneratedTypeBuilder addRawAugmentGenTypeDefinition(String augmentPackageName, String basePackageName,\r
+        Type targetTypeRef, AugmentationSchema augSchema) {\r
+        var Map<String, GeneratedTypeBuilder> augmentBuilders = genTypeBuilders.get(augmentPackageName);\r
+        if (augmentBuilders === null) {\r
+            augmentBuilders = new HashMap();\r
+            genTypeBuilders.put(augmentPackageName, augmentBuilders);\r
+        }\r
+        val augIdentifier = getAugmentIdentifier(augSchema.unknownSchemaNodes);\r
+\r
+        val augTypeName = if (augIdentifier !== null) {\r
+                parseToClassName(augIdentifier)\r
+            } else {\r
+                augGenTypeName(augmentBuilders, targetTypeRef.name);\r
+            }\r
+\r
+        val augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augTypeName);\r
+\r
+        augTypeBuilder.addImplementsType(DATA_OBJECT);\r
+        augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef));\r
+        addImplementedInterfaceFromUses(augSchema, augTypeBuilder);\r
+\r
+        augSchemaNodeToMethods(basePackageName, augTypeBuilder, augSchema.childNodes);\r
+        augmentBuilders.put(augTypeName, augTypeBuilder);\r
+        return augTypeBuilder;\r
+    }\r
 \r
     /**\r
      *\r
@@ -1080,6 +1218,9 @@ public class BindingGeneratorImpl implements BindingGenerator {
         val List<Type> genTypes = new ArrayList();\r
         val List<DataNodeIterator> augSchemaIts = new ArrayList();\r
         for (childNode : augChildNodes) {\r
+            if (!childNode.addedByUses) {\r
+                \r
+            \r
             if(childNode instanceof DataNodeContainer) {\r
                 augSchemaIts.add(new DataNodeIterator(childNode as DataNodeContainer));\r
 \r
@@ -1095,6 +1236,9 @@ public class BindingGeneratorImpl implements BindingGenerator {
                 }\r
                 genTypes.addAll(choiceToGeneratedType(augBasePackageName, childNode as ChoiceNode, module));\r
             }\r
+            \r
+            \r
+            }\r
         }\r
 \r
         for (it : augSchemaIts) {\r
@@ -1916,14 +2060,16 @@ public class BindingGeneratorImpl implements BindingGenerator {
             } else {\r
                 resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, true);\r
             }\r
-        } else if(schemaNode instanceof LeafListSchemaNode) {\r
-            resolveLeafListSchemaNode(typeBuilder, schemaNode as LeafListSchemaNode);\r
-        } else if(schemaNode instanceof ContainerSchemaNode) {\r
-            resolveContainerSchemaNode(basePackageName, typeBuilder, schemaNode as ContainerSchemaNode);\r
-        } else if(schemaNode instanceof ChoiceNode) {\r
-            resolveChoiceSchemaNode(basePackageName,typeBuilder,schemaNode as ChoiceNode);\r
-        } else if(schemaNode instanceof ListSchemaNode) {\r
-            resolveListSchemaNode(basePackageName, typeBuilder, schemaNode as ListSchemaNode);\r
+        } else if (!schemaNode.addedByUses) {\r
+            if (schemaNode instanceof LeafListSchemaNode) {\r
+                resolveLeafListSchemaNode(typeBuilder, schemaNode as LeafListSchemaNode);\r
+            } else if(schemaNode instanceof ContainerSchemaNode) {\r
+                resolveContainerSchemaNode(basePackageName, typeBuilder, schemaNode as ContainerSchemaNode);\r
+            } else if(schemaNode instanceof ChoiceNode) {\r
+                resolveChoiceSchemaNode(basePackageName,typeBuilder,schemaNode as ChoiceNode);\r
+            } else if(schemaNode instanceof ListSchemaNode) {\r
+                resolveListSchemaNode(basePackageName, typeBuilder, schemaNode as ListSchemaNode);\r
+            }\r
         }\r
     }\r
 \r
index 3068f46fe6939d5403f14a22beaf86f00d97799b..048de43e7172392168cb1099a1be75430a4ca2ba 100644 (file)
@@ -8,7 +8,8 @@
 package org.opendaylight.yangtools.sal.binding.generator.impl;
 
 import static org.junit.Assert.*;
-import static org.opendaylight.yangtools.sal.binding.generator.impl.SupportTestUtil.*;
+import static org.opendaylight.yangtools.sal.binding.generator.impl.SupportTestUtil.containsInterface;
+import static org.opendaylight.yangtools.sal.binding.generator.impl.SupportTestUtil.containsMethods;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -70,6 +71,7 @@ public class ChoiceCaseGenTypesTest {
     public void choiceCaseResolvingTypeTest() {
         final YangModelParser parser = new YangParserImpl();
         final Set<Module> modules = parser.parseYangModels(yangModels);
+
         final SchemaContext context = parser.resolveSchemaContext(modules);
 
         assertNotNull("context is null", context);
@@ -141,6 +143,7 @@ public class ChoiceCaseGenTypesTest {
 
         genType = checkGeneratedType(genTypes, "LeafAugCase", pcgPref
                 + ".netconf.state.datastores.datastore.locks.lock.type"); // choice
+        // FIXME
         containsMethods(genType, new NameTypePattern("getLeafAugCase", "String"));
         containsInterface("LockType", genType);
 
index acaf426cf981eebdca10e8a061c6da7318e0981d..aee0c431d94451b80921790753d5dea6bc8ea783 100644 (file)
@@ -117,7 +117,7 @@ public class SupportTestUtil {
                 break;
             }
         }
-        assertTrue("Generated type " + genType.getName() + " doesn't implement inrerface " + interfaceNameSearched,
+        assertTrue("Generated type " + genType.getName() + " doesn't implement interface " + interfaceNameSearched,
                 interfaceFound);
     }
 
index 0581b95ddc96f73d50f2923ac41f0c55fcc83230..59d4523affb5e4e93104a1f994350b16f8c5c70c 100644 (file)
@@ -43,14 +43,17 @@ import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
 
 /**
  * Test correct code generation.
- * 
+ *
  */
 public class CompilationTest {
     private static final String FS = File.separator;
-    private static final String NS_TEST = "org" + FS + "opendaylight" + FS + "yang" + FS + "gen" + FS + "v1" + FS
-            + "urn" + FS + "opendaylight" + FS + "test" + FS + "rev131008";
-    private static final String NS_FOO = "org" + FS + "opendaylight" + FS + "yang" + FS + "gen" + FS + "v1" + FS
-            + "urn" + FS + "opendaylight" + FS + "foo" + FS + "rev131008";
+    private static final String BASE_PATH = "org" + FS + "opendaylight" + FS + "yang" + FS + "gen" + FS + "v1";
+    private static final String NS_TEST = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "test" + FS + "rev131008";
+    private static final String NS_FOO = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "foo" + FS + "rev131008";
+    private static final String NS_BAR = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "bar" + FS + "rev131008";
+    private static final String NS_BAZ = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "baz" + FS + "rev131008";
+
+    private static final String BASE_PKG = "org.opendaylight.yang.gen.v1";
 
     private static final String TEST_PATH = "target" + FS + "test";
     private static final File TEST_DIR = new File(TEST_PATH);
@@ -62,6 +65,8 @@ public class CompilationTest {
 
     private YangParserImpl parser;
     private BindingGenerator bindingGenerator;
+    private JavaCompiler compiler;
+    private StandardJavaFileManager fileManager;
 
     @BeforeClass
     public static void createTestDirs() {
@@ -76,6 +81,8 @@ public class CompilationTest {
     public void init() {
         parser = new YangParserImpl();
         bindingGenerator = new BindingGeneratorImpl();
+        compiler = ToolProvider.getSystemJavaCompiler();
+        fileManager = compiler.getStandardFileManager(null, null, null);
     }
 
     /**
@@ -107,32 +114,63 @@ public class CompilationTest {
 
         // Test if all sources are generated
         File parent = new File(sourcesOutputDir, NS_TEST);
-        File linksKeyFile = new File(parent, "LinksKey.java");
-        assertTrue(new File(parent, "KeyArgs.java").exists());
-        assertTrue(new File(parent, "Links.java").exists());
-        assertTrue(new File(parent, "LinksBuilder.java").exists());
-        assertTrue(linksKeyFile.exists());
-        assertTrue(new File(parent, "TestData.java").exists());
-        assertTrue(new File(parent, "links" + FS + "Level.java").exists());
-        assertTrue(new File(parent, "links" + FS + "LinkGroup.java").exists());
-        assertTrue(new File(parent, "links" + FS + "Node.java").exists());
-        assertTrue(new File(parent, "links" + FS + "NodeBuilder.java").exists());
-        assertTrue(new File(parent, "links" + FS + "NodeList.java").exists());
-        assertTrue(new File(parent, "links" + FS + "NodeListBuilder.java").exists());
-        assertTrue(linksKeyFile.exists());
+        assertEquals(6, parent.listFiles().length);
+        File keyArgs = new File(parent, "KeyArgs.java");
+        File links = new File(parent, "Links.java");
+        File linksBuilder = new File(parent, "LinksBuilder.java");
+        File linksKey = new File(parent, "LinksKey.java");
+        File testData = new File(parent, "TestData.java");
+        assertTrue(keyArgs.exists());
+        assertTrue(links.exists());
+        assertTrue(linksBuilder.exists());
+        assertTrue(linksKey.exists());
+        assertTrue(testData.exists());
+
+        parent = new File(sourcesOutputDir, NS_TEST + FS + "links");
+        assertEquals(7, parent.listFiles().length);
+        File level = new File(parent, "Level.java");
+        File linkGroup = new File(parent, "LinkGroup.java");
+        File node = new File(parent, "Node.java");
+        File nodeBuilder = new File(parent, "NodeBuilder.java");
+        File nodeList = new File(parent, "NodeList.java");
+        File nodeListBuilder = new File(parent, "NodeListBuilder.java");
+        File nodesType = new File(parent, "NodesType.java");
+        assertTrue(level.exists());
+        assertTrue(linkGroup.exists());
+        assertTrue(node.exists());
+        assertTrue(nodeBuilder.exists());
+        assertTrue(nodeList.exists());
+        assertTrue(nodeListBuilder.exists());
+        assertTrue(nodesType.exists());
 
         // Test if sources are compilable
-        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
-        List<File> filesList = getJavaFiles(sourcesOutputDir);
-        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList);
-        Iterable<String> options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath());
-        boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call();
-        assertTrue(compiled);
+        testCompilation(sourcesOutputDir, compiledOutputDir);
 
         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
-        Class<?> linksKeyClass = Class.forName("org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008.LinksKey",
-                true, loader);
+        Class<?> keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader);
+        Class<?> linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
+        Class<?> linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
+
+        // Test generated 'grouping key-args'
+        try {
+            assertTrue(keyArgsClass.isInterface());
+            assertEquals(3, keyArgsClass.getDeclaredMethods().length);
+
+            Method getId = keyArgsClass.getMethod("getId");
+            assertEquals(Byte.class, getId.getReturnType());
+            Method getName = keyArgsClass.getMethod("getName");
+            assertEquals(String.class, getName.getReturnType());
+            Method getSize = keyArgsClass.getMethod("getSize");
+            assertEquals(Integer.class, getSize.getReturnType());
+        } catch (NoSuchMethodException e) {
+            throw new AssertionError("Required method not found in " + keyArgsClass, e);
+        }
+
+        // test generated 'list links'
+        assertTrue(linksClass.isInterface());
+        // FIXME: anyxml
+        assertEquals(5, linksClass.getDeclaredMethods().length);
+        testImplementIfc(linksClass, keyArgsClass);
 
         // Test list key constructor arguments ordering
         try {
@@ -158,26 +196,218 @@ public class CompilationTest {
         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
         generator.generateToFile(sourcesOutputDir);
 
-        // Test if all sources are generated
-        File parent = new File(sourcesOutputDir, NS_TEST);
+        // Test if all sources were generated from 'module foo'
+        File parent = new File(sourcesOutputDir, NS_FOO);
+        assertEquals(7, parent.listFiles().length);
         assertTrue(new File(parent, "Object.java").exists());
         assertTrue(new File(parent, "OpenObject.java").exists());
-        assertTrue(new File(parent, "object" + FS + "Nodes.java").exists());
-        assertTrue(new File(parent, "object" + FS + "NodesBuilder.java").exists());
-        assertTrue(new File(parent, "open" + FS + "object" + FS + "Nodes1.java").exists());
-        assertTrue(new File(parent, "open" + FS + "object" + FS + "Nodes1Builder.java").exists());
-        assertTrue(new File(parent, "open" + FS + "object" + FS + "nodes" + FS + "Links.java").exists());
-        assertTrue(new File(parent, "open" + FS + "object" + FS + "nodes" + FS + "LinksBuilder.java").exists());
+        assertTrue(new File(parent, "ExplicitRouteObject.java").exists());
+        assertTrue(new File(parent, "PathKeySubobject.java").exists());
+
+        parent = new File(parent, "object");
+        assertEquals(2, parent.listFiles().length);
+        assertTrue(new File(parent, "Nodes.java").exists());
+        assertTrue(new File(parent, "NodesBuilder.java").exists());
+
+        parent = new File(sourcesOutputDir, NS_FOO + FS + "open");
+        assertEquals(1, parent.listFiles().length);
+
+        parent = new File(parent, "object");
+        assertEquals(3, parent.listFiles().length);
+        assertTrue(new File(parent, "Nodes1.java").exists());
+        assertTrue(new File(parent, "Nodes1Builder.java").exists());
+
+        parent = new File(parent, "nodes");
+        assertEquals(2, parent.listFiles().length);
+        assertTrue(new File(parent, "Links.java").exists());
+        assertTrue(new File(parent, "LinksBuilder.java").exists());
+
+        parent = new File(sourcesOutputDir, NS_FOO + FS + "explicit");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "route");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "object");
+        assertEquals(3, parent.listFiles().length);
+        assertTrue(new File(parent, "Subobjects.java").exists());
+        assertTrue(new File(parent, "SubobjectsBuilder.java").exists());
+
+        parent = new File(parent, "subobjects");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "subobject");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "type");
+        assertEquals(3, parent.listFiles().length);
+        assertTrue(new File(parent, "PathKey.java").exists());
+        assertTrue(new File(parent, "PathKeyBuilder.java").exists());
+
+        parent = new File(parent, "path");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "key");
+        assertEquals(2, parent.listFiles().length);
+        assertTrue(new File(parent, "PathKey.java").exists());
+        assertTrue(new File(parent, "PathKeyBuilder.java").exists());
+
+        // Test if all sources were generated from 'module bar'
+        parent = new File(sourcesOutputDir, NS_BAR);
+        assertEquals(3, parent.listFiles().length);
+        assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists());
+        assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists());
+
+        parent = new File(parent, "basic");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "explicit");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "route");
+        assertEquals(1, parent.listFiles().length);
+
+        parent = new File(parent, "subobjects");
+        assertEquals(2, parent.listFiles().length);
+        assertTrue(new File(parent, "SubobjectType.java").exists());
+
+        parent = new File(parent, "subobject");
+        assertEquals(1, parent.listFiles().length);
+
+        parent = new File(parent, "type");
+        assertEquals(4, parent.listFiles().length);
+        assertTrue(new File(parent, "IpPrefix.java").exists());
+        assertTrue(new File(parent, "IpPrefixBuilder.java").exists());
+        assertTrue(new File(parent, "Label.java").exists());
+        assertTrue(new File(parent, "LabelBuilder.java").exists());
 
         // Test if sources are compilable
-        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
+        testCompilation(sourcesOutputDir, compiledOutputDir);
 
-        List<File> filesList = getJavaFiles(sourcesOutputDir);
-        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList);
-        Iterable<String> options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath());
-        boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call();
-        assertTrue(compiled);
+        cleanUp(sourcesOutputDir, compiledOutputDir);
+    }
+
+    @Test
+    public void testAugmentOfAugmentGeneration() throws Exception {
+        final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "aug-of-aug");
+        assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
+        final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "aug-of-aug");
+        assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
+
+        final List<File> sourceFiles = getSourceFiles("/compilation/augment-of-augment");
+        final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
+        final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
+        final List<Type> types = bindingGenerator.generateTypes(context);
+        final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
+        generator.generateToFile(sourcesOutputDir);
+
+        // Test if all sources were generated from 'module foo'
+        File parent = new File(sourcesOutputDir, NS_FOO);
+        assertEquals(6, parent.listFiles().length);
+        File fooListener = new File(parent, "FooListener.java");
+        File pathAttributes = new File(parent, "PathAttributes.java");
+        File update = new File(parent, "Update.java");
+        File updateBuilder = new File(parent, "UpdateBuilder.java");
+        assertTrue(fooListener.exists());
+        assertTrue(pathAttributes.exists());
+        assertTrue(update.exists());
+        assertTrue(updateBuilder.exists());
+
+        parent = new File(sourcesOutputDir, NS_FOO + FS + "path");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "attributes");
+        assertEquals(2, parent.listFiles().length);
+        File origin = new File(parent, "Origin.java");
+        File originBuilder = new File(parent, "OriginBuilder.java");
+        assertTrue(origin.exists());
+        assertTrue(originBuilder.exists());
+
+        parent = new File(sourcesOutputDir, NS_FOO + FS + "update");
+        assertEquals(2, parent.listFiles().length);
+        pathAttributes = new File(parent, "PathAttributes.java");
+        File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java");
+        assertTrue(pathAttributes.exists());
+        assertTrue(pathAttributesBuilder.exists());
+
+        // Test if all sources were generated from 'module bar'
+        parent = new File(sourcesOutputDir, NS_BAR);
+        assertEquals(5, parent.listFiles().length);
+        File destination = new File(parent, "Destination.java");
+        File pathAttributes1 = new File(parent, "PathAttributes1.java");
+        File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java");
+        assertTrue(destination.exists());
+        assertTrue(pathAttributes1.exists());
+        assertTrue(pathAttributes1Builder.exists());
+
+        parent = new File(sourcesOutputDir, NS_BAR + FS + "destination");
+        assertEquals(2, parent.listFiles().length);
+        File destinationType = new File(parent, "DestinationType.java");
+        assertTrue(destinationType.exists());
+
+        parent = new File(parent, "destination");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "type");
+        assertEquals(2, parent.listFiles().length);
+        File destinationIpv4 = new File(parent, "DestinationIp.java");
+        File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java");
+        assertTrue(destinationIpv4.exists());
+        assertTrue(destinationIpv4Builder.exists());
+
+        parent = new File(sourcesOutputDir, NS_BAR + FS + "update");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "path");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "attributes");
+        assertEquals(3, parent.listFiles().length);
+        File mpUnreachNlri = new File(parent, "MpUnreachNlri.java");
+        File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java");
+        assertTrue(mpUnreachNlri.exists());
+        assertTrue(mpUnreachNlriBuilder.exists());
+
+        parent = new File(parent, "mp");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "unreach");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "nlri");
+        assertEquals(3, parent.listFiles().length);
+        File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java");
+        File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java");
+        assertTrue(withdrawnRoutes.exists());
+        assertTrue(withdrawnRoutesBuilder.exists());
+
+        parent = new File(parent, "withdrawn");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "routes");
+        assertEquals(1, parent.listFiles().length);
+        destinationType = new File(parent, "DestinationType.java");
+        assertTrue(destinationType.exists());
+
+        // Test if all sources were generated from 'module baz'
+        parent = new File(sourcesOutputDir, NS_BAZ);
+        assertEquals(2, parent.listFiles().length);
+        File linkstateDestination = new File(parent, "LinkstateDestination.java");
+        assertTrue(linkstateDestination.exists());
+
+        parent = new File(sourcesOutputDir, NS_BAZ + FS + "update");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "path");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "attributes");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "mp");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "unreach");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "nlri");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "withdrawn");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "routes");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "destination");
+        assertEquals(1, parent.listFiles().length);
+        parent = new File(parent, "type");
+        assertEquals(2, parent.listFiles().length);
+        File destinationLinkstate = new File(parent, "DestinationLinkstate.java");
+        File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java");
+        assertTrue(destinationLinkstate.exists());
+        assertTrue(destinationLinkstateBuilder.exists());
+
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
 
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }
@@ -202,40 +432,34 @@ public class CompilationTest {
         assertTrue(new File(parent, "NodesBuilder.java").exists());
         assertTrue(new File(parent, "Alg.java").exists());
 
-        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
-
-        List<File> filesList = getJavaFiles(sourcesOutputDir);
-        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList);
-        Iterable<String> options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath());
-        boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call();
-        assertTrue(compiled);
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
 
-        String pkg = "org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008";
+        String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008";
         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
         Class<?> nodesClass = Class.forName(pkg + ".Nodes", true, loader);
 
         // Test methods return type
         byte[] b = new byte[] {};
         testReturnType(nodesClass, "getIdBinary", b.getClass());
-        testReturnType(loader, nodesClass, "getIdBits", pkg + ".Nodes$IdBits");
-        testReturnType(loader, nodesClass, "isIdBoolean", "java.lang.Boolean");
-        testReturnType(loader, nodesClass, "getIdDecimal64", "java.math.BigDecimal");
-        testReturnType(loader, nodesClass, "isIdEmpty", "java.lang.Boolean");
-        testReturnType(loader, nodesClass, "getIdEnumeration", pkg + ".Nodes$IdEnumeration");
+        testReturnType(nodesClass, "getIdBits", pkg + ".Nodes$IdBits", loader);
+        testReturnType(nodesClass, "isIdBoolean", "java.lang.Boolean", loader);
+        testReturnType(nodesClass, "getIdDecimal64", "java.math.BigDecimal", loader);
+        testReturnType(nodesClass, "isIdEmpty", "java.lang.Boolean", loader);
+        testReturnType(nodesClass, "getIdEnumeration", pkg + ".Nodes$IdEnumeration", loader);
         testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg");
         testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier");
-        testReturnType(loader, nodesClass, "getId8", "java.lang.Byte");
-        testReturnType(loader, nodesClass, "getId16", "java.lang.Short");
-        testReturnType(loader, nodesClass, "getId32", "java.lang.Integer");
-        testReturnType(loader, nodesClass, "getId64", "java.lang.Long");
-        testReturnType(loader, nodesClass, "getIdLeafref", "java.lang.Long");
-        testReturnType(loader, nodesClass, "getIdString", "java.lang.String");
-        testReturnType(loader, nodesClass, "getIdU8", "java.lang.Short");
-        testReturnType(loader, nodesClass, "getIdU16", "java.lang.Integer");
-        testReturnType(loader, nodesClass, "getIdU32", "java.lang.Long");
-        testReturnType(loader, nodesClass, "getIdU64", "java.math.BigInteger");
-        testReturnType(loader, nodesClass, "getIdUnion", pkg + ".Nodes$IdUnion");
+        testReturnType(nodesClass, "getId8", "java.lang.Byte", loader);
+        testReturnType(nodesClass, "getId16", "java.lang.Short", loader);
+        testReturnType(nodesClass, "getId32", "java.lang.Integer", loader);
+        testReturnType(nodesClass, "getId64", "java.lang.Long", loader);
+        testReturnType(nodesClass, "getIdLeafref", "java.lang.Long", loader);
+        testReturnType(nodesClass, "getIdString", "java.lang.String", loader);
+        testReturnType(nodesClass, "getIdU8", "java.lang.Short", loader);
+        testReturnType(nodesClass, "getIdU16", "java.lang.Integer", loader);
+        testReturnType(nodesClass, "getIdU32", "java.lang.Long", loader);
+        testReturnType(nodesClass, "getIdU64", "java.math.BigInteger", loader);
+        testReturnType(nodesClass, "getIdUnion", pkg + ".Nodes$IdUnion", loader);
 
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }
@@ -256,25 +480,31 @@ public class CompilationTest {
 
         // Test if all sources are generated
         File fooParent = new File(sourcesOutputDir, NS_FOO);
-        File nodes = new File(fooParent, "Nodes.java");
-        File nodesBuilder = new File(fooParent, "NodesBuilder.java");
+        assertEquals(3, fooParent.listFiles().length);
         assertTrue(new File(fooParent, "FooData.java").exists());
-        assertTrue(nodes.exists());
-        assertTrue(nodesBuilder.exists());
+        assertTrue(new File(fooParent, "Nodes.java").exists());
+        assertTrue(new File(fooParent, "NodesBuilder.java").exists());
 
-        // Test if sources are compilable
-        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
+        File barParent = new File(sourcesOutputDir, NS_BAR);
+        assertEquals(1, barParent.listFiles().length);
+        assertTrue(new File(barParent, "IdentityClass.java").exists());
 
-        List<File> filesList = getJavaFiles(sourcesOutputDir);
-        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList);
-        Iterable<String> options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath());
-        boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call();
-        assertTrue(compiled);
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
 
         ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
-        Class<?> nodesClass = Class.forName("org.opendaylight.yang.gen.v1.urn.opendaylight.foo.rev131008.Nodes", true,
-                loader);
+        Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader);
+        Class<?> identityClass = Class
+                .forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader);
+
+        // test identity
+        try {
+            identityClass.getConstructor();
+            Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
+            assertEquals(baseIdentity, identityClass.getSuperclass());
+        } catch (NoSuchMethodException e) {
+            throw new AssertionError("IdentityClass must have no-arg constructor");
+        }
 
         // Test annotation
         try {
@@ -290,6 +520,37 @@ public class CompilationTest {
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }
 
+    @Test
+    public void testAugmentToUsesInAugment() throws Exception {
+        final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "augment-uses-to-augment");
+        assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
+        final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "augment-uses-to-augment");
+        assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
+
+        final List<File> sourceFiles = getSourceFiles("/compilation/augment-uses-to-augment");
+        final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
+        final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
+        final List<Type> types = bindingGenerator.generateTypes(context);
+        final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
+        generator.generateToFile(sourcesOutputDir);
+
+        // Test if all sources are generated
+        File fooParent = new File(sourcesOutputDir, NS_FOO);
+        assertEquals(4, fooParent.listFiles().length);
+        assertTrue(new File(fooParent, "IgpLinkAttributes.java").exists());
+        assertTrue(new File(fooParent, "Link1.java").exists());
+        assertTrue(new File(fooParent, "Link1Builder.java").exists());
+
+        File bazParent = new File(sourcesOutputDir, NS_BAZ);
+        assertEquals(4, bazParent.listFiles().length);
+        assertTrue(new File(bazParent, "IgpLinkAttributes1.java").exists());
+        assertTrue(new File(bazParent, "IgpLinkAttributes1Builder.java").exists());
+        assertTrue(new File(bazParent, "LinkAttributes.java").exists());
+
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
+    }
+
     @Test
     public void compilationTest() throws Exception {
         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "yang");
@@ -304,16 +565,41 @@ public class CompilationTest {
         final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
         generator.generateToFile(sourcesOutputDir);
 
-        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
 
+        cleanUp(sourcesOutputDir, compiledOutputDir);
+    }
+
+    /**
+     * Test if source code is compilable.
+     *
+     * @param sourcesOutputDir
+     *            directory containing source files
+     * @param compiledOutputDir
+     *            compiler output directory
+     */
+    private void testCompilation(File sourcesOutputDir, File compiledOutputDir) {
         List<File> filesList = getJavaFiles(sourcesOutputDir);
         Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(filesList);
         Iterable<String> options = Arrays.asList("-d", compiledOutputDir.getAbsolutePath());
         boolean compiled = compiler.getTask(null, null, null, options, null, compilationUnits).call();
         assertTrue(compiled);
+    }
 
-        cleanUp(sourcesOutputDir, compiledOutputDir);
+    private void testImplementIfc(Class<?> classToTest, String ifc, ClassLoader loader) throws ClassNotFoundException {
+        Class<?>[] interfaces = classToTest.getInterfaces();
+        List<Class<?>> ifcsList = Arrays.asList(interfaces);
+        Class<?> ifcClass = Class.forName(ifc, true, loader);
+        testImplementIfc(classToTest, ifcClass);
+    }
+
+    private void testImplementIfc(Class<?> classToTest, Class<?> ifcClass) throws ClassNotFoundException {
+        Class<?>[] interfaces = classToTest.getInterfaces();
+        List<Class<?>> ifcsList = Arrays.asList(interfaces);
+        if (!ifcsList.contains(ifcClass)) {
+            throw new AssertionError(classToTest + " should implement " + ifcClass);
+        }
     }
 
     private void testReturnType(Class<?> clazz, String methodName, Class<?> returnType) throws Exception {
@@ -326,7 +612,7 @@ public class CompilationTest {
         }
     }
 
-    private void testReturnType(ClassLoader loader, Class<?> clazz, String methodName, String returnTypeStr)
+    private void testReturnType(Class<?> clazz, String methodName, String returnTypeStr, ClassLoader loader)
             throws Exception {
         Class<?> returnType;
         try {
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/bar.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/bar.yang
new file mode 100644 (file)
index 0000000..231bb42
--- /dev/null
@@ -0,0 +1,29 @@
+module bar {
+    yang-version 1;
+    namespace "urn:opendaylight:bar";
+    prefix "bar";
+
+    import foo { prefix fo; revision-date 2013-10-08; }
+
+    revision "2013-10-08" {
+    }
+
+    augment "/fo:update/fo:path-attributes" {
+        container mp-unreach-nlri {
+            container withdrawn-routes {
+                uses destination;
+            }
+        }
+    }
+
+    grouping destination {
+        choice destination-type {
+            case destination-ip {
+                leaf-list prefixes {
+                    type string;
+                }
+            }
+        }
+    }
+
+}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/baz.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/baz.yang
new file mode 100644 (file)
index 0000000..f361b34
--- /dev/null
@@ -0,0 +1,27 @@
+module baz {
+    yang-version 1;
+    namespace "urn:opendaylight:baz";
+    prefix "baz";
+
+    import foo { prefix fo; revision-date 2013-10-08; }
+    import bar { prefix br; revision-date 2013-10-08; }
+
+    revision "2013-10-08" {
+    }
+
+    augment "/fo:update/fo:path-attributes/br:mp-unreach-nlri/br:withdrawn-routes/br:destination-type" {
+        case destination-linkstate {
+            uses linkstate-destination;
+        }
+    }
+
+    grouping linkstate-destination {
+        leaf nlri-type {
+            type string;
+        }
+        leaf protocol-id {
+            type string;
+        }
+    }
+
+}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-of-augment/foo.yang
new file mode 100644 (file)
index 0000000..502b29b
--- /dev/null
@@ -0,0 +1,23 @@
+module foo {
+    yang-version 1;
+    namespace "urn:opendaylight:foo";
+    prefix "foo";
+
+    revision "2013-10-08" {
+    }
+
+    grouping path-attributes {
+        container origin {
+            leaf value {
+                type string;
+            }
+        }
+    }
+
+    notification update {
+        container path-attributes {
+            uses path-attributes;
+        }
+    }
+
+}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/bar.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/bar.yang
new file mode 100644 (file)
index 0000000..e1735b4
--- /dev/null
@@ -0,0 +1,22 @@
+module bar {
+    yang-version 1;
+    namespace "urn:opendaylight:bar";
+    prefix "bar";
+
+    revision "2013-10-08" {
+    }
+
+    grouping basic-explicit-route-subobjects {
+        choice subobject-type {
+            case ip-prefix {
+            }
+            case label {
+            }
+        }
+    }
+
+    grouping explicit-route-subobjects {
+        uses basic-explicit-route-subobjects;
+    }
+
+}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/foo.yang
new file mode 100644 (file)
index 0000000..e0d60ac
--- /dev/null
@@ -0,0 +1,51 @@
+module foo {
+    yang-version 1;
+    namespace "urn:opendaylight:foo";
+    prefix "foo";
+
+    import bar { prefix b; revision-date 2013-10-08; }
+
+    revision "2013-10-08" {
+    }
+
+    grouping object {
+        container nodes {
+        }
+    }
+
+    grouping open-object {
+        uses object {
+            augment "nodes" {
+                container links {
+                    leaf id {
+                        type string;
+                    }
+                }
+            }
+        }
+    }
+
+    grouping explicit-route-object {
+        list subobjects {
+            leaf loose {
+                type boolean;
+            }
+            uses b:explicit-route-subobjects {
+                augment "subobject-type" {
+                    case path-key {
+                        container path-key {
+                            uses path-key-subobject;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    grouping path-key-subobject {
+        leaf path-key {
+            type string;
+        }
+    }
+
+}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/test.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-under-uses/test.yang
deleted file mode 100644 (file)
index a13c39e..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-module test {
-    yang-version 1;
-    namespace "urn:opendaylight:test";
-    prefix "t";
-
-    revision "2013-10-08" {
-    }
-
-    grouping object {
-        container nodes {
-        }
-    }
-
-    grouping open-object {
-        uses object {
-            augment "nodes" {
-                container links {
-                    leaf id {
-                        type string;
-                    }
-                }
-            }
-        }
-    }
-
-}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/bar.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/bar.yang
new file mode 100644 (file)
index 0000000..c4fd4ea
--- /dev/null
@@ -0,0 +1,28 @@
+module bar {
+    yang-version 1;
+    namespace "urn:opendaylight.bar";
+    prefix "bar";
+
+    revision "2013-10-08" {
+    }
+
+    container network-topology {
+        list topology {
+            key "topology-id";
+            leaf topology-id {
+                type int32;
+            }
+            list link {
+                key "link-id";
+                uses link-attributes;
+            }
+        }
+    }
+
+    grouping link-attributes {
+        leaf link-id {
+            type int8;
+        }
+    }
+
+}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/baz.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/baz.yang
new file mode 100644 (file)
index 0000000..0cf07cb
--- /dev/null
@@ -0,0 +1,35 @@
+module baz {
+    yang-version 1;
+    namespace "urn:opendaylight.baz";
+    prefix "baz";
+
+    import foo {
+        prefix "fo";
+        revision-date 2013-10-08;
+    }
+
+    import bar {
+        prefix "br";
+        revision-date 2013-10-08;
+    }
+
+    revision "2013-10-08" {
+    }
+
+
+
+    augment "/br:network-topology/br:topology/br:link/fo:igp-link-attributes" {
+        uses link-attributes;
+    }
+
+    grouping link-attributes {
+        container ospf-link-attributes {
+            leaf multi-topology-id {
+                type uint8 {
+                    range "0..127";
+                }
+            }
+        }
+    }
+
+}
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/augment-uses-to-augment/foo.yang
new file mode 100644 (file)
index 0000000..e982011
--- /dev/null
@@ -0,0 +1,36 @@
+module foo {
+    yang-version 1;
+    namespace "urn:opendaylight.foo";
+    prefix "foo";
+
+    import bar {
+        prefix "br";
+        revision-date 2013-10-08;
+    }
+
+    revision "2013-10-08" {
+    }
+
+
+    augment "/br:network-topology/br:topology/br:link" {
+        uses igp-link-attributes;
+    }
+
+    grouping igp-link-attributes {
+        container igp-link-attributes {
+            leaf name {
+                type string;
+            }
+            leaf-list flag {
+                type string;
+            }
+            leaf metric {
+                type uint32 {
+                    range "0..16777215"  {
+                    }
+                }
+            }
+        }
+    }
+
+}
index a8abe38c70729cefc93c05a9e8c2e06e3b9c73a1..63486ce810c85f25c457a578e232335fef6c95b7 100644 (file)
@@ -11,6 +11,7 @@ import static org.opendaylight.yangtools.binding.generator.util.BindingGenerator
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.*;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -50,6 +51,7 @@ import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
+import org.opendaylight.yangtools.yang.model.util.DataNodeIterator;
 import org.opendaylight.yangtools.yang.model.util.ExtendedType;
 import org.opendaylight.yangtools.yang.model.util.StringType;
 import org.opendaylight.yangtools.yang.model.util.UnionType;
@@ -561,7 +563,8 @@ public final class TypeProviderImpl implements TypeProvider {
             final String moduleName = module.getName();
             final String basePackageName = moduleNamespaceToPackageName(module);
 
-            final Set<TypeDefinition<?>> typeDefinitions = module.getTypeDefinitions();
+            final DataNodeIterator it = new DataNodeIterator(module);
+            final List<TypeDefinition<?>> typeDefinitions = it.allTypedefs();
             final List<TypeDefinition<?>> listTypeDefinitions = sortTypeDefinitionAccordingDepth(typeDefinitions);
 
             final Map<String, Type> typeMap = new HashMap<>();
@@ -1108,7 +1111,7 @@ public final class TypeProviderImpl implements TypeProvider {
      *         definitions are in list behind them).
      */
     private List<TypeDefinition<?>> sortTypeDefinitionAccordingDepth(
-            final Set<TypeDefinition<?>> unsortedTypeDefinitions) {
+            final Collection<TypeDefinition<?>> unsortedTypeDefinitions) {
         List<TypeDefinition<?>> sortedTypeDefinition = new ArrayList<>();
 
         Map<Integer, List<TypeDefinition<?>>> typeDefinitionsDepths = new TreeMap<>();
index 20b9ea4d48f7f5ba8383edc2ccce30eab4caf040..6c86c2c303ba38ec283218513103cbf0efffe9fb 100644 (file)
@@ -14,7 +14,9 @@ import org.opendaylight.yangtools.yang.common.QName;
 /**\r
  * Node which can contains other nodes.\r
  */\r
-public interface DataNodeContainer {\r
+public interface DataNodeContainer extends YangNode {\r
+\r
+    YangNode getParent();\r
 \r
     /**\r
      * Returns set of all newly defined types within this DataNodeContainer.\r
index 892a725225c8f455059aa8ed969b8039fde909ee..f126a529396d78ff2e8b30aa9a10bcb932aaa4e0 100644 (file)
@@ -8,17 +8,19 @@
 package org.opendaylight.yangtools.yang.model.api;
 
 /**
- * 
+ *
  * Contains the method which are used for getting metadata from the schema nodes
  * which contains data.
- * 
+ *
  */
-public interface DataSchemaNode extends SchemaNode {
+public interface DataSchemaNode extends SchemaNode, YangNode {
+
+    YangNode getParent();
 
     /**
      * Returns <code>true</code> if the data node was added by augmentation,
      * otherwise returns <code>false</code>
-     * 
+     *
      * @return <code>true</code> if the data node was added by augmentation,
      *         otherwise returns <code>false</code>
      */
@@ -27,7 +29,7 @@ public interface DataSchemaNode extends SchemaNode {
     /**
      * Returns <code>true</code> if the data node was added by uses statement,
      * otherwise returns <code>false</code>
-     * 
+     *
      * @return <code>true</code> if the data node was added by uses statement,
      *         otherwise returns <code>false</code>
      */
@@ -36,7 +38,7 @@ public interface DataSchemaNode extends SchemaNode {
     /**
      * Returns <code>true</code> if the data represents configuration data,
      * otherwise returns <code>false</code>
-     * 
+     *
      * @return <code>true</code> if the data represents configuration data,
      *         otherwise returns <code>false</code>
      */
@@ -44,7 +46,7 @@ public interface DataSchemaNode extends SchemaNode {
 
     /**
      * Returns the constraints associated with Data Schema Node
-     * 
+     *
      * @return the constraints associated with Data Schema Node
      */
     ConstraintDefinition getConstraints();
index 3a7cce85b546545f1c5f49b915a178e88cbb0991..639e03ad006c3924c7890263ce8e2f92bf32c4c1 100644 (file)
@@ -17,7 +17,7 @@ import java.util.List;
  * from a standard.
  * </p>
  */
-public interface Deviation {
+public interface Deviation extends YangNode {
 
     /**
      * Enum describing YANG deviation 'deviate' statement. It defines how the
index 837f1718dba21006c3737fd6322f8d88e510abde..3d5cdee20592022588cd10d36a3036f356838ecb 100644 (file)
@@ -19,51 +19,51 @@ import java.util.Set;
  * <i>Example of YANG module</i> <code><br/>
  * {@link #getName() <b><font color="#FF0000">module</font></b>} module_name{<br />
     &nbsp;&nbsp;{@link #getYangVersion() <b><font color="#8b4513">yang-version</font></b>} "1";<br /><br />
-    
+
     &nbsp;&nbsp;{@link #getNamespace() <b><font color="#00FF00">namespace</font></b>} "urn:module:namespace";<br />
     &nbsp;&nbsp;{@link #getPrefix() <b><font color="#0000FF">prefix</font></b><a name="prefix"></a>} "prefix";<br /><br />
-    
+
     &nbsp;&nbsp;{@link #getDescription() <b><font color="#b8860b">description</font></b>} "description test";<br />
     &nbsp;&nbsp;{@link #getReference() <b><font color="#008b8b">reference</font></b>} "reference test";<br /><br />
 
     &nbsp;&nbsp;{@link #getOrganization() <b><font color="#606060">organization</font></b>} "John Doe, john.doe@email.com";<br />
     &nbsp;&nbsp;{@link #getContact() <b><font color="#FF9900">contact</font></b>} "http://www.opendaylight.org/";<br /><br />
-    
-    &nbsp;&nbsp;{@link #getFeatures() <b><font color="#8b0000">feature</font></b>} feature-test{<br /> 
+
+    &nbsp;&nbsp;{@link #getFeatures() <b><font color="#8b0000">feature</font></b>} feature-test{<br />
     &nbsp;&nbsp;&nbsp;&nbsp; description "description of some feature";<br />
     &nbsp;&nbsp;}</br>
-    
+
     &nbsp;&nbsp;{@link #getNotifications() <b><font color="#b22222">notification</font></b>} notification-test;<br />
-    &nbsp;&nbsp;{@link #getRpcs() <b><font color="#d2691e">rpc</font></b>} rpc-test;<br /> 
-    <!-- &nbsp;&nbsp;{@link #getDeviations() <b><font color="#b8860b">deviation</font></b>} deviation-test;<br /> -->         
-    &nbsp;&nbsp;{@link #getIdentities() <b><font color="#bdb76b">identity</font></b>} identity-test;<br /> 
-    &nbsp;&nbsp;{@link #getExtensionSchemaNodes() <b><font color="#808000">extension</font></b>} extension-test;<br />         
+    &nbsp;&nbsp;{@link #getRpcs() <b><font color="#d2691e">rpc</font></b>} rpc-test;<br />
+    <!-- &nbsp;&nbsp;{@link #getDeviations() <b><font color="#b8860b">deviation</font></b>} deviation-test;<br /> -->
+    &nbsp;&nbsp;{@link #getIdentities() <b><font color="#bdb76b">identity</font></b>} identity-test;<br />
+    &nbsp;&nbsp;{@link #getExtensionSchemaNodes() <b><font color="#808000">extension</font></b>} extension-test;<br />
 
 
     &nbsp;&nbsp;{@link #getRevision() <b><font color="#339900">revision</font></b>} 2011-08-27 {<br />
-    
+
     &nbsp;&nbsp;{@link #getImports() <b><font color="#9400d3">import</font></b>} other_module {<br />
     &nbsp;&nbsp;&nbsp;&nbsp;prefix "other_module_prefix"<br />
     &nbsp;&nbsp;&nbsp;&nbsp;revision-date 2011-08-27<br />
     &nbsp;&nbsp;}<br /><br />
-    
+
     &nbsp;&nbsp;container cont {<br />
     &nbsp;&nbsp;}<br />
-    
+
     &nbsp;&nbsp;{@link #getAugmentations() <b><font color="#dc143c">augment</font></b>} "/cont" { ;<br />
     &nbsp;&nbsp;}<br />
     }
-    
+
     </code>
  */
 
-public interface Module extends DataNodeContainer {
+public interface Module extends DataNodeContainer, YangNode {
 
     /**
      * Returns the namespace of the module which is specified as argument of
      * YANG {@link Module <b><font color="#00FF00">namespace</font></b>}
      * keyword.
-     * 
+     *
      * @return URI format of the namespace of the module
      */
     URI getNamespace();
@@ -71,14 +71,14 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns the name of the module which is specified as argument of YANG
      * {@link Module <b><font color="#FF0000">module</font></b>} keyword
-     * 
+     *
      * @return string with the name of the module
      */
     String getName();
 
     /**
      * Returns the revision date for the module.
-     * 
+     *
      * @return date of the module revision which is specified as argument of
      *         YANG {@link Module <b><font color="#339900">revison</font></b>}
      *         keyword
@@ -87,7 +87,7 @@ public interface Module extends DataNodeContainer {
 
     /**
      * Returns the prefix of the module
-     * 
+     *
      * @return string with the module prefix which is specified as argument of
      *         YANG {@link Module <b><font color="#0000FF">prefix</font></b>}
      *         keyword
@@ -96,9 +96,9 @@ public interface Module extends DataNodeContainer {
 
     /**
      * Returns the YANG version.
-     * 
+     *
      * Default value is 1.
-     * 
+     *
      * @return string with the module YANG version which is specified as
      *         argument of YANG {@link Module <b> <font
      *         color="#8b4513">yang-version</font></b>} keyword
@@ -107,7 +107,7 @@ public interface Module extends DataNodeContainer {
 
     /**
      * Returns the module description.
-     * 
+     *
      * @return string with the module description which is specified as argument
      *         of YANG {@link Module <b><font
      *         color="#b8860b">description</font></b>} keyword
@@ -116,7 +116,7 @@ public interface Module extends DataNodeContainer {
 
     /**
      * Returns the module reference.
-     * 
+     *
      * @return string with the module reference which is specified as argument
      *         of YANG {@link Module <b><font
      *         color="#008b8b">reference</font></b>} keyword
@@ -125,7 +125,7 @@ public interface Module extends DataNodeContainer {
 
     /**
      * Returns the module organization.
-     * 
+     *
      * @return string with the name of the organization specified in the module
      *         as the argument of YANG {@link Module <b><font
      *         color="#606060">organization</font></b>} keyword
@@ -134,11 +134,11 @@ public interface Module extends DataNodeContainer {
 
     /**
      * Returns the module contact.
-     * 
+     *
      * The contact represents the person or persons to whom technical queries
      * concerning this module should be sent, such as their name, postal
      * address, telephone number, and electronic mail address.
-     * 
+     *
      * @return string with the contact data specified in the module as the
      *         argument of YANG {@link Module <b><font
      *         color="#FF9900">contact</font></b>} keyword
@@ -148,7 +148,7 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns imports which represents YANG modules which are imported to this
      * module via <b>import</b> statement.
-     * 
+     *
      * @return set of module imports which are specified in the module as the
      *         argument of YANG {@link Module <b><font
      *         color="#9400d3">import</font></b>} keywords.
@@ -158,10 +158,10 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns <code>FeatureDefinition</code> instances which contain data from
      * <b>feature</b> statements defined in the module.
-     * 
+     *
      * The feature is used to define a mechanism by which portions of the schema
      * are marked as conditional.
-     * 
+     *
      * @return feature statements in lexicographical order which are specified
      *         in the module as the argument of YANG {@link Module <b><font
      *         color="#8b0000">feature</font></b>} keywords.
@@ -171,7 +171,7 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns <code>NotificationDefinition</code> instances which contain data
      * from <b>notification</b> statements defined in the module.
-     * 
+     *
      * @return notification statements in lexicographical order which are
      *         specified in the module as the argument of YANG {@link Module
      *         <b><font color="#b22222">notification</font></b>} keywords.
@@ -181,7 +181,7 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns <code>AugmentationSchema</code> instances which contain data from
      * <b>augment</b> statements defined in the module.
-     * 
+     *
      * @return set of the augmentation schema instances which are specified in
      *         the module as YANG {@link Module <b><font
      *         color="#dc143c">augment</font></b>} keyword and are
@@ -192,7 +192,7 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns <code>RpcDefinition</code> instances which contain data from
      * <b>rpc</b> statements defined in the module.
-     * 
+     *
      * @return set of the rpc definition instances which are specified in the
      *         module as YANG {@link Module <b><font
      *         color="#d2691e">rpc</font></b>} keywords and are lexicographicaly
@@ -203,7 +203,7 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns <code>Deviation</code> instances which contain data from
      * <b>deviation</b> statements defined in the module.
-     * 
+     *
      * @return set of the deviation instances
      */
     Set<Deviation> getDeviations();
@@ -211,7 +211,7 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns <code>IdentitySchemaNode</code> instances which contain data from
      * <b>identity</b> statements defined in the module.
-     * 
+     *
      * @return set of identity schema node instances which are specified in the
      *         module as YANG {@link Module <b><font
      *         color="#bdb76b">identity</font></b>} keywords and are
@@ -222,7 +222,7 @@ public interface Module extends DataNodeContainer {
     /**
      * Returns <code>ExtensionDefinition</code> instances which contain data
      * from <b>extension</b> statements defined in the module.
-     * 
+     *
      * @return set of extension definition instances which are specified in the
      *         module as YANG {@link Module <b><font
      *         color="#808000">extension</font></b>} keyword and are
@@ -232,7 +232,7 @@ public interface Module extends DataNodeContainer {
 
     /**
      * Returns unknown nodes defined in module.
-     * 
+     *
      * @return unknown nodes in lexicographical order
      */
     List<UnknownSchemaNode> getUnknownSchemaNodes();
index 4be0490586d805cf21fc380dd4c639c3de29634a..752f37ddedc8247eae928c3c8523d068ec24e4d1 100644 (file)
@@ -17,7 +17,7 @@ import java.util.Set;
  * are also defined.\r
  * </p>\r
  */\r
-public interface RpcDefinition extends SchemaNode {\r
+public interface RpcDefinition extends SchemaNode, YangNode {\r
 \r
     /**\r
      * @return Set of type definitions declared under this rpc statement.\r
index ae9aabae2bc32a34091fb3564af3dc4bfd9c98d6..b8042c80bb52d1aa4bbb38738833bf46519d53ba 100644 (file)
@@ -13,21 +13,23 @@ import java.util.Set;
 /**
  * Contains the methods for getting data and checking properties of the YANG
  * <code>uses</code> substatement.
- * 
+ *
  */
-public interface UsesNode {
+public interface UsesNode extends YangNode {
+
+    YangNode getParent();
 
     /**
      * Returns the schema path to used grouping.
-     * 
+     *
      * @return schema path to 'grouping' on which this 'uses' statement points
      */
     SchemaPath getGroupingPath();
 
     /**
-     * 
+     *
      * Returns agumentations which were specified in this uses node.
-     * 
+     *
      * @return Set of augment statements defined under this uses node
      */
     Set<AugmentationSchema> getAugmentations();
@@ -35,7 +37,7 @@ public interface UsesNode {
     /**
      * Returns <code>true</code> if the data node was added by augmentation,
      * otherwise returns <code>false</code>
-     * 
+     *
      * @return <code>true</code> if the data node was added by augmentation,
      *         otherwise returns <code>false</code>
      */
@@ -44,7 +46,7 @@ public interface UsesNode {
     /**
      * Returns <code>true</code> if the data node was added by uses statement,
      * otherwise returns <code>false</code>
-     * 
+     *
      * @return <code>true</code> if the data node was added by uses statement,
      *         otherwise returns <code>false</code>
      */
@@ -53,7 +55,7 @@ public interface UsesNode {
     /**
      * Some of the properties of each node in the grouping can be refined with
      * the "refine" statement.
-     * 
+     *
      * @return Map, where key is schema path of refined node and value is
      *         refined node
      */
diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangNode.java
new file mode 100644 (file)
index 0000000..acdbf6c
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.model.api;
+
+public interface YangNode {
+
+}
index 518d6d8a894c502f8faaceda7e234a970bbe4de9..ed1db9a31505fc3ca961704e002862268975ca9f 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
 public class DataNodeIterator implements Iterator<DataSchemaNode> {
 
@@ -31,6 +32,7 @@ public class DataNodeIterator implements Iterator<DataSchemaNode> {
     private final List<ChoiceNode> allChoices;
     private final List<DataSchemaNode> allChilds;
     private final List<GroupingDefinition> allGroupings;
+    private final List<TypeDefinition<?>> allTypedefs;
 
     public DataNodeIterator(final DataNodeContainer container) {
         if (container == null) {
@@ -42,6 +44,7 @@ public class DataNodeIterator implements Iterator<DataSchemaNode> {
         this.allChilds = new ArrayList<>();
         this.allChoices = new ArrayList<>();
         this.allGroupings = new ArrayList<>();
+        this.allTypedefs = new ArrayList<>();
 
         this.container = container;
         traverse(this.container);
@@ -63,6 +66,10 @@ public class DataNodeIterator implements Iterator<DataSchemaNode> {
         return allGroupings;
     }
 
+    public List<TypeDefinition<?>> allTypedefs() {
+        return allTypedefs;
+    }
+
     private void traverse(final DataNodeContainer dataNode) {
         if (dataNode == null) {
             return;
@@ -96,6 +103,7 @@ public class DataNodeIterator implements Iterator<DataSchemaNode> {
             }
         }
 
+        this.allTypedefs.addAll(dataNode.getTypeDefinitions());
         traverseModule(dataNode);
         traverseGroupings(dataNode);
 
@@ -108,12 +116,15 @@ public class DataNodeIterator implements Iterator<DataSchemaNode> {
         } else {
             return;
         }
+
         final Set<NotificationDefinition> notifications = module.getNotifications();
         for (NotificationDefinition notificationDefinition : notifications) {
             traverse(notificationDefinition);
         }
+
         final Set<RpcDefinition> rpcs = module.getRpcs();
         for (RpcDefinition rpcDefinition : rpcs) {
+            this.allTypedefs.addAll(rpcDefinition.getTypeDefinitions());
             ContainerSchemaNode input = rpcDefinition.getInput();
             if (input != null) {
                 traverse(input);
index 2fd454c1f0be2b7f96d0bc439d04de38c67ceb46..4abc94cf9484e906c71e9da4fe70d498a55e5cb9 100644 (file)
@@ -19,9 +19,9 @@ import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuil
 public abstract class AbstractBuilder implements Builder {
     protected String moduleName;
     protected final int line;
-    protected Builder parent;
+    protected Builder parentBuilder;
 
-    protected List<UnknownSchemaNode> unknownNodes;
+    protected List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
     protected final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     protected AbstractBuilder(final String moduleName, final int line) {
@@ -46,12 +46,12 @@ public abstract class AbstractBuilder implements Builder {
 
     @Override
     public Builder getParent() {
-        return parent;
+        return parentBuilder;
     }
 
     @Override
-    public void setParent(final Builder parent) {
-        this.parent = parent;
+    public void setParent(final Builder parentBuilder) {
+        this.parentBuilder = parentBuilder;
     }
 
     @Override
index 927c7f7b35b295017d41aaf7e5365a80c9cb0958..55610d33b664ccaa1c3a3c55139809a3ca9e7f01 100644 (file)
@@ -7,13 +7,20 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.api;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.parser.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 /**
@@ -22,12 +29,18 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder implements DataNodeContainerBuilder {
     protected QName qname;
 
-    protected Set<DataSchemaNode> childNodes;
+    protected Map<QName, DataSchemaNode> childNodes = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
     protected final Set<DataSchemaNodeBuilder> addedChildNodes = new HashSet<DataSchemaNodeBuilder>();
 
-    protected Set<GroupingDefinition> groupings;
+    protected Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
     protected final Set<GroupingBuilder> addedGroupings = new HashSet<GroupingBuilder>();
 
+    protected Set<TypeDefinition<?>> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    protected final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<>();
+
+    protected Set<UsesNode> usesNodes = new HashSet<>();
+    protected final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<>();
+
     protected AbstractDataNodeContainerBuilder(final String moduleName, final int line, final QName qname) {
         super(moduleName, line);
         this.qname = qname;
@@ -39,15 +52,11 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i
     }
 
     @Override
-    public Set<DataSchemaNode> getChildNodes() {
+    public Collection<DataSchemaNode> getChildNodes() {
         if (childNodes == null) {
             return Collections.emptySet();
         }
-        return childNodes;
-    }
-
-    public void setChildNodes(Set<DataSchemaNode> childNodes) {
-        this.childNodes = childNodes;
+        return childNodes.values();
     }
 
     @Override
@@ -78,6 +87,18 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i
         addedChildNodes.add(child);
     }
 
+    @Override
+    public void addChildNode(DataSchemaNode child) {
+        QName childName = child.getQName();
+        for (QName qname : childNodes.keySet()) {
+            if (qname.equals(childName)) {
+                throw new YangParseException(moduleName, line, "Can not add '" + child + "' to '" + this
+                        + "' in module '" + moduleName + "': node with same name already declared");
+            }
+        }
+        childNodes.put(child.getQName(), child);
+    }
+
     @Override
     public Set<GroupingDefinition> getGroupings() {
         if (groupings == null) {
@@ -107,4 +128,18 @@ public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder i
         addedGroupings.add(grouping);
     }
 
+    @Override
+    public Set<UsesNodeBuilder> getUsesNodes() {
+        return addedUsesNodes;
+    }
+
+    public void setUsesnodes(final Set<UsesNode> usesNodes) {
+        this.usesNodes = usesNodes;
+    }
+
+    @Override
+    public void addUsesNode(UsesNodeBuilder usesNode) {
+        addedUsesNodes.add(usesNode);
+    }
+
 }
index 1a1b6b8d4cbbce321de77146ebb4e7cf179b29e4..34c48192fff106481e54a78b2e1c22c68c446652 100644 (file)
@@ -23,7 +23,6 @@ public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implemen
     protected String description;\r
     protected String reference;\r
     protected Status status = Status.CURRENT;\r
-    protected List<UnknownSchemaNode> unknownNodes;\r
 \r
     protected AbstractSchemaNodeBuilder(final String moduleName, final int line, final QName qname) {\r
         super(moduleName, line);\r
@@ -34,7 +33,7 @@ public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implemen
     public int hashCode() {\r
         final int prime = 31;\r
         int result = super.hashCode();\r
-        result = prime * result + ((parent == null) ? 0 : parent.hashCode());\r
+        result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode());\r
         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());\r
         return result;\r
     }\r
@@ -54,11 +53,11 @@ public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implemen
             return false;\r
         }\r
         AbstractSchemaNodeBuilder other = (AbstractSchemaNodeBuilder) obj;\r
-        if (parent == null) {\r
-            if (other.parent != null) {\r
+        if (parentBuilder == null) {\r
+            if (other.parentBuilder != null) {\r
                 return false;\r
             }\r
-        } else if (!parent.equals(other.parent)) {\r
+        } else if (!parentBuilder.equals(other.parentBuilder)) {\r
             return false;\r
         }\r
         if (schemaPath == null) {\r
index c8025892c2f59ab26d2e13739923102260ce6944..903c05e76b84c58fa9b8fd5155ed8c6fed6b8963 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 
 /**
  * Interface for builders of 'augment' statement.
@@ -65,7 +66,7 @@ public interface AugmentationSchemaBuilder extends DataNodeContainerBuilder {
      */
     void setTargetNodeSchemaPath(SchemaPath path);
 
-    AugmentationSchema build();
+    AugmentationSchema build(YangNode parent);
 
     /**
      * Get information about augmentation process.
index 05ff7dbf8e1b6695797c6d7724986e8bc34f3b0b..c2647836c701372f79eb2567f0b9022a403d4d3f 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api;
 
 import java.util.List;
 
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
 
 /**
@@ -18,35 +19,35 @@ public interface Builder {
 
     /**
      * Get name of module in which this node is declared.
-     * 
+     *
      * @return module name
      */
     String getModuleName();
 
     /**
      * Set name of module in which this node is declared.
-     * 
+     *
      * @param moduleName
      */
     void setModuleName(String moduleName);
 
     /**
      * Get current line in yang file.
-     * 
+     *
      * @return current line in yang file
      */
     int getLine();
 
     /**
      * Get parent node of this node.
-     * 
+     *
      * @return parent node builder or null if this is top level node
      */
     Builder getParent();
 
     /**
      * Set parent of this node.
-     * 
+     *
      * @param parent
      *            parent node builder
      */
@@ -54,28 +55,28 @@ public interface Builder {
 
     /**
      * Add unknown node to this builder.
-     * 
+     *
      * @param unknownNode
      */
     void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode);
 
     /**
      * Get builders of unknown nodes defined in this node.
-     * 
+     *
      * @return collection of UnknownSchemaNodeBuilder objects
      */
     List<UnknownSchemaNodeBuilder> getUnknownNodeBuilders();
 
     /**
      * Build YANG data model node.
-     * 
+     *
      * This method should create an instance of YANG data model node. After
      * creating an instance, this instance should be returned for each call
      * without repeating build process.
-     * 
+     *
      * @return YANG data model node
      */
-    Object build();
+    Object build(YangNode parent);
 
     interface Rebuildable<T extends Builder> {
         T toBuilder();
index 9bd45768e3bfea8fb80de0d253cf843a7346771b..a2ffec1dcf9cd06c6815c3bf8d8b251b30f621af 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.api;
 
+import java.util.Collection;
 import java.util.Set;
 
 import org.opendaylight.yangtools.yang.common.QName;
@@ -22,35 +23,35 @@ public interface DataNodeContainerBuilder extends Builder {
 
     /**
      * Get qname of this node.
-     * 
+     *
      * @return QName of this node
      */
     QName getQName();
 
     /**
      * Get schema path of this node.
-     * 
+     *
      * @return SchemaPath of this node
      */
     SchemaPath getPath();
 
     /**
      * Get already built child nodes.
-     * 
+     *
      * @return collection of child nodes
      */
-    Set<DataSchemaNode> getChildNodes();
+    Collection<DataSchemaNode> getChildNodes();
 
     /**
      * Get builders of child nodes.
-     * 
+     *
      * @return collection child nodes builders
      */
     Set<DataSchemaNodeBuilder> getChildNodeBuilders();
 
     /**
      * Get child node by name.
-     * 
+     *
      * @param name
      *            name of child to seek
      * @return child node with given name if present, null otherwise
@@ -59,56 +60,58 @@ public interface DataNodeContainerBuilder extends Builder {
 
     /**
      * Add builder of child node to this node.
-     * 
+     *
      * @param childNode
      */
     void addChildNode(DataSchemaNodeBuilder childNode);
 
+    void addChildNode(DataSchemaNode childNode);
+
     /**
      * Get already built groupings defined in this node.
-     * 
+     *
      * @return collection of GroupingDefinition objects
      */
     Set<GroupingDefinition> getGroupings();
 
     /**
      * Get builders of groupings defined in this node.
-     * 
+     *
      * @return collection of grouping builders
      */
     Set<GroupingBuilder> getGroupingBuilders();
 
     /**
      * Add builder of grouping statement to this node.
-     * 
+     *
      * @param groupingBuilder
      */
     void addGrouping(GroupingBuilder groupingBuilder);
 
     /**
      * Get builders of uses defined in this node.
-     * 
+     *
      * @return collection of uses builders
      */
     Set<UsesNodeBuilder> getUsesNodes();
 
     /**
      * Add builder of uses statement to this node.
-     * 
+     *
      * @param usesBuilder
      */
     void addUsesNode(UsesNodeBuilder usesBuilder);
 
     /**
      * Get builders of typedef statement defined in this node.
-     * 
+     *
      * @return typedefBuilder
      */
     Set<TypeDefinitionBuilder> getTypeDefinitionBuilders();
 
     /**
      * Add typedef builder to this node.
-     * 
+     *
      * @param typedefBuilder
      */
     void addTypedef(TypeDefinitionBuilder typedefBuilder);
index f1622c413b229a15bc49a6970e052b4f88781674..8d343bb4e07f41093fabc1f70f8fcf0ffd6e4e05 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.impl.ConstraintsBuilder;
 
 /**
@@ -22,7 +23,7 @@ public interface DataSchemaNodeBuilder extends SchemaNodeBuilder, GroupingMember
     /**
      * Build DataSchemaNode object from this builder.
      */
-    DataSchemaNode build();
+    DataSchemaNode build(YangNode parent);
 
     /**
      *
index 79b87a75979609a18d4906296ebdf98b2e5eee4c..f8ad74d4b624c40d5c6ed1005520146bf07fe117 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.builder.api;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 
 /**
  * Interface for builders of 'grouping' statement.
@@ -18,7 +19,7 @@ public interface GroupingBuilder extends DataNodeContainerBuilder, SchemaNodeBui
     /**
      * Build GroupingDefinition object from this builder.
      */
-    GroupingDefinition build();
+    GroupingDefinition build(YangNode parent);
 
     void setQName(QName qname);
 
index 102e6a74adcedf84c0b7782fe35454b7417d0420..9e3124c79afcc1abdaaf8da14eb7619930a7a0aa 100644 (file)
@@ -11,6 +11,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;\r
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;\r
 import org.opendaylight.yangtools.yang.model.api.Status;\r
+import org.opendaylight.yangtools.yang.model.api.YangNode;\r
 \r
 /**\r
  * Interface for all builders of SchemaNode nodes.\r
@@ -83,6 +84,6 @@ public interface SchemaNodeBuilder extends Builder {
     /**\r
      * Build SchemaNode object from this builder.\r
      */\r
-    SchemaNode build();\r
+    SchemaNode build(YangNode parent);\r
 \r
 }\r
index d63648d3605626320996338a42e8ffdac1e789b4..27977111fd9d65409146c5196136b33d8d00341c 100644 (file)
@@ -12,6 +12,7 @@ import java.util.List;
 import org.opendaylight.yangtools.yang.common.QName;\r
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;\r
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;\r
+import org.opendaylight.yangtools.yang.model.api.YangNode;\r
 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;\r
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;\r
 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;\r
@@ -23,7 +24,7 @@ public interface TypeDefinitionBuilder extends TypeAwareBuilder, SchemaNodeBuild
 \r
     void setQName(QName qname);\r
 \r
-    TypeDefinition<?> build();\r
+    TypeDefinition<?> build(YangNode parent);\r
 \r
     List<RangeConstraint> getRanges();\r
 \r
index 77c3356f1d35aedb8eeca397b866ca344d51e9bb..f27af6e0cb5dd4215d349a8e4123bc06b64bcdb1 100644 (file)
@@ -13,6 +13,7 @@ import java.util.Set;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
 
@@ -154,7 +155,7 @@ public interface UsesNodeBuilder extends GroupingMember, Builder {
     /**
      * Build new UsesNode object.
      */
-    UsesNode build();
+    UsesNode build(YangNode parent);
 
     /**
      * Get child nodes defined in target grouping.
index aee09cd52e7519d7c60d9b1012eb9f063060f254..03389ff48c8c447cf1e6f81a861e655bc9abff99 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -17,6 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 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.model.api.YangNode;
 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;
@@ -38,8 +38,9 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
     }
 
     @Override
-    public AnyXmlSchemaNode build() {
+    public AnyXmlSchemaNode build(YangNode parent) {
         if (!built) {
+            instance.setParent(parent);
             instance.setPath(schemaPath);
             instance.setConstraints(constraints.build());
             instance.setDescription(description);
@@ -50,11 +51,8 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
             instance.setAddedByUses(addedByUses);
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
@@ -135,11 +133,11 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
         } else if (!schemaPath.equals(other.schemaPath)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         return true;
@@ -153,6 +151,7 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
     private final class AnyXmlSchemaNodeImpl implements AnyXmlSchemaNode {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -180,6 +179,15 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index d8b07e64a058306faacd299505ce8c326671261c..c74dbabc22f1353ca06804147b61f26b98156131 100644 (file)
@@ -7,13 +7,10 @@
  */
 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.Map;
 import java.util.Set;
-import java.util.TreeMap;
 import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
@@ -26,6 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
@@ -51,7 +49,6 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
     private SchemaPath targetPath;
     private SchemaPath targetNodeSchemaPath;
 
-    private final Set<UsesNodeBuilder> usesNodes = new HashSet<UsesNodeBuilder>();
     private boolean resolved;
 
     public AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr) {
@@ -76,24 +73,15 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
         throw new YangParseException(moduleName, line, "augment can not contains grouping statement");
     }
 
-    @Override
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return usesNodes;
-    }
-
-    @Override
-    public void addUsesNode(UsesNodeBuilder usesBuilder) {
-        usesNodes.add(usesBuilder);
-    }
-
     @Override
     public SchemaPath getPath() {
         return targetNodeSchemaPath;
     }
 
     @Override
-    public AugmentationSchema build() {
+    public AugmentationSchema build(YangNode parent) {
         if (!built) {
+            instance.setParent(parent);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
@@ -108,23 +96,21 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
             instance.setWhenCondition(whenStmt);
 
             // CHILD NODES
-            final Map<QName, DataSchemaNode> childs = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
             for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childs.put(node.getQName(), node.build());
+                DataSchemaNode child = node.build(instance);
+                childNodes.put(child.getQName(), child);
             }
-            instance.setChildNodes(childs);
+            instance.setChildNodes(childNodes);
 
             // USES
-            final Set<UsesNode> usesNodeDefinitions = new HashSet<UsesNode>();
-            for (UsesNodeBuilder builder : usesNodes) {
-                usesNodeDefinitions.add(builder.build());
+            for (UsesNodeBuilder builder : addedUsesNodes) {
+                usesNodes.add(builder.build(instance));
             }
-            instance.setUses(usesNodeDefinitions);
+            instance.setUses(usesNodes);
 
             // UNKNOWN NODES
-            List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
+                unknownNodes.add(b.build(instance));
             }
             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
@@ -220,7 +206,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
         int result = 1;
         result = prime * result + ((augmentTargetStr == null) ? 0 : augmentTargetStr.hashCode());
         result = prime * result + ((whenCondition == null) ? 0 : whenCondition.hashCode());
-        result = prime * result + ((childNodes == null) ? 0 : childNodes.hashCode());
+        result = prime * result + ((addedChildNodes == null) ? 0 : addedChildNodes.hashCode());
         return result;
     }
 
@@ -250,11 +236,11 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
         } else if (!whenCondition.equals(other.whenCondition)) {
             return false;
         }
-        if (childNodes == null) {
-            if (other.childNodes != null) {
+        if (addedChildNodes == null) {
+            if (other.addedChildNodes != null) {
                 return false;
             }
-        } else if (!childNodes.equals(other.childNodes)) {
+        } else if (!addedChildNodes.equals(other.addedChildNodes)) {
             return false;
         }
         return true;
@@ -265,6 +251,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
     }
 
     private final class AugmentationSchemaImpl implements AugmentationSchema {
+        private YangNode parent;
         private SchemaPath targetPath;
         private RevisionAwareXPath whenCondition;
         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
@@ -278,6 +265,15 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain
             this.targetPath = targetPath;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public SchemaPath getTargetPath() {
             return targetPath;
index d226757972a1fd1907dcd397508a7c28f395981f..d56a310ac9ef0d9f0d71d4c98d5893e5275841c4 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 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.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
@@ -34,16 +35,18 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
         AugmentationTargetBuilder {
     private boolean isBuilt;
     private final ChoiceNodeImpl instance;
+    private YangNode parent;
     // DataSchemaNode args
     private boolean augmenting;
     private boolean addedByUses;
     private Boolean configuration;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
-    private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<>();
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
+    private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
     // ChoiceNode args
-    private Set<ChoiceCaseNode> cases;
-    private final Set<ChoiceCaseBuilder> addedCases = new HashSet<>();
+    private Set<ChoiceCaseNode> cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    private final Set<ChoiceCaseBuilder> caseBuilders = new HashSet<>();
     private String defaultCase;
 
     public ChoiceBuilder(final String moduleName, final int line, final QName qname) {
@@ -53,8 +56,10 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
     }
 
     @Override
-    public ChoiceNode build() {
+    public ChoiceNode build(YangNode parent) {
         if (!isBuilt) {
+            this.parent = parent;
+            instance.setParent(parent);
             instance.setPath(schemaPath);
             instance.setDescription(description);
             instance.setReference(reference);
@@ -66,29 +71,22 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
             instance.setDefaultCase(defaultCase);
 
             // CASES
-            if (cases == null) {
-                cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-                for (ChoiceCaseBuilder caseBuilder : addedCases) {
-                    cases.add(caseBuilder.build());
-                }
+            for (ChoiceCaseBuilder caseBuilder : caseBuilders) {
+                cases.add(caseBuilder.build(instance));
             }
             instance.setCases(cases);
 
             // AUGMENTATIONS
-            final Set<AugmentationSchema> augmentations = new HashSet<>();
-            for (AugmentationSchemaBuilder builder : addedAugmentations) {
-                augmentations.add(builder.build());
+            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+                augmentations.add(builder.build(instance));
             }
-            instance.setAvailableAugmentations(augmentations);
+            instance.setAvailableAugmentations(new HashSet<>(augmentations));
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
@@ -99,7 +97,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
     @Override
     public void rebuild() {
         isBuilt = false;
-        build();
+        build(parent);
     }
 
     @Override
@@ -108,7 +106,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
     }
 
     public Set<ChoiceCaseBuilder> getCases() {
-        return addedCases;
+        return caseBuilders;
     }
 
     /**
@@ -119,7 +117,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
      * @return case with given name if present, null otherwise
      */
     public ChoiceCaseBuilder getCaseNodeByName(String caseName) {
-        for (ChoiceCaseBuilder addedCase : addedCases) {
+        for (ChoiceCaseBuilder addedCase : caseBuilders) {
             if (addedCase.getQName().getLocalName().equals(caseName)) {
                 return addedCase;
             }
@@ -139,7 +137,8 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
     public void addCase(DataSchemaNodeBuilder caseNode) {
         QName caseQName = caseNode.getQName();
         String caseName = caseQName.getLocalName();
-        for (ChoiceCaseBuilder addedCase : addedCases) {
+
+        for (ChoiceCaseBuilder addedCase : caseBuilders) {
             if (addedCase.getQName().getLocalName().equals(caseName)) {
                 throw new YangParseException(caseNode.getModuleName(), caseNode.getLine(), "Can not add '" + caseNode
                         + "' to node '" + qname.getLocalName() + "' in module '" + moduleName
@@ -148,7 +147,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
         }
 
         if (caseNode instanceof ChoiceCaseBuilder) {
-            addedCases.add((ChoiceCaseBuilder) caseNode);
+            caseBuilders.add((ChoiceCaseBuilder) caseNode);
         } else {
             ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(caseNode.getModuleName(), caseNode.getLine(),
                     caseQName);
@@ -162,7 +161,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
             SchemaPath newPath = ParserUtils.createSchemaPath(caseNode.getPath(), caseQName);
             caseNode.setPath(newPath);
             caseBuilder.addChildNode(caseNode);
-            addedCases.add(caseBuilder);
+            caseBuilders.add(caseBuilder);
         }
     }
 
@@ -204,13 +203,13 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
         return constraints;
     }
 
-    public Set<AugmentationSchemaBuilder> getAugmentations() {
-        return addedAugmentations;
-    }
-
     @Override
     public void addAugmentation(AugmentationSchemaBuilder augment) {
-        addedAugmentations.add(augment);
+        augmentationBuilders.add(augment);
+    }
+
+    public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
+        return augmentationBuilders;
     }
 
     public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
@@ -252,11 +251,11 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
         } else if (!schemaPath.equals(other.schemaPath)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         return true;
@@ -270,6 +269,7 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
     public final class ChoiceNodeImpl implements ChoiceNode {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -300,6 +300,15 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index e2b34fb0d0a9a4a6424713ceb5a86621d884debc..aa6d4d726258aec5a4257f69238907300065bb34 100644 (file)
@@ -6,7 +6,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -19,6 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
@@ -32,6 +32,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
         AugmentationTargetBuilder {
     private boolean isBuilt;
     private final ChoiceCaseNodeImpl instance;
+    private YangNode parent;
     // SchemaNode args
     private SchemaPath schemaPath;
     private String description;
@@ -41,10 +42,9 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
     private boolean augmenting;
     private boolean addedByUses;
     private final ConstraintsBuilder constraints;
-    // DataNodeContainer args
-    private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<>();
     // AugmentationTarget args
-    private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<>();
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
+    private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
 
     public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname) {
         super(moduleName, line, qname);
@@ -53,8 +53,10 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
     }
 
     @Override
-    public ChoiceCaseNode build() {
+    public ChoiceCaseNode build(YangNode parent) {
         if (!isBuilt) {
+            this.parent = parent;
+            instance.setParent(parent);
             instance.setConstraints(constraints.build());
             instance.setPath(schemaPath);
             instance.setDescription(description);
@@ -64,33 +66,30 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
             instance.setAddedByUses(addedByUses);
 
             // CHILD NODES
-            final Map<QName, DataSchemaNode> childs = new TreeMap<>(Comparators.QNAME_COMP);
             for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childs.put(node.getQName(), node.build());
+                DataSchemaNode child = node.build(instance);
+                childNodes.put(child.getQName(), child);
             }
-            instance.setChildNodes(childs);
+            instance.setChildNodes(childNodes);
 
             // USES
-            final Set<UsesNode> uses = new HashSet<>();
             for (UsesNodeBuilder builder : addedUsesNodes) {
-                uses.add(builder.build());
+                usesNodes.add(builder.build(instance));
             }
-            instance.setUses(uses);
+            instance.setUses(usesNodes);
 
             // UNKNOWN NODES
-            final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
+                unknownNodes.add(b.build(instance));
             }
             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             // AUGMENTATIONS
-            final Set<AugmentationSchema> augmentations = new HashSet<>();
-            for (AugmentationSchemaBuilder builder : addedAugmentations) {
-                augmentations.add(builder.build());
+            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+                augmentations.add(builder.build(instance));
             }
-            instance.setAvailableAugmentations(augmentations);
+            instance.setAvailableAugmentations(new HashSet<>(augmentations));
 
             isBuilt = true;
         }
@@ -101,7 +100,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
     @Override
     public void rebuild() {
         isBuilt = false;
-        build();
+        build(parent);
     }
 
     @Override
@@ -117,6 +116,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
     @Override
     public void setPath(final SchemaPath schemaPath) {
         this.schemaPath = schemaPath;
+        instance.setPath(schemaPath);
     }
 
     public String getDescription() {
@@ -168,15 +168,6 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
         this.addedByUses = addedByUses;
     }
 
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return addedUsesNodes;
-    }
-
-    @Override
-    public void addUsesNode(UsesNodeBuilder usesNodeBuilder) {
-        addedUsesNodes.add(usesNodeBuilder);
-    }
-
     @Override
     public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
         return Collections.emptySet();
@@ -204,7 +195,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
 
     @Override
     public void addAugmentation(AugmentationSchemaBuilder augment) {
-        addedAugmentations.add(augment);
+        augmentationBuilders.add(augment);
     }
 
     @Override
@@ -234,11 +225,11 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
         } else if (!schemaPath.equals(other.schemaPath)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         return true;
@@ -252,6 +243,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
     public final class ChoiceCaseNodeImpl implements ChoiceCaseNode {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -281,6 +273,15 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index b1084e1659e6eb87ab14b9710b05295f09747ead..4a95610b36265cd6024651f4c1863991f13381cf 100644 (file)
@@ -9,20 +9,19 @@ package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
-import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
-import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
-public final class ConstraintsBuilder extends AbstractBuilder {
+public final class ConstraintsBuilder {
     private static final int HASH_IF_BOOL_TRUE = 1231;
     private static final int HASH_IF_BOOL_FALSE = 1237;
 
+    private final String moduleName;
+    private final int line;
     private final ConstraintDefinitionImpl instance;
     private final Set<MustDefinition> mustDefinitions;
     private String whenCondition;
@@ -31,13 +30,15 @@ public final class ConstraintsBuilder extends AbstractBuilder {
     private Integer max;
 
     public ConstraintsBuilder(final String moduleName, final int line) {
-        super(moduleName, line);
+        this.moduleName = moduleName;
+        this.line = line;
         instance = new ConstraintDefinitionImpl();
         mustDefinitions = new HashSet<MustDefinition>();
     }
 
     ConstraintsBuilder(final ConstraintsBuilder b) {
-        super(b.getModuleName(), b.getLine());
+        this.moduleName = b.getModuleName();
+        this.line = b.getLine();
         instance = new ConstraintDefinitionImpl();
         mustDefinitions = new HashSet<MustDefinition>(b.getMustDefinitions());
         whenCondition = b.getWhenCondition();
@@ -46,7 +47,6 @@ public final class ConstraintsBuilder extends AbstractBuilder {
         max = b.getMaxElements();
     }
 
-    @Override
     public ConstraintDefinition build() {
         RevisionAwareXPath whenStmt;
         if (whenCondition == null) {
@@ -62,14 +62,12 @@ public final class ConstraintsBuilder extends AbstractBuilder {
         return instance;
     }
 
-    @Override
-    public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) {
-        throw new YangParseException(moduleName, line, "Can not add unknown node to constraints.");
+    public String getModuleName() {
+        return moduleName;
     }
 
-    @Override
-    public List<UnknownSchemaNodeBuilder> getUnknownNodeBuilders() {
-        return Collections.emptyList();
+    public int getLine() {
+        return line;
     }
 
     public Integer getMinElements() {
index 11aee5b62e87d12235cdce19d1419c5f8ffc6175..9aeabc07cd26d1302eaa440ed507b5805de8f22c 100644 (file)
@@ -13,8 +13,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -27,6 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
@@ -41,6 +40,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
         AugmentationTargetBuilder, DataSchemaNodeBuilder {
     private boolean isBuilt;
     private final ContainerSchemaNodeImpl instance;
+    private YangNode parent;
 
     // SchemaNode args
     private SchemaPath schemaPath;
@@ -52,14 +52,9 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
     private boolean addedByUses;
     private Boolean configuration;
     private final ConstraintsBuilder constraints;
-    // DataNodeContainer args
-    private Set<TypeDefinition<?>> typedefs;
-    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<>();
-    private Set<UsesNode> usesNodes;
-    private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<>();
     // AugmentationTarget args
-    private Set<AugmentationSchema> augmentations;
-    private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<>();
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
+    private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
     // ContainerSchemaNode args
     private boolean presence;
 
@@ -72,8 +67,10 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
     }
 
     @Override
-    public ContainerSchemaNode build() {
+    public ContainerSchemaNode build(YangNode parent) {
         if (!isBuilt) {
+            this.parent = parent;
+            instance.setParent(parent);
             instance.setPath(schemaPath);
             instance.setDescription(description);
             instance.setReference(reference);
@@ -90,66 +87,44 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             instance.setConfiguration(configuration);
 
             // USES
-            if (usesNodes == null) {
-                usesNodes = new HashSet<>();
-                for (UsesNodeBuilder builder : addedUsesNodes) {
-                    usesNodes.add(builder.build());
-                }
+            for (UsesNodeBuilder builder : addedUsesNodes) {
+                usesNodes.add(builder.build(instance));
             }
             instance.setUses(usesNodes);
 
             // CHILD NODES
-            final Map<QName, DataSchemaNode> childs = new TreeMap<>(Comparators.QNAME_COMP);
-            if (childNodes == null || childNodes.isEmpty()) {
-                for (DataSchemaNodeBuilder node : addedChildNodes) {
-                    childs.put(node.getQName(), node.build());
-                }
-            } else {
-                for (DataSchemaNode node : childNodes) {
-                    childs.put(node.getQName(), node);
-                }
+            for (DataSchemaNodeBuilder node : addedChildNodes) {
+                DataSchemaNode child = node.build(instance);
+                childNodes.put(child.getQName(), node.build(instance));
             }
-            instance.setChildNodes(childs);
+            instance.setChildNodes(childNodes);
 
             // GROUPINGS
-            if (groupings == null) {
-                groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-                for (GroupingBuilder builder : addedGroupings) {
-                    groupings.add(builder.build());
-                }
+            for (GroupingBuilder builder : addedGroupings) {
+                groupings.add(builder.build(instance));
             }
             instance.setGroupings(groupings);
 
             // TYPEDEFS
-            if (typedefs == null) {
-                typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-                for (TypeDefinitionBuilder entry : addedTypedefs) {
-                    typedefs.add(entry.build());
-                }
+            for (TypeDefinitionBuilder entry : addedTypedefs) {
+                typedefs.add(entry.build(instance));
             }
             instance.setTypeDefinitions(typedefs);
 
             // AUGMENTATIONS
-            if (augmentations == null) {
-                augmentations = new HashSet<>();
-                for (AugmentationSchemaBuilder builder : addedAugmentations) {
-                    augmentations.add(builder.build());
-                }
+            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+                augmentations.add(builder.build(instance));
             }
-            instance.setAvailableAugmentations(augmentations);
+            instance.setAvailableAugmentations(new HashSet<>(augmentations));
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             instance.setConstraints(constraints.build());
-            instance.setAvailableAugmentations(augmentations);
 
             isBuilt = true;
         }
@@ -159,7 +134,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
     @Override
     public void rebuild() {
         isBuilt = false;
-        build();
+        build(parent);
     }
 
     @Override
@@ -188,17 +163,18 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
         this.typedefs = typedefs;
     }
 
-    public Set<AugmentationSchemaBuilder> getAugmentations() {
-        return addedAugmentations;
+    public List<AugmentationSchema> getAugmentations() {
+        return augmentations;
     }
 
-    @Override
-    public void addAugmentation(AugmentationSchemaBuilder augment) {
-        addedAugmentations.add(augment);
+    public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
+        return augmentationBuilders;
     }
 
-    public void setAugmentations(final Set<AugmentationSchema> augmentations) {
-        this.augmentations = augmentations;
+    @Override
+    public void addAugmentation(AugmentationSchemaBuilder augment) {
+        augmentationBuilders.add(augment);
+        System.out.println();
     }
 
     public SchemaPath getPath() {
@@ -277,20 +253,6 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
         return constraints;
     }
 
-    @Override
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return addedUsesNodes;
-    }
-
-    @Override
-    public void addUsesNode(UsesNodeBuilder usesNodeBuilder) {
-        addedUsesNodes.add(usesNodeBuilder);
-    }
-
-    public void setUsesnodes(final Set<UsesNode> usesNodes) {
-        this.usesNodes = usesNodes;
-    }
-
     public boolean isPresence() {
         return presence;
     }
@@ -344,6 +306,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
     public final class ContainerSchemaNodeImpl implements ContainerSchemaNode {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -377,6 +340,15 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index 6cef6238d5cdf9284a031d2c0fffb384007bbd37..af1f7998913c4bdca8cbb80556af53e8c0d39361 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.Deviation;
 import org.opendaylight.yangtools.yang.model.api.Deviation.Deviate;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
@@ -41,7 +42,7 @@ public final class DeviationBuilder extends AbstractBuilder {
     }
 
     @Override
-    public Deviation build() {
+    public Deviation build(YangNode parent) {
         if (targetPath == null) {
             throw new YangParseException(moduleName, line, "Unresolved deviation target");
         }
@@ -51,9 +52,8 @@ public final class DeviationBuilder extends AbstractBuilder {
             instance.setReference(reference);
 
             // UNKNOWN NODES
-            List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
+                unknownNodes.add(b.build(instance));
             }
             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
index f010d2ee1e5c180105a71bfc18ddcc6d28e18450..401d9d5ecefe0cf156a0b2ca585ac12e30089f7b 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -16,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
 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.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
 
@@ -29,7 +29,7 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder {
     }
 
     @Override
-    public ExtensionDefinition build() {
+    public ExtensionDefinition build(YangNode parent) {
         if (!isBuilt) {
             instance.setPath(schemaPath);
             instance.setDescription(description);
@@ -37,13 +37,10 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder {
             instance.setStatus(status);
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<UnknownSchemaNode>();
-                for (UnknownSchemaNodeBuilder un : addedUnknownNodes) {
-                    unknownNodes.add(un.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder un : addedUnknownNodes) {
+                unknownNodes.add(un.build(null));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
index 5a4da1edf00bb275f81039084078e860c25190e3..b0d1fc4fb085b838cd4858fde164d6a312b5034f 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -16,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.FeatureDefinition;
 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.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
 
@@ -29,7 +29,7 @@ public final class FeatureBuilder extends AbstractSchemaNodeBuilder {
     }
 
     @Override
-    public FeatureDefinitionImpl build() {
+    public FeatureDefinitionImpl build(YangNode parent) {
         if (!isBuilt) {
             instance.setPath(schemaPath);
             instance.setDescription(description);
@@ -37,13 +37,10 @@ public final class FeatureBuilder extends AbstractSchemaNodeBuilder {
             instance.setStatus(status);
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<UnknownSchemaNode>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(null));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
index ce152981225f3e6625d49b25b19fa7dcbff3e08c..c4f6a23ec65fd11eea4f382d1ee08bc016e8bb17 100644 (file)
@@ -7,13 +7,10 @@
  */
 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.Map;
 import java.util.Set;
-import java.util.TreeMap;
 import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
@@ -24,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
@@ -41,20 +39,15 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
     private Status status = Status.CURRENT;
     private boolean addedByUses;
 
-    private Set<TypeDefinition<?>> typedefs;
-    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
-
-    private Set<UsesNode> usesNodes;
-    private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
-
     public GroupingBuilderImpl(final String moduleName, final int line, final QName qname) {
         super(moduleName, line, qname);
         instance = new GroupingDefinitionImpl(qname);
     }
 
     @Override
-    public GroupingDefinition build() {
+    public GroupingDefinition build(YangNode parent) {
         if (!isBuilt) {
+            instance.setParent(parent);
             instance.setPath(schemaPath);
             instance.setDescription(description);
             instance.setReference(reference);
@@ -62,53 +55,35 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
             instance.setAddedByUses(addedByUses);
 
             // CHILD NODES
-            final Map<QName, DataSchemaNode> childs = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
-            if (childNodes == null || childNodes.isEmpty()) {
-                for (DataSchemaNodeBuilder node : addedChildNodes) {
-                    childs.put(node.getQName(), node.build());
-                }
-            } else {
-                for (DataSchemaNode node : childNodes) {
-                    childs.put(node.getQName(), node);
-                }
+            for (DataSchemaNodeBuilder node : addedChildNodes) {
+                DataSchemaNode child = node.build(instance);
+                childNodes.put(child.getQName(), child);
             }
-            instance.setChildNodes(childs);
+            instance.setChildNodes(childNodes);
 
             // GROUPINGS
-            if (groupings == null) {
-                groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
-                for (GroupingBuilder builder : addedGroupings) {
-                    groupings.add(builder.build());
-                }
+            for (GroupingBuilder builder : addedGroupings) {
+                groupings.add(builder.build(instance));
             }
             instance.setGroupings(groupings);
 
             // TYPEDEFS
-            if (typedefs == null) {
-                typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
-                for (TypeDefinitionBuilder entry : addedTypedefs) {
-                    typedefs.add(entry.build());
-                }
+            for (TypeDefinitionBuilder entry : addedTypedefs) {
+                typedefs.add(entry.build(instance));
             }
             instance.setTypeDefinitions(typedefs);
 
             // USES
-            if (usesNodes == null) {
-                usesNodes = new HashSet<UsesNode>();
-                for (UsesNodeBuilder builder : addedUsesNodes) {
-                    usesNodes.add(builder.build());
-                }
+            for (UsesNodeBuilder builder : addedUsesNodes) {
+                usesNodes.add(builder.build(instance));
             }
             instance.setUses(usesNodes);
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<UnknownSchemaNode>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
@@ -192,20 +167,6 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
         this.addedByUses = addedByUses;
     }
 
-    @Override
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return addedUsesNodes;
-    }
-
-    @Override
-    public void addUsesNode(final UsesNodeBuilder usesBuilder) {
-        addedUsesNodes.add(usesBuilder);
-    }
-
-    public void setUsesnodes(final Set<UsesNode> usesNodes) {
-        this.usesNodes = usesNodes;
-    }
-
     @Override
     public String toString() {
         return "grouping " + qname.getLocalName();
@@ -215,7 +176,7 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
     public int hashCode() {
         final int prime = 31;
         int result = 1;
-        result = prime * result + ((parent == null) ? 0 : parent.hashCode());
+        result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode());
         result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
         return result;
     }
@@ -235,11 +196,11 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
             return false;
         }
         final GroupingBuilderImpl other = (GroupingBuilderImpl) obj;
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         if (schemaPath == null) {
@@ -256,6 +217,7 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
     private final class GroupingDefinitionImpl implements GroupingDefinition {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status;
@@ -284,6 +246,15 @@ public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index 8bc76ebd28ed3ee248bacb8a4f5f8e13a4d15a0c..81e17a63cdb57925f6784c209d436564094d583c 100644 (file)
@@ -7,7 +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;
@@ -18,8 +17,10 @@ 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.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
+import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     private boolean isBuilt;
@@ -36,8 +37,11 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     }
 
     @Override
-    public IdentitySchemaNode build() {
+    public IdentitySchemaNode build(YangNode parent) {
         if (!isBuilt) {
+            if (!(parentBuilder instanceof ModuleBuilder)) {
+                throw new YangParseException(moduleName, line, "Identity can be defined only under module (was" + parentBuilder + ")");
+            }
             instance.setPath(schemaPath);
             instance.setDescription(description);
             instance.setReference(reference);
@@ -46,7 +50,7 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
             if (baseIdentity == null) {
                 if(baseIdentityBuilder != null) {
                     baseIdentityBuilder.addDerivedIdentity(instance);
-                    baseIdentity = baseIdentityBuilder.build();
+                    baseIdentity = baseIdentityBuilder.build(null);
                 }
             } else {
                 if(baseIdentity instanceof IdentitySchemaNodeImpl) {
@@ -56,13 +60,10 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
             instance.setBaseIdentity(baseIdentity);
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(null));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
index b8b77e20c833c29c60f356c55ea2d64b9c72abf4..617368f9c73e1aca480865c1a85cad16ffebd04c 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
@@ -47,8 +48,8 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple
     }
 
     @Override
-    public IdentityrefType build() {
-        return new IdentityrefType(baseIdentity.build(), schemaPath);
+    public IdentityrefType build(YangNode parent) {
+        return new IdentityrefType(baseIdentity.build(parent), schemaPath);
     }
 
     public String getBaseString() {
index ba305b1d92277bef0a88f4636e8fe4efe02d8fc9..87681178bf566cadc460ff4810200fbc940995c5 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -18,6 +17,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 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;
@@ -47,8 +47,9 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
     }
 
     @Override
-    public LeafListSchemaNode build() {
+    public LeafListSchemaNode build(YangNode parent) {
         if (!isBuilt) {
+            instance.setParent(parent);
             instance.setConstraints(constraints.build());
             instance.setPath(schemaPath);
             instance.setDescription(description);
@@ -60,19 +61,16 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
             instance.setUserOrdered(userOrdered);
 
             if (type == null) {
-                instance.setType(typedef.build());
+                instance.setType(typedef.build(instance));
             } else {
                 instance.setType(type);
             }
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
@@ -197,11 +195,11 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
         } else if (!schemaPath.equals(other.schemaPath)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         return true;
@@ -215,6 +213,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
     private final class LeafListSchemaNodeImpl implements LeafListSchemaNode {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -244,6 +243,15 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index ebbc48d56a8da4c4c6ad5fe300537819573536a8..cc9d2d7c21f914662bdd18d802fd156b3a4ddecd 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -18,6 +17,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 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;
@@ -48,8 +48,9 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
     }
 
     @Override
-    public LeafSchemaNode build() {
+    public LeafSchemaNode build(YangNode parent) {
         if (!isBuilt) {
+            instance.setParent(parent);
             instance.setPath(schemaPath);
             instance.setConstraints(constraints.build());
             instance.setDescription(description);
@@ -67,19 +68,16 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
 
             // TYPE
             if (type == null) {
-                instance.setType(typedef.build());
+                instance.setType(typedef.build(instance));
             } else {
                 instance.setType(type);
             }
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
@@ -212,11 +210,11 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
         } else if (!schemaPath.equals(other.schemaPath)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         return true;
@@ -230,6 +228,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
     private final class LeafSchemaNodeImpl implements LeafSchemaNode {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -260,6 +259,15 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index 47323f4cf03edabf5f1b68855d82e6043c5f522e..072616c5bc94e30b2eb6acae646474e512ab9bd6 100644 (file)
@@ -13,8 +13,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -27,6 +25,7 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
@@ -41,6 +40,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         AugmentationTargetBuilder {
     private boolean isBuilt;
     private final ListSchemaNodeImpl instance;
+    private YangNode parent;
     // SchemaNode args
     private SchemaPath schemaPath;
     private String description;
@@ -51,14 +51,9 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     private boolean addedByUses;
     private Boolean configuration;
     private final ConstraintsBuilder constraints;
-    // DataNodeContainer args
-    private Set<TypeDefinition<?>> typedefs;
-    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<>();
-    private Set<UsesNode> usesNodes;
-    private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<>();
     // AugmentationTarget args
-    private Set<AugmentationSchema> augmentations;
-    private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<>();
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
+    private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
     // ListSchemaNode args
     private List<QName> keyDefinition = Collections.emptyList();
     private boolean userOrdered;
@@ -71,8 +66,10 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     }
 
     @Override
-    public ListSchemaNode build() {
+    public ListSchemaNode build(YangNode parent) {
         if (!isBuilt) {
+            this.parent = parent;
+            instance.setParent(parent);
             instance.setKeyDefinition(keyDefinition);
             instance.setPath(schemaPath);
             instance.setDescription(description);
@@ -84,66 +81,44 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             instance.setUserOrdered(userOrdered);
 
             // CHILD NODES
-            final Map<QName, DataSchemaNode> childs = new TreeMap<>(Comparators.QNAME_COMP);
-            if (childNodes == null || childNodes.isEmpty()) {
-                for (DataSchemaNodeBuilder node : addedChildNodes) {
-                    childs.put(node.getQName(), node.build());
-                }
-            } else {
-                for (DataSchemaNode node : childNodes) {
-                    childs.put(node.getQName(), node);
-                }
+            for (DataSchemaNodeBuilder node : addedChildNodes) {
+                DataSchemaNode child = node.build(instance);
+                childNodes.put(child.getQName(), child);
             }
-            instance.setChildNodes(childs);
+            instance.setChildNodes(childNodes);
 
             // TYPEDEFS
-            if (typedefs == null) {
-                typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-                for (TypeDefinitionBuilder entry : addedTypedefs) {
-                    typedefs.add(entry.build());
-                }
+            for (TypeDefinitionBuilder entry : addedTypedefs) {
+                typedefs.add(entry.build(instance));
             }
             instance.setTypeDefinitions(typedefs);
 
             // USES
-            if (usesNodes == null) {
-                usesNodes = new HashSet<>();
-                for (UsesNodeBuilder builder : addedUsesNodes) {
-                    usesNodes.add(builder.build());
-                }
+            for (UsesNodeBuilder builder : addedUsesNodes) {
+                usesNodes.add(builder.build(instance));
             }
             instance.setUses(usesNodes);
 
             // GROUPINGS
-            if (groupings == null) {
-                groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
-                for (GroupingBuilder builder : addedGroupings) {
-                    groupings.add(builder.build());
-                }
+            for (GroupingBuilder builder : addedGroupings) {
+                groupings.add(builder.build(instance));
             }
             instance.setGroupings(groupings);
 
             // AUGMENTATIONS
-            if (augmentations == null) {
-                augmentations = new HashSet<>();
-                for (AugmentationSchemaBuilder builder : addedAugmentations) {
-                    augmentations.add(builder.build());
-                }
+            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+                augmentations.add(builder.build(instance));
             }
-            instance.setAvailableAugmentations(augmentations);
+            instance.setAvailableAugmentations(new HashSet<>(augmentations));
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             instance.setConstraints(constraints.build());
-            instance.setAvailableAugmentations(augmentations);
 
             isBuilt = true;
         }
@@ -153,7 +128,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     @Override
     public void rebuild() {
         isBuilt = false;
-        build();
+        build(parent);
     }
 
     @Override
@@ -225,30 +200,16 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     }
 
     @Override
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return addedUsesNodes;
-    }
-
-    @Override
-    public void addUsesNode(final UsesNodeBuilder usesBuilder) {
-        addedUsesNodes.add(usesBuilder);
-    }
-
-    public void setUsesnodes(final Set<UsesNode> usesNodes) {
-        this.usesNodes = usesNodes;
-    }
-
-    public Set<AugmentationSchemaBuilder> getAugmentations() {
-        return addedAugmentations;
+    public void addAugmentation(AugmentationSchemaBuilder augment) {
+        augmentationBuilders.add(augment);
     }
 
-    @Override
-    public void addAugmentation(AugmentationSchemaBuilder augment) {
-        addedAugmentations.add(augment);
+    public List<AugmentationSchema> getAugmentations() {
+        return augmentations;
     }
 
-    public void setAugmentations(final Set<AugmentationSchema> augmentations) {
-        this.augmentations = augmentations;
+    public List<AugmentationSchemaBuilder> getAugmentationBuilders() {
+        return augmentationBuilders;
     }
 
     public List<QName> getKeyDefinition() {
@@ -329,11 +290,11 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         } else if (!schemaPath.equals(other.schemaPath)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         return true;
@@ -347,6 +308,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     public final class ListSchemaNodeImpl implements ListSchemaNode {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -381,6 +343,15 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
@@ -591,11 +562,11 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(ListSchemaNodeImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder();
+            sb.append("list ");
+            sb.append(qname.getLocalName());
             sb.append("[");
-            sb.append("qname=" + qname);
-            sb.append(", path=" + path);
-            sb.append(", keyDefinition=" + keyDefinition);
+            sb.append(path);
             sb.append("]");
             return sb.toString();
         }
index fb9cf06831db52d6602f7cff0cb5318920c7cf5b..a15d9db32f5306b76b5bfb12debff1b5f4ffd38d 100644 (file)
@@ -18,7 +18,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
 import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
@@ -37,6 +36,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
@@ -70,17 +70,22 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
     private final Set<TypeAwareBuilder> dirtyNodes = new HashSet<TypeAwareBuilder>();
 
     private final Set<ModuleImport> imports = new HashSet<ModuleImport>();
-    private final List<AugmentationSchemaBuilder> addedAugments = new ArrayList<AugmentationSchemaBuilder>();
+    private final Set<AugmentationSchema> augments = new HashSet<>();
+    private final List<AugmentationSchemaBuilder> augmentBuilders = new ArrayList<>();
     private final List<AugmentationSchemaBuilder> allAugments = new ArrayList<AugmentationSchemaBuilder>();
-    private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
     private final List<UsesNodeBuilder> allUsesNodes = new ArrayList<UsesNodeBuilder>();
+    private final Set<RpcDefinition> rpcs = new TreeSet<RpcDefinition>(Comparators.SCHEMA_NODE_COMP);
     private final Set<RpcDefinitionBuilder> addedRpcs = new HashSet<RpcDefinitionBuilder>();
+    private final Set<NotificationDefinition> notifications = new TreeSet<NotificationDefinition>(Comparators.SCHEMA_NODE_COMP);
     private final Set<NotificationBuilder> addedNotifications = new HashSet<NotificationBuilder>();
+    private final Set<IdentitySchemaNode> identities = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
     private final Set<IdentitySchemaNodeBuilder> addedIdentities = new HashSet<IdentitySchemaNodeBuilder>();
-    private final Set<FeatureBuilder> addedFeatures = new HashSet<FeatureBuilder>();
-    private final Set<DeviationBuilder> addedDeviations = new HashSet<DeviationBuilder>();
-    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
-    private final List<ExtensionBuilder> addedExtensions = new ArrayList<ExtensionBuilder>();
+    private final Set<FeatureDefinition> features = new TreeSet<FeatureDefinition>(Comparators.SCHEMA_NODE_COMP);
+    private final Set<FeatureBuilder> addedFeatures = new HashSet<>();
+    private final Set<Deviation> deviations = new HashSet<>();
+    private final Set<DeviationBuilder> deviationBuilders = new HashSet<>();
+    private final List<ExtensionDefinition> extensions = new ArrayList<>();
+    private final List<ExtensionBuilder> addedExtensions = new ArrayList<>();
     private final List<UnknownSchemaNodeBuilder> allUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     public ModuleBuilder(final String name) {
@@ -91,100 +96,93 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         actualPath.push(this);
     }
 
+    public Module build() {
+        return build(null);
+    }
+
     /**
      * Build new Module object based on this builder.
      */
     @Override
-    public Module build() {
+    public Module build(YangNode parent) {
         instance.setPrefix(prefix);
         instance.setRevision(revision);
         instance.setImports(imports);
         instance.setNamespace(namespace);
 
         // TYPEDEFS
-        final Set<TypeDefinition<?>> typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
         for (TypeDefinitionBuilder tdb : addedTypedefs) {
-            typedefs.add(tdb.build());
+            typedefs.add(tdb.build(instance));
         }
         instance.setTypeDefinitions(typedefs);
 
         // CHILD NODES
-        final Map<QName, DataSchemaNode> children = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
         for (DataSchemaNodeBuilder child : addedChildNodes) {
-            children.put(child.getQName(), child.build());
+            DataSchemaNode childNode = child.build(instance);
+            childNodes.put(childNode.getQName(), childNode);
         }
-        instance.setChildNodes(children);
+        instance.setChildNodes(childNodes);
 
         // GROUPINGS
-        final Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
         for (GroupingBuilder gb : addedGroupings) {
-            groupings.add(gb.build());
+            groupings.add(gb.build(instance));
         }
         instance.setGroupings(groupings);
 
         // USES
-        final Set<UsesNode> usesDefinitions = new HashSet<UsesNode>();
         for (UsesNodeBuilder unb : addedUsesNodes) {
-            usesDefinitions.add(unb.build());
+            usesNodes.add(unb.build(instance));
         }
-        instance.setUses(usesDefinitions);
+        instance.setUses(usesNodes);
 
         // FEATURES
-        final Set<FeatureDefinition> features = new TreeSet<FeatureDefinition>(Comparators.SCHEMA_NODE_COMP);
         for (FeatureBuilder fb : addedFeatures) {
-            features.add(fb.build());
+            features.add(fb.build(instance));
         }
         instance.setFeatures(features);
 
         // NOTIFICATIONS
-        final Set<NotificationDefinition> notifications = new TreeSet<NotificationDefinition>(
-                Comparators.SCHEMA_NODE_COMP);
         for (NotificationBuilder entry : addedNotifications) {
-            notifications.add(entry.build());
+            notifications.add(entry.build(instance));
         }
         instance.setNotifications(notifications);
 
         // AUGMENTATIONS
-        final Set<AugmentationSchema> augmentations = new HashSet<AugmentationSchema>();
-        for (AugmentationSchemaBuilder builder : addedAugments) {
-            augmentations.add(builder.build());
+        for (AugmentationSchemaBuilder builder : augmentBuilders) {
+            augments.add(builder.build(instance));
         }
-        instance.setAugmentations(augmentations);
+        instance.setAugmentations(augments);
 
         // RPCs
-        final Set<RpcDefinition> rpcs = new TreeSet<RpcDefinition>(Comparators.SCHEMA_NODE_COMP);
         for (RpcDefinitionBuilder rpc : addedRpcs) {
-            rpcs.add(rpc.build());
+            rpcs.add(rpc.build(instance));
         }
         instance.setRpcs(rpcs);
 
         // DEVIATIONS
-        final Set<Deviation> deviations = new HashSet<Deviation>();
-        for (DeviationBuilder entry : addedDeviations) {
-            deviations.add(entry.build());
+        for (DeviationBuilder entry : deviationBuilders) {
+            deviations.add(entry.build(instance));
         }
         instance.setDeviations(deviations);
 
         // EXTENSIONS
-        final List<ExtensionDefinition> extensions = new ArrayList<ExtensionDefinition>();
         for (ExtensionBuilder eb : addedExtensions) {
-            extensions.add(eb.build());
+            extensions.add(eb.build(instance));
         }
         Collections.sort(extensions, Comparators.SCHEMA_NODE_COMP);
         instance.setExtensionSchemaNodes(extensions);
 
         // IDENTITIES
-        final Set<IdentitySchemaNode> identities = new TreeSet<IdentitySchemaNode>(Comparators.SCHEMA_NODE_COMP);
         for (IdentitySchemaNodeBuilder id : addedIdentities) {
-            identities.add(id.build());
+            identities.add(id.build(instance));
         }
         instance.setIdentities(identities);
 
         // UNKNOWN NODES
-        final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
         for (UnknownSchemaNodeBuilder unb : addedUnknownNodes) {
-            unknownNodes.add(unb.build());
+            unknownNodes.add(unb.build(instance));
         }
+        Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
         instance.setUnknownSchemaNodes(unknownNodes);
 
         return instance;
@@ -258,7 +256,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
     }
 
     public Set<DeviationBuilder> getDeviations() {
-        return addedDeviations;
+        return deviationBuilders;
     }
 
     public List<ExtensionBuilder> getExtensions() {
@@ -332,6 +330,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
     }
 
     public ExtensionBuilder addExtension(final QName qname, final int line) {
+        Builder parent = getActualNode();
+        if (!(parent.equals(this))) {
+            throw new YangParseException(name, line, "extension can be defined only in module or submodule");
+        }
+
         final String extName = qname.getLocalName();
         for (ExtensionBuilder addedExtension : addedExtensions) {
             if (addedExtension.getQName().getLocalName().equals(extName)) {
@@ -339,6 +342,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
             }
         }
         final ExtensionBuilder builder = new ExtensionBuilder(name, line, qname);
+        builder.setParent(parent);
         addedExtensions.add(builder);
         return builder;
     }
@@ -430,7 +434,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
 
         if (parent.equals(this)) {
             // augment can be declared only under 'module' ...
-            addedAugments.add(builder);
+            augmentBuilders.add(builder);
         } else {
             // ... or 'uses' statement
             if (parent instanceof UsesNodeBuilder) {
@@ -449,11 +453,6 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         return builder;
     }
 
-    @Override
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return addedUsesNodes;
-    }
-
     @Override
     public void addUsesNode(UsesNodeBuilder usesBuilder) {
         addedUsesNodes.add(usesBuilder);
@@ -549,6 +548,10 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         return outputBuilder;
     }
 
+    public void addNotification(NotificationDefinition notification) {
+        notifications.add(notification);
+    }
+
     public NotificationBuilder addNotification(final int line, final QName qname) {
         final Builder parent = getActualNode();
         if (!(parent.equals(this))) {
@@ -737,7 +740,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
 
         final DeviationBuilder builder = new DeviationBuilder(name, line, targetPath);
         builder.setParent(parent);
-        addedDeviations.add(builder);
+        deviationBuilders.add(builder);
         return builder;
     }
 
@@ -830,6 +833,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
             this.name = name;
         }
 
+        @Override
+        public YangNode getParent() {
+            return null;
+        }
+
         @Override
         public URI getNamespace() {
             return namespace;
index 371d9c54015d62bcb561d92c790f171477547e7e..107c0be0c747d2ca9789f6c97f334bbf152383c4 100644 (file)
@@ -13,8 +13,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -26,6 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
@@ -35,19 +34,19 @@ 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.YangParseException;
 
 public final class NotificationBuilder extends AbstractDataNodeContainerBuilder implements SchemaNodeBuilder,
         AugmentationTargetBuilder {
     private boolean isBuilt;
     private final NotificationDefinitionImpl instance;
+    private YangNode parent;
     private SchemaPath schemaPath;
     private String description;
     private String reference;
     private Status status = Status.CURRENT;
-    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
-    private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
-    private Set<AugmentationSchema> augmentations;
-    private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<AugmentationSchemaBuilder>();
+    private final List<AugmentationSchema> augmentations = new ArrayList<>();
+    private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
 
     NotificationBuilder(final String moduleName, final int line, final QName qname) {
         super(moduleName, line, qname);
@@ -55,54 +54,52 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
     }
 
     @Override
-    public NotificationDefinition build() {
+    public NotificationDefinition build(YangNode parent) {
+        if (!(parentBuilder instanceof ModuleBuilder)) {
+            throw new YangParseException(moduleName, line, "Notification can be defined only under module (was " + parentBuilder + ")");
+        }
         if (!isBuilt) {
+            this.parent = parent;
+            instance.setParent(parent);
             instance.setPath(schemaPath);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
 
             // CHILD NODES
-            final Map<QName, DataSchemaNode> childs = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
             for (DataSchemaNodeBuilder node : addedChildNodes) {
-                childs.put(node.getQName(), node.build());
+                DataSchemaNode child = node.build(instance);
+                childNodes.put(child.getQName(), child);
             }
-            instance.setChildNodes(childs);
+            instance.setChildNodes(childNodes);
 
             // GROUPINGS
-            final Set<GroupingDefinition> groupingDefs = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
             for (GroupingBuilder builder : addedGroupings) {
-                groupingDefs.add(builder.build());
+                groupings.add(builder.build(instance));
             }
-            instance.setGroupings(groupingDefs);
+            instance.setGroupings(groupings);
 
             // TYPEDEFS
-            final Set<TypeDefinition<?>> typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
             for (TypeDefinitionBuilder entry : addedTypedefs) {
-                typedefs.add(entry.build());
+                typedefs.add(entry.build(instance));
             }
             instance.setTypeDefinitions(typedefs);
 
             // USES
-            final Set<UsesNode> uses = new HashSet<UsesNode>();
             for (UsesNodeBuilder builder : addedUsesNodes) {
-                uses.add(builder.build());
+                usesNodes.add(builder.build(instance));
             }
-            instance.setUses(uses);
+            instance.setUses(usesNodes);
 
             // AUGMENTATIONS
-            if (augmentations == null) {
-                augmentations = new HashSet<AugmentationSchema>();
-                for (AugmentationSchemaBuilder builder : addedAugmentations) {
-                    augmentations.add(builder.build());
-                }
+            for (AugmentationSchemaBuilder builder : augmentationBuilders) {
+                augmentations.add(builder.build(instance));
             }
-            instance.setAvailableAugmentations(augmentations);
+            instance.setAvailableAugmentations(new HashSet<>(augmentations));
 
             // UNKNOWN NODES
-            final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
+                unknownNodes.add(b.build(instance));
             }
             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
@@ -116,7 +113,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
     @Override
     public void rebuild() {
         isBuilt = false;
-        build();
+        build(parent);
     }
 
     @Override
@@ -129,16 +126,6 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
         addedTypedefs.add(type);
     }
 
-    @Override
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return addedUsesNodes;
-    }
-
-    @Override
-    public void addUsesNode(final UsesNodeBuilder usesNodeBuilder) {
-        addedUsesNodes.add(usesNodeBuilder);
-    }
-
     @Override
     public SchemaPath getPath() {
         return schemaPath;
@@ -181,17 +168,9 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
         }
     }
 
-    public Set<AugmentationSchemaBuilder> getAugmentations() {
-        return addedAugmentations;
-    }
-
     @Override
     public void addAugmentation(AugmentationSchemaBuilder augment) {
-        addedAugmentations.add(augment);
-    }
-
-    public void setAugmentations(final Set<AugmentationSchema> augmentations) {
-        this.augmentations = augmentations;
+        augmentationBuilders.add(augment);
     }
 
     @Override
@@ -202,6 +181,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
     public final class NotificationDefinitionImpl implements NotificationDefinition {
         private final QName qname;
         private SchemaPath path;
+        private YangNode parent;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -230,6 +210,15 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
             this.path = path;
         }
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         @Override
         public String getDescription() {
             return description;
index b9a43a838658b7417a0fcaaf90f5f857931cefed..1c839a9320d4f5c6a83688d36dce883fbb486597 100644 (file)
@@ -7,7 +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;
@@ -17,23 +16,28 @@ import java.util.TreeSet;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 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 org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
     private boolean isBuilt;
     private final RpcDefinitionImpl instance;
     private ContainerSchemaNodeBuilder inputBuilder;
     private ContainerSchemaNodeBuilder outputBuilder;
-    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
-    private final Set<GroupingBuilder> addedGroupings = new HashSet<GroupingBuilder>();
+    private final Set<TypeDefinition<?>> typedefs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<>();
+    private final Set<GroupingDefinition> groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    private final Set<GroupingBuilder> addedGroupings = new HashSet<>();
 
     public ContainerSchemaNodeBuilder getInput() {
         return inputBuilder;
@@ -49,41 +53,39 @@ public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {
     }
 
     @Override
-    public RpcDefinition build() {
+    public RpcDefinition build(YangNode parent) {
+        if (!(parent instanceof Module)) {
+            throw new YangParseException(moduleName, line, "Rpc can be defined only under module");
+        }
         if (!isBuilt) {
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
 
-            final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build();
-            final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build();
+            final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build(instance);
+            final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build(instance);
             instance.setInput(input);
             instance.setOutput(output);
 
             instance.setPath(schemaPath);
 
             // TYPEDEFS
-            final Set<TypeDefinition<?>> typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);
             for (TypeDefinitionBuilder entry : addedTypedefs) {
-                typedefs.add(entry.build());
+                typedefs.add(entry.build(instance));
             }
             instance.setTypeDefinitions(typedefs);
 
             // GROUPINGS
-            final Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
             for (GroupingBuilder entry : addedGroupings) {
-                groupings.add(entry.build());
+                groupings.add(entry.build(instance));
             }
             instance.setGroupings(groupings);
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<UnknownSchemaNode>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(instance));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
index b2f2c16de6978f54e08ea7292b6c3fca7c9c53d1..289d09585482033aac778f4bf9fb20d1583dcc82 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -16,12 +15,12 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
 import org.opendaylight.yangtools.yang.model.util.ExtendedType;
 import org.opendaylight.yangtools.yang.model.util.UnknownType;
-import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
@@ -46,14 +45,14 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder im
     }
 
     @Override
-    public TypeDefinition<? extends TypeDefinition<?>> build() {
+    public TypeDefinition<? extends TypeDefinition<?>> build(YangNode parent) {
         TypeDefinition<?> result = null;
         ExtendedType.Builder typeBuilder = null;
         if ((type == null || type instanceof UnknownType) && typedef == null) {
             throw new YangParseException("Unresolved type: '" + qname.getLocalName() + "'.");
         }
         if (type == null || type instanceof UnknownType) {
-            type = typedef.build();
+            type = typedef.build(parent);
         }
 
         typeBuilder = new ExtendedType.Builder(qname, type, description, reference, schemaPath);
@@ -69,13 +68,10 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder im
         typeBuilder.fractionDigits(fractionDigits);
 
         // UNKNOWN NODES
-        if (unknownNodes == null) {
-            unknownNodes = new ArrayList<UnknownSchemaNode>();
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
-            }
-            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build(null));
         }
+        Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
         typeBuilder.unknownSchemaNodes(unknownNodes);
         result = typeBuilder.build();
         return result;
index 4e913c460f62eb0001d75b4fecbbdf08ee64e1f0..8c965eaa8a5759261a2537944f0bf3529c8c8494 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
@@ -80,11 +81,11 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements
     }
 
     @Override
-    public UnionType build() {
+    public UnionType build(YangNode parent) {
         if (!isBuilt) {
             instance = new UnionType(types);
             for (TypeDefinitionBuilder tdb : typedefs) {
-                types.add(tdb.build());
+                types.add(tdb.build(null));
             }
             isBuilt = true;
         }
index 64e35abed830e21f8a66ce2cef9e57f230fa36b4..452660a55e4c85518c51957b5f988baf9759bd8e 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -16,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
 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.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
 
@@ -89,7 +89,7 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     }
 
     @Override
-    public UnknownSchemaNode build() {
+    public UnknownSchemaNode build(YangNode parent) {
         if (!isBuilt) {
             instance.setPath(schemaPath);
             instance.setNodeType(nodeType);
@@ -104,18 +104,15 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
                 instance.setExtensionDefinition(extensionDefinition);
             } else {
                 if (extensionBuilder != null) {
-                    instance.setExtensionDefinition(extensionBuilder.build());
+                    instance.setExtensionDefinition(extensionBuilder.build(null));
                 }
             }
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<UnknownSchemaNode>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(null));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
index 625da75fda6ecd48a7e829752f3ad8c017752a14..3ca8bd5f0e9a2aa3827090558b6441d2156dcafe 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
@@ -36,7 +37,7 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder {
     private boolean isBuilt;
     private UsesNodeImpl instance;
-    private DataNodeContainerBuilder parent;
+    private DataNodeContainerBuilder parentBuilder;
     private final String groupingName;
     private SchemaPath groupingPath;
     private GroupingDefinition groupingDefinition;
@@ -44,6 +45,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
     private boolean addedByUses;
     private boolean augmenting;
     private AugmentationSchemaBuilder parentAugment;
+    private final Set<AugmentationSchema> augments = new HashSet<>();
     private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<>();
     private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<>();
     private final List<RefineHolder> refines = new ArrayList<>();
@@ -99,30 +101,29 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
     }
 
     @Override
-    public UsesNode build() {
+    public UsesNode build(YangNode parent) {
         if (!isBuilt) {
             instance = new UsesNodeImpl(groupingPath);
             instance.setAddedByUses(addedByUses);
+            instance.setParent(parent);
 
             // AUGMENTATIONS
-            final Set<AugmentationSchema> augments = new HashSet<>();
             for (AugmentationSchemaBuilder builder : addedAugments) {
-                augments.add(builder.build());
+                augments.add(builder.build(instance));
             }
             instance.setAugmentations(augments);
 
             // REFINES
             final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<>();
             for (SchemaNodeBuilder refineBuilder : refineBuilders) {
-                SchemaNode refineNode = refineBuilder.build();
+                SchemaNode refineNode = refineBuilder.build(instance);
                 refineNodes.put(refineNode.getPath(), refineNode);
             }
             instance.setRefines(refineNodes);
 
             // UNKNOWN NODES
-            List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
+                unknownNodes.add(b.build(instance));
             }
             instance.setUnknownSchemaNodes(unknownNodes);
 
@@ -134,7 +135,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
 
     @Override
     public DataNodeContainerBuilder getParent() {
-        return parent;
+        return parentBuilder;
     }
 
     @Override
@@ -143,7 +144,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
             throw new YangParseException(moduleName, line,
                     "Parent of 'uses' has to be instance of DataNodeContainerBuilder, but was: '" + parent + "'.");
         }
-        this.parent = (DataNodeContainerBuilder) parent;
+        this.parentBuilder = (DataNodeContainerBuilder) parent;
     }
 
     @Override
@@ -267,7 +268,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
         final int prime = 31;
         int result = 1;
         result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode());
-        result = prime * result + ((parent == null) ? 0 : parent.hashCode());
+        result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode());
         return result;
     }
 
@@ -290,11 +291,11 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
         } else if (!groupingName.equals(other.groupingName)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         return true;
@@ -306,12 +307,22 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
     }
 
     public final class UsesNodeImpl implements UsesNode {
+        private YangNode parent;
         private final SchemaPath groupingPath;
         private Set<AugmentationSchema> augmentations = Collections.emptySet();
         private boolean addedByUses;
         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();
         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
 
+        @Override
+        public YangNode getParent() {
+            return parent;
+        }
+
+        private void setParent(YangNode parent) {
+            this.parent = parent;
+        }
+
         private UsesNodeImpl(final SchemaPath groupingPath) {
             this.groupingPath = groupingPath;
         }
index 38b282de69c362bc8511c2bd002e718ad0dcad23..4a3701d45f13c7d2e5461088565f1ee9c9dc1233 100644 (file)
@@ -29,7 +29,6 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
 
-import com.google.common.base.Preconditions;
 import org.antlr.v4.runtime.ANTLRInputStream;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.tree.ParseTree;
@@ -70,6 +69,7 @@ import org.opendaylight.yangtools.yang.validator.YangModelBasicValidator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -456,7 +456,7 @@ public final class YangParserImpl implements YangModelParser {
                         throw new YangParseException(module.getName(), idref.getLine(), "Failed to find base identity");
                     }
                     idref.setBaseIdentity(identity);
-                    nodeToResolve.setType(idref.build());
+                    nodeToResolve.setType(idref.build(null));
                 } else {
                     resolveType(nodeToResolve, modules, module);
                 }
@@ -478,7 +478,7 @@ public final class YangParserImpl implements YangModelParser {
                     IdentitySchemaNodeBuilder identity = findBaseIdentity(modules, module, idref.getBaseString(),
                             idref.getLine());
                     idref.setBaseIdentity(identity);
-                    nodeToResolve.setType(idref.build());
+                    nodeToResolve.setType(idref.build(null));
                 } else {
                     resolveTypeWithContext(nodeToResolve, modules, module, context);
                 }
index d9858bc3cc6e56d10d1f9a60e9ec9682247538b0..2a3683d1fec7875e702a682d297b62e60eba553d 100644 (file)
@@ -61,7 +61,7 @@ public final class CopyUtils {
     /**
      * Create copy of DataSchemaNodeBuilder with new parent. If updateQName is
      * true, qname of node will be corrected based on new parent.
-     * 
+     *
      * @param old
      *            builder to copy
      * @param newParent
@@ -132,7 +132,7 @@ public final class CopyUtils {
         for (ChoiceCaseBuilder childNode : old.getCases()) {
             copy.addCase(copy(childNode, copy, updateQName));
         }
-        for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
+        for (AugmentationSchemaBuilder augment : old.getAugmentationBuilders()) {
             copy.addAugmentation(copyAugment(augment, copy));
         }
         for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
@@ -194,7 +194,6 @@ public final class CopyUtils {
         copy.setAugmenting(old.isAugmenting());
         copy.setAddedByUses(old.isAddedByUses());
         copy.setConfiguration(old.isConfiguration());
-        copy.setChildNodes(old.getChildNodes());
         for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
             copy.addChildNode(copy(childNode, copy, updateQName));
         }
@@ -208,7 +207,7 @@ public final class CopyUtils {
         for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
             copy.addUsesNode(copyUses(oldUses, copy));
         }
-        for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
+        for (AugmentationSchemaBuilder augment : old.getAugmentationBuilders()) {
             copy.addAugmentation(copyAugment(augment, copy));
         }
         for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
@@ -297,7 +296,6 @@ public final class CopyUtils {
         copy.setAugmenting(old.isAugmenting());
         copy.setAddedByUses(old.isAddedByUses());
         copy.setConfiguration(old.isConfiguration());
-        copy.setChildNodes(old.getChildNodes());
         for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
             copy.addChildNode(copy(childNode, copy, updateQName));
         }
@@ -311,7 +309,7 @@ public final class CopyUtils {
         for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
             copy.addUsesNode(copyUses(oldUses, copy));
         }
-        for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
+        for (AugmentationSchemaBuilder augment : old.getAugmentationBuilders()) {
             copy.addAugmentation(copyAugment(augment, copy));
         }
         for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
@@ -336,7 +334,6 @@ public final class CopyUtils {
         copy.setReference(old.getReference());
         copy.setStatus(old.getStatus());
         copy.setAddedByUses(old.isAddedByUses());
-        copy.setChildNodes(old.getChildNodes());
         for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
             copy.addChildNode(copy(childNode, copy, updateQName));
         }
@@ -476,7 +473,6 @@ public final class CopyUtils {
         copy.setReference(old.getReference());
         copy.setStatus(old.getStatus());
         copy.addWhenCondition(old.getWhenCondition());
-        copy.setChildNodes(old.getChildNodes());
         copy.setTargetNodeSchemaPath(old.getTargetNodeSchemaPath());
         for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
             copy.addChildNode(copy(childNode, copy, false));
@@ -570,7 +566,7 @@ public final class CopyUtils {
 
     /**
      * Create AnyXmlBuilder from given AnyXmlSchemaNode.
-     * 
+     *
      * @param anyxml
      *            base anyxml
      * @param qname
@@ -591,7 +587,7 @@ public final class CopyUtils {
 
     /**
      * Create GroupingBuilder from given GroupingDefinition.
-     * 
+     *
      * @param grouping
      *            base grouping
      * @param qname
@@ -605,7 +601,9 @@ public final class CopyUtils {
     public static GroupingBuilder createGrouping(GroupingDefinition grouping, QName qname, String moduleName, int line) {
         final GroupingBuilderImpl builder = new GroupingBuilderImpl(moduleName, line, qname);
         builder.setPath(grouping.getPath());
-        builder.setChildNodes(grouping.getChildNodes());
+        for (DataSchemaNode child : grouping.getChildNodes()) {
+            builder.addChildNode(child);
+        }
         builder.setGroupings(grouping.getGroupings());
         builder.setTypedefs(grouping.getTypeDefinitions());
         builder.setUsesnodes(grouping.getUses());
@@ -618,7 +616,7 @@ public final class CopyUtils {
 
     /**
      * Create TypeDefinitionBuilder from given ExtendedType.
-     * 
+     *
      * @param typedef
      *            base typedef
      * @param qname
@@ -650,7 +648,7 @@ public final class CopyUtils {
 
     /**
      * Create UnknownSchemaNodeBuilder from given UnknownSchemaNode.
-     * 
+     *
      * @param unknownNode
      *            base unknown node
      * @param qname
@@ -677,7 +675,7 @@ public final class CopyUtils {
 
     /**
      * Create LeafSchemaNodeBuilder from given LeafSchemaNode.
-     * 
+     *
      * @param leaf
      *            leaf from which to create builder
      * @param qname
@@ -703,7 +701,7 @@ public final class CopyUtils {
 
     /**
      * Create ContainerSchemaNodeBuilder from given ContainerSchemaNode.
-     * 
+     *
      * @param container
      *            base container
      * @param qname
@@ -721,10 +719,12 @@ public final class CopyUtils {
         convertDataSchemaNode(container, builder);
         builder.setConfiguration(container.isConfiguration());
         builder.setUnknownNodes(container.getUnknownSchemaNodes());
-        builder.setChildNodes(container.getChildNodes());
+        for (DataSchemaNode child : container.getChildNodes()) {
+            builder.addChildNode(child);
+        }
         builder.setGroupings(container.getGroupings());
         builder.setTypedefs(container.getTypeDefinitions());
-        builder.setAugmentations(container.getAvailableAugmentations());
+        builder.getAugmentations().addAll(container.getAvailableAugmentations());
         builder.setUsesnodes(container.getUses());
         builder.setPresence(container.isPresenceContainer());
         return builder;
@@ -732,7 +732,7 @@ public final class CopyUtils {
 
     /**
      * Create ListSchemaNodeBuilder from given ListSchemaNode.
-     * 
+     *
      * @param list
      *            base list
      * @param qname
@@ -749,9 +749,11 @@ public final class CopyUtils {
         builder.setConfiguration(list.isConfiguration());
         builder.setUnknownNodes(list.getUnknownSchemaNodes());
         builder.setTypedefs(list.getTypeDefinitions());
-        builder.setChildNodes(list.getChildNodes());
+        for (DataSchemaNode child : list.getChildNodes()) {
+            builder.addChildNode(child);
+        }
         builder.setGroupings(list.getGroupings());
-        builder.setAugmentations(list.getAvailableAugmentations());
+        builder.getAugmentations().addAll(list.getAvailableAugmentations());
         builder.setUsesnodes(list.getUses());
         builder.setUserOrdered(builder.isUserOrdered());
         return builder;
@@ -759,7 +761,7 @@ public final class CopyUtils {
 
     /**
      * Create LeafListSchemaNodeBuilder from given LeafListSchemaNode.
-     * 
+     *
      * @param leafList
      *            base leaf-list
      * @param qname
@@ -784,7 +786,7 @@ public final class CopyUtils {
 
     /**
      * Create ChoiceBuilder from given ChoiceNode.
-     * 
+     *
      * @param choice
      *            base choice
      * @param qname
@@ -807,7 +809,7 @@ public final class CopyUtils {
 
     /**
      * Set DataSchemaNode arguments to builder object
-     * 
+     *
      * @param node
      *            node from which arguments should be read
      * @param builder
@@ -824,7 +826,7 @@ public final class CopyUtils {
 
     /**
      * Copy constraints from constraints definition to constraints builder.
-     * 
+     *
      * @param nodeConstraints
      *            definition from which constraints will be copied
      * @param constraints
index 9d5b90eb0074a0a7656c785c5e3e674dfbccf49a..7faef14300e84d598ceed097fadd8aafb53f9c2a 100644 (file)
@@ -192,6 +192,20 @@ public final class GroupingUtils {
         return null;
     }
 
+    private static void setNodeAugmenting(DataSchemaNodeBuilder node) {
+        node.setAugmenting(true);
+        if (node instanceof DataNodeContainerBuilder) {
+            for (DataSchemaNodeBuilder child : ((DataNodeContainerBuilder)node).getChildNodeBuilders()) {
+                setNodeAugmenting(child);
+            }
+        }
+        if (node instanceof ChoiceBuilder) {
+            for (ChoiceCaseBuilder child : ((ChoiceBuilder)node).getCases()) {
+                setNodeAugmenting(child);
+            }
+        }
+    }
+
     /**
      * Add nodes defined in uses target grouping to uses parent.
      *
@@ -215,7 +229,8 @@ public final class GroupingUtils {
             setAddedByUsesToNode(child);
 
             if (usesNode.isAugmenting()) {
-                child.setAugmenting(true);
+                //child.setAugmenting(true);
+                setNodeAugmenting(child);
             }
             if (usesNode.isAugmenting() && !(usesNode.getParentAugment().getParent() instanceof UsesNodeBuilder)) {
                 AugmentationSchemaBuilder parentAugment = usesNode.getParentAugment();
@@ -327,7 +342,7 @@ public final class GroupingUtils {
             }
             if (!exists) {
                 DataSchemaNodeBuilder copy = CopyUtils.copy(childNode, parent, true);
-                setAddedByUsesToNode((GroupingMember) copy);
+                setAddedByUsesToNode(copy);
                 collection.add(copy);
             }
         }
index 124f8c701392a1f46f79fb4bebd20056f8e360f1..dbd78e582a5bec446d405d146ec46f80190bba95 100644 (file)
@@ -218,6 +218,7 @@ public final class ParserUtils {
         }
         for (UsesNodeBuilder usesNode : augment.getUsesNodes()) {
             val copy = CopyUtils.copyUses(usesNode, target);
+            copy.setAugmenting(true);
             target.addUsesNode(copy);
         }
     }
@@ -392,7 +393,7 @@ public final class ParserUtils {
     }
     
     public static def getRpc(ModuleBuilder module,String name) {
-        for(rpc : module.rpcs) {
+        for(rpc : module.getRpcs()) {
             if(name == rpc.QName.localName) {
                 return rpc;
             }
@@ -401,7 +402,7 @@ public final class ParserUtils {
     }
     
     public static def getNotification(ModuleBuilder module,String name) {
-        for(notification : module.notifications) {
+        for(notification : module.getNotifications()) {
             if(name == notification.QName.localName) {
                 return notification;
             }
@@ -668,5 +669,6 @@ public final class ParserUtils {
             }
             return parent as ModuleBuilder;
         }
-    }
-    
\ No newline at end of file
+
+}
+
index 40d47dddd7c6d3fa1cb072b13e859bf7d4a720cb..f9372d8686a4c1f110cc11201f501bf3c3ce85f1 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.parser.util;
 
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
 
 public final class RefineHolder extends AbstractBuilder {
@@ -104,7 +105,7 @@ public final class RefineHolder extends AbstractBuilder {
     }
 
     @Override
-    public Object build() {
+    public Object build(YangNode parent) {
         return null;
     }
 
@@ -121,7 +122,7 @@ public final class RefineHolder extends AbstractBuilder {
         result = prime * result + ((minElements == null) ? 0 : minElements.hashCode());
         result = prime * result + ((must == null) ? 0 : must.hashCode());
         result = prime * result + ((name == null) ? 0 : name.hashCode());
-        result = prime * result + ((parent == null) ? 0 : parent.hashCode());
+        result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode());
         result = prime * result + ((presence == null) ? 0 : presence.hashCode());
         result = prime * result + ((reference == null) ? 0 : reference.hashCode());
         return result;
@@ -202,11 +203,11 @@ public final class RefineHolder extends AbstractBuilder {
         } else if (!name.equals(other.name)) {
             return false;
         }
-        if (parent == null) {
-            if (other.parent != null) {
+        if (parentBuilder == null) {
+            if (other.parentBuilder != null) {
                 return false;
             }
-        } else if (!parent.equals(other.parent)) {
+        } else if (!parentBuilder.equals(other.parentBuilder)) {
             return false;
         }
         if (presence == null) {
index b499fdbce43a2ab32198693def65ae295f12ea13..f3f2def8fe01437925638503e1e2de349134ee98 100644 (file)
@@ -50,6 +50,7 @@ public final class RefineUtils {
         }
         if (unknownNodes != null) {
             for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
+                unknown.setParent(leaf);
                 leaf.addUnknownNodeBuilder(unknown);
             }
         }
@@ -68,6 +69,7 @@ public final class RefineUtils {
         }
         if (unknownNodes != null) {
             for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
+                unknown.setParent(container);
                 container.addUnknownNodeBuilder(unknown);
             }
         }
@@ -90,6 +92,7 @@ public final class RefineUtils {
         }
         if (unknownNodes != null) {
             for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
+                unknown.setParent(list);
                 list.addUnknownNodeBuilder(unknown);
             }
         }
@@ -112,6 +115,7 @@ public final class RefineUtils {
         }
         if (unknownNodes != null) {
             for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
+                unknown.setParent(leafList);
                 leafList.addUnknownNodeBuilder(unknown);
             }
         }
@@ -130,6 +134,7 @@ public final class RefineUtils {
         }
         if (unknownNodes != null) {
             for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
+                unknown.setParent(choice);
                 choice.addUnknownNodeBuilder(unknown);
             }
         }
@@ -148,6 +153,7 @@ public final class RefineUtils {
         }
         if (unknownNodes != null) {
             for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
+                unknown.setParent(anyXml);
                 anyXml.addUnknownNodeBuilder(unknown);
             }
         }
@@ -155,7 +161,7 @@ public final class RefineUtils {
 
     /**
      * Check if refine can be performed on given node.
-     * 
+     *
      * @param node
      *            node to refine
      * @param refine
@@ -245,9 +251,9 @@ public final class RefineUtils {
      * <li>reference</li>
      * <li>config</li>
      * </ul>
-     * 
+     *
      * These parameters may be refined for any node.
-     * 
+     *
      * @param node
      *            node to refine
      * @param refine
@@ -291,7 +297,7 @@ public final class RefineUtils {
 
     /**
      * Perform refine operation on given node.
-     * 
+     *
      * @param nodeToRefine
      *            builder of node to refine
      * @param refine
index 0f2d1537f5b91190c6f4a122ac226b7607ed6f20..44cb0d635d976cbff7f9c96a258ad036b1502b77 100644 (file)
@@ -86,6 +86,7 @@ public class GroupingTest {
         assertEquals(1, leafMustConstraints.size());
         MustDefinition leafMust = leafMustConstraints.iterator().next();
         assertEquals("\"ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)\"", leafMust.toString());
+        assertEquals(1, refineLeaf.getUnknownSchemaNodes().size());
 
         // container port
         assertNotNull(refineContainer);
index 9a88a8671351af30686d9e9e34c49c305667b037..d471d85dbc03aadf131b4d8029acd3eca57a5d8e 100644 (file)
@@ -161,6 +161,7 @@ public class TypesResolutionTest {
         LeafSchemaNode leaf = (LeafSchemaNode) tested.getDataChildByName("inst-id-leaf1");
         InstanceIdentifier leafType = (InstanceIdentifier) leaf.getType();
         assertFalse(leafType.requireInstance());
+        assertEquals(1, leaf.getUnknownSchemaNodes().size());
     }
 
     @Test
@@ -178,11 +179,14 @@ public class TypesResolutionTest {
         assertEquals(5, identities.size());
         IdentitySchemaNode cryptoAlg = null;
         IdentitySchemaNode cryptoBase = null;
+        IdentitySchemaNode cryptoId = null;
         for (IdentitySchemaNode id : identities) {
             if (id.getQName().getLocalName().equals("crypto-alg")) {
                 cryptoAlg = id;
             } else if ("crypto-base".equals(id.getQName().getLocalName())) {
                 cryptoBase = id;
+            } else if ("crypto-id".equals(id.getQName().getLocalName())) {
+                cryptoId = id;
             }
         }
         assertNotNull(cryptoAlg);
@@ -194,6 +198,9 @@ public class TypesResolutionTest {
         assertNotNull(cryptoBase);
         assertNull(cryptoBase.getBaseIdentity());
         assertEquals(3, cryptoBase.getDerivedIdentities().size());
+
+        assertNotNull(cryptoId);
+        assertEquals(1, cryptoId.getUnknownSchemaNodes().size());
     }
 
     @Test
index 4662edc11ee7b4f08faf0f212ba905eebdeaac73..0d0ddb47bbbedbbda9c4b8d10582db6f2d2a2496 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.parser.impl;
 
 import static org.junit.Assert.*;
-import static org.junit.Assert.assertEquals;
 
 import java.io.File;
 import java.io.FileNotFoundException;
index d523a2eb778bcabdba7c2fdf25b2aa7e3b43db05..c93b51c0fddd35bf5d2bbba2c54a808d65c03968 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 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.impl.ModuleBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
 
 public class BitImplTest {
@@ -104,7 +105,10 @@ public class BitImplTest {
 
         List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
         UnknownSchemaNodeBuilder usnb = new UnknownSchemaNodeBuilder("module", 3, qnameB);
-        unknownNodes.add(usnb.build());
+        ModuleBuilder parent = org.mockito.Mockito.mock(ModuleBuilder.class);
+        usnb.setParent(parent);
+
+        unknownNodes.add(usnb.build(null));
 
         biA = new BitImpl(55L, qnameA, schemaPathA, "description", "reference", Status.CURRENT, unknownNodes);
 
index 126a97728136857265e0e9d10ce617530093e2a0..0769f4231c0a9eb3971b8045f2ef201fb138fa0c 100644 (file)
@@ -173,6 +173,7 @@ module foo {
                             "(ifType = 'ethernet' and ifMTU = 1500)" {
                         error-message "An ethernet MTU must be 1500";
                     }
+                    mountpoint "mnt-extension";
                 }
                 refine port {
                     description "description of port defined by refine";
@@ -194,4 +195,11 @@ module foo {
         }
     }
 
+    extension mountpoint {
+        description "enter point";
+        argument "name" {
+            yin-element "true";
+        }
+    }
+
 }
index 050d5c0de9866828215fc25f91f4a9dc03006119..befe0629b762f1a0373d52777a748dd5f2142cc1 100644 (file)
@@ -52,8 +52,9 @@ module custom-types-test {
 
     leaf inst-id-leaf1 {
         type instance-identifier {
-           require-instance false;
+            require-instance false;
         }
+        iit:mountpoint "mnt-extension";
     }
 
     leaf inst-id-leaf2 {
@@ -67,6 +68,7 @@ module custom-types-test {
     identity crypto-id {
         base "crypto-base";
         description "crypto-id description";
+        iit:mountpoint "mnt-extension";
     }
 
     identity crypto-base {