Converted BindingGenerator and ParserUtils to xtend 77/1077/2
authorTony Tkacik <ttkacik@cisco.com>
Tue, 3 Sep 2013 04:23:28 +0000 (21:23 -0700)
committerTony Tkacik <ttkacik@cisco.com>
Tue, 3 Sep 2013 04:37:25 +0000 (21:37 -0700)
  - Fixed bug in findNode implementation methods,
    which lead to ignoring rpcs and notifications

Change-Id: Ifb16c9911a0d0dfb4a62e2986b8c1d2ae84e4b17
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
15 files changed:
code-generator/binding-generator-impl/pom.xml
code-generator/binding-generator-impl/src/main/.gitignore [new file with mode: 0644]
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend [moved from code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java with 58% similarity]
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java
model/enum/src/main/yang/.gitignore [new file with mode: 0644]
yang/yang-model-util/pom.xml
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.xtend [moved from yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java with 69% similarity]
yang/yang-parser-impl/pom.xml
yang/yang-parser-impl/src/main/.gitignore [new file with mode: 0644]
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/impl/ModuleBuilder.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/impl/YangParserImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java [deleted file]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend [new file with mode: 0644]

index 9a1fc491eede57675e76bdba391c1de415b1cc85..60f6ff573411c764a10d55c7c48dad9bfdb6f626 100644 (file)
     <modelVersion>4.0.0</modelVersion>\r
     <artifactId>binding-generator-impl</artifactId>\r
 \r
+    <build>\r
+        <plugins>\r
+            <plugin>\r
+                <groupId>org.eclipse.xtend</groupId>\r
+                <artifactId>xtend-maven-plugin</artifactId>\r
+                <version>2.4.2</version>\r
+                <executions>\r
+                    <execution>\r
+                        <goals>\r
+                            <goal>compile</goal>\r
+                        </goals>\r
+                        <configuration>\r
+                            <outputDirectory>${basedir}/src/main/xtend-gen</outputDirectory>\r
+                        </configuration>\r
+                    </execution>\r
+                </executions>\r
+            </plugin>\r
+            <plugin>\r
+                <artifactId>maven-clean-plugin</artifactId>\r
+                <version>2.4.1</version>\r
+                <configuration>\r
+                    <filesets>\r
+                        <fileset>\r
+                            <directory>${basedir}/src/main/xtend-gen</directory>\r
+                            <includes>\r
+                                <include>**</include>\r
+                            </includes>\r
+                        </fileset>\r
+                    </filesets>\r
+                </configuration>\r
+            </plugin>\r
+        </plugins>\r
+    </build>\r
+\r
     <dependencies>\r
         <dependency>\r
             <groupId>org.opendaylight.yangtools</groupId>\r
         <dependency>\r
             <groupId>com.google.guava</groupId>\r
             <artifactId>guava</artifactId>\r
+        </dependency>\r
+                <dependency>\r
+            <groupId>org.eclipse.xtend</groupId>\r
+            <artifactId>org.eclipse.xtend.lib</artifactId>\r
+            <version>2.4.2</version>\r
         </dependency>\r
     </dependencies>\r
 \r
diff --git a/code-generator/binding-generator-impl/src/main/.gitignore b/code-generator/binding-generator-impl/src/main/.gitignore
new file mode 100644 (file)
index 0000000..04b73cb
--- /dev/null
@@ -0,0 +1 @@
+/xtend-gen
@@ -9,17 +9,14 @@ package org.opendaylight.yangtools.sal.binding.generator.impl;
 \r
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.*;\r
 import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.*;\r
-import static org.opendaylight.yangtools.binding.generator.util.Types.BOOLEAN;\r
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.*;\r
 \r
 import java.util.ArrayList;\r
 import java.util.Collections;\r
-import java.util.Comparator;\r
 import java.util.HashMap;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
-import java.util.concurrent.Future;\r
 \r
 import org.opendaylight.yangtools.binding.generator.util.BindingTypes;\r
 import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl;\r
@@ -29,22 +26,15 @@ import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.
 import org.opendaylight.yangtools.sal.binding.generator.api.BindingGenerator;\r
 import org.opendaylight.yangtools.sal.binding.generator.spi.TypeProvider;\r
 import org.opendaylight.yangtools.sal.binding.model.api.AccessModifier;\r
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;\r
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;\r
-import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType;\r
 import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.EnumBuilder;\r
-import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder;\r
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTOBuilder;\r
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilder;\r
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.MethodSignatureBuilder;\r
 import org.opendaylight.yangtools.sal.binding.yang.types.GroupingDefinitionDependencySort;\r
 import org.opendaylight.yangtools.sal.binding.yang.types.TypeProviderImpl;\r
-import org.opendaylight.yangtools.yang.binding.DataRoot;\r
-import org.opendaylight.yangtools.yang.binding.Identifiable;\r
-import org.opendaylight.yangtools.yang.binding.Identifier;\r
 import org.opendaylight.yangtools.yang.binding.RpcService;\r
-import org.opendaylight.yangtools.yang.common.QName;\r
 import org.opendaylight.yangtools.yang.common.RpcResult;\r
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;\r
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;\r
@@ -58,14 +48,12 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;\r
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;\r
 import org.opendaylight.yangtools.yang.model.api.Module;\r
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;\r
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;\r
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;\r
 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.TypeDefinition;\r
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;\r
-import org.opendaylight.yangtools.yang.model.api.UsesNode;\r
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;\r
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;\r
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;\r
@@ -73,10 +61,10 @@ import org.opendaylight.yangtools.yang.model.util.DataNodeIterator;
 import org.opendaylight.yangtools.yang.model.util.ExtendedType;\r
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;\r
 import org.opendaylight.yangtools.yang.model.util.UnionType;\r
+import static com.google.common.base.Preconditions.*;\r
+import static extension org.opendaylight.yangtools.binding.generator.util.Types.*;\r
 \r
-import com.google.common.base.Preconditions;\r
-\r
-public final class BindingGeneratorImpl implements BindingGenerator {\r
+public class BindingGeneratorImpl implements BindingGenerator {\r
 \r
     /**\r
      * Outter key represents the package name. Outter value represents map of\r
@@ -89,13 +77,13 @@ public final class BindingGeneratorImpl implements BindingGenerator {
     /**\r
      * Provide methods for converting YANG types to JAVA types.\r
      */\r
-    private TypeProvider typeProvider;\r
+    private var TypeProvider typeProvider;\r
 \r
     /**\r
      * Holds reference to schema context to resolve data of augmented elemnt\r
      * when creating augmentation builder\r
      */\r
-    private SchemaContext schemaContext;\r
+    private var SchemaContext schemaContext;\r
 \r
     /**\r
      * Each grouping which is converted from schema node to generated type is\r
@@ -105,25 +93,22 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * Schema node the object of type <code>Type</code> is required. So in this\r
      * case is used this map.\r
      */\r
-    private final Map<SchemaPath, GeneratedType> allGroupings = new HashMap<SchemaPath, GeneratedType>();\r
+    private val allGroupings = new HashMap<SchemaPath, GeneratedType>();\r
+    \r
+    \r
+    private val yangToJavaMapping = new HashMap<SchemaPath, Type>();\r
 \r
     /**\r
      * Constant with the concrete name of namespace.\r
      */\r
-    private final static String YANG_EXT_NAMESPACE = "urn:opendaylight:yang:extension:yang-ext";\r
+    private val static String YANG_EXT_NAMESPACE = "urn:opendaylight:yang:extension:yang-ext";\r
 \r
     /**\r
      * Constant with the concrete name of identifier.\r
      */\r
-    private final static String AUGMENT_IDENTIFIER_NAME = "augment-identifier";\r
-\r
-    /**\r
-     * Only parent constructor is invoked.\r
-     */\r
-    public BindingGeneratorImpl() {\r
-        super();\r
-    }\r
+    private val static String AUGMENT_IDENTIFIER_NAME = "augment-identifier";\r
 \r
+    \r
     /**\r
      * Resolves generated types from <code>context</code> schema nodes of all\r
      * modules.\r
@@ -142,31 +127,32 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @throws IllegalStateException\r
      *             if <code>context</code> contain no modules\r
      */\r
-    @Override\r
-    public List<Type> generateTypes(final SchemaContext context) {\r
-        Preconditions.checkArgument(context != null,"Schema Context reference cannot be NULL.");\r
-        Preconditions.checkState(context.getModules() != null,"Schema Context does not contain defined modules.");\r
-        final List<Type> generatedTypes = new ArrayList<>();\r
+    override generateTypes(SchemaContext context) {\r
+        checkArgument(context !== null,"Schema Context reference cannot be NULL.");\r
+        checkState(context.modules !== null,"Schema Context does not contain defined modules.");\r
+        val List<Type> generatedTypes = new ArrayList();\r
         schemaContext = context;\r
         typeProvider = new TypeProviderImpl(context);\r
-        final Set<Module> modules = context.getModules();\r
-        genTypeBuilders = new HashMap<>();\r
-        for (final Module module : modules) {\r
+        val Set<Module> modules = context.modules;\r
+        genTypeBuilders = new HashMap();\r
+        for (module : modules) {\r
 \r
             generatedTypes.addAll(allGroupingsToGenTypes(module));\r
 \r
-            if (false == module.getChildNodes().isEmpty()) {\r
+            if (false == module.childNodes.isEmpty()) {\r
                 generatedTypes.add(moduleToDataType(module));\r
             }\r
             generatedTypes.addAll(allTypeDefinitionsToGenTypes(module));\r
             generatedTypes.addAll(allContainersToGenTypes(module));\r
             generatedTypes.addAll(allListsToGenTypes(module));\r
             generatedTypes.addAll(allChoicesToGenTypes(module));\r
-            generatedTypes.addAll(allAugmentsToGenTypes(module));\r
             generatedTypes.addAll(allRPCMethodsToGenType(module));\r
             generatedTypes.addAll(allNotificationsToGenType(module));\r
             generatedTypes.addAll(allIdentitiesToGenTypes(module, context));\r
-\r
+        }\r
+        for (module : modules) {\r
+            generatedTypes.addAll(allAugmentsToGenTypes(module));\r
+            \r
         }\r
         return generatedTypes;\r
     }\r
@@ -199,37 +185,43 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @throws IllegalStateException\r
      *             if <code>context</code> contain no modules\r
      */\r
-    @Override\r
-    public List<Type> generateTypes(final SchemaContext context, final Set<Module> modules) {\r
-        Preconditions.checkArgument(context != null,"Schema Context reference cannot be NULL.");\r
-        Preconditions.checkState(context.getModules() != null,"Schema Context does not contain defined modules.");\r
-        Preconditions.checkArgument(modules != null,"Sef of Modules cannot be NULL.");\r
+    override generateTypes(SchemaContext context, Set<Module> modules) {\r
+        checkArgument(context !== null,"Schema Context reference cannot be NULL.");\r
+        checkState(context.modules !== null,"Schema Context does not contain defined modules.");\r
+        checkArgument(modules !== null,"Set of Modules cannot be NULL.");\r
 \r
-        final List<Type> filteredGenTypes = new ArrayList<>();\r
+        val List<Type> filteredGenTypes = new ArrayList();\r
         schemaContext = context;\r
         typeProvider = new TypeProviderImpl(context);\r
-        final Set<Module> contextModules = context.getModules();\r
-        genTypeBuilders = new HashMap<>();\r
-        for (final Module contextModule : contextModules) {\r
-            final List<Type> generatedTypes = new ArrayList<>();\r
+        val Set<Module> contextModules = context.modules;\r
+        genTypeBuilders = new HashMap();\r
+        \r
+        for (contextModule : contextModules) {\r
+            val List<Type> generatedTypes = new ArrayList();\r
 \r
             generatedTypes.addAll(allGroupingsToGenTypes(contextModule));\r
-            if (false == contextModule.getChildNodes().isEmpty()) {\r
+            if (false == contextModule.childNodes.isEmpty()) {\r
                 generatedTypes.add(moduleToDataType(contextModule));\r
             }\r
             generatedTypes.addAll(allTypeDefinitionsToGenTypes(contextModule));\r
             generatedTypes.addAll(allContainersToGenTypes(contextModule));\r
             generatedTypes.addAll(allListsToGenTypes(contextModule));\r
             generatedTypes.addAll(allChoicesToGenTypes(contextModule));\r
-            generatedTypes.addAll(allAugmentsToGenTypes(contextModule));\r
             generatedTypes.addAll(allRPCMethodsToGenType(contextModule));\r
             generatedTypes.addAll(allNotificationsToGenType(contextModule));\r
             generatedTypes.addAll(allIdentitiesToGenTypes(contextModule, context));\r
-\r
+            \r
             if (modules.contains(contextModule)) {\r
                 filteredGenTypes.addAll(generatedTypes);\r
             }\r
         }\r
+        for (contextModule : contextModules) {\r
+            val generatedTypes = (allAugmentsToGenTypes(contextModule));\r
+            if (modules.contains(contextModule)) {\r
+                filteredGenTypes.addAll(generatedTypes);\r
+            }\r
+            \r
+        }\r
         return filteredGenTypes;\r
     }\r
 \r
@@ -249,17 +241,18 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<Type> allTypeDefinitionsToGenTypes(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
-        Preconditions.checkArgument(module.getName() != null,"Module name cannot be NULL.");\r
-        Preconditions.checkArgument(module.getTypeDefinitions() != null,"Type Definitions for module " + module.getName() + " cannot be NULL.");\r
-\r
-        final Set<TypeDefinition<?>> typeDefinitions = module.getTypeDefinitions();\r
-        final List<Type> generatedTypes = new ArrayList<>();\r
-        for (final TypeDefinition<?> typedef : typeDefinitions) {\r
-            if (typedef != null) {\r
-                final Type type = ((TypeProviderImpl) typeProvider).generatedTypeForExtendedDefinitionType(typedef, typedef);\r
-                if ((type != null) && !generatedTypes.contains(type)) {\r
+    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
+        checkState(typeDefinitions !== null,'''Type Definitions for module Â«module.name» cannot be NULL.''');\r
+\r
+        \r
+        val List<Type> generatedTypes = new ArrayList();\r
+        for ( TypeDefinition<?> typedef : typeDefinitions) {\r
+            if (typedef !== null) {\r
+                val type = (typeProvider as TypeProviderImpl).generatedTypeForExtendedDefinitionType(typedef, typedef);\r
+                if ((type !== null) && !generatedTypes.contains(type)) {\r
                     generatedTypes.add(type);\r
                 }\r
             }\r
@@ -284,21 +277,21 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<Type> allContainersToGenTypes(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
+    private def List<Type> allContainersToGenTypes( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
 \r
-        Preconditions.checkArgument(module.getName() != null,"Module name cannot be NULL.");\r
+        checkArgument(module.name !== null,"Module name cannot be NULL.");\r
 \r
-        if (module.getChildNodes() == null) {\r
-            throw new IllegalArgumentException("Reference to Set of Child Nodes in module " + module.getName()\r
+        if (module.childNodes === null) {\r
+            throw new IllegalArgumentException("Reference to Set of Child Nodes in module " + module.name\r
                     + " cannot be NULL.");\r
         }\r
 \r
-        final List<Type> generatedTypes = new ArrayList<>();\r
-        final DataNodeIterator it = new DataNodeIterator(module);\r
-        final List<ContainerSchemaNode> schemaContainers = it.allContainers();\r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
-        for (final ContainerSchemaNode container : schemaContainers) {\r
+        val List<Type> generatedTypes = new ArrayList();\r
+        val it = new DataNodeIterator(module);\r
+        val List<ContainerSchemaNode> schemaContainers = it.allContainers();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
+        for (container : schemaContainers) {\r
             if (!container.isAddedByUses()) {\r
                 generatedTypes.add(containerToGenType(basePackageName, container));\r
             }\r
@@ -323,22 +316,21 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<Type> allListsToGenTypes(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
-\r
-        Preconditions.checkArgument(module.getName() != null,"Module name cannot be NULL.");\r
+    private def List<Type> allListsToGenTypes( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
+        checkArgument(module.name !== null,"Module name cannot be NULL.");\r
 \r
-        if (module.getChildNodes() == null) {\r
-            throw new IllegalArgumentException("Reference to Set of Child Nodes in module " + module.getName()\r
+        if (module.childNodes === null) {\r
+            throw new IllegalArgumentException("Reference to Set of Child Nodes in module " + module.name\r
                     + " cannot be NULL.");\r
         }\r
 \r
-        final List<Type> generatedTypes = new ArrayList<>();\r
-        final DataNodeIterator it = new DataNodeIterator(module);\r
-        final List<ListSchemaNode> schemaLists = it.allLists();\r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
-        if (schemaLists != null) {\r
-            for (final ListSchemaNode list : schemaLists) {\r
+        val List<Type> generatedTypes = new ArrayList();\r
+        val it = new DataNodeIterator(module);\r
+        val List<ListSchemaNode> schemaLists = it.allLists();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
+        if (schemaLists !== null) {\r
+            for (list : schemaLists) {\r
                 if (!list.isAddedByUses()) {\r
                     generatedTypes.addAll(listToGenType(basePackageName, list));\r
                 }\r
@@ -363,17 +355,17 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<GeneratedType> allChoicesToGenTypes(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
-        Preconditions.checkArgument(module.getName() != null,"Module name cannot be NULL.");\r
+    private def List<GeneratedType> allChoicesToGenTypes( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
+        checkArgument(module.name !== null,"Module name cannot be NULL.");\r
 \r
-        final DataNodeIterator it = new DataNodeIterator(module);\r
-        final List<ChoiceNode> choiceNodes = it.allChoices();\r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
+        val it = new DataNodeIterator(module);\r
+        val choiceNodes = it.allChoices();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
 \r
-        final List<GeneratedType> generatedTypes = new ArrayList<>();\r
-        for (final ChoiceNode choice : choiceNodes) {\r
-            if ((choice != null) && !choice.isAddedByUses()) {\r
+        val List<GeneratedType> generatedTypes = new ArrayList();\r
+        for (choice : choiceNodes) {\r
+            if ((choice !== null) && !choice.isAddedByUses()) {\r
                 generatedTypes.addAll(choiceToGeneratedType(basePackageName, choice));\r
             }\r
         }\r
@@ -397,18 +389,18 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<Type> allAugmentsToGenTypes(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
-        Preconditions.checkArgument(module.getName() != null,"Module name cannot be NULL.");\r
-        if (module.getChildNodes() == null) {\r
+    private def List<Type> allAugmentsToGenTypes( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
+        checkArgument(module.name !== null,"Module name cannot be NULL.");\r
+        if (module.childNodes === null) {\r
             throw new IllegalArgumentException("Reference to Set of Augmentation Definitions in module "\r
-                    + module.getName() + " cannot be NULL.");\r
+                    + module.name + " cannot be NULL.");\r
         }\r
 \r
-        final List<Type> generatedTypes = new ArrayList<>();\r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
-        final List<AugmentationSchema> augmentations = resolveAugmentations(module);\r
-        for (final AugmentationSchema augment : augmentations) {\r
+        val List<Type> generatedTypes = new ArrayList();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
+        val List<AugmentationSchema> augmentations = resolveAugmentations(module);\r
+        for (augment : augmentations) {\r
             generatedTypes.addAll(augmentationToGenTypes(basePackageName, augment));\r
         }\r
         return generatedTypes;\r
@@ -430,33 +422,27 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<AugmentationSchema> resolveAugmentations(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
-        Preconditions.checkState(module.getAugmentations() != null,"Augmentations Set cannot be NULL.");\r
-\r
-        final Set<AugmentationSchema> augmentations = module.getAugmentations();\r
-        final List<AugmentationSchema> sortedAugmentations = new ArrayList<>(augmentations);\r
-        Collections.sort(sortedAugmentations, new Comparator<AugmentationSchema>() {\r
+    private def List<AugmentationSchema> resolveAugmentations( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
+        checkState(module.augmentations !== null,"Augmentations Set cannot be NULL.");\r
 \r
-            @Override\r
-            public int compare(AugmentationSchema augSchema1, AugmentationSchema augSchema2) {\r
+        val Set<AugmentationSchema> augmentations = module.augmentations;\r
+        val List<AugmentationSchema> sortedAugmentations = new ArrayList(augmentations);\r
+        Collections.sort(sortedAugmentations, [augSchema1, augSchema2 |\r
 \r
-                if (augSchema1.getTargetPath().getPath().size() > augSchema2.getTargetPath().getPath().size()) {\r
+                if (augSchema1.targetPath.path.size() > augSchema2.targetPath.path.size()) {\r
                     return 1;\r
-                } else if (augSchema1.getTargetPath().getPath().size() < augSchema2.getTargetPath().getPath().size()) {\r
+                } else if (augSchema1.targetPath.path.size() < augSchema2.targetPath.path.size()) {\r
                     return -1;\r
                 }\r
                 return 0;\r
-\r
-            }\r
-        });\r
-\r
+           ]);\r
         return sortedAugmentations;\r
     }\r
 \r
     /**\r
      * Converts whole <b>module</b> to <code>GeneratedType</code> object.\r
-     * Firstly is created the module builder object from which is finally\r
+     * Firstly is created the module builder object from which is vally\r
      * obtained reference to <code>GeneratedType</code> object.\r
      *\r
      * @param module\r
@@ -468,16 +454,16 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             if the module equals null\r
      *\r
      */\r
-    private GeneratedType moduleToDataType(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
+    private def GeneratedType moduleToDataType( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
 \r
-        final GeneratedTypeBuilder moduleDataTypeBuilder = moduleTypeBuilder(module, "Data");\r
+        val moduleDataTypeBuilder = moduleTypeBuilder(module, "Data");\r
         addImplementedInterfaceFromUses(module, moduleDataTypeBuilder);\r
-        moduleDataTypeBuilder.addImplementsType(Types.typeForClass(DataRoot.class));\r
+        moduleDataTypeBuilder.addImplementsType(DATA_ROOT);\r
 \r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
-        if (moduleDataTypeBuilder != null) {\r
-            final Set<DataSchemaNode> dataNodes = module.getChildNodes();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
+        if (moduleDataTypeBuilder !== null) {\r
+            val Set<DataSchemaNode> dataNodes = module.childNodes;\r
             resolveDataSchemaNodes(basePackageName, moduleDataTypeBuilder, dataNodes);\r
         }\r
         return moduleDataTypeBuilder.toInstance();\r
@@ -501,79 +487,78 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<Type> allRPCMethodsToGenType(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
+    private def List<Type> allRPCMethodsToGenType( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
 \r
-        Preconditions.checkArgument(module.getName() != null,"Module name cannot be NULL.");\r
+        checkArgument(module.name !== null,"Module name cannot be NULL.");\r
 \r
-        if (module.getChildNodes() == null) {\r
+        if (module.childNodes === null) {\r
             throw new IllegalArgumentException("Reference to Set of RPC Method Definitions in module "\r
-                    + module.getName() + " cannot be NULL.");\r
+                    + module.name + " cannot be NULL.");\r
         }\r
 \r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
-        final Set<RpcDefinition> rpcDefinitions = module.getRpcs();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
+        val Set<RpcDefinition> rpcDefinitions = module.rpcs;\r
 \r
         if (rpcDefinitions.isEmpty()) {\r
             return Collections.emptyList();\r
         }\r
 \r
-        final List<Type> genRPCTypes = new ArrayList<>();\r
-        final GeneratedTypeBuilder interfaceBuilder = moduleTypeBuilder(module, "Service");\r
-        interfaceBuilder.addImplementsType(Types.typeForClass(RpcService.class));\r
-        final Type future = Types.typeForClass(Future.class);\r
-        for (final RpcDefinition rpc : rpcDefinitions) {\r
-            if (rpc != null) {\r
+        val List<Type> genRPCTypes = new ArrayList();\r
+        val interfaceBuilder = moduleTypeBuilder(module, "Service");\r
+        interfaceBuilder.addImplementsType(Types.typeForClass(RpcService));\r
+        for (rpc : rpcDefinitions) {\r
+            if (rpc !== null) {\r
 \r
-                String rpcName = parseToClassName(rpc.getQName().getLocalName());\r
-                String rpcMethodName = parseToValidParamName(rpcName);\r
-                MethodSignatureBuilder method = interfaceBuilder.addMethod(rpcMethodName);\r
+                val rpcName = parseToClassName(rpc.QName.localName);\r
+                val rpcMethodName = parseToValidParamName(rpcName);\r
+                val method = interfaceBuilder.addMethod(rpcMethodName);\r
 \r
-                final List<DataNodeIterator> rpcInOut = new ArrayList<>();\r
+                val rpcInOut = new ArrayList();\r
 \r
-                ContainerSchemaNode input = rpc.getInput();\r
-                ContainerSchemaNode output = rpc.getOutput();\r
+                val input = rpc.input;\r
+                val output = rpc.output;\r
 \r
-                if (input != null) {\r
+                if (input !== null) {\r
                     rpcInOut.add(new DataNodeIterator(input));\r
-                    GeneratedTypeBuilder inType = addRawInterfaceDefinition(basePackageName, input, rpcName);\r
+                    val inType = addRawInterfaceDefinition(basePackageName, input, rpcName);\r
                     addImplementedInterfaceFromUses(input, inType);\r
                     inType.addImplementsType(DATA_OBJECT);\r
                     inType.addImplementsType(augmentable(inType));\r
-                    resolveDataSchemaNodes(basePackageName, inType, input.getChildNodes());\r
-                    Type inTypeInstance = inType.toInstance();\r
+                    resolveDataSchemaNodes(basePackageName, inType, input.childNodes);\r
+                    val inTypeInstance = inType.toInstance();\r
                     genRPCTypes.add(inTypeInstance);\r
                     method.addParameter(inTypeInstance, "input");\r
                 }\r
 \r
-                Type outTypeInstance = Types.typeForClass(Void.class);\r
-                if (output != null) {\r
+                var Type outTypeInstance = VOID;\r
+                if (output !== null) {\r
                     rpcInOut.add(new DataNodeIterator(output));\r
-                    GeneratedTypeBuilder outType = addRawInterfaceDefinition(basePackageName, output, rpcName);\r
+                    val outType = addRawInterfaceDefinition(basePackageName, output, rpcName);\r
                     addImplementedInterfaceFromUses(output, outType);\r
                     outType.addImplementsType(DATA_OBJECT);\r
                     outType.addImplementsType(augmentable(outType));\r
 \r
-                    resolveDataSchemaNodes(basePackageName, outType, output.getChildNodes());\r
+                    resolveDataSchemaNodes(basePackageName, outType, output.childNodes);\r
                     outTypeInstance = outType.toInstance();\r
                     genRPCTypes.add(outTypeInstance);\r
 \r
                 }\r
 \r
-                final Type rpcRes = Types.parameterizedTypeFor(Types.typeForClass(RpcResult.class), outTypeInstance);\r
-                method.setReturnType(Types.parameterizedTypeFor(future, rpcRes));\r
-                for (DataNodeIterator it : rpcInOut) {\r
-                    List<ContainerSchemaNode> nContainers = it.allContainers();\r
-                    if ((nContainers != null) && !nContainers.isEmpty()) {\r
-                        for (final ContainerSchemaNode container : nContainers) {\r
+                val rpcRes = Types.parameterizedTypeFor(Types.typeForClass(RpcResult), outTypeInstance);\r
+                method.setReturnType(Types.parameterizedTypeFor(FUTURE, rpcRes));\r
+                for (iter : rpcInOut) {\r
+                    val List<ContainerSchemaNode> nContainers = iter.allContainers();\r
+                    if ((nContainers !== null) && !nContainers.isEmpty()) {\r
+                        for (container : nContainers) {\r
                             if (!container.isAddedByUses()) {\r
                                 genRPCTypes.add(containerToGenType(basePackageName, container));\r
                             }\r
                         }\r
                     }\r
-                    List<ListSchemaNode> nLists = it.allLists();\r
-                    if ((nLists != null) && !nLists.isEmpty()) {\r
-                        for (final ListSchemaNode list : nLists) {\r
+                    val List<ListSchemaNode> nLists = iter.allLists();\r
+                    if ((nLists !== null) && !nLists.isEmpty()) {\r
+                        for (list : nLists) {\r
                             if (!list.isAddedByUses()) {\r
                                 genRPCTypes.addAll(listToGenType(basePackageName, list));\r
                             }\r
@@ -604,51 +589,50 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<Type> allNotificationsToGenType(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
+    private def List<Type> allNotificationsToGenType( Module module) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
 \r
-        Preconditions.checkArgument(module.getName() != null,"Module name cannot be NULL.");\r
+        checkArgument(module.name !== null,"Module name cannot be NULL.");\r
 \r
-        if (module.getChildNodes() == null) {\r
+        if (module.childNodes === null) {\r
             throw new IllegalArgumentException("Reference to Set of Notification Definitions in module "\r
-                    + module.getName() + " cannot be NULL.");\r
+                    + module.name + " cannot be NULL.");\r
         }\r
-        final Set<NotificationDefinition> notifications = module.getNotifications();\r
+        val notifications = module.notifications;\r
         if(notifications.isEmpty()) return Collections.emptyList();\r
         \r
-        final GeneratedTypeBuilder listenerInterface = moduleTypeBuilder(module, "Listener");\r
+        val listenerInterface = moduleTypeBuilder(module, "Listener");\r
         listenerInterface.addImplementsType(BindingTypes.NOTIFICATION_LISTENER);\r
         \r
         \r
         \r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
-        final List<Type> generatedTypes = new ArrayList<>();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
+        val List<Type> generatedTypes = new ArrayList();\r
         \r
         \r
-        for (final NotificationDefinition notification : notifications) {\r
-            if (notification != null) {\r
-                DataNodeIterator it = new DataNodeIterator(notification);\r
+        for ( notification : notifications) {\r
+            if (notification !== null) {\r
+                val iter = new DataNodeIterator(notification);\r
 \r
                 // Containers\r
-                for (ContainerSchemaNode node : it.allContainers()) {\r
+                for (node : iter.allContainers()) {\r
                     if (!node.isAddedByUses()) {\r
                         generatedTypes.add(containerToGenType(basePackageName, node));\r
                     }\r
                 }\r
                 // Lists\r
-                for (ListSchemaNode node : it.allLists()) {\r
+                for (node : iter.allLists()) {\r
                     if (!node.isAddedByUses()) {\r
                         generatedTypes.addAll(listToGenType(basePackageName, node));\r
                     }\r
                 }\r
-                final GeneratedTypeBuilder notificationInterface = addDefaultInterfaceDefinition(basePackageName,\r
+                val notificationInterface = addDefaultInterfaceDefinition(basePackageName,\r
                         notification);\r
-                notificationInterface.addImplementsType(Types\r
-                        .typeForClass(org.opendaylight.yangtools.yang.binding.Notification.class));\r
+                notificationInterface.addImplementsType(NOTIFICATION);\r
                 // Notification object\r
-                resolveDataSchemaNodes(basePackageName, notificationInterface, notification.getChildNodes());\r
+                resolveDataSchemaNodes(basePackageName, notificationInterface, notification.childNodes);\r
                 \r
-                listenerInterface.addMethod("on"+notificationInterface.getName()) //\r
+                listenerInterface.addMethod("on"+notificationInterface.name) //\r
                     .setAccessModifier(AccessModifier.PUBLIC)\r
                     .addParameter(notificationInterface, "notification")\r
                     .setReturnType(Types.VOID);\r
@@ -674,15 +658,15 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         (object of type <code>IdentitySchemaNode</code>\r
      *\r
      */\r
-    private List<Type> allIdentitiesToGenTypes(final Module module, final SchemaContext context) {\r
-        List<Type> genTypes = new ArrayList<>();\r
+    private def List<Type> allIdentitiesToGenTypes( Module module, SchemaContext context) {\r
+        val List<Type> genTypes = new ArrayList();\r
 \r
-        final Set<IdentitySchemaNode> schemaIdentities = module.getIdentities();\r
+        val Set<IdentitySchemaNode> schemaIdentities = module.identities;\r
 \r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
 \r
-        if (schemaIdentities != null && !schemaIdentities.isEmpty()) {\r
-            for (final IdentitySchemaNode identity : schemaIdentities) {\r
+        if (schemaIdentities !== null && !schemaIdentities.isEmpty()) {\r
+            for (identity : schemaIdentities) {\r
                 genTypes.add(identityToGenType(basePackageName, identity, context));\r
             }\r
         }\r
@@ -709,27 +693,27 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <code>IdentitySchemaNode</code>\r
      *\r
      */\r
-    private GeneratedType identityToGenType(final String basePackageName, final IdentitySchemaNode identity,\r
-            final SchemaContext context) {\r
-        if (identity == null) {\r
+    private def GeneratedType identityToGenType(String basePackageName, IdentitySchemaNode identity,\r
+            SchemaContext context) {\r
+        if (identity === null) {\r
             return null;\r
         }\r
 \r
-        final String packageName = packageNameForGeneratedType(basePackageName, identity.getPath());\r
-        final String genTypeName = parseToClassName(identity.getQName().getLocalName());\r
-        final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(packageName, genTypeName);\r
+        val packageName = packageNameForGeneratedType(basePackageName, identity.path);\r
+        val genTypeName = parseToClassName(identity.QName.localName);\r
+        val newType = new GeneratedTOBuilderImpl(packageName, genTypeName);\r
 \r
-        IdentitySchemaNode baseIdentity = identity.getBaseIdentity();\r
-        if (baseIdentity != null) {\r
-            Module baseIdentityParentModule = SchemaContextUtil.findParentModule(context, baseIdentity);\r
+        val baseIdentity = identity.baseIdentity;\r
+        if (baseIdentity !== null) {\r
+            val baseIdentityParentModule = SchemaContextUtil.findParentModule(context, baseIdentity);\r
 \r
-            final String returnTypePkgName = moduleNamespaceToPackageName(baseIdentityParentModule);\r
-            final String returnTypeName = parseToClassName(baseIdentity.getQName().getLocalName());\r
+            val returnTypePkgName = moduleNamespaceToPackageName(baseIdentityParentModule);\r
+            val returnTypeName = parseToClassName(baseIdentity.QName.localName);\r
 \r
-            GeneratedTransferObject gto = new GeneratedTOBuilderImpl(returnTypePkgName, returnTypeName).toInstance();\r
+            val gto = new GeneratedTOBuilderImpl(returnTypePkgName, returnTypeName).toInstance();\r
             newType.setExtendsType(gto);\r
         } else {\r
-            newType.setExtendsType(Types.getBaseIdentityTO());\r
+            newType.setExtendsType(Types.baseIdentityTO);\r
         }\r
         newType.setAbstract(true);\r
         return newType.toInstance();\r
@@ -749,19 +733,17 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         (object of type <code>GroupingDefinition</code>)\r
      *\r
      */\r
-    private List<Type> allGroupingsToGenTypes(final Module module) {\r
-        Preconditions.checkArgument(module != null,"Module parameter can not be null");\r
-        final List<Type> genTypes = new ArrayList<>();\r
-        final String basePackageName = moduleNamespaceToPackageName(module);\r
-        final Set<GroupingDefinition> groupings = module.getGroupings();\r
-        List<GroupingDefinition> groupingsSortedByDependencies;\r
-\r
-        groupingsSortedByDependencies = GroupingDefinitionDependencySort.sort(groupings);\r
-\r
-        for (final GroupingDefinition grouping : groupingsSortedByDependencies) {\r
-            GeneratedType genType = groupingToGenType(basePackageName, grouping);\r
+    private def List<Type> allGroupingsToGenTypes( Module module) {\r
+        checkArgument(module !== null,"Module parameter can not be null");\r
+        val List<Type> genTypes = new ArrayList();\r
+        val basePackageName = moduleNamespaceToPackageName(module);\r
+        val Set<GroupingDefinition> groupings = module.groupings;\r
+        val List<GroupingDefinition> groupingsSortedByDependencies = GroupingDefinitionDependencySort.sort(groupings);\r
+\r
+        for (grouping : groupingsSortedByDependencies) {\r
+            val genType = groupingToGenType(basePackageName, grouping);\r
             genTypes.add(genType);\r
-            SchemaPath schemaPath = grouping.getPath();\r
+            val schemaPath = grouping.path;\r
             allGroupings.put(schemaPath, genType);\r
         }\r
         return genTypes;\r
@@ -779,14 +761,14 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @return GeneratedType which is generated from grouping (object of type\r
      *         <code>GroupingDefinition</code>)\r
      */\r
-    private GeneratedType groupingToGenType(final String basePackageName, GroupingDefinition grouping) {\r
-        if (grouping == null) {\r
+    private def GeneratedType groupingToGenType( String basePackageName, GroupingDefinition grouping) {\r
+        if (grouping === null) {\r
             return null;\r
         }\r
 \r
-        final String packageName = packageNameForGeneratedType(basePackageName, grouping.getPath());\r
-        final Set<DataSchemaNode> schemaNodes = grouping.getChildNodes();\r
-        final GeneratedTypeBuilder typeBuilder = addDefaultInterfaceDefinition(packageName, grouping);\r
+        val packageName = packageNameForGeneratedType(basePackageName, grouping.path);\r
+        val Set<DataSchemaNode> schemaNodes = grouping.childNodes;\r
+        val typeBuilder = addDefaultInterfaceDefinition(packageName, grouping);\r
 \r
         resolveDataSchemaNodes(basePackageName, typeBuilder, schemaNodes);\r
         return typeBuilder.toInstance();\r
@@ -803,12 +785,12 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @return EnumTypeDefinition if it is found inside\r
      *         <code>typeDefinition</code> or <code>null</code> in other case\r
      */\r
-    private EnumTypeDefinition enumTypeDefFromExtendedType(final TypeDefinition<?> typeDefinition) {\r
-        if (typeDefinition != null) {\r
-            if (typeDefinition.getBaseType() instanceof EnumTypeDefinition) {\r
-                return (EnumTypeDefinition) typeDefinition.getBaseType();\r
-            } else if (typeDefinition.getBaseType() instanceof ExtendedType) {\r
-                return enumTypeDefFromExtendedType(typeDefinition.getBaseType());\r
+    private def EnumTypeDefinition enumTypeDefFromExtendedType( TypeDefinition<?> typeDefinition) {\r
+        if (typeDefinition !== null) {\r
+            if (typeDefinition.baseType instanceof EnumTypeDefinition) {\r
+                return typeDefinition.baseType as EnumTypeDefinition;\r
+            } else if (typeDefinition.baseType instanceof ExtendedType) {\r
+                return enumTypeDefFromExtendedType(typeDefinition.baseType);\r
             }\r
         }\r
         return null;\r
@@ -831,13 +813,13 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @return enumeration builder which contais data from\r
      *         <code>enumTypeDef</code>\r
      */\r
-    private EnumBuilder resolveInnerEnumFromTypeDefinition(final EnumTypeDefinition enumTypeDef, final String enumName,\r
-            final GeneratedTypeBuilder typeBuilder) {\r
-        if ((enumTypeDef != null) && (typeBuilder != null) && (enumTypeDef.getQName() != null)\r
-                && (enumTypeDef.getQName().getLocalName() != null)) {\r
+    private def EnumBuilder resolveInnerEnumFromTypeDefinition( EnumTypeDefinition enumTypeDef, String enumName,\r
+            GeneratedTypeBuilder typeBuilder) {\r
+        if ((enumTypeDef !== null) && (typeBuilder !== null) && (enumTypeDef.QName !== null)\r
+                && (enumTypeDef.QName.localName !== null)) {\r
 \r
-            final String enumerationName = parseToClassName(enumName);\r
-            final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumerationName);\r
+            val enumerationName = parseToClassName(enumName);\r
+            val enumBuilder = typeBuilder.addEnumeration(enumerationName);\r
             enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);\r
 \r
             return enumBuilder;\r
@@ -859,10 +841,10 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @throws IllegalArgumentException\r
      *             if <code>module</code> equals null\r
      */\r
-    private GeneratedTypeBuilder moduleTypeBuilder(final Module module, final String postfix) {\r
-        Preconditions.checkArgument(module != null,"Module reference cannot be NULL.");\r
-        String packageName = moduleNamespaceToPackageName(module);\r
-        final String moduleName = parseToClassName(module.getName()) + postfix;\r
+    private def GeneratedTypeBuilder moduleTypeBuilder( Module module, String postfix) {\r
+        checkArgument(module !== null,"Module reference cannot be NULL.");\r
+        val packageName = moduleNamespaceToPackageName(module);\r
+        val moduleName = parseToClassName(module.name) + postfix;\r
 \r
         return new GeneratedTypeBuilderImpl(packageName, moduleName);\r
 \r
@@ -890,35 +872,37 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             <li>if target path of <code>augSchema</code> equals null</li>\r
      *             </ul>\r
      */\r
-    private List<Type> augmentationToGenTypes(final String augmentPackageName, final AugmentationSchema augSchema) {\r
-        Preconditions.checkArgument(augmentPackageName != null,"Package Name cannot be NULL.");\r
-        Preconditions.checkArgument(augSchema != null,"Augmentation Schema cannot be NULL.");\r
-        Preconditions.checkState(augSchema.getTargetPath() != null,"Augmentation Schema does not contain Target Path (Target Path is NULL).");\r
+    private def List<Type> augmentationToGenTypes( String augmentPackageName, AugmentationSchema augSchema) {\r
+        checkArgument(augmentPackageName !== null,"Package Name cannot be NULL.");\r
+        checkArgument(augSchema !== null,"Augmentation Schema cannot be NULL.");\r
+        checkState(augSchema.targetPath !== null,"Augmentation Schema does not contain Target Path (Target Path is NULL).");\r
 \r
-        final List<Type> genTypes = new ArrayList<>();\r
+        val List<Type> genTypes = new ArrayList();\r
 \r
         // EVERY augmented interface will extends Augmentation<T> interface\r
         // and DataObject interface!!!\r
-        final SchemaPath targetPath = augSchema.getTargetPath();\r
-        final DataSchemaNode targetSchemaNode = findDataSchemaNode(schemaContext, targetPath);\r
-        if ((targetSchemaNode != null) && (targetSchemaNode.getQName() != null)\r
-                && (targetSchemaNode.getQName().getLocalName() != null)) {\r
-            final Module targetModule = findParentModule(schemaContext, targetSchemaNode);\r
-            final String targetBasePackage = moduleNamespaceToPackageName(targetModule);\r
-            final String targetPackageName = packageNameForGeneratedType(targetBasePackage, targetSchemaNode.getPath());\r
-            final String targetSchemaNodeName = targetSchemaNode.getQName().getLocalName();\r
-            final Set<DataSchemaNode> augChildNodes = augSchema.getChildNodes();\r
+        val targetPath = augSchema.targetPath;\r
+        val targetSchemaNode = findDataSchemaNode(schemaContext, targetPath);\r
+        val targetType = yangToJavaMapping.get(targetSchemaNode.path);\r
+        if ((targetSchemaNode !== null) && (targetSchemaNode.QName !== null)\r
+                && (targetSchemaNode.QName.localName !== null)) {\r
+            \r
+            val targetPackageName = targetType.packageName;\r
+            val targetSchemaNodeName = targetType.name;\r
+            \r
+            \r
+            val augChildNodes = augSchema.childNodes;\r
 \r
             if (!(targetSchemaNode instanceof ChoiceNode)) {\r
-                final GeneratedTypeBuilder augTypeBuilder = addRawAugmentGenTypeDefinition(augmentPackageName,\r
-                        targetPackageName, targetSchemaNodeName, augSchema);\r
-                final GeneratedType augType = augTypeBuilder.toInstance();\r
+                val augTypeBuilder = addRawAugmentGenTypeDefinition(augmentPackageName,\r
+                        targetType, augSchema);\r
+                val augType = augTypeBuilder.toInstance();\r
                 genTypes.add(augType);\r
             } else {\r
-                final Type refChoiceType = new ReferencedTypeImpl(targetPackageName,\r
+                val refChoiceType = new ReferencedTypeImpl(targetPackageName,\r
                         parseToClassName(targetSchemaNodeName));\r
-                final ChoiceNode choiceTarget = (ChoiceNode) targetSchemaNode;\r
-                final Set<ChoiceCaseNode> choiceCaseNodes = choiceTarget.getCases();\r
+                val choiceTarget = targetSchemaNode as ChoiceNode;\r
+                val choiceCaseNodes = choiceTarget.cases;\r
                 genTypes.addAll(generateTypesFromAugmentedChoiceCases(augmentPackageName, refChoiceType,\r
                         choiceCaseNodes));\r
             }\r
@@ -946,22 +930,23 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            and uses of augment\r
      * @return generated type builder for augment\r
      */\r
-    private GeneratedTypeBuilder addRawAugmentGenTypeDefinition(final String augmentPackageName,\r
-            final String targetPackageName, final String targetSchemaNodeName, final AugmentationSchema augSchema) {\r
-        final String targetTypeName = parseToClassName(targetSchemaNodeName);\r
-        Map<String, GeneratedTypeBuilder> augmentBuilders = genTypeBuilders.get(augmentPackageName);\r
-        if (augmentBuilders == null) {\r
-            augmentBuilders = new HashMap<>();\r
+    private def GeneratedTypeBuilder addRawAugmentGenTypeDefinition( String augmentPackageName,\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
-        final String augIdentifier = getAugmentIdentifier(augSchema.getUnknownSchemaNodes());\r
+        val augIdentifier = getAugmentIdentifier(augSchema.unknownSchemaNodes);\r
 \r
-        final String augTypeName = augIdentifier != null ? parseToClassName(augIdentifier) : augGenTypeName(\r
-                augmentBuilders, targetTypeName);\r
-        final Type targetTypeRef = new ReferencedTypeImpl(targetPackageName, targetTypeName);\r
-        final Set<DataSchemaNode> augChildNodes = augSchema.getChildNodes();\r
+        val augTypeName = if (augIdentifier !== null ) { \r
+            parseToClassName(augIdentifier)\r
+        } else {\r
+            augGenTypeName(augmentBuilders, targetTypeRef.name);\r
+        }\r
+        val Set<DataSchemaNode> augChildNodes = augSchema.childNodes;\r
 \r
-        final GeneratedTypeBuilder augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augTypeName);\r
+        val augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augTypeName);\r
 \r
         augTypeBuilder.addImplementsType(DATA_OBJECT);\r
         augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef));\r
@@ -977,16 +962,15 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @param unknownSchemaNodes\r
      * @return\r
      */\r
-    private String getAugmentIdentifier(List<UnknownSchemaNode> unknownSchemaNodes) {\r
-        String ret = null;\r
-        for (UnknownSchemaNode unknownSchemaNode : unknownSchemaNodes) {\r
-            QName nodeType = unknownSchemaNode.getNodeType();\r
-            if (AUGMENT_IDENTIFIER_NAME.equals(nodeType.getLocalName())\r
-                    && YANG_EXT_NAMESPACE.equals(nodeType.getNamespace().toString())) {\r
-                return unknownSchemaNode.getNodeParameter();\r
+    private def String getAugmentIdentifier(List<UnknownSchemaNode> unknownSchemaNodes) {\r
+        for (unknownSchemaNode : unknownSchemaNodes) {\r
+            val nodeType = unknownSchemaNode.nodeType;\r
+            if (AUGMENT_IDENTIFIER_NAME.equals(nodeType.localName)\r
+                    && YANG_EXT_NAMESPACE.equals(nodeType.namespace.toString())) {\r
+                return unknownSchemaNode.nodeParameter;\r
             }\r
         }\r
-        return ret;\r
+        return null;\r
     }\r
 \r
     /**\r
@@ -1002,45 +986,45 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @return list of <code>Type</code> which represents container, list and\r
      *         choice subnodes of augment\r
      */\r
-    private List<Type> augmentationBodyToGenTypes(final String augBasePackageName,\r
-            final Set<DataSchemaNode> augChildNodes) {\r
-        final List<Type> genTypes = new ArrayList<>();\r
-        final List<DataNodeIterator> augSchemaIts = new ArrayList<>();\r
-        for (final DataSchemaNode childNode : augChildNodes) {\r
+    private def List<Type> augmentationBodyToGenTypes( String augBasePackageName,\r
+            Set<DataSchemaNode> augChildNodes) {\r
+        val List<Type> genTypes = new ArrayList();\r
+        val List<DataNodeIterator> augSchemaIts = new ArrayList();\r
+        for (childNode : augChildNodes) {\r
             if (childNode instanceof DataNodeContainer) {\r
-                augSchemaIts.add(new DataNodeIterator((DataNodeContainer) childNode));\r
+                augSchemaIts.add(new DataNodeIterator(childNode as DataNodeContainer));\r
 \r
                 if (childNode instanceof ContainerSchemaNode) {\r
-                    genTypes.add(containerToGenType(augBasePackageName, (ContainerSchemaNode) childNode));\r
+                    genTypes.add(containerToGenType(augBasePackageName, childNode as ContainerSchemaNode));\r
                 } else if (childNode instanceof ListSchemaNode) {\r
-                    genTypes.addAll(listToGenType(augBasePackageName, (ListSchemaNode) childNode));\r
+                    genTypes.addAll(listToGenType(augBasePackageName, childNode as ListSchemaNode));\r
                 }\r
             } else if (childNode instanceof ChoiceNode) {\r
-                final ChoiceNode choice = (ChoiceNode) childNode;\r
-                for (final ChoiceCaseNode caseNode : choice.getCases()) {\r
+                val choice = childNode as ChoiceNode;\r
+                for (caseNode : choice.cases) {\r
                     augSchemaIts.add(new DataNodeIterator(caseNode));\r
                 }\r
-                genTypes.addAll(choiceToGeneratedType(augBasePackageName, (ChoiceNode) childNode));\r
+                genTypes.addAll(choiceToGeneratedType(augBasePackageName, childNode as ChoiceNode));\r
             }\r
         }\r
 \r
-        for (final DataNodeIterator it : augSchemaIts) {\r
-            final List<ContainerSchemaNode> augContainers = it.allContainers();\r
-            final List<ListSchemaNode> augLists = it.allLists();\r
-            final List<ChoiceNode> augChoices = it.allChoices();\r
+        for (it : augSchemaIts) {\r
+            val List<ContainerSchemaNode> augContainers = it.allContainers();\r
+            val List<ListSchemaNode> augLists = it.allLists();\r
+            val List<ChoiceNode> augChoices = it.allChoices();\r
 \r
-            if (augContainers != null) {\r
-                for (final ContainerSchemaNode container : augContainers) {\r
+            if (augContainers !== null) {\r
+                for (container : augContainers) {\r
                     genTypes.add(containerToGenType(augBasePackageName, container));\r
                 }\r
             }\r
-            if (augLists != null) {\r
-                for (final ListSchemaNode list : augLists) {\r
+            if (augLists !== null) {\r
+                for (list : augLists) {\r
                     genTypes.addAll(listToGenType(augBasePackageName, list));\r
                 }\r
             }\r
-            if (augChoices != null) {\r
-                for (final ChoiceNode choice : augChoices) {\r
+            if (augChoices !== null) {\r
+                for (choice : augChoices) {\r
                     genTypes.addAll(choiceToGeneratedType(augBasePackageName, choice));\r
                 }\r
             }\r
@@ -1060,15 +1044,12 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            string with name of augmented node\r
      * @return string with unique name for augmentation builder\r
      */\r
-    private String augGenTypeName(final Map<String, GeneratedTypeBuilder> builders, final String genTypeName) {\r
-        String augTypeName = genTypeName;\r
-\r
-        int index = 1;\r
-        while ((builders != null) && builders.containsKey(genTypeName + index)) {\r
-            index++;\r
+    private def String augGenTypeName( Map<String, GeneratedTypeBuilder> builders, String genTypeName) {\r
+        var index = 1;\r
+        while ((builders !== null) && builders.containsKey(genTypeName + index)) {\r
+            index = index + 1;\r
         }\r
-        augTypeName += index;\r
-        return augTypeName;\r
+        return genTypeName + index;\r
     }\r
 \r
     /**\r
@@ -1084,14 +1065,14 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            schema paths\r
      * @return generated type for <code>containerNode</code>\r
      */\r
-    private GeneratedType containerToGenType(final String basePackageName, ContainerSchemaNode containerNode) {\r
-        if (containerNode == null) {\r
+    private def GeneratedType containerToGenType( String basePackageName, ContainerSchemaNode containerNode) {\r
+        if (containerNode === null) {\r
             return null;\r
         }\r
 \r
-        final String packageName = packageNameForGeneratedType(basePackageName, containerNode.getPath());\r
-        final Set<DataSchemaNode> schemaNodes = containerNode.getChildNodes();\r
-        final GeneratedTypeBuilder typeBuilder = addDefaultInterfaceDefinition(packageName, containerNode);\r
+        val packageName = packageNameForGeneratedType(basePackageName, containerNode.path);\r
+        val schemaNodes = containerNode.childNodes;\r
+        val typeBuilder = addDefaultInterfaceDefinition(packageName, containerNode);\r
 \r
         resolveDataSchemaNodes(basePackageName, typeBuilder, schemaNodes);\r
         return typeBuilder.toInstance();\r
@@ -1118,14 +1099,14 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         parameter. The getter methods (representing child nodes) could be\r
      *         added to it.\r
      */\r
-    private GeneratedTypeBuilder resolveDataSchemaNodes(final String basePackageName,\r
-            final GeneratedTypeBuilder typeBuilder, final Set<DataSchemaNode> schemaNodes) {\r
-        if ((schemaNodes != null) && (typeBuilder != null)) {\r
-            for (final DataSchemaNode schemaNode : schemaNodes) {\r
-                if (schemaNode.isAugmenting() || schemaNode.isAddedByUses()) {\r
-                    continue;\r
+    private def GeneratedTypeBuilder resolveDataSchemaNodes( String basePackageName,\r
+            GeneratedTypeBuilder typeBuilder, Set<DataSchemaNode> schemaNodes) {\r
+        if ((schemaNodes !== null) && (typeBuilder !== null)) {\r
+            for (schemaNode : schemaNodes) {\r
+                if (!schemaNode.isAugmenting() && !schemaNode.isAddedByUses()) {\r
+                    addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, typeBuilder);\r
                 }\r
-                addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, typeBuilder);\r
+                \r
             }\r
         }\r
         return typeBuilder;\r
@@ -1149,10 +1130,10 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         parameter <code>typeBuilder</code>. The getter method could be\r
      *         added to it.\r
      */\r
-    private GeneratedTypeBuilder augSchemaNodeToMethods(final String basePackageName,\r
-            final GeneratedTypeBuilder typeBuilder, final Set<DataSchemaNode> schemaNodes) {\r
-        if ((schemaNodes != null) && (typeBuilder != null)) {\r
-            for (final DataSchemaNode schemaNode : schemaNodes) {\r
+    private def GeneratedTypeBuilder augSchemaNodeToMethods( String basePackageName,\r
+             GeneratedTypeBuilder typeBuilder,  Set<DataSchemaNode> schemaNodes) {\r
+        if ((schemaNodes !== null) && (typeBuilder !== null)) {\r
+            for (schemaNode : schemaNodes) {\r
                 if (schemaNode.isAugmenting()) {\r
                     addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, typeBuilder);\r
                 }\r
@@ -1174,19 +1155,15 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            generated type builder to which is <code>schemaNode</code>\r
      *            added as a method.\r
      */\r
-    private void addSchemaNodeToBuilderAsMethod(final String basePackageName, final DataSchemaNode schemaNode,\r
-            final GeneratedTypeBuilder typeBuilder) {\r
-        if (schemaNode != null && typeBuilder != null) {\r
-            if (schemaNode instanceof LeafSchemaNode) {\r
-                resolveLeafSchemaNodeAsMethod(typeBuilder, (LeafSchemaNode) schemaNode);\r
-            } else if (schemaNode instanceof LeafListSchemaNode) {\r
-                resolveLeafListSchemaNode(typeBuilder, (LeafListSchemaNode) schemaNode);\r
-            } else if (schemaNode instanceof ContainerSchemaNode) {\r
-                resolveContainerSchemaNode(basePackageName, typeBuilder, (ContainerSchemaNode) schemaNode);\r
-            } else if (schemaNode instanceof ListSchemaNode) {\r
-                resolveListSchemaNode(basePackageName, typeBuilder, (ListSchemaNode) schemaNode);\r
-            } else if (schemaNode instanceof ChoiceNode) {\r
-                resolveChoiceSchemaNode(basePackageName, typeBuilder, (ChoiceNode) schemaNode);\r
+    private def void addSchemaNodeToBuilderAsMethod( String basePackageName,  DataSchemaNode node,\r
+             GeneratedTypeBuilder typeBuilder) {\r
+        if (node !== null && typeBuilder !== null) {\r
+            switch(node) {\r
+                case node instanceof LeafSchemaNode: resolveLeafSchemaNodeAsMethod(typeBuilder, node as LeafSchemaNode)\r
+                case node instanceof LeafListSchemaNode: resolveLeafListSchemaNode(typeBuilder, node as LeafListSchemaNode)\r
+                case node instanceof ContainerSchemaNode: resolveContainerSchemaNode(basePackageName, typeBuilder, node as ContainerSchemaNode)\r
+                case node instanceof ListSchemaNode: resolveListSchemaNode(basePackageName, typeBuilder, node as ListSchemaNode)\r
+                case node instanceof ChoiceNode: resolveChoiceSchemaNode(basePackageName, typeBuilder, node as ChoiceNode)\r
             }\r
         }\r
     }\r
@@ -1216,17 +1193,17 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private void resolveChoiceSchemaNode(final String basePackageName, final GeneratedTypeBuilder typeBuilder,\r
-            final ChoiceNode choiceNode) {\r
-        Preconditions.checkArgument(basePackageName != null,"Base Package Name cannot be NULL.");\r
-        Preconditions.checkArgument(typeBuilder != null,"Generated Type Builder cannot be NULL.");\r
-        Preconditions.checkArgument(choiceNode != null,"Choice Schema Node cannot be NULL.");\r
-\r
-        final String choiceName = choiceNode.getQName().getLocalName();\r
-        if (choiceName != null && !choiceNode.isAddedByUses()) {\r
-            final String packageName = packageNameForGeneratedType(basePackageName, choiceNode.getPath());\r
-            final GeneratedTypeBuilder choiceType = addDefaultInterfaceDefinition(packageName, choiceNode);\r
-            constructGetter(typeBuilder, choiceName, choiceNode.getDescription(), choiceType);\r
+    private def void resolveChoiceSchemaNode( String basePackageName,  GeneratedTypeBuilder typeBuilder,\r
+             ChoiceNode choiceNode) {\r
+        checkArgument(basePackageName !== null,"Base Package Name cannot be NULL.");\r
+        checkArgument(typeBuilder !== null,"Generated Type Builder cannot be NULL.");\r
+        checkArgument(choiceNode !== null,"Choice Schema Node cannot be NULL.");\r
+\r
+        val choiceName = choiceNode.QName.localName;\r
+        if (choiceName !== null && !choiceNode.isAddedByUses()) {\r
+            val packageName = packageNameForGeneratedType(basePackageName, choiceNode.path);\r
+            val choiceType = addDefaultInterfaceDefinition(packageName, choiceNode);\r
+            constructGetter(typeBuilder, choiceName, choiceNode.description, choiceType);\r
         }\r
     }\r
 \r
@@ -1253,19 +1230,19 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private List<GeneratedType> choiceToGeneratedType(final String basePackageName, final ChoiceNode choiceNode) {\r
-        Preconditions.checkArgument(basePackageName != null,"Base Package Name cannot be NULL.");\r
-        Preconditions.checkArgument(choiceNode != null,"Choice Schema Node cannot be NULL.");\r
+    private def List<GeneratedType> choiceToGeneratedType( String basePackageName,  ChoiceNode choiceNode) {\r
+        checkArgument(basePackageName !== null,"Base Package Name cannot be NULL.");\r
+        checkArgument(choiceNode !== null,"Choice Schema Node cannot be NULL.");\r
 \r
-        final List<GeneratedType> generatedTypes = new ArrayList<>();\r
-        final String packageName = packageNameForGeneratedType(basePackageName, choiceNode.getPath());\r
-        final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(packageName, choiceNode);\r
-        choiceTypeBuilder.addImplementsType(DATA_OBJECT);\r
-        final GeneratedType choiceType = choiceTypeBuilder.toInstance();\r
+        val List<GeneratedType> generatedTypes = new ArrayList();\r
+        val packageName = packageNameForGeneratedType(basePackageName, choiceNode.path);\r
+        val choiceTypeBuilder = addRawInterfaceDefinition(packageName, choiceNode);\r
+        //choiceTypeBuilder.addImplementsType(DATA_OBJECT);\r
+        val choiceType = choiceTypeBuilder.toInstance();\r
 \r
         generatedTypes.add(choiceType);\r
-        final Set<ChoiceCaseNode> caseNodes = choiceNode.getCases();\r
-        if ((caseNodes != null) && !caseNodes.isEmpty()) {\r
+        val Set<ChoiceCaseNode> caseNodes = choiceNode.cases;\r
+        if ((caseNodes !== null) && !caseNodes.isEmpty()) {\r
             generatedTypes.addAll(generateTypesFromChoiceCases(basePackageName, choiceType, caseNodes));\r
         }\r
         return generatedTypes;\r
@@ -1297,21 +1274,21 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *             *\r
      */\r
-    private List<GeneratedType> generateTypesFromChoiceCases(final String basePackageName, final Type refChoiceType,\r
-            final Set<ChoiceCaseNode> caseNodes) {\r
-        Preconditions.checkArgument(basePackageName != null,"Base Package Name cannot be NULL.");\r
-        Preconditions.checkArgument(refChoiceType != null,"Referenced Choice Type cannot be NULL.");\r
-        Preconditions.checkArgument(caseNodes != null,"Set of Choice Case Nodes cannot be NULL.");\r
-\r
-        final List<GeneratedType> generatedTypes = new ArrayList<>();\r
-        for (final ChoiceCaseNode caseNode : caseNodes) {\r
-            if (caseNode != null && !caseNode.isAddedByUses() && !caseNode.isAugmenting()) {\r
-                final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath());\r
-                final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode);\r
+    private def List<GeneratedType> generateTypesFromChoiceCases( String basePackageName,  Type refChoiceType,\r
+             Set<ChoiceCaseNode> caseNodes) {\r
+        checkArgument(basePackageName !== null,"Base Package Name cannot be NULL.");\r
+        checkArgument(refChoiceType !== null,"Referenced Choice Type cannot be NULL.");\r
+        checkArgument(caseNodes !== null,"Set of Choice Case Nodes cannot be NULL.");\r
+\r
+        val List<GeneratedType> generatedTypes = new ArrayList();\r
+        for (caseNode : caseNodes) {\r
+            if (caseNode !== null && !caseNode.isAddedByUses() && !caseNode.isAugmenting()) {\r
+                val packageName = packageNameForGeneratedType(basePackageName, caseNode.path);\r
+                val caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode);\r
                 caseTypeBuilder.addImplementsType(refChoiceType);\r
 \r
-                final Set<DataSchemaNode> childNodes = caseNode.getChildNodes();\r
-                if (childNodes != null) {\r
+                val Set<DataSchemaNode> childNodes = caseNode.childNodes;\r
+                if (childNodes !== null) {\r
                     resolveDataSchemaNodes(basePackageName, caseTypeBuilder, childNodes);\r
                 }\r
                 generatedTypes.add(caseTypeBuilder.toInstance());\r
@@ -1346,21 +1323,21 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             <li>if <code>caseNodes</code> equals null</li>\r
      *             </ul>\r
      */\r
-    private List<GeneratedType> generateTypesFromAugmentedChoiceCases(final String basePackageName,\r
-            final Type refChoiceType, final Set<ChoiceCaseNode> caseNodes) {\r
-        Preconditions.checkArgument(basePackageName != null,"Base Package Name cannot be NULL.");\r
-        Preconditions.checkArgument(refChoiceType != null,"Referenced Choice Type cannot be NULL.");\r
-        Preconditions.checkArgument(caseNodes != null,"Set of Choice Case Nodes cannot be NULL.");\r
-\r
-        final List<GeneratedType> generatedTypes = new ArrayList<>();\r
-        for (final ChoiceCaseNode caseNode : caseNodes) {\r
-            if (caseNode != null && caseNode.isAugmenting()) {\r
-                final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath());\r
-                final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode);\r
+    private def List<GeneratedType> generateTypesFromAugmentedChoiceCases( String basePackageName,\r
+             Type refChoiceType,  Set<ChoiceCaseNode> caseNodes) {\r
+        checkArgument(basePackageName !== null,"Base Package Name cannot be NULL.");\r
+        checkArgument(refChoiceType !== null,"Referenced Choice Type cannot be NULL.");\r
+        checkArgument(caseNodes !== null,"Set of Choice Case Nodes cannot be NULL.");\r
+\r
+        val List<GeneratedType> generatedTypes = new ArrayList();\r
+        for (caseNode : caseNodes) {\r
+            if (caseNode !== null && caseNode.isAugmenting()) {\r
+                val packageName = packageNameForGeneratedType(basePackageName, caseNode.path);\r
+                val caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode);\r
                 caseTypeBuilder.addImplementsType(refChoiceType);\r
 \r
-                final Set<DataSchemaNode> childNodes = caseNode.getChildNodes();\r
-                if (childNodes != null) {\r
+                val Set<DataSchemaNode> childNodes = caseNode.childNodes;\r
+                if (childNodes !== null) {\r
                     resolveDataSchemaNodes(basePackageName, caseTypeBuilder, childNodes);\r
                 }\r
                 generatedTypes.add(caseTypeBuilder.toInstance());\r
@@ -1387,43 +1364,43 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <li>true - in other cases</li>\r
      *         </ul>\r
      */\r
-    private boolean resolveLeafSchemaNodeAsMethod(final GeneratedTypeBuilder typeBuilder, final LeafSchemaNode leaf) {\r
-        if ((leaf != null) && (typeBuilder != null)) {\r
-            final String leafName = leaf.getQName().getLocalName();\r
-            String leafDesc = leaf.getDescription();\r
-            if (leafDesc == null) {\r
+    private def boolean resolveLeafSchemaNodeAsMethod( GeneratedTypeBuilder typeBuilder,  LeafSchemaNode leaf) {\r
+        if ((leaf !== null) && (typeBuilder !== null)) {\r
+            val leafName = leaf.QName.localName;\r
+            var String leafDesc = leaf.description;\r
+            if (leafDesc === null) {\r
                 leafDesc = "";\r
             }\r
 \r
-            final Module parentModule = findParentModule(schemaContext, leaf);\r
-            if (leafName != null && !leaf.isAddedByUses()) {\r
-                final TypeDefinition<?> typeDef = leaf.getType();\r
+            val parentModule = findParentModule(schemaContext, leaf);\r
+            if (leafName !== null && !leaf.isAddedByUses()) {\r
+                val TypeDefinition<?> typeDef = leaf.type;\r
 \r
-                Type returnType = null;\r
+                var Type returnType = null;\r
                 if (typeDef instanceof EnumTypeDefinition) {\r
                     returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf);\r
-                    final EnumTypeDefinition enumTypeDef = enumTypeDefFromExtendedType(typeDef);\r
-                    final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, leafName,\r
+                    val enumTypeDef = enumTypeDefFromExtendedType(typeDef);\r
+                    val enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, leafName,\r
                             typeBuilder);\r
 \r
-                    if (enumBuilder != null) {\r
-                        returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName());\r
+                    if (enumBuilder !== null) {\r
+                        returnType = new ReferencedTypeImpl(enumBuilder.packageName, enumBuilder.name);\r
                     }\r
-                    ((TypeProviderImpl) typeProvider).putReferencedType(leaf.getPath(), returnType);\r
+                    (typeProvider as TypeProviderImpl).putReferencedType(leaf.path, returnType);\r
                 } else if (typeDef instanceof UnionType) {\r
-                    GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leafName, leaf, parentModule);\r
-                    if (genTOBuilder != null) {\r
-                        returnType = new ReferencedTypeImpl(genTOBuilder.getPackageName(), genTOBuilder.getName());\r
+                    val genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leafName, leaf, parentModule);\r
+                    if (genTOBuilder !== null) {\r
+                        returnType = new ReferencedTypeImpl(genTOBuilder.packageName, genTOBuilder.name);\r
                     }\r
                 } else if (typeDef instanceof BitsTypeDefinition) {\r
-                    GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leafName, leaf, parentModule);\r
-                    if (genTOBuilder != null) {\r
-                        returnType = new ReferencedTypeImpl(genTOBuilder.getPackageName(), genTOBuilder.getName());\r
+                    val genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leafName, leaf, parentModule);\r
+                    if (genTOBuilder !== null) {\r
+                        returnType = new ReferencedTypeImpl(genTOBuilder.packageName, genTOBuilder.name);\r
                     }\r
                 } else {\r
                     returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf);\r
                 }\r
-                if (returnType != null) {\r
+                if (returnType !== null) {\r
                     constructGetter(typeBuilder, leafName, leafDesc, returnType);\r
                     return true;\r
                 }\r
@@ -1451,23 +1428,23 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <li>true - other cases</li>\r
      *         </ul>\r
      */\r
-    private boolean resolveLeafSchemaNodeAsProperty(final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf,\r
+    private def boolean resolveLeafSchemaNodeAsProperty( GeneratedTOBuilder toBuilder, LeafSchemaNode leaf,\r
             boolean isReadOnly) {\r
-        if ((leaf != null) && (toBuilder != null)) {\r
-            final String leafName = leaf.getQName().getLocalName();\r
-            String leafDesc = leaf.getDescription();\r
-            if (leafDesc == null) {\r
+        if ((leaf !== null) && (toBuilder !== null)) {\r
+            val leafName = leaf.QName.localName;\r
+            var String leafDesc = leaf.description;\r
+            if (leafDesc === null) {\r
                 leafDesc = "";\r
             }\r
 \r
-            if (leafName != null && !leaf.isAddedByUses()) {\r
-                final TypeDefinition<?> typeDef = leaf.getType();\r
+            if (leafName !== null && !leaf.isAddedByUses()) {\r
+                val TypeDefinition<?> typeDef = leaf.type;\r
 \r
                 // TODO: properly resolve enum types\r
-                final Type returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf);\r
+                val returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf);\r
 \r
-                if (returnType != null) {\r
-                    final GeneratedPropertyBuilder propBuilder = toBuilder.addProperty(parseToClassName(leafName));\r
+                if (returnType !== null) {\r
+                    val propBuilder = toBuilder.addProperty(parseToClassName(leafName));\r
 \r
                     propBuilder.setReadOnly(isReadOnly);\r
                     propBuilder.setReturnType(returnType);\r
@@ -1501,17 +1478,17 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <li>false - other cases</li>\r
      *         </ul>\r
      */\r
-    private boolean resolveLeafListSchemaNode(final GeneratedTypeBuilder typeBuilder, final LeafListSchemaNode node) {\r
-        if ((node != null) && (typeBuilder != null)) {\r
-            final String nodeName = node.getQName().getLocalName();\r
-            String nodeDesc = node.getDescription();\r
-            if (nodeDesc == null) {\r
+    private def boolean resolveLeafListSchemaNode( GeneratedTypeBuilder typeBuilder, LeafListSchemaNode node) {\r
+        if ((node !== null) && (typeBuilder !== null)) {\r
+            val nodeName = node.QName.localName;\r
+            var String nodeDesc = node.description;\r
+            if (nodeDesc === null) {\r
                 nodeDesc = "";\r
             }\r
 \r
-            if (nodeName != null && !node.isAddedByUses()) {\r
-                final TypeDefinition<?> type = node.getType();\r
-                final Type listType = Types.listTypeFor(typeProvider.javaTypeForSchemaDefinitionType(type, node));\r
+            if (nodeName !== null && !node.isAddedByUses()) {\r
+                val TypeDefinition<?> type = node.type;\r
+                val listType = Types.listTypeFor(typeProvider.javaTypeForSchemaDefinitionType(type, node));\r
 \r
                 constructGetter(typeBuilder, nodeName, nodeDesc, listType);\r
                 return true;\r
@@ -1546,16 +1523,16 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <li>true - other cases</li>\r
      *         </ul>\r
      */\r
-    private boolean resolveContainerSchemaNode(final String basePackageName, final GeneratedTypeBuilder typeBuilder,\r
-            final ContainerSchemaNode containerNode) {\r
-        if ((containerNode != null) && (typeBuilder != null)) {\r
-            final String nodeName = containerNode.getQName().getLocalName();\r
+    private def boolean resolveContainerSchemaNode( String basePackageName, GeneratedTypeBuilder typeBuilder,\r
+            ContainerSchemaNode containerNode) {\r
+        if ((containerNode !== null) && (typeBuilder !== null)) {\r
+            val nodeName = containerNode.QName.localName;\r
 \r
-            if (nodeName != null && !containerNode.isAddedByUses()) {\r
-                final String packageName = packageNameForGeneratedType(basePackageName, containerNode.getPath());\r
+            if (nodeName !== null && !containerNode.isAddedByUses()) {\r
+                val packageName = packageNameForGeneratedType(basePackageName, containerNode.path);\r
 \r
-                final GeneratedTypeBuilder rawGenType = addDefaultInterfaceDefinition(packageName, containerNode);\r
-                constructGetter(typeBuilder, nodeName, containerNode.getDescription(), rawGenType);\r
+                val rawGenType = addDefaultInterfaceDefinition(packageName, containerNode);\r
+                constructGetter(typeBuilder, nodeName, containerNode.description, rawGenType);\r
 \r
                 return true;\r
             }\r
@@ -1588,15 +1565,15 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <li>true - other cases</li>\r
      *         </ul>\r
      */\r
-    private boolean resolveListSchemaNode(final String basePackageName, final GeneratedTypeBuilder typeBuilder,\r
-            final ListSchemaNode listNode) {\r
-        if ((listNode != null) && (typeBuilder != null)) {\r
-            final String listName = listNode.getQName().getLocalName();\r
-\r
-            if (listName != null && !listNode.isAddedByUses()) {\r
-                final String packageName = packageNameForGeneratedType(basePackageName, listNode.getPath());\r
-                final GeneratedTypeBuilder rawGenType = addDefaultInterfaceDefinition(packageName, listNode);\r
-                constructGetter(typeBuilder, listName, listNode.getDescription(), Types.listTypeFor(rawGenType));\r
+    private def boolean resolveListSchemaNode( String basePackageName, GeneratedTypeBuilder typeBuilder,\r
+            ListSchemaNode listNode) {\r
+        if ((listNode !== null) && (typeBuilder !== null)) {\r
+            val listName = listNode.QName.localName;\r
+\r
+            if (listName !== null && !listNode.isAddedByUses()) {\r
+                val packageName = packageNameForGeneratedType(basePackageName, listNode.path);\r
+                val rawGenType = addDefaultInterfaceDefinition(packageName, listNode);\r
+                constructGetter(typeBuilder, listName, listNode.description, Types.listTypeFor(rawGenType));\r
                 return true;\r
             }\r
         }\r
@@ -1624,15 +1601,15 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            schema node for which is created generated type builder\r
      * @return generated type builder <code>schemaNode</code>\r
      */\r
-    private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode) {\r
-        final GeneratedTypeBuilder builder = addRawInterfaceDefinition(packageName, schemaNode, "");\r
+    private def GeneratedTypeBuilder addDefaultInterfaceDefinition( String packageName, SchemaNode schemaNode) {\r
+        val builder = addRawInterfaceDefinition(packageName, schemaNode, "");\r
         builder.addImplementsType(DATA_OBJECT);\r
         if (!(schemaNode instanceof GroupingDefinition)) {\r
             builder.addImplementsType(augmentable(builder));\r
         }\r
 \r
         if (schemaNode instanceof DataNodeContainer) {\r
-            addImplementedInterfaceFromUses((DataNodeContainer) schemaNode, builder);\r
+            addImplementedInterfaceFromUses( schemaNode as DataNodeContainer, builder);\r
         }\r
 \r
         return builder;\r
@@ -1648,7 +1625,7 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            schema node which provide data about the schema node name\r
      * @return generated type builder for <code>schemaNode</code>\r
      */\r
-    private GeneratedTypeBuilder addRawInterfaceDefinition(final String packageName, final SchemaNode schemaNode) {\r
+    private def GeneratedTypeBuilder addRawInterfaceDefinition( String packageName,  SchemaNode schemaNode) {\r
         return addRawInterfaceDefinition(packageName, schemaNode, "");\r
     }\r
 \r
@@ -1675,28 +1652,29 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             </ul>\r
      *\r
      */\r
-    private GeneratedTypeBuilder addRawInterfaceDefinition(final String packageName, final SchemaNode schemaNode,\r
-            final String prefix) {\r
-        Preconditions.checkArgument(schemaNode != null,"Data Schema Node cannot be NULL.");\r
-        Preconditions.checkArgument(packageName != null,"Package Name for Generated Type cannot be NULL.");\r
-        Preconditions.checkArgument(schemaNode.getQName() != null,"QName for Data Schema Node cannot be NULL.");\r
-        final String schemaNodeName = schemaNode.getQName().getLocalName();\r
-        Preconditions.checkArgument(schemaNodeName != null,"Local Name of QName for Data Schema Node cannot be NULL.");\r
-\r
-        final String genTypeName;\r
-        if (prefix == null) {\r
+    private def GeneratedTypeBuilder addRawInterfaceDefinition( String packageName,  SchemaNode schemaNode,\r
+             String prefix) {\r
+        checkArgument(schemaNode !== null,"Data Schema Node cannot be NULL.");\r
+        checkArgument(packageName !== null,"Package Name for Generated Type cannot be NULL.");\r
+        checkArgument(schemaNode.QName !== null,"QName for Data Schema Node cannot be NULL.");\r
+        val schemaNodeName = schemaNode.QName.localName;\r
+        checkArgument(schemaNodeName !== null,"Local Name of QName for Data Schema Node cannot be NULL.");\r
+\r
+        var String genTypeName;\r
+        if (prefix === null) {\r
             genTypeName = parseToClassName(schemaNodeName);\r
         } else {\r
             genTypeName = prefix + parseToClassName(schemaNodeName);\r
         }\r
-\r
-        final GeneratedTypeBuilder newType = new GeneratedTypeBuilderImpl(packageName, genTypeName);\r
+        //FIXME: Validation of name conflict\r
+        val newType = new GeneratedTypeBuilderImpl(packageName, genTypeName);\r
+        yangToJavaMapping.put(schemaNode.path,newType);\r
         if (!genTypeBuilders.containsKey(packageName)) {\r
-            final Map<String, GeneratedTypeBuilder> builders = new HashMap<>();\r
+            val Map<String, GeneratedTypeBuilder> builders = new HashMap();\r
             builders.put(genTypeName, newType);\r
             genTypeBuilders.put(packageName, builders);\r
         } else {\r
-            final Map<String, GeneratedTypeBuilder> builders = genTypeBuilders.get(packageName);\r
+            val Map<String, GeneratedTypeBuilder> builders = genTypeBuilders.get(packageName);\r
             if (!builders.containsKey(genTypeName)) {\r
                 builders.put(genTypeName, newType);\r
             }\r
@@ -1712,8 +1690,8 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @return string with the name of the getter method for\r
      *         <code>methodName</code> in JAVA method format\r
      */\r
-    private String getterMethodName(final String methodName,Type returnType) {\r
-        final StringBuilder method = new StringBuilder();\r
+    private def String getterMethodName( String methodName,Type returnType) {\r
+        val method = new StringBuilder();\r
         if(BOOLEAN.equals(returnType)) {\r
             method.append("is");\r
         } else {\r
@@ -1723,21 +1701,6 @@ public final class BindingGeneratorImpl implements BindingGenerator {
         return method.toString();\r
     }\r
 \r
-    /**\r
-     * Creates the name of the setter method from <code>methodName</code>.\r
-     *\r
-     * @param methodName\r
-     *            string with the name of the setter method\r
-     * @return string with the name of the setter method for\r
-     *         <code>methodName</code> in JAVA method format\r
-     */\r
-    private String setterMethodName(final String methodName) {\r
-        final StringBuilder method = new StringBuilder();\r
-        method.append("set");\r
-        method.append(parseToClassName(methodName));\r
-        return method.toString();\r
-    }\r
-\r
     /**\r
      * Created a method signature builder as part of\r
      * <code>interfaceBuilder</code>.\r
@@ -1759,10 +1722,10 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * @return method signature builder which represents the getter method of\r
      *         <code>interfaceBuilder</code>\r
      */\r
-    private MethodSignatureBuilder constructGetter(final GeneratedTypeBuilder interfaceBuilder,\r
-            final String schemaNodeName, final String comment, final Type returnType) {\r
+    private def MethodSignatureBuilder constructGetter( GeneratedTypeBuilder interfaceBuilder,\r
+             String schemaNodeName,  String comment,  Type returnType) {\r
 \r
-        final MethodSignatureBuilder getMethod = interfaceBuilder.addMethod(getterMethodName(schemaNodeName,returnType));\r
+        val getMethod = interfaceBuilder.addMethod(getterMethodName(schemaNodeName,returnType));\r
 \r
         getMethod.setComment(comment);\r
         getMethod.setReturnType(returnType);\r
@@ -1770,33 +1733,30 @@ public final class BindingGeneratorImpl implements BindingGenerator {
         return getMethod;\r
     }\r
 \r
-    private List<Type> listToGenType(final String basePackageName, final ListSchemaNode list) {\r
-        Preconditions.checkArgument(basePackageName != null,"Package Name for Generated Type cannot be NULL.");\r
-        Preconditions.checkArgument(list != null,"List Schema Node cannot be NULL.");\r
+    private def listToGenType( String basePackageName,  ListSchemaNode list) {\r
+        checkArgument(basePackageName !== null,"Package Name for Generated Type cannot be NULL.");\r
+        checkArgument(list !== null,"List Schema Node cannot be NULL.");\r
 \r
-        final String packageName = packageNameForGeneratedType(basePackageName, list.getPath());\r
-        // final GeneratedTypeBuilder typeBuilder =\r
+        val packageName = packageNameForGeneratedType(basePackageName, list.path);\r
+        // val typeBuilder =\r
         // resolveListTypeBuilder(packageName, list);\r
-        final GeneratedTypeBuilder typeBuilder = addDefaultInterfaceDefinition(packageName, list);\r
+        val typeBuilder = addDefaultInterfaceDefinition(packageName, list);\r
 \r
-        final List<String> listKeys = listKeys(list);\r
-        GeneratedTOBuilder genTOBuilder = resolveListKeyTOBuilder(packageName, list);\r
+        val List<String> listKeys = listKeys(list);\r
+        val genTOBuilder = resolveListKeyTOBuilder(packageName, list);\r
 \r
-        if (genTOBuilder != null) {\r
-            ParameterizedType identifierMarker = Types.parameterizedTypeFor(Types.typeForClass(Identifier.class),\r
-                    typeBuilder);\r
-            ParameterizedType identifiableMarker = Types.parameterizedTypeFor(Types.typeForClass(Identifiable.class),\r
-                    genTOBuilder);\r
+        if (genTOBuilder !== null) {\r
+            val identifierMarker = IDENTIFIER.parameterizedTypeFor(typeBuilder);\r
+            val identifiableMarker = IDENTIFIABLE.parameterizedTypeFor(genTOBuilder);\r
             genTOBuilder.addImplementsType(identifierMarker);\r
             typeBuilder.addImplementsType(identifiableMarker);\r
         }\r
-        final Set<DataSchemaNode> schemaNodes = list.getChildNodes();\r
+        val schemaNodes = list.childNodes;\r
 \r
-        for (final DataSchemaNode schemaNode : schemaNodes) {\r
-            if (schemaNode.isAugmenting()) {\r
-                continue;\r
+        for (schemaNode : schemaNodes) {\r
+            if (!schemaNode.isAugmenting()) {\r
+                addSchemaNodeToListBuilders(basePackageName, schemaNode, typeBuilder, genTOBuilder, listKeys);\r
             }\r
-            addSchemaNodeToListBuilders(basePackageName, schemaNode, typeBuilder, genTOBuilder, listKeys);\r
         }\r
         return typeBuildersToGenTypes(typeBuilder, genTOBuilder);\r
     }\r
@@ -1823,35 +1783,35 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *             <li>if <code>typeBuilder</code> equals null</li>\r
      *             </ul>\r
      */\r
-    private void addSchemaNodeToListBuilders(final String basePackageName, final DataSchemaNode schemaNode,\r
-            final GeneratedTypeBuilder typeBuilder, final GeneratedTOBuilder genTOBuilder, final List<String> listKeys) {\r
-        Preconditions.checkArgument(schemaNode != null,"Data Schema Node cannot be NULL.");\r
+    private def void addSchemaNodeToListBuilders( String basePackageName,  DataSchemaNode schemaNode,\r
+             GeneratedTypeBuilder typeBuilder,  GeneratedTOBuilder genTOBuilder,  List<String> listKeys) {\r
+        checkArgument(schemaNode !== null,"Data Schema Node cannot be NULL.");\r
 \r
-        Preconditions.checkArgument(typeBuilder != null,"Generated Type Builder cannot be NULL.");\r
+        checkArgument(typeBuilder !== null,"Generated Type Builder cannot be NULL.");\r
 \r
         if (schemaNode instanceof LeafSchemaNode) {\r
-            final LeafSchemaNode leaf = (LeafSchemaNode) schemaNode;\r
-            final String leafName = leaf.getQName().getLocalName();\r
+            val leaf = schemaNode as LeafSchemaNode;\r
+            val leafName = leaf.QName.localName;\r
             if (!listKeys.contains(leafName)) {\r
                 resolveLeafSchemaNodeAsMethod(typeBuilder, leaf);\r
             } else {\r
                 resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, true);\r
             }\r
         } else if (schemaNode instanceof LeafListSchemaNode) {\r
-            resolveLeafListSchemaNode(typeBuilder, (LeafListSchemaNode) schemaNode);\r
+            resolveLeafListSchemaNode(typeBuilder,  schemaNode as LeafListSchemaNode);\r
         } else if (schemaNode instanceof ContainerSchemaNode) {\r
-            resolveContainerSchemaNode(basePackageName, typeBuilder, (ContainerSchemaNode) schemaNode);\r
+            resolveContainerSchemaNode(basePackageName, typeBuilder, schemaNode as ContainerSchemaNode);\r
         } else if (schemaNode instanceof ListSchemaNode) {\r
-            resolveListSchemaNode(basePackageName, typeBuilder, (ListSchemaNode) schemaNode);\r
+            resolveListSchemaNode(basePackageName, typeBuilder, schemaNode as ListSchemaNode);\r
         }\r
     }\r
 \r
-    private List<Type> typeBuildersToGenTypes(final GeneratedTypeBuilder typeBuilder, GeneratedTOBuilder genTOBuilder) {\r
-        final List<Type> genTypes = new ArrayList<>();\r
-        Preconditions.checkArgument(typeBuilder != null,"Generated Type Builder cannot be NULL.");\r
+    private def typeBuildersToGenTypes( GeneratedTypeBuilder typeBuilder, GeneratedTOBuilder genTOBuilder) {\r
+        val List<Type> genTypes = new ArrayList();\r
+        checkArgument(typeBuilder !== null,"Generated Type Builder cannot be NULL.");\r
 \r
-        if (genTOBuilder != null) {\r
-            final GeneratedTransferObject genTO = genTOBuilder.toInstance();\r
+        if (genTOBuilder !== null) {\r
+            val genTO = genTOBuilder.toInstance();\r
             constructGetter(typeBuilder, "key", "Returns Primary Key of Yang List Type", genTO);\r
             genTypes.add(genTO);\r
         }\r
@@ -1869,14 +1829,13 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <code>list</code> contains no keys then the empty list is\r
      *         returned.\r
      */\r
-    private List<String> listKeys(final ListSchemaNode list) {\r
-        final List<String> listKeys = new ArrayList<>();\r
+    private def listKeys( ListSchemaNode list) {\r
+        val List<String> listKeys = new ArrayList();\r
 \r
-        if (list.getKeyDefinition() != null) {\r
-            final List<QName> keyDefinitions = list.getKeyDefinition();\r
-\r
-            for (final QName keyDefinition : keyDefinitions) {\r
-                listKeys.add(keyDefinition.getLocalName());\r
+        if (list.keyDefinition !== null) {\r
+            val keyDefinitions = list.keyDefinition;\r
+            for (keyDefinition : keyDefinitions) {\r
+                listKeys.add(keyDefinition.localName);\r
             }\r
         }\r
         return listKeys;\r
@@ -1894,11 +1853,11 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *         <code>list</code> or null if <code>list</code> is null or list of\r
      *         key definitions is null or empty.\r
      */\r
-    private GeneratedTOBuilder resolveListKeyTOBuilder(final String packageName, final ListSchemaNode list) {\r
-        GeneratedTOBuilder genTOBuilder = null;\r
-        if ((list.getKeyDefinition() != null) && (!list.getKeyDefinition().isEmpty())) {\r
-            if (list != null) {\r
-                final String listName = list.getQName().getLocalName() + "Key";\r
+    private def GeneratedTOBuilder resolveListKeyTOBuilder( String packageName,  ListSchemaNode list) {\r
+        var GeneratedTOBuilder genTOBuilder = null;\r
+        if ((list.keyDefinition !== null) && (!list.keyDefinition.isEmpty())) {\r
+            if (list !== null) {\r
+                val listName = list.QName.localName + "Key";\r
                 genTOBuilder = schemaNodeToTransferObjectBuilder(packageName, listName);\r
             }\r
         }\r
@@ -1927,20 +1886,20 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            string with name for generated TO builder\r
      * @return generated TO builder for <code>typeDef</code>\r
      */\r
-    private GeneratedTOBuilder addTOToTypeBuilder(TypeDefinition<?> typeDef, GeneratedTypeBuilder typeBuilder,\r
+    private def GeneratedTOBuilder addTOToTypeBuilder(TypeDefinition<?> typeDef, GeneratedTypeBuilder typeBuilder,\r
             String leafName, LeafSchemaNode leaf, Module parentModule) {\r
-        final String classNameFromLeaf = parseToClassName(leafName);\r
-        List<GeneratedTOBuilder> genTOBuilders = new ArrayList<>();\r
-        final String packageName = typeBuilder.getFullyQualifiedName();\r
+        val classNameFromLeaf = parseToClassName(leafName);\r
+        val List<GeneratedTOBuilder> genTOBuilders = new ArrayList();\r
+        val packageName = typeBuilder.fullyQualifiedName;\r
         if (typeDef instanceof UnionTypeDefinition) {\r
-            genTOBuilders.addAll(((TypeProviderImpl) typeProvider).provideGeneratedTOBuildersForUnionTypeDef(\r
+            genTOBuilders.addAll((typeProvider as TypeProviderImpl).provideGeneratedTOBuildersForUnionTypeDef(\r
                     packageName, typeDef, classNameFromLeaf, leaf));\r
         } else if (typeDef instanceof BitsTypeDefinition) {\r
-            genTOBuilders.add(((TypeProviderImpl) typeProvider).provideGeneratedTOBuilderForBitsTypeDefinition(\r
+            genTOBuilders.add(((typeProvider as TypeProviderImpl) ).provideGeneratedTOBuilderForBitsTypeDefinition(\r
                     packageName, typeDef, classNameFromLeaf));\r
         }\r
-        if (genTOBuilders != null && !genTOBuilders.isEmpty()) {\r
-            for (GeneratedTOBuilder genTOBuilder : genTOBuilders) {\r
+        if (genTOBuilders !== null && !genTOBuilders.isEmpty()) {\r
+            for (genTOBuilder : genTOBuilders) {\r
                 typeBuilder.addEnclosingTransferObject(genTOBuilder);\r
             }\r
             return genTOBuilders.get(0);\r
@@ -1955,7 +1914,7 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      * The method passes through the list of <i>uses</i> in\r
      * {@code dataNodeContainer}. For every <i>use</i> is obtained coresponding\r
      * generated type from {@link BindingGeneratorImpl#allGroupings\r
-     * allGroupings} which is adde as <i>implements type</i> to\r
+     * allGroupings} which is added as <i>implements type</i> to\r
      * <code>builder</code>\r
      *\r
      * @param dataNodeContainer\r
@@ -1965,19 +1924,18 @@ public final class BindingGeneratorImpl implements BindingGenerator {
      *            <code>dataNodeContainer</code>\r
      * @return generated type builder with all implemented types\r
      */\r
-    private GeneratedTypeBuilder addImplementedInterfaceFromUses(final DataNodeContainer dataNodeContainer,\r
-            final GeneratedTypeBuilder builder) {\r
-        for (UsesNode usesNode : dataNodeContainer.getUses()) {\r
-            if (usesNode.getGroupingPath() != null) {\r
-                GeneratedType genType = allGroupings.get(usesNode.getGroupingPath());\r
-                if (genType == null) {\r
-                    throw new IllegalStateException("Grouping " + usesNode.getGroupingPath() + "is not resolved for "\r
-                            + builder.getName());\r
+    private def addImplementedInterfaceFromUses( DataNodeContainer dataNodeContainer,\r
+            GeneratedTypeBuilder builder) {\r
+        for (usesNode : dataNodeContainer.uses) {\r
+            if (usesNode.groupingPath !== null) {\r
+                val genType = allGroupings.get(usesNode.groupingPath);\r
+                if (genType === null) {\r
+                    throw new IllegalStateException("Grouping " + usesNode.groupingPath + "is not resolved for "\r
+                            + builder.name);\r
                 }\r
                 builder.addImplementsType(genType);\r
             }\r
         }\r
         return builder;\r
     }\r
-\r
 }\r
index 513390c75e2ec934c707b603ea5fe984a16d553f..14e0c67889f7bcb3d9d4c6d7d4473389f08b8afb 100644 (file)
@@ -365,7 +365,7 @@ public final class TypeProviderImpl implements TypeProvider {
             } else {
                 final Module module = findParentModule(schemaContext, parentNode);
                 if (module != null) {
-                    final DataSchemaNode dataNode;
+                    final SchemaNode dataNode;
                     if (xpath.isAbsolute()) {
                         dataNode = findDataSchemaNode(schemaContext, module, xpath);
                     } else {
@@ -398,7 +398,7 @@ public final class TypeProviderImpl implements TypeProvider {
      *         <li>false - other cases</li>
      *         </ul>
      */
-    private boolean leafContainsEnumDefinition(final DataSchemaNode dataNode) {
+    private boolean leafContainsEnumDefinition(final SchemaNode dataNode) {
         if (dataNode instanceof LeafSchemaNode) {
             final LeafSchemaNode leaf = (LeafSchemaNode) dataNode;
             if (leaf.getType() instanceof EnumTypeDefinition) {
@@ -422,7 +422,7 @@ public final class TypeProviderImpl implements TypeProvider {
      *         <li>false - other cases</li>
      *         </ul>
      */
-    private boolean leafListContainsEnumDefinition(final DataSchemaNode dataNode) {
+    private boolean leafListContainsEnumDefinition(final SchemaNode dataNode) {
         if (dataNode instanceof LeafListSchemaNode) {
             final LeafListSchemaNode leafList = (LeafListSchemaNode) dataNode;
             if (leafList.getType() instanceof EnumTypeDefinition) {
@@ -516,7 +516,7 @@ public final class TypeProviderImpl implements TypeProvider {
      *            contains information about YANG type
      * @return JAVA <code>Type</code> representation of <code>dataNode</code>
      */
-    private Type resolveTypeFromDataSchemaNode(final DataSchemaNode dataNode) {
+    private Type resolveTypeFromDataSchemaNode(final SchemaNode dataNode) {
         Type returnType = null;
         if (dataNode != null) {
             if (dataNode instanceof LeafSchemaNode) {
diff --git a/model/enum/src/main/yang/.gitignore b/model/enum/src/main/yang/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
index 4856c4a3508f2daca21a7d6067e7195562201769..7b0298073221f806821c3f141eee374a2bfad251 100644 (file)
     <name>${project.artifactId}</name>\r
     <description>${project.artifactId}</description>\r
 \r
+\r
+    <build>\r
+        <plugins>\r
+            <plugin>\r
+                <groupId>org.eclipse.xtend</groupId>\r
+                <artifactId>xtend-maven-plugin</artifactId>\r
+                <version>2.4.2</version>\r
+                <executions>\r
+                    <execution>\r
+                        <goals>\r
+                            <goal>compile</goal>\r
+                        </goals>\r
+                        <configuration>\r
+                            <outputDirectory>${basedir}/src/main/xtend-gen</outputDirectory>\r
+                        </configuration>\r
+                    </execution>\r
+                </executions>\r
+            </plugin>\r
+            <plugin>\r
+                <artifactId>maven-clean-plugin</artifactId>\r
+                <version>2.4.1</version>\r
+                <configuration>\r
+                    <filesets>\r
+                        <fileset>\r
+                            <directory>${basedir}/src/main/xtend-gen</directory>\r
+                            <includes>\r
+                                <include>**</include>\r
+                            </includes>\r
+                        </fileset>\r
+                    </filesets>\r
+                </configuration>\r
+            </plugin>\r
+        </plugins>\r
+    </build>\r
+\r
     <dependencies>\r
         <dependency>\r
             <groupId>${project.groupId}</groupId>\r
             <artifactId>yang-model-api</artifactId>\r
         </dependency>\r
+        <dependency>\r
+            <groupId>org.eclipse.xtend</groupId>\r
+            <artifactId>org.eclipse.xtend.lib</artifactId>\r
+            <version>2.4.2</version>\r
+        </dependency>\r
     </dependencies>\r
-\r
 </project>\r
similarity index 69%
rename from yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.java
rename to yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaContextUtil.xtend
index 91ba9364d114667d46c05c8c0a9bff0fa18c8da9..67374b354e7e36799ebd298fa65f1cd941db6499 100644 (file)
@@ -25,6 +25,10 @@ import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition
+import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
+import java.io.ObjectOutputStream.PutField
+import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode
 
 /**
  * The Schema Context Util contains support methods for searching through Schema Context modules for specified schema
@@ -33,9 +37,9 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
  *
  * @author Lukas Sedlak <lsedlak@cisco.com>
  */
-public final class SchemaContextUtil {
+public  class SchemaContextUtil {
 
-    private SchemaContextUtil() {
+    private new() {
     }
 
     /**
@@ -55,19 +59,16 @@ public final class SchemaContextUtil {
      * @return DataSchemaNode from the end of the Schema Path or
      *         <code>null</code> if the Node is not present.
      */
-    public static DataSchemaNode findDataSchemaNode(final SchemaContext context, final SchemaPath schemaPath) {
+    public static def SchemaNode findDataSchemaNode( SchemaContext context,  SchemaPath schemaPath) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
         if (schemaPath == null) {
             throw new IllegalArgumentException("Schema Path reference cannot be NULL");
         }
-
-        final Module module = resolveModuleFromSchemaPath(context, schemaPath);
-        final Queue<QName> prefixedPath = new LinkedList<>(schemaPath.getPath());
-
-        if ((module != null) && (prefixedPath != null)) {
-            return findSchemaNodeForGivenPath(context, module, prefixedPath);
+        val prefixedPath = (schemaPath.getPath());
+        if (prefixedPath != null) {
+            return findNodeInSchemaContext(context,prefixedPath);
         }
         return null;
     }
@@ -96,8 +97,8 @@ public final class SchemaContextUtil {
      * @return Returns Data Schema Node for specified Schema Context for given Non-conditional Revision Aware XPath,
      * or <code>null</code> if the DataSchemaNode is not present in Schema Context.
      */
-    public static DataSchemaNode findDataSchemaNode(final SchemaContext context, final Module module,
-            final RevisionAwareXPath nonCondXPath) {
+    public static def SchemaNode findDataSchemaNode( SchemaContext context,  Module module,
+             RevisionAwareXPath nonCondXPath) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -108,16 +109,15 @@ public final class SchemaContextUtil {
             throw new IllegalArgumentException("Non Conditional Revision Aware XPath cannot be NULL!");
         }
 
-        final String strXPath = nonCondXPath.toString();
+         val  strXPath = nonCondXPath.toString();
         if (strXPath != null) {
             if (strXPath.contains("[")) {
                 throw new IllegalArgumentException("Revision Aware XPath cannot contains condition!");
             }
             if (nonCondXPath.isAbsolute()) {
-                final Queue<QName> qnamedPath = xpathToQNamePath(context, module, strXPath);
+                 val qnamedPath = xpathToQNamePath(context, module, strXPath);
                 if (qnamedPath != null) {
-                    final DataSchemaNode dataNode = findSchemaNodeForGivenPath(context, module, qnamedPath);
-                    return dataNode;
+                    return findNodeInSchemaContext(context,qnamedPath);
                 }
             }
         }
@@ -157,8 +157,8 @@ public final class SchemaContextUtil {
      * @return DataSchemaNode if is present in specified Schema Context for given relative Revision Aware XPath,
      * otherwise will return <code>null</code>.
      */
-    public static DataSchemaNode findDataSchemaNodeForRelativeXPath(final SchemaContext context, final Module module,
-            final SchemaNode actualSchemaNode, final RevisionAwareXPath relativeXPath) {
+    public static def SchemaNode findDataSchemaNodeForRelativeXPath( SchemaContext context,  Module module,
+             SchemaNode actualSchemaNode,  RevisionAwareXPath relativeXPath) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -176,53 +176,17 @@ public final class SchemaContextUtil {
                     + "for non relative Revision Aware XPath use findDataSchemaNode method!");
         }
 
-        final SchemaPath actualNodePath = actualSchemaNode.getPath();
+         val actualNodePath = actualSchemaNode.getPath();
         if (actualNodePath != null) {
-            final Queue<QName> qnamePath = resolveRelativeXPath(context, module, relativeXPath, actualSchemaNode);
+             val qnamePath = resolveRelativeXPath(context, module, relativeXPath, actualSchemaNode);
 
             if (qnamePath != null) {
-                final DataSchemaNode dataNode = findSchemaNodeForGivenPath(context, module, qnamePath);
-                return dataNode;
+                return findNodeInSchemaContext(context,qnamePath);
             }
         }
         return null;
     }
 
-    /**
-     * Retrieve information from Schema Path and returns the module reference to which Schema Node belongs. The
-     * search for correct Module is based on namespace within the last item in Schema Path. If schema context
-     * contains module with namespace specified in last item of Schema Path, then operation will returns Module
-     * reference, otherwise returns <code>null</code>
-     * <br>
-     * If Schema Context or Schema Node contains <code>null</code> references the method will throw IllegalArgumentException
-     *
-     * @throws IllegalArgumentException
-     *
-     * @param context Schema Context
-     * @param schemaPath Schema Path
-     * @return Module reference for given Schema Path if module is present in Schema Context,
-     * otherwise returns <code>null</code>
-     */
-    private static Module resolveModuleFromSchemaPath(final SchemaContext context, final SchemaPath schemaPath) {
-        if (context == null) {
-            throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
-        }
-        if (schemaPath == null) {
-            throw new IllegalArgumentException("Schema Path reference cannot be NULL");
-        }
-
-        final List<QName> path = schemaPath.getPath();
-        if (!path.isEmpty()) {
-            final QName qname = path.get(path.size() - 1);
-
-            if ((qname != null) && (qname.getNamespace() != null)) {
-                return context.findModuleByNamespace(qname.getNamespace());
-            }
-        }
-
-        return null;
-    }
-
     /**
      * Returns parent Yang Module for specified Schema Context in which Schema Node is declared. If the Schema Node
      * is not present in Schema Context the operation will return <code>null</code>.
@@ -236,7 +200,7 @@ public final class SchemaContextUtil {
      * @return Yang Module for specified Schema Context and Schema Node, if Schema Node is NOT present,
      * the method will returns <code>null</code>
      */
-    public static Module findParentModule(final SchemaContext context, final SchemaNode schemaNode) {
+    public static def Module findParentModule( SchemaContext context,  SchemaNode schemaNode) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -244,18 +208,18 @@ public final class SchemaContextUtil {
             throw new IllegalArgumentException("Schema Node cannot be NULL!");
         }
 
-        final SchemaPath schemaPath = schemaNode.getPath();
+        val schemaPath = schemaNode.getPath();
         if (schemaPath == null) {
             throw new IllegalStateException("Schema Path for Schema Node is not "
                     + "set properly (Schema Path is NULL)");
         }
-        final List<QName> qnamedPath = schemaPath.getPath();
+        val qnamedPath = schemaPath.getPath();
         if (qnamedPath == null || qnamedPath.isEmpty()) {
             throw new IllegalStateException("Schema Path contains invalid state of path parts."
                     + "The Schema Path MUST contain at least ONE QName which defines namespace and Local name"
                     + "of path.");
         }
-        final QName qname = qnamedPath.get(qnamedPath.size() - 1);
+        val qname = qnamedPath.get(qnamedPath.size() - 1);
         return context.findModuleByNamespace(qname.getNamespace());
     }
 
@@ -276,8 +240,8 @@ public final class SchemaContextUtil {
      * @return DataSchemaNode if is present in Module(s) for specified Schema Context and given QNamed Path,
      * otherwise will return <code>null</code>.
      */
-    private static DataSchemaNode findSchemaNodeForGivenPath(final SchemaContext context, final Module module,
-            final Queue<QName> qnamedPath) {
+    private static def SchemaNode findSchemaNodeForGivenPath( SchemaContext context,  Module module,
+             Queue<QName> qnamedPath) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -293,35 +257,41 @@ public final class SchemaContextUtil {
                     + "of path.");
         }
 
-        DataNodeContainer nextNode = module;
-        final URI moduleNamespace = module.getNamespace();
+        var DataNodeContainer nextNode = module;
+        val moduleNamespace = module.getNamespace();
 
-        QName childNodeQName;
-        DataSchemaNode schemaNode = null;
+        var QName childNodeQName;
+        var SchemaNode schemaNode = null;
         while ((nextNode != null) && !qnamedPath.isEmpty()) {
             childNodeQName = qnamedPath.peek();
             if (childNodeQName != null) {
-                final URI childNodeNamespace = childNodeQName.getNamespace();
+                val URI childNodeNamespace = childNodeQName.getNamespace();
 
                 schemaNode = nextNode.getDataChildByName(childNodeQName.getLocalName());
+                if(schemaNode == null && nextNode instanceof Module) {
+                    schemaNode = (nextNode as Module).getNotificationByName(childNodeQName);
+                }
+                if(schemaNode == null && nextNode instanceof Module) {
+                    
+                }
                 if (schemaNode != null) {
                     if (schemaNode instanceof ContainerSchemaNode) {
-                        nextNode = (ContainerSchemaNode) schemaNode;
+                        nextNode = schemaNode as ContainerSchemaNode;
                     } else if (schemaNode instanceof ListSchemaNode) {
-                        nextNode = (ListSchemaNode) schemaNode;
+                        nextNode = schemaNode as ListSchemaNode;
                     } else if (schemaNode instanceof ChoiceNode) {
-                        final ChoiceNode choice = (ChoiceNode) schemaNode;
+                        val choice =  schemaNode as ChoiceNode;
                         qnamedPath.poll();
                         if (!qnamedPath.isEmpty()) {
                             childNodeQName = qnamedPath.peek();
                             nextNode = choice.getCaseNodeByName(childNodeQName);
-                            schemaNode = (DataSchemaNode) nextNode;
+                            schemaNode = nextNode as DataSchemaNode;
                         }
                     } else {
                         nextNode = null;
                     }
                 } else if (!childNodeNamespace.equals(moduleNamespace)) {
-                    final Module nextModule = context.findModuleByNamespace(childNodeNamespace);
+                    val Module nextModule = context.findModuleByNamespace(childNodeNamespace);
                     schemaNode = findSchemaNodeForGivenPath(context, nextModule, qnamedPath);
                     return schemaNode;
                 }
@@ -330,6 +300,107 @@ public final class SchemaContextUtil {
         }
         return schemaNode;
     }
+    
+    
+    private static def SchemaNode findNodeInSchemaContext(SchemaContext context, List<QName> path) {
+        val current = path.get(0);
+        val module = context.findModuleByNamespace(current.namespace);
+        if(module == null) return null;
+        return findNodeInModule(module,path);
+    }
+    
+    private static def SchemaNode findNodeInModule(Module module, List<QName> path) {
+        val current = path.get(0);
+        var SchemaNode node = module.getDataChildByName(current);
+        if (node != null) return findNode(node as DataSchemaNode,path.nextLevel);
+        node = module.getRpcByName(current);
+        if (node != null) return findNodeInRpc(node as RpcDefinition,path.nextLevel)
+        node = module.getNotificationByName(current);
+        if (node != null) return findNodeInNotification(node as NotificationDefinition,path.nextLevel)
+        return null
+    }
+     
+    private static def SchemaNode findNodeInRpc(RpcDefinition rpc,List<QName> path) {
+        if(path.empty) return rpc;
+        val current = path.get(0);
+        switch (current.localName) {
+            case "input": return findNode(rpc.input,path.nextLevel)
+            case "output": return  findNode(rpc.output,path.nextLevel)
+        }
+        return null
+    }
+    
+    private static def SchemaNode findNodeInNotification(NotificationDefinition rpc,List<QName> path) {
+        if(path.empty) return rpc;
+        val current = path.get(0);
+        val node = rpc.getDataChildByName(current)
+        if(node != null) return findNode(node,path.nextLevel)
+        return null
+    }
+    
+    private static dispatch def SchemaNode findNode(ChoiceNode parent,List<QName> path) {
+        if(path.empty) return parent;
+        val current = path.get(0);
+        val node = parent.getCaseNodeByName(current)
+        if (node != null) return findNodeInCase(node,path.nextLevel)
+        return null
+    }
+    
+    private static dispatch def SchemaNode findNode(ContainerSchemaNode parent,List<QName> path) {
+        if(path.empty) return parent;
+         val current = path.get(0);
+        val node = parent.getDataChildByName(current)
+        if (node != null) return findNode(node,path.nextLevel)
+        return null
+    }
+    
+    private static dispatch def SchemaNode findNode(ListSchemaNode parent,List<QName> path) {
+        if(path.empty) return parent;
+         val current = path.get(0);
+        val node = parent.getDataChildByName(current)
+        if (node != null) return findNode(node,path.nextLevel)
+        return null
+    }
+    
+    private static dispatch def SchemaNode findNode(DataSchemaNode parent,List<QName> path){
+        if(path.empty) {
+            return parent
+        } else {
+            throw new IllegalArgumentException("Path nesting violation");
+        }
+    }
+    
+    public static  def SchemaNode findNodeInCase(ChoiceCaseNode parent,List<QName> path) {
+        if(path.empty) return parent;
+         val current = path.get(0);
+        val node = parent.getDataChildByName(current)
+        if (node != null) return findNode(node,path.nextLevel)
+        return null
+    }
+    
+     
+    public static def RpcDefinition getRpcByName(Module module, QName name) {
+        for(notification : module.rpcs) {
+            if(notification.QName == name) {
+                return notification;
+            }
+        }
+        return null;
+    }
+    
+    
+    private static def nextLevel(List<QName> path){
+        return path.subList(1,path.size)
+    }
+    
+    public static def NotificationDefinition getNotificationByName(Module module, QName name) {
+        for(notification : module.notifications) {
+            if(notification.QName == name) {
+                return notification;
+            }
+        }
+        return null;
+    }
 
     /**
      * Transforms string representation of XPath to Queue of QNames. The XPath is split by "/" and for each part of
@@ -345,8 +416,8 @@ public final class SchemaContextUtil {
      * @param xpath XPath String
      * @return
      */
-    private static Queue<QName> xpathToQNamePath(final SchemaContext context, final Module parentModule,
-            final String xpath) {
+    private static def xpathToQNamePath( SchemaContext context,  Module parentModule,
+             String xpath) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -357,11 +428,11 @@ public final class SchemaContextUtil {
             throw new IllegalArgumentException("XPath string reference cannot be NULL!");
         }
 
-        final Queue<QName> path = new LinkedList<>();
-        final String[] prefixedPath = xpath.split("/");
-        for (int i = 0; i < prefixedPath.length; ++i) {
-            if (!prefixedPath[i].isEmpty()) {
-                path.add(stringPathPartToQName(context, parentModule, prefixedPath[i]));
+        val path = new LinkedList<QName>();
+        val String[] prefixedPath = xpath.split("/");
+        for (pathComponent : prefixedPath) {
+            if (!pathComponent.isEmpty()) {
+                path.add(stringPathPartToQName(context, parentModule, pathComponent));
             }
         }
         return path;
@@ -387,8 +458,8 @@ public final class SchemaContextUtil {
      * @param prefixedPathPart Prefixed Path Part string
      * @return QName from prefixed Path Part String.
      */
-    private static QName stringPathPartToQName(final SchemaContext context, final Module parentModule,
-            final String prefixedPathPart) {
+    private static def QName stringPathPartToQName( SchemaContext context,  Module parentModule,
+             String prefixedPathPart) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -400,10 +471,10 @@ public final class SchemaContextUtil {
         }
 
         if (prefixedPathPart.contains(":")) {
-            final String[] prefixedName = prefixedPathPart.split(":");
-            final Module module = resolveModuleForPrefix(context, parentModule, prefixedName[0]);
+             val String[] prefixedName = prefixedPathPart.split(":");
+             val module = resolveModuleForPrefix(context, parentModule, prefixedName.get(0));
             if (module != null) {
-                return new QName(module.getNamespace(), module.getRevision(), prefixedName[1]);
+                return new QName(module.getNamespace(), module.getRevision(), prefixedName.get(1));
             }
         } else {
             return new QName(parentModule.getNamespace(), parentModule.getRevision(), prefixedPathPart);
@@ -430,7 +501,7 @@ public final class SchemaContextUtil {
      * @param prefix Module Prefix
      * @return Module for given prefix in specified Schema Context if is present, otherwise returns <code>null</code>
      */
-    private static Module resolveModuleForPrefix(final SchemaContext context, final Module module, final String prefix) {
+    private static def Module resolveModuleForPrefix( SchemaContext context,  Module module,  String prefix) {
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -445,8 +516,8 @@ public final class SchemaContextUtil {
             return module;
         }
 
-        final Set<ModuleImport> imports = module.getImports();
-        for (final ModuleImport mi : imports) {
+        val imports = module.getImports();
+        for ( ModuleImport mi : imports) {
             if (prefix.equals(mi.getPrefix())) {
                 return context.findModuleByName(mi.getModuleName(), mi.getRevision());
             }
@@ -463,9 +534,9 @@ public final class SchemaContextUtil {
      * @param leafrefSchemaPath Schema Path for Leafref
      * @return
      */
-    private static Queue<QName> resolveRelativeXPath(final SchemaContext context, final Module module,
-            final RevisionAwareXPath relativeXPath, final SchemaNode leafrefParentNode) {
-        final Queue<QName> absolutePath = new LinkedList<>();
+    private static def resolveRelativeXPath( SchemaContext context,  Module module,
+             RevisionAwareXPath relativeXPath,  SchemaNode leafrefParentNode) {
+
         if (context == null) {
             throw new IllegalArgumentException("Schema Context reference cannot be NULL!");
         }
@@ -482,24 +553,22 @@ public final class SchemaContextUtil {
         if (leafrefParentNode.getPath() == null) {
             throw new IllegalArgumentException("Schema Path reference for Leafref cannot be NULL!");
         }
-
-        final String strXPath = relativeXPath.toString();
+        val absolutePath = new LinkedList<QName>();
+        val String strXPath = relativeXPath.toString();
         if (strXPath != null) {
-            final String[] xpaths = strXPath.split("/");
+            val String[] xpaths = strXPath.split("/");
             if (xpaths != null) {
-                int colCount = 0;
-                while (xpaths[colCount].contains("..")) {
-                    ++colCount;
+                var int colCount = 0;
+                while (xpaths.get(colCount).contains("..")) {
+                    colCount = colCount+ 1;
                 }
-                final List<QName> path = leafrefParentNode.getPath().getPath();
+                val path = leafrefParentNode.getPath().getPath();
                 if (path != null) {
-                    int lenght = path.size() - colCount;
-                    for (int i = 0; i < lenght; ++i) {
-                        absolutePath.add(path.get(i));
-                    }
-                    for (int i = colCount; i < xpaths.length; ++i) {
-                        absolutePath.add(stringPathPartToQName(context, module, xpaths[i]));
-                    }
+                    val int lenght = path.size() - colCount;
+                    absolutePath.addAll(path.subList(0,lenght));
+                    absolutePath.addAll(
+                        xpaths.subList(colCount,xpaths.length).map[stringPathPartToQName(context, module,it)]
+                    )
                 }
             }
         }
index 189c7cb7c00851266a4a781c1e02dea64e237aa6..88ef7280f91b0e49ea18bb41c832f50274f93d97 100644 (file)
             <groupId>com.google.guava</groupId>\r
             <artifactId>guava</artifactId>\r
         </dependency>\r
+        <dependency>\r
+            <groupId>org.eclipse.xtend</groupId>\r
+            <artifactId>org.eclipse.xtend.lib</artifactId>\r
+            <version>2.4.2</version>\r
+        </dependency>\r
         <dependency>\r
             <groupId>junit</groupId>\r
             <artifactId>junit</artifactId>\r
+            <scope>test</scope>\r
         </dependency>\r
     </dependencies>\r
 \r
     <build>\r
         <plugins>\r
+            <plugin>\r
+                <artifactId>maven-clean-plugin</artifactId>\r
+                <version>2.4.1</version>\r
+                <configuration>\r
+                    <filesets>\r
+                        <fileset>\r
+                            <directory>${basedir}/src/main/xtend-gen</directory>\r
+                            <includes>\r
+                                <include>**</include>\r
+                            </includes>\r
+                        </fileset>\r
+                    </filesets>\r
+                </configuration>\r
+            </plugin>\r
             <plugin>\r
                 <groupId>org.antlr</groupId>\r
                 <artifactId>antlr4-maven-plugin</artifactId>\r
                 </configuration>\r
             </plugin>\r
             <plugin>\r
+                <groupId>org.eclipse.xtend</groupId>\r
+                <artifactId>xtend-maven-plugin</artifactId>\r
+                <version>2.4.2</version>\r
+                <executions>\r
+                    <execution>\r
+                        <goals>\r
+                            <goal>compile</goal>\r
+                        </goals>\r
+                        <configuration>\r
+                            <outputDirectory>${basedir}/src/main/xtend-gen</outputDirectory>\r
+                        </configuration>\r
+                    </execution>\r
+                </executions>\r
+            </plugin><plugin>\r
                 <groupId>org.codehaus.mojo</groupId>\r
                 <artifactId>build-helper-maven-plugin</artifactId>\r
                 <version>1.7</version>\r
                     </execution>\r
                 </executions>\r
             </plugin>\r
+            \r
             <plugin>\r
                 <groupId>org.apache.maven.plugins</groupId>\r
                 <artifactId>maven-javadoc-plugin</artifactId>\r
diff --git a/yang/yang-parser-impl/src/main/.gitignore b/yang/yang-parser-impl/src/main/.gitignore
new file mode 100644 (file)
index 0000000..04b73cb
--- /dev/null
@@ -0,0 +1 @@
+/xtend-gen
index 2ae0ad5531498834d8424f2bb9136c4bc9eadcea..9f534ad192daf18b61e3e63c91bae7c48a841e44 100644 (file)
@@ -77,4 +77,8 @@ public interface Builder {
      */
     Object build();
 
+    
+    public interface Rebuildable<T extends Builder> {
+        T toBuilder();
+    }
 }
index 01ee714694d3e198988329d344e9460b2cadb701..cab518c329f035567f33cf77681e8b3431b0dad4 100644 (file)
-/*
- * 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.parser.builder.impl;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-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;
-import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.Deviation;
-import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
-import org.opendaylight.yangtools.yang.model.api.FeatureDefinition;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.ModuleImport;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-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.parser.builder.api.AbstractDataNodeContainerBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
-import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder;
-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.RefineHolder;
-import org.opendaylight.yangtools.yang.parser.util.YangParseException;
-
-/**
- * Builder of Module object. If this module is dependent on external
- * module/modules, these dependencies must be resolved before module is built,
- * otherwise result may not be valid.
- */
-public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
-    private final ModuleImpl instance;
-    private final String name;
-    private final SchemaPath schemaPath;
-    private URI namespace;
-    private String prefix;
-    private Date revision;
-
-    private final LinkedList<Builder> actualPath = new LinkedList<Builder>();
-    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 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<RpcDefinitionBuilder> addedRpcs = new HashSet<RpcDefinitionBuilder>();
-    private final Set<NotificationBuilder> addedNotifications = new HashSet<NotificationBuilder>();
-    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 List<UnknownSchemaNodeBuilder> allUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
-
-    public ModuleBuilder(final String name) {
-        super(name, 0, null);
-        this.name = name;
-        schemaPath = new SchemaPath(Collections.<QName>emptyList(), true);
-        instance = new ModuleImpl(name);
-        actualPath.push(this);
-    }
-
-    /**
-     * Build new Module object based on this builder.
-     */
-    @Override
-    public Module build() {
-        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());
-        }
-        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());
-        }
-        instance.setChildNodes(children);
-
-        // GROUPINGS
-        final Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
-        for (GroupingBuilder gb : addedGroupings) {
-            groupings.add(gb.build());
-        }
-        instance.setGroupings(groupings);
-
-        // USES
-        final Set<UsesNode> usesDefinitions = new HashSet<UsesNode>();
-        for (UsesNodeBuilder unb : addedUsesNodes) {
-            usesDefinitions.add(unb.build());
-        }
-        instance.setUses(usesDefinitions);
-
-        // FEATURES
-        final Set<FeatureDefinition> features = new TreeSet<FeatureDefinition>(Comparators.SCHEMA_NODE_COMP);
-        for (FeatureBuilder fb : addedFeatures) {
-            features.add(fb.build());
-        }
-        instance.setFeatures(features);
-
-        // NOTIFICATIONS
-        final Set<NotificationDefinition> notifications = new TreeSet<NotificationDefinition>(
-                Comparators.SCHEMA_NODE_COMP);
-        for (NotificationBuilder entry : addedNotifications) {
-            notifications.add(entry.build());
-        }
-        instance.setNotifications(notifications);
-
-        // AUGMENTATIONS
-        final Set<AugmentationSchema> augmentations = new HashSet<AugmentationSchema>();
-        for (AugmentationSchemaBuilder builder : addedAugments) {
-            augmentations.add(builder.build());
-        }
-        instance.setAugmentations(augmentations);
-
-        // RPCs
-        final Set<RpcDefinition> rpcs = new TreeSet<RpcDefinition>(Comparators.SCHEMA_NODE_COMP);
-        for (RpcDefinitionBuilder rpc : addedRpcs) {
-            rpcs.add(rpc.build());
-        }
-        instance.setRpcs(rpcs);
-
-        // DEVIATIONS
-        final Set<Deviation> deviations = new HashSet<Deviation>();
-        for (DeviationBuilder entry : addedDeviations) {
-            deviations.add(entry.build());
-        }
-        instance.setDeviations(deviations);
-
-        // EXTENSIONS
-        final List<ExtensionDefinition> extensions = new ArrayList<ExtensionDefinition>();
-        for (ExtensionBuilder eb : addedExtensions) {
-            extensions.add(eb.build());
-        }
-        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());
-        }
-        instance.setIdentities(identities);
-
-        // UNKNOWN NODES
-        final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
-        for (UnknownSchemaNodeBuilder unb : addedUnknownNodes) {
-            unknownNodes.add(unb.build());
-        }
-        instance.setUnknownSchemaNodes(unknownNodes);
-
-        return instance;
-    }
-
-    public boolean isAllUsesDataCollected() {
-        for(UsesNodeBuilder usesNode : allUsesNodes) {
-            if(!usesNode.isDataCollected()) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public void setParent(Builder parent) {
-        throw new YangParseException(name, 0, "Can not set parent to module");
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return schemaPath;
-    }
-
-    @Override
-    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
-        return addedTypedefs;
-    }
-
-    public void enterNode(final Builder node) {
-        actualPath.push(node);
-    }
-
-    public void exitNode() {
-        actualPath.pop();
-    }
-
-    public Builder getActualNode() {
-        if (actualPath.isEmpty()) {
-            return null;
-        } else {
-            return actualPath.get(0);
-        }
-    }
-
-    public Builder getActualParent() {
-        if (actualPath.size() < 2) {
-            return null;
-        } else {
-            return actualPath.get(1);
-        }
-    }
-
-    public Set<TypeAwareBuilder> getDirtyNodes() {
-        return dirtyNodes;
-    }
-
-    public List<AugmentationSchemaBuilder> getAllAugments() {
-        return allAugments;
-    }
-
-    public Set<IdentitySchemaNodeBuilder> getIdentities() {
-        return addedIdentities;
-    }
-
-    public List<UsesNodeBuilder> getAllUsesNodes() {
-        return allUsesNodes;
-    }
-
-    public Set<DeviationBuilder> getDeviations() {
-        return addedDeviations;
-    }
-
-    public List<ExtensionBuilder> getExtensions() {
-        return addedExtensions;
-    }
-
-    public List<UnknownSchemaNodeBuilder> getAllUnknownNodes() {
-        return allUnknownNodes;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public URI getNamespace() {
-        return namespace;
-    }
-
-    public void setNamespace(final URI namespace) {
-        this.namespace = namespace;
-    }
-
-    public String getPrefix() {
-        return prefix;
-    }
-
-    public Date getRevision() {
-        return revision;
-    }
-
-    public void markActualNodeDirty() {
-        final TypeAwareBuilder nodeBuilder = (TypeAwareBuilder) getActualNode();
-        dirtyNodes.add(nodeBuilder);
-    }
-
-    public void setRevision(final Date revision) {
-        this.revision = revision;
-    }
-
-    public void setPrefix(final String prefix) {
-        this.prefix = prefix;
-    }
-
-    public void setYangVersion(final String yangVersion) {
-        instance.setYangVersion(yangVersion);
-    }
-
-    public void setDescription(final String description) {
-        instance.setDescription(description);
-    }
-
-    public void setReference(final String reference) {
-        instance.setReference(reference);
-    }
-
-    public void setOrganization(final String organization) {
-        instance.setOrganization(organization);
-    }
-
-    public void setContact(final String contact) {
-        instance.setContact(contact);
-    }
-
-    public boolean addModuleImport(final String moduleName, final Date revision, final String prefix) {
-        final ModuleImport moduleImport = createModuleImport(moduleName, revision, prefix);
-        return imports.add(moduleImport);
-    }
-
-    public Set<ModuleImport> getModuleImports() {
-        return imports;
-    }
-
-    public ExtensionBuilder addExtension(final QName qname, final int line) {
-        final String extName = qname.getLocalName();
-        for (ExtensionBuilder addedExtension : addedExtensions) {
-            if (addedExtension.getQName().getLocalName().equals(extName)) {
-                throw new YangParseException(moduleName, line, "Can not add extension '" + extName
-                        + "': extension with same name already declared at line " + addedExtension.getLine());
-            }
-        }
-        final ExtensionBuilder builder = new ExtensionBuilder(name, line, qname);
-        addedExtensions.add(builder);
-        return builder;
-    }
-
-    public ContainerSchemaNodeBuilder addContainerNode(final int line, final QName qname, final SchemaPath schemaPath) {
-        final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-        addChildToParent(parent, builder, qname.getLocalName());
-
-        return builder;
-    }
-
-    public ListSchemaNodeBuilder addListNode(final int line, final QName qname, final SchemaPath schemaPath) {
-        final ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(name, line, qname, schemaPath);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-        addChildToParent(parent, builder, qname.getLocalName());
-
-        return builder;
-    }
-
-    public LeafSchemaNodeBuilder addLeafNode(final int line, final QName qname, final SchemaPath schemaPath) {
-        final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(name, line, qname, schemaPath);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-        addChildToParent(parent, builder, qname.getLocalName());
-
-        return builder;
-    }
-
-    public LeafListSchemaNodeBuilder addLeafListNode(final int line, final QName qname, final SchemaPath schemaPath) {
-        final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(name, line, qname, schemaPath);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-        addChildToParent(parent, builder, qname.getLocalName());
-
-        return builder;
-    }
-
-    public GroupingBuilder addGrouping(final int line, final QName qname) {
-        final GroupingBuilder builder = new GroupingBuilderImpl(name, line, qname);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-
-        String groupingName = qname.getLocalName();
-        if (parent.equals(this)) {
-            for (GroupingBuilder addedGrouping : addedGroupings) {
-                if (addedGrouping.getQName().getLocalName().equals(groupingName)) {
-                    throw new YangParseException(name, line, "grouping with same name '" + groupingName
-                            + "' already declared at line " + addedGrouping.getLine());
-                }
-            }
-            addedGroupings.add(builder);
-        } else {
-            if (parent instanceof DataNodeContainerBuilder) {
-                DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent;
-                for (GroupingBuilder addedGrouping : parentNode.getGroupingBuilders()) {
-                    if (addedGrouping.getQName().getLocalName().equals(groupingName)) {
-                        throw new YangParseException(name, line, "grouping with same name '" + groupingName
-                                + "' already declared at line " + addedGrouping.getLine());
-                    }
-                }
-                parentNode.addGrouping(builder);
-            } else if (parent instanceof RpcDefinitionBuilder) {
-                RpcDefinitionBuilder parentNode = (RpcDefinitionBuilder) parent;
-                for (GroupingBuilder child : parentNode.getGroupings()) {
-                    if (child.getQName().getLocalName().equals(groupingName)) {
-                        throw new YangParseException(name, line, "grouping with same name '" + groupingName
-                                + "' already declared at line " + child.getLine());
-                    }
-                }
-                parentNode.addGrouping(builder);
-            } else {
-                throw new YangParseException(name, line, "Unresolved parent of grouping " + groupingName);
-            }
-        }
-
-        return builder;
-    }
-
-    public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr) {
-        final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-
-        if (parent.equals(this)) {
-            // augment can be declared only under 'module' ...
-            addedAugments.add(builder);
-        } else {
-            // ... or 'uses' statement
-            if (parent instanceof UsesNodeBuilder) {
-                ((UsesNodeBuilder) parent).addAugment(builder);
-            } else {
-                throw new YangParseException(name, line, "Augment can be declared only under module or uses statement.");
-            }
-        }
-        allAugments.add(builder);
-
-        return builder;
-    }
-
-    @Override
-    public Set<UsesNodeBuilder> getUsesNodes() {
-        return addedUsesNodes;
-    }
-
-    @Override
-    public void addUsesNode(UsesNodeBuilder usesBuilder) {
-        addedUsesNodes.add(usesBuilder);
-        allUsesNodes.add(usesBuilder);
-    }
-
-    public UsesNodeBuilder addUsesNode(final int line, final String groupingPathStr) {
-        final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, groupingPathStr);
-
-        Builder parent = getActualNode();
-        usesBuilder.setParent(parent);
-
-        if (parent.equals(this)) {
-            addedUsesNodes.add(usesBuilder);
-        } else {
-            if (!(parent instanceof DataNodeContainerBuilder)) {
-                throw new YangParseException(name, line, "Unresolved parent of uses '" + groupingPathStr + "'.");
-            }
-            ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder);
-        }
-        allUsesNodes.add(usesBuilder);
-        return usesBuilder;
-    }
-
-    public void addRefine(final RefineHolder refine) {
-        final Builder parent = getActualNode();
-        if (!(parent instanceof UsesNodeBuilder)) {
-            throw new YangParseException(name, refine.getLine(), "refine can be defined only in uses statement");
-        }
-        ((UsesNodeBuilder) parent).addRefine(refine);
-        refine.setParent(parent);
-    }
-
-    public RpcDefinitionBuilder addRpc(final int line, final QName qname) {
-        Builder parent = getActualNode();
-        if (!(parent.equals(this))) {
-            throw new YangParseException(name, line, "rpc can be defined only in module or submodule");
-        }
-
-        final RpcDefinitionBuilder rpcBuilder = new RpcDefinitionBuilder(name, line, qname);
-        rpcBuilder.setParent(parent);
-
-        String rpcName = qname.getLocalName();
-        for (RpcDefinitionBuilder rpc : addedRpcs) {
-            if (rpc.getQName().getLocalName().equals(rpcName)) {
-                throw new YangParseException(name, line, "rpc with same name '" + rpcName
-                        + "' already declared at line " + rpc.getLine());
-            }
-        }
-        for (DataSchemaNodeBuilder addedChild : addedChildNodes) {
-            if (addedChild.getQName().getLocalName().equals(rpcName)) {
-                throw new YangParseException(name, line, "Can not add rpc: node with same name '" + rpcName
-                        + "' already declared at line " + addedChild.getLine());
-            }
-        }
-        for (NotificationBuilder addedNotification : addedNotifications) {
-            if (addedNotification.getQName().getLocalName().equals(rpcName)) {
-                throw new YangParseException(name, line, "Can not add rpc: notification with same name '" + rpcName
-                        + "' already declared at line " + addedNotification.getLine());
-            }
-        }
-        addedRpcs.add(rpcBuilder);
-        return rpcBuilder;
-    }
-
-    public ContainerSchemaNodeBuilder addRpcInput(final int line, final QName qname, final SchemaPath schemaPath) {
-        final Builder parent = getActualNode();
-        if (!(parent instanceof RpcDefinitionBuilder)) {
-            throw new YangParseException(name, line, "input can be defined only in rpc statement");
-        }
-        final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent;
-
-        final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath);
-        inputBuilder.setParent(rpc);
-
-        rpc.setInput(inputBuilder);
-        return inputBuilder;
-    }
-
-    public ContainerSchemaNodeBuilder addRpcOutput(final SchemaPath schemaPath, final QName qname, final int line) {
-        final Builder parent = getActualNode();
-        if (!(parent instanceof RpcDefinitionBuilder)) {
-            throw new YangParseException(name, line, "output can be defined only in rpc statement");
-        }
-        final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent;
-
-        final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath);
-        outputBuilder.setParent(rpc);
-
-        rpc.setOutput(outputBuilder);
-        return outputBuilder;
-    }
-
-    public NotificationBuilder addNotification(final int line, final QName qname) {
-        final Builder parent = getActualNode();
-        if (!(parent.equals(this))) {
-            throw new YangParseException(name, line, "notification can be defined only in module or submodule");
-        }
-
-        String notificationName = qname.getLocalName();
-        for (NotificationBuilder nb : addedNotifications) {
-            if (nb.getQName().equals(qname)) {
-                throw new YangParseException(name, line, "notification with same name '" + notificationName
-                        + "' already declared at line " + nb.getLine());
-            }
-        }
-        for (RpcDefinitionBuilder rpc : addedRpcs) {
-            if (rpc.getQName().getLocalName().equals(notificationName)) {
-                throw new YangParseException(name, line, "Can not add notification: rpc with same name '"
-                        + notificationName + "' already declared at line " + rpc.getLine());
-            }
-        }
-        for (DataSchemaNodeBuilder addedChild : addedChildNodes) {
-            if (addedChild.getQName().getLocalName().equals(notificationName)) {
-                throw new YangParseException(name, line, "Can not add notification: node with same name '"
-                        + notificationName + "' already declared at line " + addedChild.getLine());
-            }
-        }
-
-        final NotificationBuilder builder = new NotificationBuilder(name, line, qname);
-        builder.setParent(parent);
-        addedNotifications.add(builder);
-
-        return builder;
-    }
-
-    public FeatureBuilder addFeature(final int line, final QName qname) {
-        Builder parent = getActualNode();
-        if (!(parent.equals(this))) {
-            throw new YangParseException(name, line, "feature can be defined only in module or submodule");
-        }
-
-        final FeatureBuilder builder = new FeatureBuilder(name, line, qname);
-        builder.setParent(parent);
-
-        String featureName = qname.getLocalName();
-        for (FeatureBuilder addedFeature : addedFeatures) {
-            if (addedFeature.getQName().getLocalName().equals(featureName)) {
-                throw new YangParseException(name, line, "feature with same name '" + featureName
-                        + "' already declared at line " + addedFeature.getLine());
-            }
-        }
-        addedFeatures.add(builder);
-        return builder;
-    }
-
-    public ChoiceBuilder addChoice(final int line, final QName qname) {
-        final ChoiceBuilder builder = new ChoiceBuilder(name, line, qname);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-        addChildToParent(parent, builder, qname.getLocalName());
-
-        return builder;
-    }
-
-    public ChoiceCaseBuilder addCase(final int line, final QName qname) {
-        Builder parent = getActualNode();
-        if (parent == null || parent.equals(this)) {
-            throw new YangParseException(name, line, "'case' parent not found");
-        }
-
-        final ChoiceCaseBuilder builder = new ChoiceCaseBuilder(name, line, qname);
-        builder.setParent(parent);
-
-        if (parent instanceof ChoiceBuilder) {
-            ((ChoiceBuilder) parent).addCase(builder);
-        } else if (parent instanceof AugmentationSchemaBuilder) {
-            ((AugmentationSchemaBuilder) parent).addChildNode(builder);
-        } else {
-            throw new YangParseException(name, line, "Unresolved parent of 'case' " + qname.getLocalName());
-        }
-
-        return builder;
-    }
-
-    public AnyXmlBuilder addAnyXml(final int line, final QName qname, final SchemaPath schemaPath) {
-        final AnyXmlBuilder builder = new AnyXmlBuilder(name, line, qname, schemaPath);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-        addChildToParent(parent, builder, qname.getLocalName());
-
-        return builder;
-    }
-
-    @Override
-    public void addTypedef(TypeDefinitionBuilder typedefBuilder) {
-        String nodeName = typedefBuilder.getQName().getLocalName();
-        for (TypeDefinitionBuilder tdb : addedTypedefs) {
-            if (tdb.getQName().getLocalName().equals(nodeName)) {
-                throw new YangParseException(name, typedefBuilder.getLine(), "typedef with same name '" + nodeName
-                        + "' already declared at line " + tdb.getLine());
-            }
-        }
-        addedTypedefs.add(typedefBuilder);
-    }
-
-    public TypeDefinitionBuilderImpl addTypedef(final int line, final QName qname) {
-        final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(name, line, qname);
-
-        Builder parent = getActualNode();
-        builder.setParent(parent);
-
-        String typedefName = qname.getLocalName();
-        if (parent.equals(this)) {
-            for (TypeDefinitionBuilder tdb : addedTypedefs) {
-                if (tdb.getQName().getLocalName().equals(typedefName)) {
-                    throw new YangParseException(name, line, "typedef with same name '" + typedefName
-                            + "' already declared at line " + tdb.getLine());
-                }
-            }
-            addedTypedefs.add(builder);
-        } else {
-            if (parent instanceof DataNodeContainerBuilder) {
-                DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent;
-                for (TypeDefinitionBuilder child : parentNode.getTypeDefinitionBuilders()) {
-                    if (child.getQName().getLocalName().equals(typedefName)) {
-                        throw new YangParseException(name, line, "typedef with same name '" + typedefName
-                                + "' already declared at line " + child.getLine());
-                    }
-                }
-                parentNode.addTypedef(builder);
-            } else if (parent instanceof RpcDefinitionBuilder) {
-                RpcDefinitionBuilder rpcParent = (RpcDefinitionBuilder) parent;
-                for (TypeDefinitionBuilder tdb : rpcParent.getTypeDefinitions()) {
-                    if (tdb.getQName().getLocalName().equals(builder.getQName().getLocalName())) {
-                        throw new YangParseException(name, line, "typedef with same name '" + typedefName
-                                + "' already declared at line " + tdb.getLine());
-                    }
-                }
-                rpcParent.addTypedef(builder);
-            } else {
-                throw new YangParseException(name, line, "Unresolved parent of typedef " + typedefName);
-            }
-        }
-
-        return builder;
-    }
-
-    public void setType(final TypeDefinition<?> type) {
-        Builder parent = getActualNode();
-        if (parent == null || !(parent instanceof TypeAwareBuilder)) {
-            throw new YangParseException("Failed to set type '" + type.getQName().getLocalName()
-                    + "'. Invalid parent node: " + parent);
-        }
-        ((TypeAwareBuilder) parent).setType(type);
-    }
-
-    public UnionTypeBuilder addUnionType(final int line, final URI namespace, final Date revision) {
-        final Builder parent = getActualNode();
-        if (parent == null) {
-            throw new YangParseException(name, line, "Unresolved parent of union type");
-        } else {
-            final UnionTypeBuilder union = new UnionTypeBuilder(name, line);
-            if (parent instanceof TypeAwareBuilder) {
-                ((TypeAwareBuilder) parent).setTypedef(union);
-                return union;
-            } else {
-                throw new YangParseException(name, line, "Invalid parent of union type.");
-            }
-        }
-    }
-
-    public void addIdentityrefType(final int line, final SchemaPath schemaPath, final String baseString) {
-        final IdentityrefTypeBuilder identityref = new IdentityrefTypeBuilder(name, line, baseString, schemaPath);
-
-        final Builder parent = getActualNode();
-        if (parent == null) {
-            throw new YangParseException(name, line, "Unresolved parent of identityref type.");
-        } else {
-            if (parent instanceof TypeAwareBuilder) {
-                final TypeAwareBuilder typeParent = (TypeAwareBuilder) parent;
-                typeParent.setTypedef(identityref);
-                dirtyNodes.add(typeParent);
-            } else {
-                throw new YangParseException(name, line, "Invalid parent of identityref type.");
-            }
-        }
-    }
-
-    public DeviationBuilder addDeviation(final int line, final String targetPath) {
-        Builder parent = getActualNode();
-        if (!(parent.equals(this))) {
-            throw new YangParseException(name, line, "deviation can be defined only in module or submodule");
-        }
-
-        final DeviationBuilder builder = new DeviationBuilder(name, line, targetPath);
-        builder.setParent(parent);
-        addedDeviations.add(builder);
-        return builder;
-    }
-
-    public IdentitySchemaNodeBuilder addIdentity(final QName qname, final int line) {
-        Builder parent = getActualNode();
-        if (!(parent.equals(this))) {
-            throw new YangParseException(name, line, "identity can be defined only in module or submodule");
-        }
-        String identityName = qname.getLocalName();
-        for (IdentitySchemaNodeBuilder idBuilder : addedIdentities) {
-            if (idBuilder.getQName().equals(qname)) {
-                throw new YangParseException(name, line, "identity with same name '" + identityName
-                        + "' already declared at line " + idBuilder.getLine());
-            }
-        }
-
-        final IdentitySchemaNodeBuilder builder = new IdentitySchemaNodeBuilder(name, line, qname);
-        builder.setParent(parent);
-        addedIdentities.add(builder);
-        return builder;
-    }
-
-    @Override
-    public void addUnknownNodeBuilder(final UnknownSchemaNodeBuilder builder) {
-        addedUnknownNodes.add(builder);
-        allUnknownNodes.add(builder);
-    }
-
-    public UnknownSchemaNodeBuilder addUnknownSchemaNode(final int line, final QName qname) {
-        final Builder parent = getActualNode();
-        final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(name, line, qname);
-        builder.setParent(parent);
-        allUnknownNodes.add(builder);
-
-        if (parent.equals(this)) {
-            addedUnknownNodes.add(builder);
-        } else {
-            if (parent instanceof SchemaNodeBuilder) {
-                ((SchemaNodeBuilder) parent).addUnknownNodeBuilder(builder);
-            } else if (parent instanceof DataNodeContainerBuilder) {
-                ((DataNodeContainerBuilder) parent).addUnknownNodeBuilder(builder);
-            } else if (parent instanceof RefineHolder) {
-                ((RefineHolder) parent).addUnknownNodeBuilder(builder);
-            } else {
-                throw new YangParseException(name, line, "Unresolved parent of unknown node '" + qname.getLocalName()
-                        + "'");
-            }
-        }
-
-        return builder;
-    }
-
-    @Override
-    public String toString() {
-        return "module " + name;
-    }
-
-    private final class ModuleImpl implements Module {
-        private URI namespace;
-        private final String name;
-        private Date revision;
-        private String prefix;
-        private String yangVersion;
-        private String description;
-        private String reference;
-        private String organization;
-        private String contact;
-        private Set<ModuleImport> imports = Collections.emptySet();
-        private Set<FeatureDefinition> features = Collections.emptySet();
-        private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
-        private Set<NotificationDefinition> notifications = Collections.emptySet();
-        private Set<AugmentationSchema> augmentations = Collections.emptySet();
-        private Set<RpcDefinition> rpcs = Collections.emptySet();
-        private Set<Deviation> deviations = Collections.emptySet();
-        private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
-        private Set<GroupingDefinition> groupings = Collections.emptySet();
-        private Set<UsesNode> uses = Collections.emptySet();
-        private List<ExtensionDefinition> extensionNodes = Collections.emptyList();
-        private Set<IdentitySchemaNode> identities = Collections.emptySet();
-        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
-
-        private ModuleImpl(String name) {
-            this.name = name;
-        }
-
-        @Override
-        public URI getNamespace() {
-            return namespace;
-        }
-
-        private void setNamespace(URI namespace) {
-            this.namespace = namespace;
-        }
-
-        @Override
-        public String getName() {
-            return name;
-        }
-
-        @Override
-        public Date getRevision() {
-            return revision;
-        }
-
-        private void setRevision(Date revision) {
-            this.revision = revision;
-        }
-
-        @Override
-        public String getPrefix() {
-            return prefix;
-        }
-
-        private void setPrefix(String prefix) {
-            this.prefix = prefix;
-        }
-
-        @Override
-        public String getYangVersion() {
-            return yangVersion;
-        }
-
-        private void setYangVersion(String yangVersion) {
-            this.yangVersion = yangVersion;
-        }
-
-        @Override
-        public String getDescription() {
-            return description;
-        }
-
-        private void setDescription(String description) {
-            this.description = description;
-        }
-
-        @Override
-        public String getReference() {
-            return reference;
-        }
-
-        private void setReference(String reference) {
-            this.reference = reference;
-        }
-
-        @Override
-        public String getOrganization() {
-            return organization;
-        }
-
-        private void setOrganization(String organization) {
-            this.organization = organization;
-        }
-
-        @Override
-        public String getContact() {
-            return contact;
-        }
-
-        private void setContact(String contact) {
-            this.contact = contact;
-        }
-
-        @Override
-        public Set<ModuleImport> getImports() {
-            return imports;
-        }
-
-        private void setImports(Set<ModuleImport> imports) {
-            if (imports != null) {
-                this.imports = imports;
-            }
-        }
-
-        @Override
-        public Set<FeatureDefinition> getFeatures() {
-            return features;
-        }
-
-        private void setFeatures(Set<FeatureDefinition> features) {
-            if (features != null) {
-                this.features = features;
-            }
-        }
-
-        @Override
-        public Set<TypeDefinition<?>> getTypeDefinitions() {
-            return typeDefinitions;
-        }
-
-        private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
-            if (typeDefinitions != null) {
-                this.typeDefinitions = typeDefinitions;
-            }
-        }
-
-        @Override
-        public Set<NotificationDefinition> getNotifications() {
-            return notifications;
-        }
-
-        private void setNotifications(Set<NotificationDefinition> notifications) {
-            if (notifications != null) {
-                this.notifications = notifications;
-            }
-        }
-
-        @Override
-        public Set<AugmentationSchema> getAugmentations() {
-            return augmentations;
-        }
-
-        private void setAugmentations(Set<AugmentationSchema> augmentations) {
-            if (augmentations != null) {
-                this.augmentations = augmentations;
-            }
-        }
-
-        @Override
-        public Set<RpcDefinition> getRpcs() {
-            return rpcs;
-        }
-
-        private void setRpcs(Set<RpcDefinition> rpcs) {
-            if (rpcs != null) {
-                this.rpcs = rpcs;
-            }
-        }
-
-        @Override
-        public Set<Deviation> getDeviations() {
-            return deviations;
-        }
-
-        private void setDeviations(Set<Deviation> deviations) {
-            if (deviations != null) {
-                this.deviations = deviations;
-            }
-        }
-
-        @Override
-        public Set<DataSchemaNode> getChildNodes() {
-            return new LinkedHashSet<DataSchemaNode>(childNodes.values());
-        }
-
-        private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
-            if (childNodes != null) {
-                this.childNodes = childNodes;
-            }
-        }
-
-        @Override
-        public Set<GroupingDefinition> getGroupings() {
-            return groupings;
-        }
-
-        private void setGroupings(Set<GroupingDefinition> groupings) {
-            if (groupings != null) {
-                this.groupings = groupings;
-            }
-        }
-
-        @Override
-        public Set<UsesNode> getUses() {
-            return uses;
-        }
-
-        private void setUses(Set<UsesNode> uses) {
-            if (uses != null) {
-                this.uses = uses;
-            }
-        }
-
-        @Override
-        public List<ExtensionDefinition> getExtensionSchemaNodes() {
-            return extensionNodes;
-        }
-
-        private void setExtensionSchemaNodes(final List<ExtensionDefinition> extensionNodes) {
-            if (extensionNodes != null) {
-                this.extensionNodes = extensionNodes;
-            }
-        }
-
-        @Override
-        public Set<IdentitySchemaNode> getIdentities() {
-            return identities;
-        }
-
-        private void setIdentities(final Set<IdentitySchemaNode> identities) {
-            if (identities != null) {
-                this.identities = identities;
-            }
-        }
-
-        @Override
-        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return unknownNodes;
-        }
-
-        private void setUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes = unknownNodes;
-            }
-        }
-
-        @Override
-        public DataSchemaNode getDataChildByName(QName name) {
-            return childNodes.get(name);
-        }
-
-        @Override
-        public DataSchemaNode getDataChildByName(String name) {
-            DataSchemaNode result = null;
-            for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
-                if (entry.getKey().getLocalName().equals(name)) {
-                    result = entry.getValue();
-                    break;
-                }
-            }
-            return result;
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((namespace == null) ? 0 : namespace.hashCode());
-            result = prime * result + ((name == null) ? 0 : name.hashCode());
-            result = prime * result + ((revision == null) ? 0 : revision.hashCode());
-            result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
-            result = prime * result + ((yangVersion == null) ? 0 : yangVersion.hashCode());
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj == null) {
-                return false;
-            }
-            if (getClass() != obj.getClass()) {
-                return false;
-            }
-            ModuleImpl other = (ModuleImpl) obj;
-            if (namespace == null) {
-                if (other.namespace != null) {
-                    return false;
-                }
-            } else if (!namespace.equals(other.namespace)) {
-                return false;
-            }
-            if (name == null) {
-                if (other.name != null) {
-                    return false;
-                }
-            } else if (!name.equals(other.name)) {
-                return false;
-            }
-            if (revision == null) {
-                if (other.revision != null) {
-                    return false;
-                }
-            } else if (!revision.equals(other.revision)) {
-                return false;
-            }
-            if (prefix == null) {
-                if (other.prefix != null) {
-                    return false;
-                }
-            } else if (!prefix.equals(other.prefix)) {
-                return false;
-            }
-            if (yangVersion == null) {
-                if (other.yangVersion != null) {
-                    return false;
-                }
-            } else if (!yangVersion.equals(other.yangVersion)) {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder(ModuleImpl.class.getSimpleName());
-            sb.append("[");
-            sb.append("name=" + name);
-            sb.append(", namespace=" + namespace);
-            sb.append(", revision=" + revision);
-            sb.append(", prefix=" + prefix);
-            sb.append(", yangVersion=" + yangVersion);
-            sb.append("]");
-            return sb.toString();
-        }
-    }
-
-    /**
-     * Add child to parent. Method checks for duplicates and add given child
-     * node to parent. If node with same name is found, throws exception. If
-     * parent is null, child node will be added directly to module.
-     *
-     * @param parent
-     * @param child
-     * @param childName
-     */
-    private void addChildToParent(final Builder parent, final DataSchemaNodeBuilder child, final String childName) {
-        final int line = child.getLine();
-        if (parent.equals(this)) {
-            // if parent == null => node is defined under module
-            // All leafs, leaf-lists, lists, containers, choices, rpcs,
-            // notifications, and anyxmls defined within a parent node or at the
-            // top level of the module or its submodules share the same
-            // identifier namespace.
-            for (DataSchemaNodeBuilder childNode : addedChildNodes) {
-                if (childNode.getQName().getLocalName().equals(childName)) {
-                    throw new YangParseException(name, line, "Can not add '" + child
-                            + "': node with same name already declared at line " + childNode.getLine());
-                }
-            }
-            for (RpcDefinitionBuilder rpc : addedRpcs) {
-                if (rpc.getQName().getLocalName().equals(childName)) {
-                    throw new YangParseException(name, line, "Can not add '" + child
-                            + "': rpc with same name already declared at line " + rpc.getLine());
-                }
-            }
-            for (NotificationBuilder notification : addedNotifications) {
-                if (notification.getQName().getLocalName().equals(childName)) {
-                    throw new YangParseException(name, line, "Can not add '" + child
-                            + "': notification with same name already declared at line " + notification.getLine());
-                }
-            }
-            addedChildNodes.add(child);
-        } else {
-            if(parent instanceof AugmentationSchemaBuilder) {
-                child.setAugmenting(true);
-            }
-            // no need for checking rpc and notification because they can be
-            // defined only under module or submodule
-            if (parent instanceof DataNodeContainerBuilder) {
-                DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent;
-                for (DataSchemaNodeBuilder childNode : parentNode.getChildNodeBuilders()) {
-                    if (childNode.getQName().getLocalName().equals(childName)) {
-                        throw new YangParseException(name, line, "Can not add '" + child + "': node with same name '"
-                                + childName + "' already declared at line " + childNode.getLine());
-                    }
-                }
-                parentNode.addChildNode(child);
-            } else if (parent instanceof ChoiceBuilder) {
-                ChoiceBuilder parentNode = (ChoiceBuilder) parent;
-                for (ChoiceCaseBuilder caseBuilder : parentNode.getCases()) {
-                    if (caseBuilder.getQName().getLocalName().equals(childName)) {
-                        throw new YangParseException(name, line, "Can not add '" + child + "': case with same name '"
-                                + childName + "' already declared at line " + caseBuilder.getLine());
-                    }
-                }
-                parentNode.addCase(child);
-            } else {
-                throw new YangParseException(name, line, "Unresolved parent of node '" + childName + "'.");
-            }
-        }
-    }
-
-    private ModuleImport createModuleImport(final String moduleName, final Date revision, final String prefix) {
-        final ModuleImport moduleImport = new ModuleImport() {
-            @Override
-            public String getModuleName() {
-                return moduleName;
-            }
-
-            @Override
-            public Date getRevision() {
-                return revision;
-            }
-
-            @Override
-            public String getPrefix() {
-                return prefix;
-            }
-
-            @Override
-            public int hashCode() {
-                final int prime = 31;
-                int result = 1;
-                result = prime * result + ((moduleName == null) ? 0 : moduleName.hashCode());
-                result = prime * result + ((revision == null) ? 0 : revision.hashCode());
-                result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
-                return result;
-            }
-
-            @Override
-            public boolean equals(Object obj) {
-                if (this == obj) {
-                    return true;
-                }
-                if (obj == null) {
-                    return false;
-                }
-                if (getClass() != obj.getClass()) {
-                    return false;
-                }
-                ModuleImport other = (ModuleImport) obj;
-                if (getModuleName() == null) {
-                    if (other.getModuleName() != null) {
-                        return false;
-                    }
-                } else if (!getModuleName().equals(other.getModuleName())) {
-                    return false;
-                }
-                if (getRevision() == null) {
-                    if (other.getRevision() != null) {
-                        return false;
-                    }
-                } else if (!getRevision().equals(other.getRevision())) {
-                    return false;
-                }
-                if (getPrefix() == null) {
-                    if (other.getPrefix() != null) {
-                        return false;
-                    }
-                } else if (!getPrefix().equals(other.getPrefix())) {
-                    return false;
-                }
-                return true;
-            }
-
-            @Override
-            public String toString() {
-                return "ModuleImport[moduleName=" + moduleName + ", revision=" + revision + ", prefix=" + prefix + "]";
-            }
-        };
-        return moduleImport;
-    }
-
-}
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.yangtools.yang.parser.builder.impl;\r
+\r
+import java.net.URI;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.HashSet;\r
+import java.util.LinkedHashSet;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.TreeMap;\r
+import java.util.TreeSet;\r
+\r
+import org.opendaylight.yangtools.yang.common.QName;\r
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;\r
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;\r
+import org.opendaylight.yangtools.yang.model.api.Deviation;\r
+import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.FeatureDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;\r
+import org.opendaylight.yangtools.yang.model.api.Module;\r
+import org.opendaylight.yangtools.yang.model.api.ModuleImport;\r
+import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;\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.UsesNode;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.Builder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.util.Comparators;\r
+import org.opendaylight.yangtools.yang.parser.util.RefineHolder;\r
+import org.opendaylight.yangtools.yang.parser.util.YangParseException;\r
+\r
+/**\r
+ * Builder of Module object. If this module is dependent on external\r
+ * module/modules, these dependencies must be resolved before module is built,\r
+ * otherwise result may not be valid.\r
+ */\r
+public class ModuleBuilder extends AbstractDataNodeContainerBuilder {\r
+    private final ModuleImpl instance;\r
+    private final String name;\r
+    private final SchemaPath schemaPath;\r
+    private URI namespace;\r
+    private String prefix;\r
+    private Date revision;\r
+\r
+    private final LinkedList<Builder> actualPath = new LinkedList<Builder>();\r
+    private final Set<TypeAwareBuilder> dirtyNodes = new HashSet<TypeAwareBuilder>();\r
+\r
+    private final Set<ModuleImport> imports = new HashSet<ModuleImport>();\r
+    private final List<AugmentationSchemaBuilder> addedAugments = new ArrayList<AugmentationSchemaBuilder>();\r
+    private final List<AugmentationSchemaBuilder> allAugments = new ArrayList<AugmentationSchemaBuilder>();\r
+    private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();\r
+    private final List<UsesNodeBuilder> allUsesNodes = new ArrayList<UsesNodeBuilder>();\r
+    private final Set<RpcDefinitionBuilder> addedRpcs = new HashSet<RpcDefinitionBuilder>();\r
+    private final Set<NotificationBuilder> addedNotifications = new HashSet<NotificationBuilder>();\r
+    private final Set<IdentitySchemaNodeBuilder> addedIdentities = new HashSet<IdentitySchemaNodeBuilder>();\r
+    private final Set<FeatureBuilder> addedFeatures = new HashSet<FeatureBuilder>();\r
+    private final Set<DeviationBuilder> addedDeviations = new HashSet<DeviationBuilder>();\r
+    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();\r
+    private final List<ExtensionBuilder> addedExtensions = new ArrayList<ExtensionBuilder>();\r
+    private final List<UnknownSchemaNodeBuilder> allUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();\r
+\r
+    public ModuleBuilder(final String name) {\r
+        super(name, 0, null);\r
+        this.name = name;\r
+        schemaPath = new SchemaPath(Collections.<QName>emptyList(), true);\r
+        instance = new ModuleImpl(name);\r
+        actualPath.push(this);\r
+    }\r
+\r
+    /**\r
+     * Build new Module object based on this builder.\r
+     */\r
+    @Override\r
+    public Module build() {\r
+        instance.setPrefix(prefix);\r
+        instance.setRevision(revision);\r
+        instance.setImports(imports);\r
+        instance.setNamespace(namespace);\r
+\r
+        // TYPEDEFS\r
+        final Set<TypeDefinition<?>> typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);\r
+        for (TypeDefinitionBuilder tdb : addedTypedefs) {\r
+            typedefs.add(tdb.build());\r
+        }\r
+        instance.setTypeDefinitions(typedefs);\r
+\r
+        // CHILD NODES\r
+        final Map<QName, DataSchemaNode> children = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);\r
+        for (DataSchemaNodeBuilder child : addedChildNodes) {\r
+            children.put(child.getQName(), child.build());\r
+        }\r
+        instance.setChildNodes(children);\r
+\r
+        // GROUPINGS\r
+        final Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);\r
+        for (GroupingBuilder gb : addedGroupings) {\r
+            groupings.add(gb.build());\r
+        }\r
+        instance.setGroupings(groupings);\r
+\r
+        // USES\r
+        final Set<UsesNode> usesDefinitions = new HashSet<UsesNode>();\r
+        for (UsesNodeBuilder unb : addedUsesNodes) {\r
+            usesDefinitions.add(unb.build());\r
+        }\r
+        instance.setUses(usesDefinitions);\r
+\r
+        // FEATURES\r
+        final Set<FeatureDefinition> features = new TreeSet<FeatureDefinition>(Comparators.SCHEMA_NODE_COMP);\r
+        for (FeatureBuilder fb : addedFeatures) {\r
+            features.add(fb.build());\r
+        }\r
+        instance.setFeatures(features);\r
+\r
+        // NOTIFICATIONS\r
+        final Set<NotificationDefinition> notifications = new TreeSet<NotificationDefinition>(\r
+                Comparators.SCHEMA_NODE_COMP);\r
+        for (NotificationBuilder entry : addedNotifications) {\r
+            notifications.add(entry.build());\r
+        }\r
+        instance.setNotifications(notifications);\r
+\r
+        // AUGMENTATIONS\r
+        final Set<AugmentationSchema> augmentations = new HashSet<AugmentationSchema>();\r
+        for (AugmentationSchemaBuilder builder : addedAugments) {\r
+            augmentations.add(builder.build());\r
+        }\r
+        instance.setAugmentations(augmentations);\r
+\r
+        // RPCs\r
+        final Set<RpcDefinition> rpcs = new TreeSet<RpcDefinition>(Comparators.SCHEMA_NODE_COMP);\r
+        for (RpcDefinitionBuilder rpc : addedRpcs) {\r
+            rpcs.add(rpc.build());\r
+        }\r
+        instance.setRpcs(rpcs);\r
+\r
+        // DEVIATIONS\r
+        final Set<Deviation> deviations = new HashSet<Deviation>();\r
+        for (DeviationBuilder entry : addedDeviations) {\r
+            deviations.add(entry.build());\r
+        }\r
+        instance.setDeviations(deviations);\r
+\r
+        // EXTENSIONS\r
+        final List<ExtensionDefinition> extensions = new ArrayList<ExtensionDefinition>();\r
+        for (ExtensionBuilder eb : addedExtensions) {\r
+            extensions.add(eb.build());\r
+        }\r
+        Collections.sort(extensions, Comparators.SCHEMA_NODE_COMP);\r
+        instance.setExtensionSchemaNodes(extensions);\r
+\r
+        // IDENTITIES\r
+        final Set<IdentitySchemaNode> identities = new TreeSet<IdentitySchemaNode>(Comparators.SCHEMA_NODE_COMP);\r
+        for (IdentitySchemaNodeBuilder id : addedIdentities) {\r
+            identities.add(id.build());\r
+        }\r
+        instance.setIdentities(identities);\r
+\r
+        // UNKNOWN NODES\r
+        final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();\r
+        for (UnknownSchemaNodeBuilder unb : addedUnknownNodes) {\r
+            unknownNodes.add(unb.build());\r
+        }\r
+        instance.setUnknownSchemaNodes(unknownNodes);\r
+\r
+        return instance;\r
+    }\r
+\r
+    public boolean isAllUsesDataCollected() {\r
+        for(UsesNodeBuilder usesNode : allUsesNodes) {\r
+            if(!usesNode.isDataCollected()) {\r
+                return false;\r
+            }\r
+        }\r
+        return true;\r
+    }\r
+\r
+    @Override\r
+    public void setParent(Builder parent) {\r
+        throw new YangParseException(name, 0, "Can not set parent to module");\r
+    }\r
+\r
+    @Override\r
+    public SchemaPath getPath() {\r
+        return schemaPath;\r
+    }\r
+\r
+    @Override\r
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {\r
+        return addedTypedefs;\r
+    }\r
+\r
+    public void enterNode(final Builder node) {\r
+        actualPath.push(node);\r
+    }\r
+\r
+    public void exitNode() {\r
+        actualPath.pop();\r
+    }\r
+\r
+    public Builder getActualNode() {\r
+        if (actualPath.isEmpty()) {\r
+            return null;\r
+        } else {\r
+            return actualPath.get(0);\r
+        }\r
+    }\r
+\r
+    public Builder getActualParent() {\r
+        if (actualPath.size() < 2) {\r
+            return null;\r
+        } else {\r
+            return actualPath.get(1);\r
+        }\r
+    }\r
+\r
+    public Set<TypeAwareBuilder> getDirtyNodes() {\r
+        return dirtyNodes;\r
+    }\r
+\r
+    public List<AugmentationSchemaBuilder> getAllAugments() {\r
+        return allAugments;\r
+    }\r
+\r
+    public Set<IdentitySchemaNodeBuilder> getIdentities() {\r
+        return addedIdentities;\r
+    }\r
+\r
+    public List<UsesNodeBuilder> getAllUsesNodes() {\r
+        return allUsesNodes;\r
+    }\r
+\r
+    public Set<DeviationBuilder> getDeviations() {\r
+        return addedDeviations;\r
+    }\r
+\r
+    public List<ExtensionBuilder> getExtensions() {\r
+        return addedExtensions;\r
+    }\r
+\r
+    public List<UnknownSchemaNodeBuilder> getAllUnknownNodes() {\r
+        return allUnknownNodes;\r
+    }\r
+\r
+    public String getName() {\r
+        return name;\r
+    }\r
+\r
+    public URI getNamespace() {\r
+        return namespace;\r
+    }\r
+\r
+    public void setNamespace(final URI namespace) {\r
+        this.namespace = namespace;\r
+    }\r
+\r
+    public String getPrefix() {\r
+        return prefix;\r
+    }\r
+\r
+    public Date getRevision() {\r
+        return revision;\r
+    }\r
+\r
+    public void markActualNodeDirty() {\r
+        final TypeAwareBuilder nodeBuilder = (TypeAwareBuilder) getActualNode();\r
+        dirtyNodes.add(nodeBuilder);\r
+    }\r
+\r
+    public void setRevision(final Date revision) {\r
+        this.revision = revision;\r
+    }\r
+\r
+    public void setPrefix(final String prefix) {\r
+        this.prefix = prefix;\r
+    }\r
+\r
+    public void setYangVersion(final String yangVersion) {\r
+        instance.setYangVersion(yangVersion);\r
+    }\r
+\r
+    public void setDescription(final String description) {\r
+        instance.setDescription(description);\r
+    }\r
+\r
+    public void setReference(final String reference) {\r
+        instance.setReference(reference);\r
+    }\r
+\r
+    public void setOrganization(final String organization) {\r
+        instance.setOrganization(organization);\r
+    }\r
+\r
+    public void setContact(final String contact) {\r
+        instance.setContact(contact);\r
+    }\r
+\r
+    public boolean addModuleImport(final String moduleName, final Date revision, final String prefix) {\r
+        final ModuleImport moduleImport = createModuleImport(moduleName, revision, prefix);\r
+        return imports.add(moduleImport);\r
+    }\r
+\r
+    public Set<ModuleImport> getModuleImports() {\r
+        return imports;\r
+    }\r
+\r
+    public ExtensionBuilder addExtension(final QName qname, final int line) {\r
+        final String extName = qname.getLocalName();\r
+        for (ExtensionBuilder addedExtension : addedExtensions) {\r
+            if (addedExtension.getQName().getLocalName().equals(extName)) {\r
+                throw new YangParseException(moduleName, line, "Can not add extension '" + extName\r
+                        + "': extension with same name already declared at line " + addedExtension.getLine());\r
+            }\r
+        }\r
+        final ExtensionBuilder builder = new ExtensionBuilder(name, line, qname);\r
+        addedExtensions.add(builder);\r
+        return builder;\r
+    }\r
+\r
+    public ContainerSchemaNodeBuilder addContainerNode(final int line, final QName qname, final SchemaPath schemaPath) {\r
+        final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+        addChildToParent(parent, builder, qname.getLocalName());\r
+\r
+        return builder;\r
+    }\r
+\r
+    public ListSchemaNodeBuilder addListNode(final int line, final QName qname, final SchemaPath schemaPath) {\r
+        final ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(name, line, qname, schemaPath);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+        addChildToParent(parent, builder, qname.getLocalName());\r
+\r
+        return builder;\r
+    }\r
+\r
+    public LeafSchemaNodeBuilder addLeafNode(final int line, final QName qname, final SchemaPath schemaPath) {\r
+        final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(name, line, qname, schemaPath);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+        addChildToParent(parent, builder, qname.getLocalName());\r
+\r
+        return builder;\r
+    }\r
+\r
+    public LeafListSchemaNodeBuilder addLeafListNode(final int line, final QName qname, final SchemaPath schemaPath) {\r
+        final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(name, line, qname, schemaPath);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+        addChildToParent(parent, builder, qname.getLocalName());\r
+\r
+        return builder;\r
+    }\r
+\r
+    public GroupingBuilder addGrouping(final int line, final QName qname) {\r
+        final GroupingBuilder builder = new GroupingBuilderImpl(name, line, qname);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+\r
+        String groupingName = qname.getLocalName();\r
+        if (parent.equals(this)) {\r
+            for (GroupingBuilder addedGrouping : addedGroupings) {\r
+                if (addedGrouping.getQName().getLocalName().equals(groupingName)) {\r
+                    throw new YangParseException(name, line, "grouping with same name '" + groupingName\r
+                            + "' already declared at line " + addedGrouping.getLine());\r
+                }\r
+            }\r
+            addedGroupings.add(builder);\r
+        } else {\r
+            if (parent instanceof DataNodeContainerBuilder) {\r
+                DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent;\r
+                for (GroupingBuilder addedGrouping : parentNode.getGroupingBuilders()) {\r
+                    if (addedGrouping.getQName().getLocalName().equals(groupingName)) {\r
+                        throw new YangParseException(name, line, "grouping with same name '" + groupingName\r
+                                + "' already declared at line " + addedGrouping.getLine());\r
+                    }\r
+                }\r
+                parentNode.addGrouping(builder);\r
+            } else if (parent instanceof RpcDefinitionBuilder) {\r
+                RpcDefinitionBuilder parentNode = (RpcDefinitionBuilder) parent;\r
+                for (GroupingBuilder child : parentNode.getGroupings()) {\r
+                    if (child.getQName().getLocalName().equals(groupingName)) {\r
+                        throw new YangParseException(name, line, "grouping with same name '" + groupingName\r
+                                + "' already declared at line " + child.getLine());\r
+                    }\r
+                }\r
+                parentNode.addGrouping(builder);\r
+            } else {\r
+                throw new YangParseException(name, line, "Unresolved parent of grouping " + groupingName);\r
+            }\r
+        }\r
+\r
+        return builder;\r
+    }\r
+\r
+    public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr) {\r
+        final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+\r
+        if (parent.equals(this)) {\r
+            // augment can be declared only under 'module' ...\r
+            addedAugments.add(builder);\r
+        } else {\r
+            // ... or 'uses' statement\r
+            if (parent instanceof UsesNodeBuilder) {\r
+                ((UsesNodeBuilder) parent).addAugment(builder);\r
+            } else {\r
+                throw new YangParseException(name, line, "Augment can be declared only under module or uses statement.");\r
+            }\r
+        }\r
+        allAugments.add(builder);\r
+\r
+        return builder;\r
+    }\r
+\r
+    @Override\r
+    public Set<UsesNodeBuilder> getUsesNodes() {\r
+        return addedUsesNodes;\r
+    }\r
+\r
+    @Override\r
+    public void addUsesNode(UsesNodeBuilder usesBuilder) {\r
+        addedUsesNodes.add(usesBuilder);\r
+        allUsesNodes.add(usesBuilder);\r
+    }\r
+\r
+    public UsesNodeBuilder addUsesNode(final int line, final String groupingPathStr) {\r
+        final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, groupingPathStr);\r
+\r
+        Builder parent = getActualNode();\r
+        usesBuilder.setParent(parent);\r
+\r
+        if (parent.equals(this)) {\r
+            addedUsesNodes.add(usesBuilder);\r
+        } else {\r
+            if (!(parent instanceof DataNodeContainerBuilder)) {\r
+                throw new YangParseException(name, line, "Unresolved parent of uses '" + groupingPathStr + "'.");\r
+            }\r
+            ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder);\r
+        }\r
+        allUsesNodes.add(usesBuilder);\r
+        return usesBuilder;\r
+    }\r
+\r
+    public void addRefine(final RefineHolder refine) {\r
+        final Builder parent = getActualNode();\r
+        if (!(parent instanceof UsesNodeBuilder)) {\r
+            throw new YangParseException(name, refine.getLine(), "refine can be defined only in uses statement");\r
+        }\r
+        ((UsesNodeBuilder) parent).addRefine(refine);\r
+        refine.setParent(parent);\r
+    }\r
+\r
+    public RpcDefinitionBuilder addRpc(final int line, final QName qname) {\r
+        Builder parent = getActualNode();\r
+        if (!(parent.equals(this))) {\r
+            throw new YangParseException(name, line, "rpc can be defined only in module or submodule");\r
+        }\r
+\r
+        final RpcDefinitionBuilder rpcBuilder = new RpcDefinitionBuilder(name, line, qname);\r
+        rpcBuilder.setParent(parent);\r
+\r
+        String rpcName = qname.getLocalName();\r
+        for (RpcDefinitionBuilder rpc : addedRpcs) {\r
+            if (rpc.getQName().getLocalName().equals(rpcName)) {\r
+                throw new YangParseException(name, line, "rpc with same name '" + rpcName\r
+                        + "' already declared at line " + rpc.getLine());\r
+            }\r
+        }\r
+        for (DataSchemaNodeBuilder addedChild : addedChildNodes) {\r
+            if (addedChild.getQName().getLocalName().equals(rpcName)) {\r
+                throw new YangParseException(name, line, "Can not add rpc: node with same name '" + rpcName\r
+                        + "' already declared at line " + addedChild.getLine());\r
+            }\r
+        }\r
+        for (NotificationBuilder addedNotification : addedNotifications) {\r
+            if (addedNotification.getQName().getLocalName().equals(rpcName)) {\r
+                throw new YangParseException(name, line, "Can not add rpc: notification with same name '" + rpcName\r
+                        + "' already declared at line " + addedNotification.getLine());\r
+            }\r
+        }\r
+        addedRpcs.add(rpcBuilder);\r
+        return rpcBuilder;\r
+    }\r
+\r
+    public ContainerSchemaNodeBuilder addRpcInput(final int line, final QName qname, final SchemaPath schemaPath) {\r
+        final Builder parent = getActualNode();\r
+        if (!(parent instanceof RpcDefinitionBuilder)) {\r
+            throw new YangParseException(name, line, "input can be defined only in rpc statement");\r
+        }\r
+        final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent;\r
+\r
+        final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath);\r
+        inputBuilder.setParent(rpc);\r
+\r
+        rpc.setInput(inputBuilder);\r
+        return inputBuilder;\r
+    }\r
+\r
+    public ContainerSchemaNodeBuilder addRpcOutput(final SchemaPath schemaPath, final QName qname, final int line) {\r
+        final Builder parent = getActualNode();\r
+        if (!(parent instanceof RpcDefinitionBuilder)) {\r
+            throw new YangParseException(name, line, "output can be defined only in rpc statement");\r
+        }\r
+        final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent;\r
+\r
+        final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath);\r
+        outputBuilder.setParent(rpc);\r
+\r
+        rpc.setOutput(outputBuilder);\r
+        return outputBuilder;\r
+    }\r
+\r
+    public NotificationBuilder addNotification(final int line, final QName qname) {\r
+        final Builder parent = getActualNode();\r
+        if (!(parent.equals(this))) {\r
+            throw new YangParseException(name, line, "notification can be defined only in module or submodule");\r
+        }\r
+\r
+        String notificationName = qname.getLocalName();\r
+        for (NotificationBuilder nb : addedNotifications) {\r
+            if (nb.getQName().equals(qname)) {\r
+                throw new YangParseException(name, line, "notification with same name '" + notificationName\r
+                        + "' already declared at line " + nb.getLine());\r
+            }\r
+        }\r
+        for (RpcDefinitionBuilder rpc : addedRpcs) {\r
+            if (rpc.getQName().getLocalName().equals(notificationName)) {\r
+                throw new YangParseException(name, line, "Can not add notification: rpc with same name '"\r
+                        + notificationName + "' already declared at line " + rpc.getLine());\r
+            }\r
+        }\r
+        for (DataSchemaNodeBuilder addedChild : addedChildNodes) {\r
+            if (addedChild.getQName().getLocalName().equals(notificationName)) {\r
+                throw new YangParseException(name, line, "Can not add notification: node with same name '"\r
+                        + notificationName + "' already declared at line " + addedChild.getLine());\r
+            }\r
+        }\r
+\r
+        final NotificationBuilder builder = new NotificationBuilder(name, line, qname);\r
+        builder.setParent(parent);\r
+        addedNotifications.add(builder);\r
+\r
+        return builder;\r
+    }\r
+\r
+    public FeatureBuilder addFeature(final int line, final QName qname) {\r
+        Builder parent = getActualNode();\r
+        if (!(parent.equals(this))) {\r
+            throw new YangParseException(name, line, "feature can be defined only in module or submodule");\r
+        }\r
+\r
+        final FeatureBuilder builder = new FeatureBuilder(name, line, qname);\r
+        builder.setParent(parent);\r
+\r
+        String featureName = qname.getLocalName();\r
+        for (FeatureBuilder addedFeature : addedFeatures) {\r
+            if (addedFeature.getQName().getLocalName().equals(featureName)) {\r
+                throw new YangParseException(name, line, "feature with same name '" + featureName\r
+                        + "' already declared at line " + addedFeature.getLine());\r
+            }\r
+        }\r
+        addedFeatures.add(builder);\r
+        return builder;\r
+    }\r
+\r
+    public ChoiceBuilder addChoice(final int line, final QName qname) {\r
+        final ChoiceBuilder builder = new ChoiceBuilder(name, line, qname);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+        addChildToParent(parent, builder, qname.getLocalName());\r
+\r
+        return builder;\r
+    }\r
+\r
+    public ChoiceCaseBuilder addCase(final int line, final QName qname) {\r
+        Builder parent = getActualNode();\r
+        if (parent == null || parent.equals(this)) {\r
+            throw new YangParseException(name, line, "'case' parent not found");\r
+        }\r
+\r
+        final ChoiceCaseBuilder builder = new ChoiceCaseBuilder(name, line, qname);\r
+        builder.setParent(parent);\r
+\r
+        if (parent instanceof ChoiceBuilder) {\r
+            ((ChoiceBuilder) parent).addCase(builder);\r
+        } else if (parent instanceof AugmentationSchemaBuilder) {\r
+            ((AugmentationSchemaBuilder) parent).addChildNode(builder);\r
+        } else {\r
+            throw new YangParseException(name, line, "Unresolved parent of 'case' " + qname.getLocalName());\r
+        }\r
+\r
+        return builder;\r
+    }\r
+\r
+    public AnyXmlBuilder addAnyXml(final int line, final QName qname, final SchemaPath schemaPath) {\r
+        final AnyXmlBuilder builder = new AnyXmlBuilder(name, line, qname, schemaPath);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+        addChildToParent(parent, builder, qname.getLocalName());\r
+\r
+        return builder;\r
+    }\r
+\r
+    @Override\r
+    public void addTypedef(TypeDefinitionBuilder typedefBuilder) {\r
+        String nodeName = typedefBuilder.getQName().getLocalName();\r
+        for (TypeDefinitionBuilder tdb : addedTypedefs) {\r
+            if (tdb.getQName().getLocalName().equals(nodeName)) {\r
+                throw new YangParseException(name, typedefBuilder.getLine(), "typedef with same name '" + nodeName\r
+                        + "' already declared at line " + tdb.getLine());\r
+            }\r
+        }\r
+        addedTypedefs.add(typedefBuilder);\r
+    }\r
+\r
+    public TypeDefinitionBuilderImpl addTypedef(final int line, final QName qname) {\r
+        final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(name, line, qname);\r
+\r
+        Builder parent = getActualNode();\r
+        builder.setParent(parent);\r
+\r
+        String typedefName = qname.getLocalName();\r
+        if (parent.equals(this)) {\r
+            for (TypeDefinitionBuilder tdb : addedTypedefs) {\r
+                if (tdb.getQName().getLocalName().equals(typedefName)) {\r
+                    throw new YangParseException(name, line, "typedef with same name '" + typedefName\r
+                            + "' already declared at line " + tdb.getLine());\r
+                }\r
+            }\r
+            addedTypedefs.add(builder);\r
+        } else {\r
+            if (parent instanceof DataNodeContainerBuilder) {\r
+                DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent;\r
+                for (TypeDefinitionBuilder child : parentNode.getTypeDefinitionBuilders()) {\r
+                    if (child.getQName().getLocalName().equals(typedefName)) {\r
+                        throw new YangParseException(name, line, "typedef with same name '" + typedefName\r
+                                + "' already declared at line " + child.getLine());\r
+                    }\r
+                }\r
+                parentNode.addTypedef(builder);\r
+            } else if (parent instanceof RpcDefinitionBuilder) {\r
+                RpcDefinitionBuilder rpcParent = (RpcDefinitionBuilder) parent;\r
+                for (TypeDefinitionBuilder tdb : rpcParent.getTypeDefinitions()) {\r
+                    if (tdb.getQName().getLocalName().equals(builder.getQName().getLocalName())) {\r
+                        throw new YangParseException(name, line, "typedef with same name '" + typedefName\r
+                                + "' already declared at line " + tdb.getLine());\r
+                    }\r
+                }\r
+                rpcParent.addTypedef(builder);\r
+            } else {\r
+                throw new YangParseException(name, line, "Unresolved parent of typedef " + typedefName);\r
+            }\r
+        }\r
+\r
+        return builder;\r
+    }\r
+\r
+    public void setType(final TypeDefinition<?> type) {\r
+        Builder parent = getActualNode();\r
+        if (parent == null || !(parent instanceof TypeAwareBuilder)) {\r
+            throw new YangParseException("Failed to set type '" + type.getQName().getLocalName()\r
+                    + "'. Invalid parent node: " + parent);\r
+        }\r
+        ((TypeAwareBuilder) parent).setType(type);\r
+    }\r
+\r
+    public UnionTypeBuilder addUnionType(final int line, final URI namespace, final Date revision) {\r
+        final Builder parent = getActualNode();\r
+        if (parent == null) {\r
+            throw new YangParseException(name, line, "Unresolved parent of union type");\r
+        } else {\r
+            final UnionTypeBuilder union = new UnionTypeBuilder(name, line);\r
+            if (parent instanceof TypeAwareBuilder) {\r
+                ((TypeAwareBuilder) parent).setTypedef(union);\r
+                return union;\r
+            } else {\r
+                throw new YangParseException(name, line, "Invalid parent of union type.");\r
+            }\r
+        }\r
+    }\r
+\r
+    public void addIdentityrefType(final int line, final SchemaPath schemaPath, final String baseString) {\r
+        final IdentityrefTypeBuilder identityref = new IdentityrefTypeBuilder(name, line, baseString, schemaPath);\r
+\r
+        final Builder parent = getActualNode();\r
+        if (parent == null) {\r
+            throw new YangParseException(name, line, "Unresolved parent of identityref type.");\r
+        } else {\r
+            if (parent instanceof TypeAwareBuilder) {\r
+                final TypeAwareBuilder typeParent = (TypeAwareBuilder) parent;\r
+                typeParent.setTypedef(identityref);\r
+                dirtyNodes.add(typeParent);\r
+            } else {\r
+                throw new YangParseException(name, line, "Invalid parent of identityref type.");\r
+            }\r
+        }\r
+    }\r
+\r
+    public DeviationBuilder addDeviation(final int line, final String targetPath) {\r
+        Builder parent = getActualNode();\r
+        if (!(parent.equals(this))) {\r
+            throw new YangParseException(name, line, "deviation can be defined only in module or submodule");\r
+        }\r
+\r
+        final DeviationBuilder builder = new DeviationBuilder(name, line, targetPath);\r
+        builder.setParent(parent);\r
+        addedDeviations.add(builder);\r
+        return builder;\r
+    }\r
+\r
+    public IdentitySchemaNodeBuilder addIdentity(final QName qname, final int line) {\r
+        Builder parent = getActualNode();\r
+        if (!(parent.equals(this))) {\r
+            throw new YangParseException(name, line, "identity can be defined only in module or submodule");\r
+        }\r
+        String identityName = qname.getLocalName();\r
+        for (IdentitySchemaNodeBuilder idBuilder : addedIdentities) {\r
+            if (idBuilder.getQName().equals(qname)) {\r
+                throw new YangParseException(name, line, "identity with same name '" + identityName\r
+                        + "' already declared at line " + idBuilder.getLine());\r
+            }\r
+        }\r
+\r
+        final IdentitySchemaNodeBuilder builder = new IdentitySchemaNodeBuilder(name, line, qname);\r
+        builder.setParent(parent);\r
+        addedIdentities.add(builder);\r
+        return builder;\r
+    }\r
+\r
+    @Override\r
+    public void addUnknownNodeBuilder(final UnknownSchemaNodeBuilder builder) {\r
+        addedUnknownNodes.add(builder);\r
+        allUnknownNodes.add(builder);\r
+    }\r
+\r
+    public UnknownSchemaNodeBuilder addUnknownSchemaNode(final int line, final QName qname) {\r
+        final Builder parent = getActualNode();\r
+        final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(name, line, qname);\r
+        builder.setParent(parent);\r
+        allUnknownNodes.add(builder);\r
+\r
+        if (parent.equals(this)) {\r
+            addedUnknownNodes.add(builder);\r
+        } else {\r
+            if (parent instanceof SchemaNodeBuilder) {\r
+                ((SchemaNodeBuilder) parent).addUnknownNodeBuilder(builder);\r
+            } else if (parent instanceof DataNodeContainerBuilder) {\r
+                ((DataNodeContainerBuilder) parent).addUnknownNodeBuilder(builder);\r
+            } else if (parent instanceof RefineHolder) {\r
+                ((RefineHolder) parent).addUnknownNodeBuilder(builder);\r
+            } else {\r
+                throw new YangParseException(name, line, "Unresolved parent of unknown node '" + qname.getLocalName()\r
+                        + "'");\r
+            }\r
+        }\r
+\r
+        return builder;\r
+    }\r
+    \r
+    public Set<RpcDefinitionBuilder> getRpcs() {\r
+        return addedRpcs;\r
+    }\r
+\r
+    public Set<NotificationBuilder> getNotifications() {\r
+        return addedNotifications;\r
+    }\r
+    \r
+    @Override\r
+    public String toString() {\r
+        return "module " + name;\r
+    }\r
+\r
+    private final class ModuleImpl implements Module {\r
+        private URI namespace;\r
+        private final String name;\r
+        private Date revision;\r
+        private String prefix;\r
+        private String yangVersion;\r
+        private String description;\r
+        private String reference;\r
+        private String organization;\r
+        private String contact;\r
+        private Set<ModuleImport> imports = Collections.emptySet();\r
+        private Set<FeatureDefinition> features = Collections.emptySet();\r
+        private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();\r
+        private Set<NotificationDefinition> notifications = Collections.emptySet();\r
+        private Set<AugmentationSchema> augmentations = Collections.emptySet();\r
+        private Set<RpcDefinition> rpcs = Collections.emptySet();\r
+        private Set<Deviation> deviations = Collections.emptySet();\r
+        private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();\r
+        private Set<GroupingDefinition> groupings = Collections.emptySet();\r
+        private Set<UsesNode> uses = Collections.emptySet();\r
+        private List<ExtensionDefinition> extensionNodes = Collections.emptyList();\r
+        private Set<IdentitySchemaNode> identities = Collections.emptySet();\r
+        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();\r
+\r
+        private ModuleImpl(String name) {\r
+            this.name = name;\r
+        }\r
+\r
+        @Override\r
+        public URI getNamespace() {\r
+            return namespace;\r
+        }\r
+\r
+        private void setNamespace(URI namespace) {\r
+            this.namespace = namespace;\r
+        }\r
+\r
+        @Override\r
+        public String getName() {\r
+            return name;\r
+        }\r
+\r
+        @Override\r
+        public Date getRevision() {\r
+            return revision;\r
+        }\r
+\r
+        private void setRevision(Date revision) {\r
+            this.revision = revision;\r
+        }\r
+\r
+        @Override\r
+        public String getPrefix() {\r
+            return prefix;\r
+        }\r
+\r
+        private void setPrefix(String prefix) {\r
+            this.prefix = prefix;\r
+        }\r
+\r
+        @Override\r
+        public String getYangVersion() {\r
+            return yangVersion;\r
+        }\r
+\r
+        private void setYangVersion(String yangVersion) {\r
+            this.yangVersion = yangVersion;\r
+        }\r
+\r
+        @Override\r
+        public String getDescription() {\r
+            return description;\r
+        }\r
+\r
+        private void setDescription(String description) {\r
+            this.description = description;\r
+        }\r
+\r
+        @Override\r
+        public String getReference() {\r
+            return reference;\r
+        }\r
+\r
+        private void setReference(String reference) {\r
+            this.reference = reference;\r
+        }\r
+\r
+        @Override\r
+        public String getOrganization() {\r
+            return organization;\r
+        }\r
+\r
+        private void setOrganization(String organization) {\r
+            this.organization = organization;\r
+        }\r
+\r
+        @Override\r
+        public String getContact() {\r
+            return contact;\r
+        }\r
+\r
+        private void setContact(String contact) {\r
+            this.contact = contact;\r
+        }\r
+\r
+        @Override\r
+        public Set<ModuleImport> getImports() {\r
+            return imports;\r
+        }\r
+\r
+        private void setImports(Set<ModuleImport> imports) {\r
+            if (imports != null) {\r
+                this.imports = imports;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<FeatureDefinition> getFeatures() {\r
+            return features;\r
+        }\r
+\r
+        private void setFeatures(Set<FeatureDefinition> features) {\r
+            if (features != null) {\r
+                this.features = features;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<TypeDefinition<?>> getTypeDefinitions() {\r
+            return typeDefinitions;\r
+        }\r
+\r
+        private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {\r
+            if (typeDefinitions != null) {\r
+                this.typeDefinitions = typeDefinitions;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<NotificationDefinition> getNotifications() {\r
+            return notifications;\r
+        }\r
+\r
+        private void setNotifications(Set<NotificationDefinition> notifications) {\r
+            if (notifications != null) {\r
+                this.notifications = notifications;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<AugmentationSchema> getAugmentations() {\r
+            return augmentations;\r
+        }\r
+\r
+        private void setAugmentations(Set<AugmentationSchema> augmentations) {\r
+            if (augmentations != null) {\r
+                this.augmentations = augmentations;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<RpcDefinition> getRpcs() {\r
+            return rpcs;\r
+        }\r
+\r
+        private void setRpcs(Set<RpcDefinition> rpcs) {\r
+            if (rpcs != null) {\r
+                this.rpcs = rpcs;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<Deviation> getDeviations() {\r
+            return deviations;\r
+        }\r
+\r
+        private void setDeviations(Set<Deviation> deviations) {\r
+            if (deviations != null) {\r
+                this.deviations = deviations;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<DataSchemaNode> getChildNodes() {\r
+            return new LinkedHashSet<DataSchemaNode>(childNodes.values());\r
+        }\r
+\r
+        private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {\r
+            if (childNodes != null) {\r
+                this.childNodes = childNodes;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<GroupingDefinition> getGroupings() {\r
+            return groupings;\r
+        }\r
+\r
+        private void setGroupings(Set<GroupingDefinition> groupings) {\r
+            if (groupings != null) {\r
+                this.groupings = groupings;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<UsesNode> getUses() {\r
+            return uses;\r
+        }\r
+\r
+        private void setUses(Set<UsesNode> uses) {\r
+            if (uses != null) {\r
+                this.uses = uses;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public List<ExtensionDefinition> getExtensionSchemaNodes() {\r
+            return extensionNodes;\r
+        }\r
+\r
+        private void setExtensionSchemaNodes(final List<ExtensionDefinition> extensionNodes) {\r
+            if (extensionNodes != null) {\r
+                this.extensionNodes = extensionNodes;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public Set<IdentitySchemaNode> getIdentities() {\r
+            return identities;\r
+        }\r
+\r
+        private void setIdentities(final Set<IdentitySchemaNode> identities) {\r
+            if (identities != null) {\r
+                this.identities = identities;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {\r
+            return unknownNodes;\r
+        }\r
+\r
+        private void setUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {\r
+            if (unknownNodes != null) {\r
+                this.unknownNodes = unknownNodes;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public DataSchemaNode getDataChildByName(QName name) {\r
+            return childNodes.get(name);\r
+        }\r
+\r
+        @Override\r
+        public DataSchemaNode getDataChildByName(String name) {\r
+            DataSchemaNode result = null;\r
+            for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {\r
+                if (entry.getKey().getLocalName().equals(name)) {\r
+                    result = entry.getValue();\r
+                    break;\r
+                }\r
+            }\r
+            return result;\r
+        }\r
+\r
+        @Override\r
+        public int hashCode() {\r
+            final int prime = 31;\r
+            int result = 1;\r
+            result = prime * result + ((namespace == null) ? 0 : namespace.hashCode());\r
+            result = prime * result + ((name == null) ? 0 : name.hashCode());\r
+            result = prime * result + ((revision == null) ? 0 : revision.hashCode());\r
+            result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());\r
+            result = prime * result + ((yangVersion == null) ? 0 : yangVersion.hashCode());\r
+            return result;\r
+        }\r
+\r
+        @Override\r
+        public boolean equals(Object obj) {\r
+            if (this == obj) {\r
+                return true;\r
+            }\r
+            if (obj == null) {\r
+                return false;\r
+            }\r
+            if (getClass() != obj.getClass()) {\r
+                return false;\r
+            }\r
+            ModuleImpl other = (ModuleImpl) obj;\r
+            if (namespace == null) {\r
+                if (other.namespace != null) {\r
+                    return false;\r
+                }\r
+            } else if (!namespace.equals(other.namespace)) {\r
+                return false;\r
+            }\r
+            if (name == null) {\r
+                if (other.name != null) {\r
+                    return false;\r
+                }\r
+            } else if (!name.equals(other.name)) {\r
+                return false;\r
+            }\r
+            if (revision == null) {\r
+                if (other.revision != null) {\r
+                    return false;\r
+                }\r
+            } else if (!revision.equals(other.revision)) {\r
+                return false;\r
+            }\r
+            if (prefix == null) {\r
+                if (other.prefix != null) {\r
+                    return false;\r
+                }\r
+            } else if (!prefix.equals(other.prefix)) {\r
+                return false;\r
+            }\r
+            if (yangVersion == null) {\r
+                if (other.yangVersion != null) {\r
+                    return false;\r
+                }\r
+            } else if (!yangVersion.equals(other.yangVersion)) {\r
+                return false;\r
+            }\r
+            return true;\r
+        }\r
+\r
+        @Override\r
+        public String toString() {\r
+            StringBuilder sb = new StringBuilder(ModuleImpl.class.getSimpleName());\r
+            sb.append("[");\r
+            sb.append("name=" + name);\r
+            sb.append(", namespace=" + namespace);\r
+            sb.append(", revision=" + revision);\r
+            sb.append(", prefix=" + prefix);\r
+            sb.append(", yangVersion=" + yangVersion);\r
+            sb.append("]");\r
+            return sb.toString();\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Add child to parent. Method checks for duplicates and add given child\r
+     * node to parent. If node with same name is found, throws exception. If\r
+     * parent is null, child node will be added directly to module.\r
+     *\r
+     * @param parent\r
+     * @param child\r
+     * @param childName\r
+     */\r
+    private void addChildToParent(final Builder parent, final DataSchemaNodeBuilder child, final String childName) {\r
+        final int line = child.getLine();\r
+        if (parent.equals(this)) {\r
+            // if parent == null => node is defined under module\r
+            // All leafs, leaf-lists, lists, containers, choices, rpcs,\r
+            // notifications, and anyxmls defined within a parent node or at the\r
+            // top level of the module or its submodules share the same\r
+            // identifier namespace.\r
+            for (DataSchemaNodeBuilder childNode : addedChildNodes) {\r
+                if (childNode.getQName().getLocalName().equals(childName)) {\r
+                    throw new YangParseException(name, line, "Can not add '" + child\r
+                            + "': node with same name already declared at line " + childNode.getLine());\r
+                }\r
+            }\r
+            for (RpcDefinitionBuilder rpc : addedRpcs) {\r
+                if (rpc.getQName().getLocalName().equals(childName)) {\r
+                    throw new YangParseException(name, line, "Can not add '" + child\r
+                            + "': rpc with same name already declared at line " + rpc.getLine());\r
+                }\r
+            }\r
+            for (NotificationBuilder notification : addedNotifications) {\r
+                if (notification.getQName().getLocalName().equals(childName)) {\r
+                    throw new YangParseException(name, line, "Can not add '" + child\r
+                            + "': notification with same name already declared at line " + notification.getLine());\r
+                }\r
+            }\r
+            addedChildNodes.add(child);\r
+        } else {\r
+            if(parent instanceof AugmentationSchemaBuilder) {\r
+                child.setAugmenting(true);\r
+            }\r
+            // no need for checking rpc and notification because they can be\r
+            // defined only under module or submodule\r
+            if (parent instanceof DataNodeContainerBuilder) {\r
+                DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent;\r
+                for (DataSchemaNodeBuilder childNode : parentNode.getChildNodeBuilders()) {\r
+                    if (childNode.getQName().getLocalName().equals(childName)) {\r
+                        throw new YangParseException(name, line, "Can not add '" + child + "': node with same name '"\r
+                                + childName + "' already declared at line " + childNode.getLine());\r
+                    }\r
+                }\r
+                parentNode.addChildNode(child);\r
+            } else if (parent instanceof ChoiceBuilder) {\r
+                ChoiceBuilder parentNode = (ChoiceBuilder) parent;\r
+                for (ChoiceCaseBuilder caseBuilder : parentNode.getCases()) {\r
+                    if (caseBuilder.getQName().getLocalName().equals(childName)) {\r
+                        throw new YangParseException(name, line, "Can not add '" + child + "': case with same name '"\r
+                                + childName + "' already declared at line " + caseBuilder.getLine());\r
+                    }\r
+                }\r
+                parentNode.addCase(child);\r
+            } else {\r
+                throw new YangParseException(name, line, "Unresolved parent of node '" + childName + "'.");\r
+            }\r
+        }\r
+    }\r
+\r
+    private ModuleImport createModuleImport(final String moduleName, final Date revision, final String prefix) {\r
+        final ModuleImport moduleImport = new ModuleImport() {\r
+            @Override\r
+            public String getModuleName() {\r
+                return moduleName;\r
+            }\r
+\r
+            @Override\r
+            public Date getRevision() {\r
+                return revision;\r
+            }\r
+\r
+            @Override\r
+            public String getPrefix() {\r
+                return prefix;\r
+            }\r
+\r
+            @Override\r
+            public int hashCode() {\r
+                final int prime = 31;\r
+                int result = 1;\r
+                result = prime * result + ((moduleName == null) ? 0 : moduleName.hashCode());\r
+                result = prime * result + ((revision == null) ? 0 : revision.hashCode());\r
+                result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());\r
+                return result;\r
+            }\r
+\r
+            @Override\r
+            public boolean equals(Object obj) {\r
+                if (this == obj) {\r
+                    return true;\r
+                }\r
+                if (obj == null) {\r
+                    return false;\r
+                }\r
+                if (getClass() != obj.getClass()) {\r
+                    return false;\r
+                }\r
+                ModuleImport other = (ModuleImport) obj;\r
+                if (getModuleName() == null) {\r
+                    if (other.getModuleName() != null) {\r
+                        return false;\r
+                    }\r
+                } else if (!getModuleName().equals(other.getModuleName())) {\r
+                    return false;\r
+                }\r
+                if (getRevision() == null) {\r
+                    if (other.getRevision() != null) {\r
+                        return false;\r
+                    }\r
+                } else if (!getRevision().equals(other.getRevision())) {\r
+                    return false;\r
+                }\r
+                if (getPrefix() == null) {\r
+                    if (other.getPrefix() != null) {\r
+                        return false;\r
+                    }\r
+                } else if (!getPrefix().equals(other.getPrefix())) {\r
+                    return false;\r
+                }\r
+                return true;\r
+            }\r
+\r
+            @Override\r
+            public String toString() {\r
+                return "ModuleImport[moduleName=" + moduleName + ", revision=" + revision + ", prefix=" + prefix + "]";\r
+            }\r
+        };\r
+        return moduleImport;\r
+    }\r
+\r
+}\r
index da752b0c6984b5011fb3519093251113329f4d10..04af1d3e92982b7c31247aa013e3ec009ea58600 100644 (file)
-/*
- * 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.parser.builder.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-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.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;
-
-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>();
-
-    RpcDefinitionBuilder(final String moduleName, final int line, final QName qname) {
-        super(moduleName, line, qname);
-        this.instance = new RpcDefinitionImpl(qname);
-    }
-
-    @Override
-    public RpcDefinition build() {
-        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();
-            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());
-            }
-            instance.setTypeDefinitions(typedefs);
-
-            // GROUPINGS
-            final Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);
-            for (GroupingBuilder entry : addedGroupings) {
-                groupings.add(entry.build());
-            }
-            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);
-            }
-            instance.setUnknownSchemaNodes(unknownNodes);
-
-            isBuilt = true;
-        }
-        return instance;
-    }
-
-    void setInput(final ContainerSchemaNodeBuilder inputBuilder) {
-        this.inputBuilder = inputBuilder;
-    }
-
-    void setOutput(final ContainerSchemaNodeBuilder outputBuilder) {
-        this.outputBuilder = outputBuilder;
-    }
-
-    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
-        return addedTypedefs;
-    }
-
-    public void addTypedef(final TypeDefinitionBuilder type) {
-        addedTypedefs.add(type);
-    }
-
-    public Set<GroupingBuilder> getGroupings() {
-        return addedGroupings;
-    }
-
-    public void addGrouping(GroupingBuilder grouping) {
-        addedGroupings.add(grouping);
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((qname == null) ? 0 : qname.hashCode());
-        result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (!(obj instanceof RpcDefinitionBuilder)) {
-            return false;
-        }
-        final RpcDefinitionBuilder other = (RpcDefinitionBuilder) obj;
-        if (other.qname == null) {
-            if (this.qname != null) {
-                return false;
-            }
-        } else if (!other.qname.equals(this.qname)) {
-            return false;
-        }
-        if (other.schemaPath == null) {
-            if (this.schemaPath != null) {
-                return false;
-            }
-        } else if (!other.schemaPath.equals(this.schemaPath)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "rpc " + qname.getLocalName();
-    }
-
-    private final class RpcDefinitionImpl implements RpcDefinition {
-        private final QName qname;
-        private SchemaPath path;
-        private String description;
-        private String reference;
-        private Status status;
-        private ContainerSchemaNode input;
-        private ContainerSchemaNode output;
-        private Set<TypeDefinition<?>> typeDefinitions;
-        private Set<GroupingDefinition> groupings;
-        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
-
-        private RpcDefinitionImpl(final QName qname) {
-            this.qname = qname;
-        }
-
-        @Override
-        public QName getQName() {
-            return qname;
-        }
-
-        @Override
-        public SchemaPath getPath() {
-            return path;
-        }
-
-        private void setPath(SchemaPath path) {
-            this.path = path;
-        }
-
-        @Override
-        public String getDescription() {
-            return description;
-        }
-
-        private void setDescription(String description) {
-            this.description = description;
-        }
-
-        @Override
-        public String getReference() {
-            return reference;
-        }
-
-        private void setReference(String reference) {
-            this.reference = reference;
-        }
-
-        @Override
-        public Status getStatus() {
-            return status;
-        }
-
-        private void setStatus(Status status) {
-            this.status = status;
-        }
-
-        @Override
-        public ContainerSchemaNode getInput() {
-            return input;
-        }
-
-        private void setInput(ContainerSchemaNode input) {
-            this.input = input;
-        }
-
-        @Override
-        public ContainerSchemaNode getOutput() {
-            return output;
-        }
-
-        private void setOutput(ContainerSchemaNode output) {
-            this.output = output;
-        }
-
-        @Override
-        public Set<TypeDefinition<?>> getTypeDefinitions() {
-            return typeDefinitions;
-        }
-
-        private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {
-            this.typeDefinitions = typeDefinitions;
-        }
-
-        @Override
-        public Set<GroupingDefinition> getGroupings() {
-            return groupings;
-        }
-
-        private void setGroupings(Set<GroupingDefinition> groupings) {
-            this.groupings = groupings;
-        }
-
-        @Override
-        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-            return unknownNodes;
-        }
-
-        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {
-            if (unknownNodes != null) {
-                this.unknownNodes = unknownNodes;
-            }
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((qname == null) ? 0 : qname.hashCode());
-            result = prime * result + ((path == null) ? 0 : path.hashCode());
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj == null) {
-                return false;
-            }
-            if (getClass() != obj.getClass()) {
-                return false;
-            }
-            final RpcDefinitionImpl other = (RpcDefinitionImpl) obj;
-            if (qname == null) {
-                if (other.qname != null) {
-                    return false;
-                }
-            } else if (!qname.equals(other.qname)) {
-                return false;
-            }
-            if (path == null) {
-                if (other.path != null) {
-                    return false;
-                }
-            } else if (!path.equals(other.path)) {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder(RpcDefinitionImpl.class.getSimpleName() + "[");
-            sb.append("qname=" + qname);
-            sb.append(", path=" + path);
-            sb.append(", input=" + input);
-            sb.append(", output=" + output + "]");
-            return sb.toString();
-        }
-    }
-
-}
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.yangtools.yang.parser.builder.impl;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+import java.util.TreeSet;\r
+\r
+import org.opendaylight.yangtools.yang.common.QName;\r
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;\r
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;\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.TypeDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;\r
+import org.opendaylight.yangtools.yang.parser.util.Comparators;\r
+\r
+public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder {\r
+    private boolean isBuilt;\r
+    private final RpcDefinitionImpl instance;\r
+    private ContainerSchemaNodeBuilder inputBuilder;\r
+    private ContainerSchemaNodeBuilder outputBuilder;\r
+    private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();\r
+    private final Set<GroupingBuilder> addedGroupings = new HashSet<GroupingBuilder>();\r
+\r
+    public ContainerSchemaNodeBuilder getInput() {\r
+        return inputBuilder;\r
+    }\r
+    \r
+    public ContainerSchemaNodeBuilder getOutput() {\r
+        return outputBuilder;\r
+    }\r
+    \r
+    RpcDefinitionBuilder(final String moduleName, final int line, final QName qname) {\r
+        super(moduleName, line, qname);\r
+        this.instance = new RpcDefinitionImpl(qname);\r
+    }\r
+\r
+    @Override\r
+    public RpcDefinition build() {\r
+        if (!isBuilt) {\r
+            instance.setDescription(description);\r
+            instance.setReference(reference);\r
+            instance.setStatus(status);\r
+\r
+            final ContainerSchemaNode input = inputBuilder == null ? null : inputBuilder.build();\r
+            final ContainerSchemaNode output = outputBuilder == null ? null : outputBuilder.build();\r
+            instance.setInput(input);\r
+            instance.setOutput(output);\r
+\r
+            instance.setPath(schemaPath);\r
+\r
+            // TYPEDEFS\r
+            final Set<TypeDefinition<?>> typedefs = new TreeSet<TypeDefinition<?>>(Comparators.SCHEMA_NODE_COMP);\r
+            for (TypeDefinitionBuilder entry : addedTypedefs) {\r
+                typedefs.add(entry.build());\r
+            }\r
+            instance.setTypeDefinitions(typedefs);\r
+\r
+            // GROUPINGS\r
+            final Set<GroupingDefinition> groupings = new TreeSet<GroupingDefinition>(Comparators.SCHEMA_NODE_COMP);\r
+            for (GroupingBuilder entry : addedGroupings) {\r
+                groupings.add(entry.build());\r
+            }\r
+            instance.setGroupings(groupings);\r
+\r
+            // UNKNOWN NODES\r
+            if (unknownNodes == null) {\r
+                unknownNodes = new ArrayList<UnknownSchemaNode>();\r
+                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {\r
+                    unknownNodes.add(b.build());\r
+                }\r
+                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);\r
+            }\r
+            instance.setUnknownSchemaNodes(unknownNodes);\r
+\r
+            isBuilt = true;\r
+        }\r
+        return instance;\r
+    }\r
+\r
+    void setInput(final ContainerSchemaNodeBuilder inputBuilder) {\r
+        this.inputBuilder = inputBuilder;\r
+    }\r
+\r
+    void setOutput(final ContainerSchemaNodeBuilder outputBuilder) {\r
+        this.outputBuilder = outputBuilder;\r
+    }\r
+\r
+    public Set<TypeDefinitionBuilder> getTypeDefinitions() {\r
+        return addedTypedefs;\r
+    }\r
+\r
+    public void addTypedef(final TypeDefinitionBuilder type) {\r
+        addedTypedefs.add(type);\r
+    }\r
+\r
+    public Set<GroupingBuilder> getGroupings() {\r
+        return addedGroupings;\r
+    }\r
+\r
+    public void addGrouping(GroupingBuilder grouping) {\r
+        addedGroupings.add(grouping);\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        result = prime * result + ((qname == null) ? 0 : qname.hashCode());\r
+        result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (obj == null) {\r
+            return false;\r
+        }\r
+        if (!(obj instanceof RpcDefinitionBuilder)) {\r
+            return false;\r
+        }\r
+        final RpcDefinitionBuilder other = (RpcDefinitionBuilder) obj;\r
+        if (other.qname == null) {\r
+            if (this.qname != null) {\r
+                return false;\r
+            }\r
+        } else if (!other.qname.equals(this.qname)) {\r
+            return false;\r
+        }\r
+        if (other.schemaPath == null) {\r
+            if (this.schemaPath != null) {\r
+                return false;\r
+            }\r
+        } else if (!other.schemaPath.equals(this.schemaPath)) {\r
+            return false;\r
+        }\r
+        return true;\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+        return "rpc " + qname.getLocalName();\r
+    }\r
+\r
+    private final class RpcDefinitionImpl implements RpcDefinition {\r
+        private final QName qname;\r
+        private SchemaPath path;\r
+        private String description;\r
+        private String reference;\r
+        private Status status;\r
+        private ContainerSchemaNode input;\r
+        private ContainerSchemaNode output;\r
+        private Set<TypeDefinition<?>> typeDefinitions;\r
+        private Set<GroupingDefinition> groupings;\r
+        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();\r
+\r
+        private RpcDefinitionImpl(final QName qname) {\r
+            this.qname = qname;\r
+        }\r
+\r
+        @Override\r
+        public QName getQName() {\r
+            return qname;\r
+        }\r
+\r
+        @Override\r
+        public SchemaPath getPath() {\r
+            return path;\r
+        }\r
+\r
+        private void setPath(SchemaPath path) {\r
+            this.path = path;\r
+        }\r
+\r
+        @Override\r
+        public String getDescription() {\r
+            return description;\r
+        }\r
+\r
+        private void setDescription(String description) {\r
+            this.description = description;\r
+        }\r
+\r
+        @Override\r
+        public String getReference() {\r
+            return reference;\r
+        }\r
+\r
+        private void setReference(String reference) {\r
+            this.reference = reference;\r
+        }\r
+\r
+        @Override\r
+        public Status getStatus() {\r
+            return status;\r
+        }\r
+\r
+        private void setStatus(Status status) {\r
+            this.status = status;\r
+        }\r
+\r
+        @Override\r
+        public ContainerSchemaNode getInput() {\r
+            return input;\r
+        }\r
+\r
+        private void setInput(ContainerSchemaNode input) {\r
+            this.input = input;\r
+        }\r
+\r
+        @Override\r
+        public ContainerSchemaNode getOutput() {\r
+            return output;\r
+        }\r
+\r
+        private void setOutput(ContainerSchemaNode output) {\r
+            this.output = output;\r
+        }\r
+\r
+        @Override\r
+        public Set<TypeDefinition<?>> getTypeDefinitions() {\r
+            return typeDefinitions;\r
+        }\r
+\r
+        private void setTypeDefinitions(Set<TypeDefinition<?>> typeDefinitions) {\r
+            this.typeDefinitions = typeDefinitions;\r
+        }\r
+\r
+        @Override\r
+        public Set<GroupingDefinition> getGroupings() {\r
+            return groupings;\r
+        }\r
+\r
+        private void setGroupings(Set<GroupingDefinition> groupings) {\r
+            this.groupings = groupings;\r
+        }\r
+\r
+        @Override\r
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {\r
+            return unknownNodes;\r
+        }\r
+\r
+        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownNodes) {\r
+            if (unknownNodes != null) {\r
+                this.unknownNodes = unknownNodes;\r
+            }\r
+        }\r
+\r
+        @Override\r
+        public int hashCode() {\r
+            final int prime = 31;\r
+            int result = 1;\r
+            result = prime * result + ((qname == null) ? 0 : qname.hashCode());\r
+            result = prime * result + ((path == null) ? 0 : path.hashCode());\r
+            return result;\r
+        }\r
+\r
+        @Override\r
+        public boolean equals(Object obj) {\r
+            if (this == obj) {\r
+                return true;\r
+            }\r
+            if (obj == null) {\r
+                return false;\r
+            }\r
+            if (getClass() != obj.getClass()) {\r
+                return false;\r
+            }\r
+            final RpcDefinitionImpl other = (RpcDefinitionImpl) obj;\r
+            if (qname == null) {\r
+                if (other.qname != null) {\r
+                    return false;\r
+                }\r
+            } else if (!qname.equals(other.qname)) {\r
+                return false;\r
+            }\r
+            if (path == null) {\r
+                if (other.path != null) {\r
+                    return false;\r
+                }\r
+            } else if (!path.equals(other.path)) {\r
+                return false;\r
+            }\r
+            return true;\r
+        }\r
+\r
+        @Override\r
+        public String toString() {\r
+            StringBuilder sb = new StringBuilder(RpcDefinitionImpl.class.getSimpleName() + "[");\r
+            sb.append("qname=" + qname);\r
+            sb.append(", path=" + path);\r
+            sb.append(", input=" + input);\r
+            sb.append(", output=" + output + "]");\r
+            return sb.toString();\r
+        }\r
+    }\r
+\r
+}\r
index 48bca6716c79b508296680caa581e8f337eafef8..c7782adf2b53fb373727bc67dc10206148e60b90 100644 (file)
-/*
- * 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.parser.impl;
-
-import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.*;
-import static org.opendaylight.yangtools.yang.parser.util.TypeUtils.*;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-
-import org.antlr.v4.runtime.ANTLRInputStream;
-import org.antlr.v4.runtime.CommonTokenStream;
-import org.antlr.v4.runtime.tree.ParseTree;
-import org.antlr.v4.runtime.tree.ParseTreeWalker;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangLexer;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangParser;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
-import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;
-import org.opendaylight.yangtools.yang.model.util.IdentityrefType;
-import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
-import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.DeviationBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ExtensionBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.IdentitySchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.GroupingUtils;
-import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort;
-import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
-import org.opendaylight.yangtools.yang.parser.util.YangParseException;
-import org.opendaylight.yangtools.yang.validator.YangModelBasicValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-public final class YangParserImpl implements YangModelParser {
-    private static final Logger LOG = LoggerFactory.getLogger(YangParserImpl.class);
-
-    @Override
-    public Set<Module> parseYangModels(final List<File> yangFiles) {
-        return Sets.newLinkedHashSet(parseYangModelsMapped(yangFiles).values());
-    }
-
-    @Override
-    public Set<Module> parseYangModels(final List<File> yangFiles, final SchemaContext context) {
-        if (yangFiles != null) {
-            final Map<InputStream, File> inputStreams = Maps.newHashMap();
-
-            for (final File yangFile : yangFiles) {
-                try {
-                    inputStreams.put(new FileInputStream(yangFile), yangFile);
-                } catch (FileNotFoundException e) {
-                    LOG.warn("Exception while reading yang file: " + yangFile.getName(), e);
-                }
-            }
-
-            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();
-
-            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(
-                    Lists.newArrayList(inputStreams.keySet()), builderToStreamMap);
-
-            for (InputStream is : inputStreams.keySet()) {
-                try {
-                    is.close();
-                } catch (IOException e) {
-                    LOG.debug("Failed to close stream.");
-                }
-            }
-
-            return new LinkedHashSet<Module>(buildWithContext(modules, context).values());
-        }
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Set<Module> parseYangModelsFromStreams(final List<InputStream> yangModelStreams) {
-        return Sets.newHashSet(parseYangModelsFromStreamsMapped(yangModelStreams).values());
-    }
-
-    @Override
-    public Set<Module> parseYangModelsFromStreams(final List<InputStream> yangModelStreams, SchemaContext context) {
-        if (yangModelStreams != null) {
-            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();
-            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuildersWithContext(
-                    yangModelStreams, builderToStreamMap, context);
-            return new LinkedHashSet<Module>(buildWithContext(modules, context).values());
-        }
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Map<File, Module> parseYangModelsMapped(List<File> yangFiles) {
-        if (yangFiles != null) {
-            final Map<InputStream, File> inputStreams = Maps.newHashMap();
-
-            for (final File yangFile : yangFiles) {
-                try {
-                    inputStreams.put(new FileInputStream(yangFile), yangFile);
-                } catch (FileNotFoundException e) {
-                    LOG.warn("Exception while reading yang file: " + yangFile.getName(), e);
-                }
-            }
-
-            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();
-            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(
-                    Lists.newArrayList(inputStreams.keySet()), builderToStreamMap);
-
-            for (InputStream is : inputStreams.keySet()) {
-                try {
-                    is.close();
-                } catch (IOException e) {
-                    LOG.debug("Failed to close stream.");
-                }
-            }
-
-            Map<File, Module> retVal = Maps.newLinkedHashMap();
-            Map<ModuleBuilder, Module> builderToModuleMap = build(modules);
-
-            for (Entry<ModuleBuilder, Module> builderToModule : builderToModuleMap.entrySet()) {
-                retVal.put(inputStreams.get(builderToStreamMap.get(builderToModule.getKey())),
-                        builderToModule.getValue());
-            }
-
-            return retVal;
-        }
-        return Collections.emptyMap();
-    }
-
-    @Override
-    public Map<InputStream, Module> parseYangModelsFromStreamsMapped(final List<InputStream> yangModelStreams) {
-        Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();
-
-        final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(yangModelStreams,
-                builderToStreamMap);
-        Map<InputStream, Module> retVal = Maps.newLinkedHashMap();
-        Map<ModuleBuilder, Module> builderToModuleMap = build(modules);
-
-        for (Entry<ModuleBuilder, Module> builderToModule : builderToModuleMap.entrySet()) {
-            retVal.put(builderToStreamMap.get(builderToModule.getKey()), builderToModule.getValue());
-        }
-        return retVal;
-    }
-
-    @Override
-    public SchemaContext resolveSchemaContext(final Set<Module> modules) {
-        return new SchemaContextImpl(modules);
-    }
-
-    private ModuleBuilder[] parseModuleBuilders(List<InputStream> inputStreams,
-            Map<ModuleBuilder, InputStream> streamToBuilderMap) {
-
-        final ParseTreeWalker walker = new ParseTreeWalker();
-        final List<ParseTree> trees = parseStreams(inputStreams);
-        final ModuleBuilder[] builders = new ModuleBuilder[trees.size()];
-
-        // validate yang
-        new YangModelBasicValidator(walker).validate(trees);
-
-        YangParserListenerImpl yangModelParser = null;
-        for (int i = 0; i < trees.size(); i++) {
-            yangModelParser = new YangParserListenerImpl();
-            walker.walk(yangModelParser, trees.get(i));
-            ModuleBuilder moduleBuilder = yangModelParser.getModuleBuilder();
-
-            // We expect the order of trees and streams has to be the same
-            streamToBuilderMap.put(moduleBuilder, inputStreams.get(i));
-            builders[i] = moduleBuilder;
-        }
-        return builders;
-    }
-
-    private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuilders(final List<InputStream> yangFileStreams,
-            Map<ModuleBuilder, InputStream> streamToBuilderMap) {
-        return resolveModuleBuildersWithContext(yangFileStreams, streamToBuilderMap, null);
-    }
-
-    private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuildersWithContext(
-            final List<InputStream> yangFileStreams, final Map<ModuleBuilder, InputStream> streamToBuilderMap,
-            final SchemaContext context) {
-        final ModuleBuilder[] builders = parseModuleBuilders(yangFileStreams, streamToBuilderMap);
-
-        // LinkedHashMap must be used to preserve order
-        final LinkedHashMap<String, TreeMap<Date, ModuleBuilder>> modules = new LinkedHashMap<String, TreeMap<Date, ModuleBuilder>>();
-
-        // module dependency graph sorted
-        List<ModuleBuilder> sorted = null;
-        if (context == null) {
-            sorted = ModuleDependencySort.sort(builders);
-        } else {
-            sorted = ModuleDependencySort.sortWithContext(context, builders);
-        }
-
-        for (final ModuleBuilder builder : sorted) {
-            if (builder == null) {
-                continue;
-            }
-            final String builderName = builder.getName();
-            Date builderRevision = builder.getRevision();
-            if (builderRevision == null) {
-                builderRevision = new Date(0L);
-            }
-            TreeMap<Date, ModuleBuilder> builderByRevision = modules.get(builderName);
-            if (builderByRevision == null) {
-                builderByRevision = new TreeMap<Date, ModuleBuilder>();
-            }
-            builderByRevision.put(builderRevision, builder);
-            modules.put(builderName, builderByRevision);
-        }
-        return modules;
-    }
-
-    private List<ParseTree> parseStreams(final List<InputStream> yangStreams) {
-        final List<ParseTree> trees = new ArrayList<ParseTree>();
-        for (InputStream yangStream : yangStreams) {
-            trees.add(parseStream(yangStream));
-        }
-        return trees;
-    }
-
-    private ParseTree parseStream(final InputStream yangStream) {
-        ParseTree result = null;
-        try {
-            final ANTLRInputStream input = new ANTLRInputStream(yangStream);
-            final YangLexer lexer = new YangLexer(input);
-            final CommonTokenStream tokens = new CommonTokenStream(lexer);
-            final YangParser parser = new YangParser(tokens);
-            parser.removeErrorListeners();
-            parser.addErrorListener(new YangErrorListener());
-
-            result = parser.yang();
-        } catch (IOException e) {
-            LOG.warn("Exception while reading yang file: " + yangStream, e);
-        }
-        return result;
-    }
-
-    private Map<ModuleBuilder, Module> build(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
-        // fix unresolved nodes
-        findUsesTargets(modules, null);
-        resolveDirtyNodes(modules);
-        resolveAugments(modules);
-        resolveUses(modules);
-        resolveDeviations(modules);
-
-        // build
-        final Map<ModuleBuilder, Module> result = new LinkedHashMap<ModuleBuilder, Module>();
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            final Map<Date, Module> modulesByRevision = new HashMap<Date, Module>();
-            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
-                final ModuleBuilder moduleBuilder = childEntry.getValue();
-                final Module module = moduleBuilder.build();
-                modulesByRevision.put(childEntry.getKey(), module);
-                result.put(moduleBuilder, module);
-            }
-        }
-        return result;
-    }
-
-    private Map<ModuleBuilder, Module> buildWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final SchemaContext context) {
-        // fix unresolved nodes
-        findUsesTargets(modules, context);
-        resolvedDirtyNodesWithContext(modules, context);
-        resolveAugmentsWithContext(modules, context);
-        resolveUsesWithContext(modules, context);
-        resolveDeviationsWithContext(modules, context);
-
-        // build
-        final Map<ModuleBuilder, Module> result = new LinkedHashMap<ModuleBuilder, Module>();
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            final Map<Date, Module> modulesByRevision = new HashMap<Date, Module>();
-            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
-                final ModuleBuilder moduleBuilder = childEntry.getValue();
-                final Module module = moduleBuilder.build();
-                modulesByRevision.put(childEntry.getKey(), module);
-                result.put(moduleBuilder, module);
-            }
-        }
-        return result;
-    }
-
-    private void resolveDirtyNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
-                final ModuleBuilder module = childEntry.getValue();
-                resolveDirtyNodes(modules, module);
-                resolveIdentities(modules, module);
-                resolveUnknownNodes(modules, module);
-            }
-        }
-    }
-
-    private void resolvedDirtyNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final SchemaContext context) {
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
-                final ModuleBuilder module = childEntry.getValue();
-                resolveDirtyNodesWithContext(modules, module, context);
-                resolveIdentitiesWithContext(modules, module, context);
-                resolveUnknownNodesWithContext(modules, module, context);
-            }
-        }
-    }
-
-    /**
-     * Search for dirty nodes (node which contains UnknownType) and resolve
-     * unknown types.
-     *
-     * @param modules
-     *            all available modules
-     * @param module
-     *            current module
-     */
-    private void resolveDirtyNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
-        final Set<TypeAwareBuilder> dirtyNodes = module.getDirtyNodes();
-        if (!dirtyNodes.isEmpty()) {
-            for (TypeAwareBuilder nodeToResolve : dirtyNodes) {
-                if (nodeToResolve instanceof UnionTypeBuilder) {
-                    // special handling for union types
-                    resolveTypeUnion((UnionTypeBuilder) nodeToResolve, modules, module);
-                } else if (nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) {
-                    // special handling for identityref types
-                    IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) nodeToResolve.getTypedef();
-                    nodeToResolve.setType(new IdentityrefType(findFullQName(modules, module, idref), idref.getPath()));
-                } else {
-                    resolveType(nodeToResolve, modules, module);
-                }
-            }
-        }
-    }
-
-    private void resolveDirtyNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, SchemaContext context) {
-        final Set<TypeAwareBuilder> dirtyNodes = module.getDirtyNodes();
-        if (!dirtyNodes.isEmpty()) {
-            for (TypeAwareBuilder nodeToResolve : dirtyNodes) {
-                if (nodeToResolve instanceof UnionTypeBuilder) {
-                    // special handling for union types
-                    resolveTypeUnionWithContext((UnionTypeBuilder) nodeToResolve, modules, module, context);
-                } else if (nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) {
-                    // special handling for identityref types
-                    IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) nodeToResolve.getTypedef();
-                    nodeToResolve.setType(new IdentityrefType(findFullQName(modules, module, idref), idref.getPath()));
-                } else {
-                    resolveTypeWithContext(nodeToResolve, modules, module, context);
-                }
-            }
-        }
-    }
-
-    /**
-     * Go through all augment definitions and perform augmentation. It is
-     * expected that modules are already sorted by their dependencies.
-     *
-     * @param modules
-     *            all loaded modules
-     */
-    private void resolveAugments(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
-        // collect augments from all loaded modules
-        final List<AugmentationSchemaBuilder> allAugments = new ArrayList<>();
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                allAugments.addAll(inner.getValue().getAllAugments());
-            }
-        }
-
-        for (int i = 0; i < allAugments.size(); i++) {
-            // pick one augment
-            final AugmentationSchemaBuilder augment = allAugments.get(i);
-            // create collection of others
-            List<AugmentationSchemaBuilder> others = new ArrayList<>(allAugments);
-            others.remove(augment);
-
-            // try to resolve it
-            boolean resolved = resolveAugment(modules, augment);
-            // while not resolved
-            int j = 0;
-            while (!(resolved) && j < others.size()) {
-                // try to resolve next augment
-                resolveAugment(modules, others.get(j));
-                // then try to resolve first again
-                resolved = resolveAugment(modules, augment);
-                j++;
-
-            }
-
-            if (!resolved) {
-                throw new YangParseException(augment.getModuleName(), augment.getLine(),
-                        "Error in augment parsing: failed to find augment target");
-            }
-        }
-    }
-
-    /**
-     * Search for augment target and perform augmentation.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param augmentBuilder
-     *            augment to resolve
-     * @return true if target node found, false otherwise
-     */
-    private boolean resolveAugment(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final AugmentationSchemaBuilder augmentBuilder) {
-        if (augmentBuilder.isResolved()) {
-            return true;
-        }
-
-        int line = augmentBuilder.getLine();
-        ModuleBuilder module = getParentModule(augmentBuilder);
-        List<QName> path = augmentBuilder.getTargetPath().getPath();
-        Builder augmentParent = augmentBuilder.getParent();
-
-        Builder firstNodeParent = null;
-        if (augmentParent instanceof ModuleBuilder) {
-            // if augment is defined under module, parent of first node is
-            // target module
-            final QName firstNameInPath = path.get(0);
-            String prefix = firstNameInPath.getPrefix();
-            if (prefix == null) {
-                prefix = module.getPrefix();
-            }
-            firstNodeParent = findDependentModuleBuilder(modules, module, prefix, line);
-        } else if (augmentParent instanceof UsesNodeBuilder) {
-            firstNodeParent = augmentParent.getParent();
-        } else {
-            // augment can be defined only under module or uses
-            throw new YangParseException(augmentBuilder.getModuleName(), line,
-                    "Failed to parse augment: Unresolved parent of augment: " + augmentParent);
-        }
-
-        return processAugmentation(augmentBuilder, firstNodeParent, path);
-    }
-
-    /**
-     * Go through all augment definitions and resolve them. This method works in
-     * same way as {@link #resolveAugments(Map)} except that if target node is
-     * not found in loaded modules, it search for target node in given context.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param context
-     *            SchemaContext containing already resolved modules
-     */
-    private void resolveAugmentsWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final SchemaContext context) {
-        // collect augments from all loaded modules
-        final List<AugmentationSchemaBuilder> allAugments = new ArrayList<>();
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                allAugments.addAll(inner.getValue().getAllAugments());
-            }
-        }
-
-        for (int i = 0; i < allAugments.size(); i++) {
-            // pick augment from list
-            final AugmentationSchemaBuilder augment = allAugments.get(i);
-            // try to resolve it
-            boolean resolved = resolveAugmentWithContext(modules, augment, context);
-            // while not resolved
-            int j = i + 1;
-            while (!(resolved) && j < allAugments.size()) {
-                // try to resolve next augment
-                resolveAugmentWithContext(modules, allAugments.get(j), context);
-                // then try to resolve first again
-                resolved = resolveAugmentWithContext(modules, augment, context);
-                j++;
-            }
-
-            if (!resolved) {
-                throw new YangParseException(augment.getModuleName(), augment.getLine(),
-                        "Error in augment parsing: failed to find augment target");
-            }
-        }
-    }
-
-    /**
-     * Search for augment target and perform augmentation.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param augment
-     *            augment to resolve
-     * @param context
-     *            SchemaContext containing already resolved modules
-     * @return true if target node found, false otherwise
-     */
-    private boolean resolveAugmentWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final AugmentationSchemaBuilder augment, final SchemaContext context) {
-        if (augment.isResolved()) {
-            return true;
-        }
-        int line = augment.getLine();
-        ModuleBuilder module = getParentModule(augment);
-        List<QName> path = augment.getTargetPath().getPath();
-        final QName firstNameInPath = path.get(0);
-        String prefix = firstNameInPath.getPrefix();
-        if (prefix == null) {
-            prefix = module.getPrefix();
-        }
-        Builder augmentParent = augment.getParent();
-        Builder currentParent = null;
-
-        if (augmentParent instanceof ModuleBuilder) {
-            // if augment is defined under module, first parent is target module
-            currentParent = findDependentModuleBuilder(modules, module, prefix, line);
-        } else if (augmentParent instanceof UsesNodeBuilder) {
-            currentParent = augmentParent.getParent();
-        } else {
-            // augment can be defined only under module or uses
-            throw new YangParseException(augment.getModuleName(), augment.getLine(),
-                    "Error in augment parsing: Unresolved parent of augment: " + augmentParent);
-        }
-
-        if (currentParent == null) {
-            return processAugmentationOnContext(augment, path, module, prefix, context);
-        } else {
-            return processAugmentation(augment, currentParent, path);
-        }
-    }
-
-    /**
-     * Go through identity statements defined in current module and resolve
-     * their 'base' statement if present.
-     *
-     * @param modules
-     *            all modules
-     * @param module
-     *            module being resolved
-     */
-    private void resolveIdentities(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
-        final Set<IdentitySchemaNodeBuilder> identities = module.getIdentities();
-        for (IdentitySchemaNodeBuilder identity : identities) {
-            final String baseIdentityName = identity.getBaseIdentityName();
-            if (baseIdentityName != null) {
-                String baseIdentityPrefix = null;
-                String baseIdentityLocalName = null;
-                if (baseIdentityName.contains(":")) {
-                    final String[] splitted = baseIdentityName.split(":");
-                    baseIdentityPrefix = splitted[0];
-                    baseIdentityLocalName = splitted[1];
-                } else {
-                    baseIdentityPrefix = module.getPrefix();
-                    baseIdentityLocalName = baseIdentityName;
-                }
-                final ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, baseIdentityPrefix,
-                        identity.getLine());
-
-                final Set<IdentitySchemaNodeBuilder> dependentModuleIdentities = dependentModule.getIdentities();
-                for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) {
-                    if (idBuilder.getQName().getLocalName().equals(baseIdentityLocalName)) {
-                        identity.setBaseIdentity(idBuilder);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Go through identity statements defined in current module and resolve
-     * their 'base' statement. Method tries to find base identity in given
-     * modules. If base identity is not found, method will search it in context.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param module
-     *            current module
-     * @param context
-     *            SchemaContext containing already resolved modules
-     */
-    private void resolveIdentitiesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, final SchemaContext context) {
-        final Set<IdentitySchemaNodeBuilder> identities = module.getIdentities();
-        for (IdentitySchemaNodeBuilder identity : identities) {
-            final String baseIdentityName = identity.getBaseIdentityName();
-            if (baseIdentityName != null) {
-                String baseIdentityPrefix = null;
-                String baseIdentityLocalName = null;
-                if (baseIdentityName.contains(":")) {
-                    final String[] splitted = baseIdentityName.split(":");
-                    baseIdentityPrefix = splitted[0];
-                    baseIdentityLocalName = splitted[1];
-                } else {
-                    baseIdentityPrefix = module.getPrefix();
-                    baseIdentityLocalName = baseIdentityName;
-                }
-                final ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module,
-                        baseIdentityPrefix, identity.getLine());
-
-                if (dependentModuleBuilder == null) {
-                    final Module dependentModule = findModuleFromContext(context, module, baseIdentityPrefix,
-                            identity.getLine());
-                    final Set<IdentitySchemaNode> dependentModuleIdentities = dependentModule.getIdentities();
-                    for (IdentitySchemaNode idNode : dependentModuleIdentities) {
-                        if (idNode.getQName().getLocalName().equals(baseIdentityLocalName)) {
-                            identity.setBaseIdentity(idNode);
-                        }
-                    }
-                } else {
-                    final Set<IdentitySchemaNodeBuilder> dependentModuleIdentities = dependentModuleBuilder
-                            .getIdentities();
-                    for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) {
-                        if (idBuilder.getQName().getLocalName().equals(baseIdentityLocalName)) {
-                            identity.setBaseIdentity(idBuilder);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Find and add reference of uses target grouping.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param context
-     *            SchemaContext containing already resolved modules or null if
-     *            context is not available
-     */
-    private void findUsesTargets(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final SchemaContext context) {
-        final List<UsesNodeBuilder> allUses = new ArrayList<>();
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                allUses.addAll(inner.getValue().getAllUsesNodes());
-            }
-        }
-        for (UsesNodeBuilder usesNode : allUses) {
-            ModuleBuilder module = ParserUtils.getParentModule(usesNode);
-            final GroupingBuilder targetGroupingBuilder = GroupingUtils.getTargetGroupingFromModules(usesNode, modules,
-                    module);
-            if (targetGroupingBuilder == null) {
-                if (context == null) {
-                    throw new YangParseException(module.getName(), usesNode.getLine(), "Referenced grouping '"
-                            + usesNode.getGroupingPathAsString() + "' not found.");
-                } else {
-                    GroupingDefinition targetGroupingDefinition = GroupingUtils.getTargetGroupingFromContext(usesNode,
-                            module, context);
-                    usesNode.setGroupingDefinition(targetGroupingDefinition);
-                }
-            } else {
-                usesNode.setGrouping(targetGroupingBuilder);
-            }
-        }
-    }
-
-    /**
-     * Copy data from uses target, update uses parent and perform refinement.
-     * Augmentations have to be resolved already.
-     *
-     * @param modules
-     *            all loaded modules
-     */
-    private void resolveUses(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                ModuleBuilder module = inner.getValue();
-                List<UsesNodeBuilder> usesNodes = null;
-                boolean dataCollected = module.isAllUsesDataCollected();
-
-                while (!dataCollected) {
-                    usesNodes = new ArrayList<>(module.getAllUsesNodes());
-                    for (UsesNodeBuilder usesNode : usesNodes) {
-                        if (!usesNode.isDataCollected()) {
-                            GroupingUtils.collectUsesData(usesNode);
-                        }
-                    }
-                    dataCollected = module.isAllUsesDataCollected();
-                }
-            }
-        }
-
-        // new loop is must because in collecting data process new uses could
-        // be created
-        final List<UsesNodeBuilder> allModulesUses = new ArrayList<>();
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                allModulesUses.addAll(inner.getValue().getAllUsesNodes());
-            }
-        }
-
-        for (UsesNodeBuilder usesNode : allModulesUses) {
-            GroupingUtils.updateUsesParent(usesNode);
-            GroupingUtils.performRefine(usesNode);
-        }
-        for (UsesNodeBuilder usesNode : allModulesUses) {
-            GroupingUtils.fixUsesNodesPath(usesNode);
-        }
-
-        for (UsesNodeBuilder usesNode : allModulesUses) {
-            if (usesNode.isCopy()) {
-                usesNode.getParent().getUsesNodes().remove(usesNode);
-            }
-        }
-    }
-
-    /**
-     * Copy data from uses target, update uses parent and perform refinement.
-     * Augmentations have to be resolved already.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param context
-     *            SchemaContext containing already resolved modules
-     */
-    private void resolveUsesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final SchemaContext context) {
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                ModuleBuilder module = inner.getValue();
-                List<UsesNodeBuilder> usesNodes = null;
-                boolean dataCollected = module.isAllUsesDataCollected();
-
-                while (!dataCollected) {
-                    usesNodes = new ArrayList<>(module.getAllUsesNodes());
-                    for (UsesNodeBuilder usesNode : usesNodes) {
-                        if (!usesNode.isDataCollected()) {
-                            if (usesNode.getGroupingBuilder() == null) {
-                                GroupingUtils.collectUsesDataFromContext(usesNode);
-                            } else {
-                                GroupingUtils.collectUsesData(usesNode);
-                            }
-                        }
-                    }
-                    dataCollected = module.isAllUsesDataCollected();
-                }
-            }
-        }
-
-        // new loop is must because in collecting data process new uses could
-        // be created
-        final List<UsesNodeBuilder> allModulesUses = new ArrayList<>();
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                allModulesUses.addAll(inner.getValue().getAllUsesNodes());
-            }
-        }
-
-        for (UsesNodeBuilder usesNode : allModulesUses) {
-            GroupingUtils.updateUsesParent(usesNode);
-            GroupingUtils.performRefine(usesNode);
-        }
-        for (UsesNodeBuilder usesNode : allModulesUses) {
-            GroupingUtils.fixUsesNodesPath(usesNode);
-        }
-    }
-
-    private void resolveUnknownNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
-        for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) {
-            QName nodeType = usnb.getNodeType();
-            try {
-                ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, nodeType.getPrefix(),
-                        usnb.getLine());
-                for (ExtensionBuilder extension : dependentModule.getExtensions()) {
-                    if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) {
-                        usnb.setNodeType(extension.getQName());
-                        usnb.setExtensionBuilder(extension);
-                        break;
-                    }
-                }
-            } catch (YangParseException e) {
-                throw new YangParseException(module.getName(), usnb.getLine(), "Failed to resolve node " + usnb
-                        + ": no such extension definition found.");
-            }
-        }
-    }
-
-    private void resolveUnknownNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, final SchemaContext context) {
-        for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) {
-            QName nodeType = usnb.getNodeType();
-            try {
-                ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module,
-                        nodeType.getPrefix(), usnb.getLine());
-
-                if (dependentModuleBuilder == null) {
-                    Module dependentModule = findModuleFromContext(context, module, nodeType.getPrefix(),
-                            usnb.getLine());
-                    for (ExtensionDefinition e : dependentModule.getExtensionSchemaNodes()) {
-                        if (e.getQName().getLocalName().equals(nodeType.getLocalName())) {
-                            usnb.setNodeType(new QName(e.getQName().getNamespace(), e.getQName().getRevision(),
-                                    nodeType.getPrefix(), e.getQName().getLocalName()));
-                            usnb.setExtensionDefinition(e);
-                            break;
-                        }
-                    }
-                } else {
-                    for (ExtensionBuilder extension : dependentModuleBuilder.getExtensions()) {
-                        if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) {
-                            usnb.setExtensionBuilder(extension);
-                            break;
-                        }
-                    }
-                }
-
-            } catch (YangParseException e) {
-                throw new YangParseException(module.getName(), usnb.getLine(), "Failed to resolve node " + usnb
-                        + ": no such extension definition found.");
-            }
-
-        }
-    }
-
-    /**
-     * Traverse through modules and resolve their deviation statements.
-     *
-     * @param modules
-     *            all loaded modules
-     */
-    private void resolveDeviations(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                ModuleBuilder b = inner.getValue();
-                resolveDeviation(modules, b);
-            }
-        }
-    }
-
-    /**
-     * Traverse through module and resolve its deviation statements.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param module
-     *            module in which resolve deviations
-     */
-    private void resolveDeviation(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
-        for (DeviationBuilder dev : module.getDeviations()) {
-            int line = dev.getLine();
-            SchemaPath targetPath = dev.getTargetPath();
-            List<QName> path = targetPath.getPath();
-            QName q0 = path.get(0);
-            String prefix = q0.getPrefix();
-            if (prefix == null) {
-                prefix = module.getPrefix();
-            }
-
-            ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, prefix, line);
-            processDeviation(dev, dependentModuleBuilder, path, module);
-        }
-    }
-
-    /**
-     * Traverse through modules and resolve their deviation statements with
-     * given context.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param context
-     *            already resolved context
-     */
-    private void resolveDeviationsWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final SchemaContext context) {
-        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
-            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
-                ModuleBuilder b = inner.getValue();
-                resolveDeviationWithContext(modules, b, context);
-            }
-        }
-    }
-
-    /**
-     * Traverse through module and resolve its deviation statements with given
-     * context.
-     *
-     * @param modules
-     *            all loaded modules
-     * @param module
-     *            module in which resolve deviations
-     * @param context
-     *            already resolved context
-     */
-    private void resolveDeviationWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, final SchemaContext context) {
-        for (DeviationBuilder dev : module.getDeviations()) {
-            int line = dev.getLine();
-            SchemaPath targetPath = dev.getTargetPath();
-            List<QName> path = targetPath.getPath();
-            QName q0 = path.get(0);
-            String prefix = q0.getPrefix();
-            if (prefix == null) {
-                prefix = module.getPrefix();
-            }
-            String name = null;
-
-            ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, prefix, line);
-            if (dependentModuleBuilder == null) {
-                Module dependentModule = findModuleFromContext(context, module, prefix, line);
-                Object currentParent = dependentModule;
-
-                for (int i = 0; i < path.size(); i++) {
-                    if (currentParent == null) {
-                        throw new YangParseException(module.getName(), line, "Failed to find deviation target.");
-                    }
-                    QName q = path.get(i);
-                    name = q.getLocalName();
-                    if (currentParent instanceof DataNodeContainer) {
-                        currentParent = ((DataNodeContainer) currentParent).getDataChildByName(name);
-                    }
-                }
-
-                if (currentParent == null) {
-                    throw new YangParseException(module.getName(), line, "Failed to find deviation target.");
-                }
-                if (currentParent instanceof SchemaNode) {
-                    dev.setTargetPath(((SchemaNode) currentParent).getPath());
-                }
-
-            } else {
-                processDeviation(dev, dependentModuleBuilder, path, module);
-            }
-        }
-    }
-
-    /**
-     * Correct deviation target path in deviation builder.
-     *
-     * @param dev
-     *            deviation
-     * @param dependentModuleBuilder
-     *            module containing deviation target
-     * @param path
-     *            current deviation target path
-     * @param module
-     *            current module
-     */
-    private void processDeviation(final DeviationBuilder dev, final ModuleBuilder dependentModuleBuilder,
-            final List<QName> path, final ModuleBuilder module) {
-        final int line = dev.getLine();
-        Builder currentParent = dependentModuleBuilder;
-
-        for (int i = 0; i < path.size(); i++) {
-            if (currentParent == null) {
-                throw new YangParseException(module.getName(), line, "Failed to find deviation target.");
-            }
-            QName q = path.get(i);
-            String name = q.getLocalName();
-            if (currentParent instanceof DataNodeContainerBuilder) {
-                currentParent = ((DataNodeContainerBuilder) currentParent).getDataChildByName(name);
-            }
-        }
-
-        if (currentParent == null || !(currentParent instanceof SchemaNodeBuilder)) {
-            throw new YangParseException(module.getName(), line, "Failed to find deviation target.");
-        }
-        dev.setTargetPath(((SchemaNodeBuilder) currentParent).getPath());
-    }
-
-}
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.yangtools.yang.parser.impl;\r
+\r
+import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.*;\r
+import static org.opendaylight.yangtools.yang.parser.util.TypeUtils.*;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.LinkedHashMap;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+import java.util.Set;\r
+import java.util.TreeMap;\r
+\r
+import org.antlr.v4.runtime.ANTLRInputStream;\r
+import org.antlr.v4.runtime.CommonTokenStream;\r
+import org.antlr.v4.runtime.tree.ParseTree;\r
+import org.antlr.v4.runtime.tree.ParseTreeWalker;\r
+import org.opendaylight.yangtools.antlrv4.code.gen.YangLexer;\r
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser;\r
+import org.opendaylight.yangtools.yang.common.QName;\r
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;\r
+import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;\r
+import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;\r
+import org.opendaylight.yangtools.yang.model.api.Module;\r
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;\r
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;\r
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;\r
+import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;\r
+import org.opendaylight.yangtools.yang.model.util.IdentityrefType;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.Builder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.impl.DeviationBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.impl.ExtensionBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.impl.IdentitySchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;\r
+import org.opendaylight.yangtools.yang.parser.util.GroupingUtils;\r
+import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort;\r
+import org.opendaylight.yangtools.yang.parser.util.ParserUtils;\r
+import org.opendaylight.yangtools.yang.parser.util.YangParseException;\r
+import org.opendaylight.yangtools.yang.validator.YangModelBasicValidator;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.google.common.collect.Lists;\r
+import com.google.common.collect.Maps;\r
+import com.google.common.collect.Sets;\r
+\r
+public final class YangParserImpl implements YangModelParser {\r
+    private static final Logger LOG = LoggerFactory.getLogger(YangParserImpl.class);\r
+\r
+    @Override\r
+    public Set<Module> parseYangModels(final List<File> yangFiles) {\r
+        return Sets.newLinkedHashSet(parseYangModelsMapped(yangFiles).values());\r
+    }\r
+\r
+    @Override\r
+    public Set<Module> parseYangModels(final List<File> yangFiles, final SchemaContext context) {\r
+        if (yangFiles != null) {\r
+            final Map<InputStream, File> inputStreams = Maps.newHashMap();\r
+\r
+            for (final File yangFile : yangFiles) {\r
+                try {\r
+                    inputStreams.put(new FileInputStream(yangFile), yangFile);\r
+                } catch (FileNotFoundException e) {\r
+                    LOG.warn("Exception while reading yang file: " + yangFile.getName(), e);\r
+                }\r
+            }\r
+\r
+            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();\r
+\r
+            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(\r
+                    Lists.newArrayList(inputStreams.keySet()), builderToStreamMap);\r
+\r
+            for (InputStream is : inputStreams.keySet()) {\r
+                try {\r
+                    is.close();\r
+                } catch (IOException e) {\r
+                    LOG.debug("Failed to close stream.");\r
+                }\r
+            }\r
+\r
+            return new LinkedHashSet<Module>(buildWithContext(modules, context).values());\r
+        }\r
+        return Collections.emptySet();\r
+    }\r
+\r
+    @Override\r
+    public Set<Module> parseYangModelsFromStreams(final List<InputStream> yangModelStreams) {\r
+        return Sets.newHashSet(parseYangModelsFromStreamsMapped(yangModelStreams).values());\r
+    }\r
+\r
+    @Override\r
+    public Set<Module> parseYangModelsFromStreams(final List<InputStream> yangModelStreams, SchemaContext context) {\r
+        if (yangModelStreams != null) {\r
+            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();\r
+            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuildersWithContext(\r
+                    yangModelStreams, builderToStreamMap, context);\r
+            return new LinkedHashSet<Module>(buildWithContext(modules, context).values());\r
+        }\r
+        return Collections.emptySet();\r
+    }\r
+\r
+    @Override\r
+    public Map<File, Module> parseYangModelsMapped(List<File> yangFiles) {\r
+        if (yangFiles != null) {\r
+            final Map<InputStream, File> inputStreams = Maps.newHashMap();\r
+\r
+            for (final File yangFile : yangFiles) {\r
+                try {\r
+                    inputStreams.put(new FileInputStream(yangFile), yangFile);\r
+                } catch (FileNotFoundException e) {\r
+                    LOG.warn("Exception while reading yang file: " + yangFile.getName(), e);\r
+                }\r
+            }\r
+\r
+            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();\r
+            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(\r
+                    Lists.newArrayList(inputStreams.keySet()), builderToStreamMap);\r
+\r
+            for (InputStream is : inputStreams.keySet()) {\r
+                try {\r
+                    is.close();\r
+                } catch (IOException e) {\r
+                    LOG.debug("Failed to close stream.");\r
+                }\r
+            }\r
+\r
+            Map<File, Module> retVal = Maps.newLinkedHashMap();\r
+            Map<ModuleBuilder, Module> builderToModuleMap = build(modules);\r
+\r
+            for (Entry<ModuleBuilder, Module> builderToModule : builderToModuleMap.entrySet()) {\r
+                retVal.put(inputStreams.get(builderToStreamMap.get(builderToModule.getKey())),\r
+                        builderToModule.getValue());\r
+            }\r
+\r
+            return retVal;\r
+        }\r
+        return Collections.emptyMap();\r
+    }\r
+\r
+    @Override\r
+    public Map<InputStream, Module> parseYangModelsFromStreamsMapped(final List<InputStream> yangModelStreams) {\r
+        Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();\r
+\r
+        final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(yangModelStreams,\r
+                builderToStreamMap);\r
+        Map<InputStream, Module> retVal = Maps.newLinkedHashMap();\r
+        Map<ModuleBuilder, Module> builderToModuleMap = build(modules);\r
+\r
+        for (Entry<ModuleBuilder, Module> builderToModule : builderToModuleMap.entrySet()) {\r
+            retVal.put(builderToStreamMap.get(builderToModule.getKey()), builderToModule.getValue());\r
+        }\r
+        return retVal;\r
+    }\r
+\r
+    @Override\r
+    public SchemaContext resolveSchemaContext(final Set<Module> modules) {\r
+        return new SchemaContextImpl(modules);\r
+    }\r
+\r
+    private ModuleBuilder[] parseModuleBuilders(List<InputStream> inputStreams,\r
+            Map<ModuleBuilder, InputStream> streamToBuilderMap) {\r
+\r
+        final ParseTreeWalker walker = new ParseTreeWalker();\r
+        final List<ParseTree> trees = parseStreams(inputStreams);\r
+        final ModuleBuilder[] builders = new ModuleBuilder[trees.size()];\r
+\r
+        // validate yang\r
+        new YangModelBasicValidator(walker).validate(trees);\r
+\r
+        YangParserListenerImpl yangModelParser = null;\r
+        for (int i = 0; i < trees.size(); i++) {\r
+            yangModelParser = new YangParserListenerImpl();\r
+            walker.walk(yangModelParser, trees.get(i));\r
+            ModuleBuilder moduleBuilder = yangModelParser.getModuleBuilder();\r
+\r
+            // We expect the order of trees and streams has to be the same\r
+            streamToBuilderMap.put(moduleBuilder, inputStreams.get(i));\r
+            builders[i] = moduleBuilder;\r
+        }\r
+        return builders;\r
+    }\r
+\r
+    private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuilders(final List<InputStream> yangFileStreams,\r
+            Map<ModuleBuilder, InputStream> streamToBuilderMap) {\r
+        return resolveModuleBuildersWithContext(yangFileStreams, streamToBuilderMap, null);\r
+    }\r
+\r
+    private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuildersWithContext(\r
+            final List<InputStream> yangFileStreams, final Map<ModuleBuilder, InputStream> streamToBuilderMap,\r
+            final SchemaContext context) {\r
+        final ModuleBuilder[] builders = parseModuleBuilders(yangFileStreams, streamToBuilderMap);\r
+\r
+        // LinkedHashMap must be used to preserve order\r
+        final LinkedHashMap<String, TreeMap<Date, ModuleBuilder>> modules = new LinkedHashMap<String, TreeMap<Date, ModuleBuilder>>();\r
+\r
+        // module dependency graph sorted\r
+        List<ModuleBuilder> sorted = null;\r
+        if (context == null) {\r
+            sorted = ModuleDependencySort.sort(builders);\r
+        } else {\r
+            sorted = ModuleDependencySort.sortWithContext(context, builders);\r
+        }\r
+\r
+        for (final ModuleBuilder builder : sorted) {\r
+            if (builder == null) {\r
+                continue;\r
+            }\r
+            final String builderName = builder.getName();\r
+            Date builderRevision = builder.getRevision();\r
+            if (builderRevision == null) {\r
+                builderRevision = new Date(0L);\r
+            }\r
+            TreeMap<Date, ModuleBuilder> builderByRevision = modules.get(builderName);\r
+            if (builderByRevision == null) {\r
+                builderByRevision = new TreeMap<Date, ModuleBuilder>();\r
+            }\r
+            builderByRevision.put(builderRevision, builder);\r
+            modules.put(builderName, builderByRevision);\r
+        }\r
+        return modules;\r
+    }\r
+\r
+    private List<ParseTree> parseStreams(final List<InputStream> yangStreams) {\r
+        final List<ParseTree> trees = new ArrayList<ParseTree>();\r
+        for (InputStream yangStream : yangStreams) {\r
+            trees.add(parseStream(yangStream));\r
+        }\r
+        return trees;\r
+    }\r
+\r
+    private ParseTree parseStream(final InputStream yangStream) {\r
+        ParseTree result = null;\r
+        try {\r
+            final ANTLRInputStream input = new ANTLRInputStream(yangStream);\r
+            final YangLexer lexer = new YangLexer(input);\r
+            final CommonTokenStream tokens = new CommonTokenStream(lexer);\r
+            final YangParser parser = new YangParser(tokens);\r
+            parser.removeErrorListeners();\r
+            parser.addErrorListener(new YangErrorListener());\r
+\r
+            result = parser.yang();\r
+        } catch (IOException e) {\r
+            LOG.warn("Exception while reading yang file: " + yangStream, e);\r
+        }\r
+        return result;\r
+    }\r
+\r
+    private Map<ModuleBuilder, Module> build(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {\r
+        // fix unresolved nodes\r
+        findUsesTargets(modules, null);\r
+        resolveDirtyNodes(modules);\r
+        resolveAugments(modules);\r
+        resolveUses(modules);\r
+        resolveDeviations(modules);\r
+\r
+        // build\r
+        final Map<ModuleBuilder, Module> result = new LinkedHashMap<ModuleBuilder, Module>();\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            final Map<Date, Module> modulesByRevision = new HashMap<Date, Module>();\r
+            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {\r
+                final ModuleBuilder moduleBuilder = childEntry.getValue();\r
+                final Module module = moduleBuilder.build();\r
+                modulesByRevision.put(childEntry.getKey(), module);\r
+                result.put(moduleBuilder, module);\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+\r
+    private Map<ModuleBuilder, Module> buildWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final SchemaContext context) {\r
+        // fix unresolved nodes\r
+        findUsesTargets(modules, context);\r
+        resolvedDirtyNodesWithContext(modules, context);\r
+        resolveAugmentsWithContext(modules, context);\r
+        resolveUsesWithContext(modules, context);\r
+        resolveDeviationsWithContext(modules, context);\r
+\r
+        // build\r
+        final Map<ModuleBuilder, Module> result = new LinkedHashMap<ModuleBuilder, Module>();\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            final Map<Date, Module> modulesByRevision = new HashMap<Date, Module>();\r
+            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {\r
+                final ModuleBuilder moduleBuilder = childEntry.getValue();\r
+                final Module module = moduleBuilder.build();\r
+                modulesByRevision.put(childEntry.getKey(), module);\r
+                result.put(moduleBuilder, module);\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+\r
+    private void resolveDirtyNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {\r
+                final ModuleBuilder module = childEntry.getValue();\r
+                resolveDirtyNodes(modules, module);\r
+                resolveIdentities(modules, module);\r
+                resolveUnknownNodes(modules, module);\r
+            }\r
+        }\r
+    }\r
+\r
+    private void resolvedDirtyNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final SchemaContext context) {\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {\r
+                final ModuleBuilder module = childEntry.getValue();\r
+                resolveDirtyNodesWithContext(modules, module, context);\r
+                resolveIdentitiesWithContext(modules, module, context);\r
+                resolveUnknownNodesWithContext(modules, module, context);\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Search for dirty nodes (node which contains UnknownType) and resolve\r
+     * unknown types.\r
+     *\r
+     * @param modules\r
+     *            all available modules\r
+     * @param module\r
+     *            current module\r
+     */\r
+    private void resolveDirtyNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {\r
+        final Set<TypeAwareBuilder> dirtyNodes = module.getDirtyNodes();\r
+        if (!dirtyNodes.isEmpty()) {\r
+            for (TypeAwareBuilder nodeToResolve : dirtyNodes) {\r
+                if (nodeToResolve instanceof UnionTypeBuilder) {\r
+                    // special handling for union types\r
+                    resolveTypeUnion((UnionTypeBuilder) nodeToResolve, modules, module);\r
+                } else if (nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) {\r
+                    // special handling for identityref types\r
+                    IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) nodeToResolve.getTypedef();\r
+                    nodeToResolve.setType(new IdentityrefType(findFullQName(modules, module, idref), idref.getPath()));\r
+                } else {\r
+                    resolveType(nodeToResolve, modules, module);\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    private void resolveDirtyNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final ModuleBuilder module, SchemaContext context) {\r
+        final Set<TypeAwareBuilder> dirtyNodes = module.getDirtyNodes();\r
+        if (!dirtyNodes.isEmpty()) {\r
+            for (TypeAwareBuilder nodeToResolve : dirtyNodes) {\r
+                if (nodeToResolve instanceof UnionTypeBuilder) {\r
+                    // special handling for union types\r
+                    resolveTypeUnionWithContext((UnionTypeBuilder) nodeToResolve, modules, module, context);\r
+                } else if (nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) {\r
+                    // special handling for identityref types\r
+                    IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) nodeToResolve.getTypedef();\r
+                    nodeToResolve.setType(new IdentityrefType(findFullQName(modules, module, idref), idref.getPath()));\r
+                } else {\r
+                    resolveTypeWithContext(nodeToResolve, modules, module, context);\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Go through all augment definitions and perform augmentation. It is\r
+     * expected that modules are already sorted by their dependencies.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     */\r
+    private void resolveAugments(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {\r
+        // collect augments from all loaded modules\r
+        final List<AugmentationSchemaBuilder> allAugments = new ArrayList<>();\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                allAugments.addAll(inner.getValue().getAllAugments());\r
+            }\r
+        }\r
+\r
+        for (int i = 0; i < allAugments.size(); i++) {\r
+            // pick one augment\r
+            final AugmentationSchemaBuilder augment = allAugments.get(i);\r
+            // create collection of others\r
+            List<AugmentationSchemaBuilder> others = new ArrayList<>(allAugments);\r
+            others.remove(augment);\r
+\r
+            // try to resolve it\r
+            boolean resolved = resolveAugment(modules, augment);\r
+            // while not resolved\r
+            int j = 0;\r
+            while (!(resolved) && j < others.size()) {\r
+                // try to resolve next augment\r
+                resolveAugment(modules, others.get(j));\r
+                // then try to resolve first again\r
+                resolved = resolveAugment(modules, augment);\r
+                j++;\r
+\r
+            }\r
+\r
+            if (!resolved) {\r
+                throw new YangParseException(augment.getModuleName(), augment.getLine(),\r
+                        "Error in augment parsing: failed to find augment target");\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Search for augment target and perform augmentation.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param augmentBuilder\r
+     *            augment to resolve\r
+     * @return true if target node found, false otherwise\r
+     */\r
+    private boolean resolveAugment(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final AugmentationSchemaBuilder augmentBuilder) {\r
+        if (augmentBuilder.isResolved()) {\r
+            return true;\r
+        }\r
+\r
+        int line = augmentBuilder.getLine();\r
+        ModuleBuilder module = getParentModule(augmentBuilder);\r
+        List<QName> path = augmentBuilder.getTargetPath().getPath();\r
+        Builder augmentParent = augmentBuilder.getParent();\r
+\r
+        Builder firstNodeParent = null;\r
+        if (augmentParent instanceof ModuleBuilder) {\r
+            // if augment is defined under module, parent of first node is\r
+            // target module\r
+            final QName firstNameInPath = path.get(0);\r
+            String prefix = firstNameInPath.getPrefix();\r
+            if (prefix == null) {\r
+                prefix = module.getPrefix();\r
+            }\r
+            firstNodeParent = findDependentModuleBuilder(modules, module, prefix, line);\r
+        } else if (augmentParent instanceof UsesNodeBuilder) {\r
+            firstNodeParent = augmentParent.getParent();\r
+        } else {\r
+            // augment can be defined only under module or uses\r
+            throw new YangParseException(augmentBuilder.getModuleName(), line,\r
+                    "Failed to parse augment: Unresolved parent of augment: " + augmentParent);\r
+        }\r
+\r
+        return processAugmentation(augmentBuilder, firstNodeParent, path);\r
+    }\r
+\r
+    /**\r
+     * Go through all augment definitions and resolve them. This method works in\r
+     * same way as {@link #resolveAugments(Map)} except that if target node is\r
+     * not found in loaded modules, it search for target node in given context.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param context\r
+     *            SchemaContext containing already resolved modules\r
+     */\r
+    private void resolveAugmentsWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final SchemaContext context) {\r
+        // collect augments from all loaded modules\r
+        final List<AugmentationSchemaBuilder> allAugments = new ArrayList<>();\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                allAugments.addAll(inner.getValue().getAllAugments());\r
+            }\r
+        }\r
+\r
+        for (int i = 0; i < allAugments.size(); i++) {\r
+            // pick augment from list\r
+            final AugmentationSchemaBuilder augment = allAugments.get(i);\r
+            // try to resolve it\r
+            boolean resolved = resolveAugmentWithContext(modules, augment, context);\r
+            // while not resolved\r
+            int j = i + 1;\r
+            while (!(resolved) && j < allAugments.size()) {\r
+                // try to resolve next augment\r
+                resolveAugmentWithContext(modules, allAugments.get(j), context);\r
+                // then try to resolve first again\r
+                resolved = resolveAugmentWithContext(modules, augment, context);\r
+                j++;\r
+            }\r
+\r
+            if (!resolved) {\r
+                throw new YangParseException(augment.getModuleName(), augment.getLine(),\r
+                        "Error in augment parsing: failed to find augment target");\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Search for augment target and perform augmentation.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param augment\r
+     *            augment to resolve\r
+     * @param context\r
+     *            SchemaContext containing already resolved modules\r
+     * @return true if target node found, false otherwise\r
+     */\r
+    private boolean resolveAugmentWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final AugmentationSchemaBuilder augment, final SchemaContext context) {\r
+        if (augment.isResolved()) {\r
+            return true;\r
+        }\r
+        int line = augment.getLine();\r
+        ModuleBuilder module = getParentModule(augment);\r
+        List<QName> path = augment.getTargetPath().getPath();\r
+        final QName firstNameInPath = path.get(0);\r
+        String prefix = firstNameInPath.getPrefix();\r
+        if (prefix == null) {\r
+            prefix = module.getPrefix();\r
+        }\r
+        Builder augmentParent = augment.getParent();\r
+        Builder currentParent = null;\r
+\r
+        if (augmentParent instanceof ModuleBuilder) {\r
+            // if augment is defined under module, first parent is target module\r
+            currentParent = findDependentModuleBuilder(modules, module, prefix, line);\r
+        } else if (augmentParent instanceof UsesNodeBuilder) {\r
+            currentParent = augmentParent.getParent();\r
+        } else {\r
+            // augment can be defined only under module or uses\r
+            throw new YangParseException(augment.getModuleName(), augment.getLine(),\r
+                    "Error in augment parsing: Unresolved parent of augment: " + augmentParent);\r
+        }\r
+\r
+        if (currentParent == null) {\r
+            return processAugmentationOnContext(augment, path, module, prefix, context);\r
+        } else {\r
+            return processAugmentation(augment, currentParent, path);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Go through identity statements defined in current module and resolve\r
+     * their 'base' statement if present.\r
+     *\r
+     * @param modules\r
+     *            all modules\r
+     * @param module\r
+     *            module being resolved\r
+     */\r
+    private void resolveIdentities(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {\r
+        final Set<IdentitySchemaNodeBuilder> identities = module.getIdentities();\r
+        for (IdentitySchemaNodeBuilder identity : identities) {\r
+            final String baseIdentityName = identity.getBaseIdentityName();\r
+            if (baseIdentityName != null) {\r
+                String baseIdentityPrefix = null;\r
+                String baseIdentityLocalName = null;\r
+                if (baseIdentityName.contains(":")) {\r
+                    final String[] splitted = baseIdentityName.split(":");\r
+                    baseIdentityPrefix = splitted[0];\r
+                    baseIdentityLocalName = splitted[1];\r
+                } else {\r
+                    baseIdentityPrefix = module.getPrefix();\r
+                    baseIdentityLocalName = baseIdentityName;\r
+                }\r
+                final ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, baseIdentityPrefix,\r
+                        identity.getLine());\r
+\r
+                final Set<IdentitySchemaNodeBuilder> dependentModuleIdentities = dependentModule.getIdentities();\r
+                for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) {\r
+                    if (idBuilder.getQName().getLocalName().equals(baseIdentityLocalName)) {\r
+                        identity.setBaseIdentity(idBuilder);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Go through identity statements defined in current module and resolve\r
+     * their 'base' statement. Method tries to find base identity in given\r
+     * modules. If base identity is not found, method will search it in context.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param module\r
+     *            current module\r
+     * @param context\r
+     *            SchemaContext containing already resolved modules\r
+     */\r
+    private void resolveIdentitiesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final ModuleBuilder module, final SchemaContext context) {\r
+        final Set<IdentitySchemaNodeBuilder> identities = module.getIdentities();\r
+        for (IdentitySchemaNodeBuilder identity : identities) {\r
+            final String baseIdentityName = identity.getBaseIdentityName();\r
+            if (baseIdentityName != null) {\r
+                String baseIdentityPrefix = null;\r
+                String baseIdentityLocalName = null;\r
+                if (baseIdentityName.contains(":")) {\r
+                    final String[] splitted = baseIdentityName.split(":");\r
+                    baseIdentityPrefix = splitted[0];\r
+                    baseIdentityLocalName = splitted[1];\r
+                } else {\r
+                    baseIdentityPrefix = module.getPrefix();\r
+                    baseIdentityLocalName = baseIdentityName;\r
+                }\r
+                final ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module,\r
+                        baseIdentityPrefix, identity.getLine());\r
+\r
+                if (dependentModuleBuilder == null) {\r
+                    final Module dependentModule = findModuleFromContext(context, module, baseIdentityPrefix,\r
+                            identity.getLine());\r
+                    final Set<IdentitySchemaNode> dependentModuleIdentities = dependentModule.getIdentities();\r
+                    for (IdentitySchemaNode idNode : dependentModuleIdentities) {\r
+                        if (idNode.getQName().getLocalName().equals(baseIdentityLocalName)) {\r
+                            identity.setBaseIdentity(idNode);\r
+                        }\r
+                    }\r
+                } else {\r
+                    final Set<IdentitySchemaNodeBuilder> dependentModuleIdentities = dependentModuleBuilder\r
+                            .getIdentities();\r
+                    for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) {\r
+                        if (idBuilder.getQName().getLocalName().equals(baseIdentityLocalName)) {\r
+                            identity.setBaseIdentity(idBuilder);\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Find and add reference of uses target grouping.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param context\r
+     *            SchemaContext containing already resolved modules or null if\r
+     *            context is not available\r
+     */\r
+    private void findUsesTargets(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final SchemaContext context) {\r
+        final List<UsesNodeBuilder> allUses = new ArrayList<>();\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                allUses.addAll(inner.getValue().getAllUsesNodes());\r
+            }\r
+        }\r
+        for (UsesNodeBuilder usesNode : allUses) {\r
+            ModuleBuilder module = ParserUtils.getParentModule(usesNode);\r
+            final GroupingBuilder targetGroupingBuilder = GroupingUtils.getTargetGroupingFromModules(usesNode, modules,\r
+                    module);\r
+            if (targetGroupingBuilder == null) {\r
+                if (context == null) {\r
+                    throw new YangParseException(module.getName(), usesNode.getLine(), "Referenced grouping '"\r
+                            + usesNode.getGroupingPathAsString() + "' not found.");\r
+                } else {\r
+                    GroupingDefinition targetGroupingDefinition = GroupingUtils.getTargetGroupingFromContext(usesNode,\r
+                            module, context);\r
+                    usesNode.setGroupingDefinition(targetGroupingDefinition);\r
+                }\r
+            } else {\r
+                usesNode.setGrouping(targetGroupingBuilder);\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Copy data from uses target, update uses parent and perform refinement.\r
+     * Augmentations have to be resolved already.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     */\r
+    private void resolveUses(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                ModuleBuilder module = inner.getValue();\r
+                List<UsesNodeBuilder> usesNodes = null;\r
+                boolean dataCollected = module.isAllUsesDataCollected();\r
+\r
+                while (!dataCollected) {\r
+                    usesNodes = new ArrayList<>(module.getAllUsesNodes());\r
+                    for (UsesNodeBuilder usesNode : usesNodes) {\r
+                        if (!usesNode.isDataCollected()) {\r
+                            GroupingUtils.collectUsesData(usesNode);\r
+                        }\r
+                    }\r
+                    dataCollected = module.isAllUsesDataCollected();\r
+                }\r
+            }\r
+        }\r
+\r
+        // new loop is must because in collecting data process new uses could\r
+        // be created\r
+        final List<UsesNodeBuilder> allModulesUses = new ArrayList<>();\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                allModulesUses.addAll(inner.getValue().getAllUsesNodes());\r
+            }\r
+        }\r
+\r
+        for (UsesNodeBuilder usesNode : allModulesUses) {\r
+            GroupingUtils.updateUsesParent(usesNode);\r
+            GroupingUtils.performRefine(usesNode);\r
+        }\r
+        for (UsesNodeBuilder usesNode : allModulesUses) {\r
+            GroupingUtils.fixUsesNodesPath(usesNode);\r
+        }\r
+\r
+        for (UsesNodeBuilder usesNode : allModulesUses) {\r
+            if (usesNode.isCopy()) {\r
+                usesNode.getParent().getUsesNodes().remove(usesNode);\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Copy data from uses target, update uses parent and perform refinement.\r
+     * Augmentations have to be resolved already.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param context\r
+     *            SchemaContext containing already resolved modules\r
+     */\r
+    private void resolveUsesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final SchemaContext context) {\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                ModuleBuilder module = inner.getValue();\r
+                List<UsesNodeBuilder> usesNodes = null;\r
+                boolean dataCollected = module.isAllUsesDataCollected();\r
+\r
+                while (!dataCollected) {\r
+                    usesNodes = new ArrayList<>(module.getAllUsesNodes());\r
+                    for (UsesNodeBuilder usesNode : usesNodes) {\r
+                        if (!usesNode.isDataCollected()) {\r
+                            if (usesNode.getGroupingBuilder() == null) {\r
+                                GroupingUtils.collectUsesDataFromContext(usesNode);\r
+                            } else {\r
+                                GroupingUtils.collectUsesData(usesNode);\r
+                            }\r
+                        }\r
+                    }\r
+                    dataCollected = module.isAllUsesDataCollected();\r
+                }\r
+            }\r
+        }\r
+\r
+        // new loop is must because in collecting data process new uses could\r
+        // be created\r
+        final List<UsesNodeBuilder> allModulesUses = new ArrayList<>();\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                allModulesUses.addAll(inner.getValue().getAllUsesNodes());\r
+            }\r
+        }\r
+\r
+        for (UsesNodeBuilder usesNode : allModulesUses) {\r
+            GroupingUtils.updateUsesParent(usesNode);\r
+            GroupingUtils.performRefine(usesNode);\r
+        }\r
+        for (UsesNodeBuilder usesNode : allModulesUses) {\r
+            GroupingUtils.fixUsesNodesPath(usesNode);\r
+        }\r
+    }\r
+\r
+    private void resolveUnknownNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {\r
+        for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) {\r
+            QName nodeType = usnb.getNodeType();\r
+            try {\r
+                ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, nodeType.getPrefix(),\r
+                        usnb.getLine());\r
+                for (ExtensionBuilder extension : dependentModule.getExtensions()) {\r
+                    if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) {\r
+                        usnb.setNodeType(extension.getQName());\r
+                        usnb.setExtensionBuilder(extension);\r
+                        break;\r
+                    }\r
+                }\r
+            } catch (YangParseException e) {\r
+                throw new YangParseException(module.getName(), usnb.getLine(), "Failed to resolve node " + usnb\r
+                        + ": no such extension definition found.");\r
+            }\r
+        }\r
+    }\r
+\r
+    private void resolveUnknownNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final ModuleBuilder module, final SchemaContext context) {\r
+        for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) {\r
+            QName nodeType = usnb.getNodeType();\r
+            try {\r
+                ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module,\r
+                        nodeType.getPrefix(), usnb.getLine());\r
+\r
+                if (dependentModuleBuilder == null) {\r
+                    Module dependentModule = findModuleFromContext(context, module, nodeType.getPrefix(),\r
+                            usnb.getLine());\r
+                    for (ExtensionDefinition e : dependentModule.getExtensionSchemaNodes()) {\r
+                        if (e.getQName().getLocalName().equals(nodeType.getLocalName())) {\r
+                            usnb.setNodeType(new QName(e.getQName().getNamespace(), e.getQName().getRevision(),\r
+                                    nodeType.getPrefix(), e.getQName().getLocalName()));\r
+                            usnb.setExtensionDefinition(e);\r
+                            break;\r
+                        }\r
+                    }\r
+                } else {\r
+                    for (ExtensionBuilder extension : dependentModuleBuilder.getExtensions()) {\r
+                        if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) {\r
+                            usnb.setExtensionBuilder(extension);\r
+                            break;\r
+                        }\r
+                    }\r
+                }\r
+\r
+            } catch (YangParseException e) {\r
+                throw new YangParseException(module.getName(), usnb.getLine(), "Failed to resolve node " + usnb\r
+                        + ": no such extension definition found.");\r
+            }\r
+\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Traverse through modules and resolve their deviation statements.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     */\r
+    private void resolveDeviations(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                ModuleBuilder b = inner.getValue();\r
+                resolveDeviation(modules, b);\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Traverse through module and resolve its deviation statements.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param module\r
+     *            module in which resolve deviations\r
+     */\r
+    private void resolveDeviation(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {\r
+        for (DeviationBuilder dev : module.getDeviations()) {\r
+            int line = dev.getLine();\r
+            SchemaPath targetPath = dev.getTargetPath();\r
+            List<QName> path = targetPath.getPath();\r
+            QName q0 = path.get(0);\r
+            String prefix = q0.getPrefix();\r
+            if (prefix == null) {\r
+                prefix = module.getPrefix();\r
+            }\r
+\r
+            ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, prefix, line);\r
+            processDeviation(dev, dependentModuleBuilder, path, module);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Traverse through modules and resolve their deviation statements with\r
+     * given context.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param context\r
+     *            already resolved context\r
+     */\r
+    private void resolveDeviationsWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final SchemaContext context) {\r
+        for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {\r
+            for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {\r
+                ModuleBuilder b = inner.getValue();\r
+                resolveDeviationWithContext(modules, b, context);\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Traverse through module and resolve its deviation statements with given\r
+     * context.\r
+     *\r
+     * @param modules\r
+     *            all loaded modules\r
+     * @param module\r
+     *            module in which resolve deviations\r
+     * @param context\r
+     *            already resolved context\r
+     */\r
+    private void resolveDeviationWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,\r
+            final ModuleBuilder module, final SchemaContext context) {\r
+        for (DeviationBuilder dev : module.getDeviations()) {\r
+            int line = dev.getLine();\r
+            SchemaPath targetPath = dev.getTargetPath();\r
+            List<QName> path = targetPath.getPath();\r
+            QName q0 = path.get(0);\r
+            String prefix = q0.getPrefix();\r
+            if (prefix == null) {\r
+                prefix = module.getPrefix();\r
+            }\r
+            String name = null;\r
+\r
+            ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, prefix, line);\r
+            if (dependentModuleBuilder == null) {\r
+                Module dependentModule = findModuleFromContext(context, module, prefix, line);\r
+                Object currentParent = dependentModule;\r
+\r
+                for (int i = 0; i < path.size(); i++) {\r
+                    if (currentParent == null) {\r
+                        throw new YangParseException(module.getName(), line, "Failed to find deviation target.");\r
+                    }\r
+                    QName q = path.get(i);\r
+                    name = q.getLocalName();\r
+                    if (currentParent instanceof DataNodeContainer) {\r
+                        currentParent = ((DataNodeContainer) currentParent).getDataChildByName(name);\r
+                    }\r
+                }\r
+\r
+                if (currentParent == null) {\r
+                    throw new YangParseException(module.getName(), line, "Failed to find deviation target.");\r
+                }\r
+                if (currentParent instanceof SchemaNode) {\r
+                    dev.setTargetPath(((SchemaNode) currentParent).getPath());\r
+                }\r
+\r
+            } else {\r
+                processDeviation(dev, dependentModuleBuilder, path, module);\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Correct deviation target path in deviation builder.\r
+     *\r
+     * @param dev\r
+     *            deviation\r
+     * @param dependentModuleBuilder\r
+     *            module containing deviation target\r
+     * @param path\r
+     *            current deviation target path\r
+     * @param module\r
+     *            current module\r
+     */\r
+    private void processDeviation(final DeviationBuilder dev, final ModuleBuilder dependentModuleBuilder,\r
+            final List<QName> path, final ModuleBuilder module) {\r
+        final int line = dev.getLine();\r
+        Builder currentParent = dependentModuleBuilder;\r
+\r
+        for (int i = 0; i < path.size(); i++) {\r
+            if (currentParent == null) {\r
+                throw new YangParseException(module.getName(), line, "Failed to find deviation target.");\r
+            }\r
+            QName q = path.get(i);\r
+            String name = q.getLocalName();\r
+            if (currentParent instanceof DataNodeContainerBuilder) {\r
+                currentParent = ((DataNodeContainerBuilder) currentParent).getDataChildByName(name);\r
+            }\r
+        }\r
+\r
+        if (currentParent == null || !(currentParent instanceof SchemaNodeBuilder)) {\r
+            throw new YangParseException(module.getName(), line, "Failed to find deviation target.");\r
+        }\r
+        dev.setTargetPath(((SchemaNodeBuilder) currentParent).getPath());\r
+    }\r
+\r
+}\r
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java
deleted file mode 100644 (file)
index f368e83..0000000
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * 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.parser.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-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.ChoiceNode;
-import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.ModuleImport;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
-import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder.ChoiceNodeImpl;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceCaseBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceCaseBuilder.ChoiceCaseNodeImpl;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder.ContainerSchemaNodeImpl;
-import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ListSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ListSchemaNodeBuilder.ListSchemaNodeImpl;
-import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.NotificationBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.impl.NotificationBuilder.NotificationDefinitionImpl;
-
-public final class ParserUtils {
-
-    private ParserUtils() {
-    }
-
-    /**
-     * Create new SchemaPath from given path and qname.
-     *
-     * @param schemaPath
-     * @param qname
-     * @return
-     */
-    public static SchemaPath createSchemaPath(SchemaPath schemaPath, QName... qname) {
-        List<QName> path = new ArrayList<>(schemaPath.getPath());
-        path.addAll(Arrays.asList(qname));
-        return new SchemaPath(path, schemaPath.isAbsolute());
-    }
-
-    /**
-     * Get module import referenced by given prefix.
-     *
-     * @param builder
-     *            module to search
-     * @param prefix
-     *            prefix associated with import
-     * @return ModuleImport based on given prefix
-     */
-    public static ModuleImport getModuleImport(final ModuleBuilder builder, final String prefix) {
-        ModuleImport moduleImport = null;
-        for (ModuleImport mi : builder.getModuleImports()) {
-            if (mi.getPrefix().equals(prefix)) {
-                moduleImport = mi;
-                break;
-            }
-        }
-        return moduleImport;
-    }
-
-    /**
-     * Find dependent module based on given prefix
-     *
-     * @param modules
-     *            all available modules
-     * @param module
-     *            current module
-     * @param prefix
-     *            target module prefix
-     * @param line
-     *            current line in yang model
-     * @return module builder if found, null otherwise
-     */
-    public static ModuleBuilder findDependentModuleBuilder(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, final String prefix, final int line) {
-        ModuleBuilder dependentModule = null;
-        Date dependentModuleRevision = null;
-
-        if (prefix.equals(module.getPrefix())) {
-            dependentModule = module;
-        } else {
-            final ModuleImport dependentModuleImport = getModuleImport(module, prefix);
-            if (dependentModuleImport == null) {
-                throw new YangParseException(module.getName(), line, "No import found with prefix '" + prefix + "'.");
-            }
-            final String dependentModuleName = dependentModuleImport.getModuleName();
-            dependentModuleRevision = dependentModuleImport.getRevision();
-
-            final TreeMap<Date, ModuleBuilder> moduleBuildersByRevision = modules.get(dependentModuleName);
-            if (moduleBuildersByRevision == null) {
-                return null;
-            }
-            if (dependentModuleRevision == null) {
-                dependentModule = moduleBuildersByRevision.lastEntry().getValue();
-            } else {
-                dependentModule = moduleBuildersByRevision.get(dependentModuleRevision);
-            }
-        }
-        return dependentModule;
-    }
-
-    /**
-     * Find module from context based on prefix.
-     *
-     * @param context
-     *            schema context
-     * @param currentModule
-     *            current module
-     * @param prefix
-     *            current prefix used to reference dependent module
-     * @param line
-     *            current line in yang model
-     * @return module based on given prefix if found in context, null otherwise
-     */
-    public static Module findModuleFromContext(final SchemaContext context, final ModuleBuilder currentModule,
-            final String prefix, final int line) {
-        TreeMap<Date, Module> modulesByRevision = new TreeMap<Date, Module>();
-
-        final ModuleImport dependentModuleImport = ParserUtils.getModuleImport(currentModule, prefix);
-        if (dependentModuleImport == null) {
-            throw new YangParseException(currentModule.getName(), line, "No import found with prefix '" + prefix + "'.");
-        }
-        final String dependentModuleName = dependentModuleImport.getModuleName();
-        final Date dependentModuleRevision = dependentModuleImport.getRevision();
-
-        for (Module contextModule : context.getModules()) {
-            if (contextModule.getName().equals(dependentModuleName)) {
-                Date revision = contextModule.getRevision();
-                if (revision == null) {
-                    revision = new Date(0L);
-                }
-                modulesByRevision.put(revision, contextModule);
-                break;
-            }
-        }
-
-        Module result = null;
-        if (dependentModuleRevision == null) {
-            result = modulesByRevision.get(modulesByRevision.firstKey());
-        } else {
-            result = modulesByRevision.get(dependentModuleRevision);
-        }
-
-        return result;
-    }
-
-    /**
-     * Parse XPath string.
-     *
-     * @param xpathString
-     *            as String
-     * @return SchemaPath from given String
-     */
-    public static SchemaPath parseXPathString(final String xpathString) {
-        final boolean absolute = xpathString.startsWith("/");
-        final String[] splittedPath = xpathString.split("/");
-        final List<QName> path = new ArrayList<QName>();
-        QName name;
-        for (String pathElement : splittedPath) {
-            if (pathElement.length() > 0) {
-                final String[] splittedElement = pathElement.split(":");
-                if (splittedElement.length == 1) {
-                    name = new QName(null, null, null, splittedElement[0]);
-                } else {
-                    name = new QName(null, null, splittedElement[0], splittedElement[1]);
-                }
-                path.add(name);
-            }
-        }
-        return new SchemaPath(path, absolute);
-    }
-
-    /**
-     * Add all augment's child nodes to given target.
-     *
-     * @param augment
-     *            builder of augment statement
-     * @param target
-     *            augmentation target node
-     */
-    public static void fillAugmentTarget(final AugmentationSchemaBuilder augment, final DataNodeContainerBuilder target) {
-        for (DataSchemaNodeBuilder child : augment.getChildNodeBuilders()) {
-            DataSchemaNodeBuilder childCopy = CopyUtils.copy(child, target, false);
-            childCopy.setAugmenting(true);
-            correctNodePath(child, target.getPath());
-            correctNodePath(childCopy, target.getPath());
-            try {
-                target.addChildNode(childCopy);
-            } catch (YangParseException e) {
-                // more descriptive message
-                throw new YangParseException(augment.getModuleName(), augment.getLine(),
-                        "Failed to perform augmentation: " + e.getMessage());
-            }
-
-        }
-        for (UsesNodeBuilder usesNode : augment.getUsesNodes()) {
-            UsesNodeBuilder copy = CopyUtils.copyUses(usesNode, target);
-            target.addUsesNode(copy);
-        }
-    }
-
-    /**
-     * Add all augment's child nodes to given target.
-     *
-     * @param augment
-     *            builder of augment statement
-     * @param target
-     *            augmentation target choice node
-     */
-    public static void fillAugmentTarget(final AugmentationSchemaBuilder augment, final ChoiceBuilder target) {
-        for (DataSchemaNodeBuilder builder : augment.getChildNodeBuilders()) {
-            DataSchemaNodeBuilder childCopy = CopyUtils.copy(builder, target, false);
-            childCopy.setAugmenting(true);
-            correctNodePath(builder, target.getPath());
-            correctNodePath(childCopy, target.getPath());
-            target.addCase(childCopy);
-        }
-        for (UsesNodeBuilder usesNode : augment.getUsesNodes()) {
-            if (usesNode != null) {
-                throw new YangParseException(augment.getModuleName(), augment.getLine(),
-                        "Error in augment parsing: cannot augment uses to choice");
-            }
-        }
-    }
-
-    /**
-     * Create new schema path of node based on parent node schema path.
-     *
-     * @param node
-     *            node to correct
-     * @param parentSchemaPath
-     *            schema path of node parent
-     */
-    static void correctNodePath(final SchemaNodeBuilder node, final SchemaPath parentSchemaPath) {
-        // set correct path
-        List<QName> targetNodePath = new ArrayList<QName>(parentSchemaPath.getPath());
-        targetNodePath.add(node.getQName());
-        node.setPath(new SchemaPath(targetNodePath, true));
-
-        // set correct path for all child nodes
-        if (node instanceof DataNodeContainerBuilder) {
-            DataNodeContainerBuilder dataNodeContainer = (DataNodeContainerBuilder) node;
-            for (DataSchemaNodeBuilder child : dataNodeContainer.getChildNodeBuilders()) {
-                correctNodePath(child, node.getPath());
-            }
-        }
-
-        // set correct path for all cases
-        if (node instanceof ChoiceBuilder) {
-            ChoiceBuilder choiceBuilder = (ChoiceBuilder) node;
-            for (ChoiceCaseBuilder choiceCaseBuilder : choiceBuilder.getCases()) {
-                correctNodePath(choiceCaseBuilder, node.getPath());
-            }
-        }
-    }
-
-    /**
-     * Find augment target node and perform augmentation.
-     *
-     * @param augment
-     * @param firstNodeParent
-     *            parent of first node in path
-     * @param path
-     *            path to augment target
-     * @return true if augmentation process succeed, false otherwise
-     */
-    public static boolean processAugmentation(final AugmentationSchemaBuilder augment, final Builder firstNodeParent,
-            final List<QName> path) {
-        // traverse augment target path and try to reach target node
-        String currentName = null;
-        Builder currentParent = firstNodeParent;
-
-        for (int i = 0; i < path.size(); i++) {
-            QName qname = path.get(i);
-
-            currentName = qname.getLocalName();
-            if (currentParent instanceof DataNodeContainerBuilder) {
-                DataSchemaNodeBuilder nodeFound = ((DataNodeContainerBuilder) currentParent)
-                        .getDataChildByName(currentName);
-                // if not found as regular child, search in uses
-                if (nodeFound == null) {
-                    boolean found = false;
-                    for (UsesNodeBuilder unb : ((DataNodeContainerBuilder) currentParent).getUsesNodes()) {
-                        DataSchemaNodeBuilder result = findNodeInUses(currentName, unb);
-                        if (result != null) {
-                            currentParent = result;
-                            found = true;
-                            break;
-                        }
-                    }
-                    // if not found even in uses nodes, return false
-                    if (!found) {
-                        return false;
-                    }
-                } else {
-                    currentParent = nodeFound;
-                }
-            } else if (currentParent instanceof ChoiceBuilder) {
-                currentParent = ((ChoiceBuilder) currentParent).getCaseNodeByName(currentName);
-            } else {
-                throw new YangParseException(augment.getModuleName(), augment.getLine(),
-                        "Error in augment parsing: failed to find node " + currentName);
-            }
-
-            // if node in path not found, return false
-            if (currentParent == null) {
-                return false;
-            }
-        }
-        if (!(currentParent instanceof DataSchemaNodeBuilder)) {
-            throw new YangParseException(
-                    augment.getModuleName(),
-                    augment.getLine(),
-                    "Error in augment parsing: The target node MUST be either a container, list, choice, case, input, output, or notification node.");
-        }
-
-        if (currentParent instanceof ChoiceBuilder) {
-            fillAugmentTarget(augment, (ChoiceBuilder) currentParent);
-        } else {
-            fillAugmentTarget(augment, (DataNodeContainerBuilder) currentParent);
-        }
-        ((AugmentationTargetBuilder) currentParent).addAugmentation(augment);
-        SchemaPath oldPath = ((DataSchemaNodeBuilder) currentParent).getPath();
-        augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-        augment.setResolved(true);
-
-        return true;
-    }
-
-    /**
-     * Find node with given name in uses target.
-     *
-     * @param localName
-     *            name of node to find
-     * @param uses
-     *            uses node which target grouping should be searched
-     * @return node with given name if found, null otherwise
-     */
-    private static DataSchemaNodeBuilder findNodeInUses(String localName, UsesNodeBuilder uses) {
-        GroupingBuilder target = uses.getGroupingBuilder();
-        for (DataSchemaNodeBuilder child : target.getChildNodeBuilders()) {
-            if (child.getQName().getLocalName().equals(localName)) {
-                return child;
-            }
-        }
-        for (UsesNodeBuilder usesNode : target.getUsesNodes()) {
-            DataSchemaNodeBuilder result = findNodeInUses(localName, usesNode);
-            if (result != null) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Find augment target node in given context and perform augmentation.
-     *
-     * @param augment
-     * @param path
-     *            path to augment target
-     * @param module
-     *            current module
-     * @param prefix
-     *            current prefix of target module
-     * @param context
-     *            SchemaContext containing already resolved modules
-     * @return true if augment process succeed, false otherwise
-     */
-    public static boolean processAugmentationOnContext(final AugmentationSchemaBuilder augment, final List<QName> path,
-            final ModuleBuilder module, final String prefix, final SchemaContext context) {
-        final int line = augment.getLine();
-        final Module dependentModule = findModuleFromContext(context, module, prefix, line);
-        if (dependentModule == null) {
-            throw new YangParseException(module.getName(), line,
-                    "Error in augment parsing: failed to find module with prefix " + prefix + ".");
-        }
-
-        String currentName = path.get(0).getLocalName();
-        SchemaNode currentParent = dependentModule.getDataChildByName(currentName);
-        if (currentParent == null) {
-            Set<NotificationDefinition> notifications = dependentModule.getNotifications();
-            for (NotificationDefinition ntf : notifications) {
-                if (ntf.getQName().getLocalName().equals(currentName)) {
-                    currentParent = ntf;
-                    break;
-                }
-            }
-        }
-        if (currentParent == null) {
-            throw new YangParseException(module.getName(), line, "Error in augment parsing: failed to find node "
-                    + currentName + ".");
-        }
-
-        for (int i = 1; i < path.size(); i++) {
-            currentName = path.get(i).getLocalName();
-            if (currentParent instanceof DataNodeContainer) {
-                currentParent = ((DataNodeContainer) currentParent).getDataChildByName(currentName);
-            } else if (currentParent instanceof ChoiceNode) {
-                currentParent = ((ChoiceNode) currentParent).getCaseNodeByName(currentName);
-            } else {
-                throw new YangParseException(augment.getModuleName(), line,
-                        "Error in augment parsing: failed to find node " + currentName);
-            }
-            // if node in path not found, return false
-            if (currentParent == null) {
-                throw new YangParseException(module.getName(), line, "Error in augment parsing: failed to find node "
-                        + currentName + ".");
-            }
-        }
-
-        if (currentParent instanceof ContainerSchemaNodeImpl) {
-            // includes container, input and output statement
-            ContainerSchemaNodeImpl c = (ContainerSchemaNodeImpl) currentParent;
-            ContainerSchemaNodeBuilder cb = c.toBuilder();
-            fillAugmentTarget(augment, cb);
-            ((AugmentationTargetBuilder) cb).addAugmentation(augment);
-            SchemaPath oldPath = cb.getPath();
-            cb.rebuild();
-            augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-            augment.setResolved(true);
-        } else if (currentParent instanceof ListSchemaNodeImpl) {
-            ListSchemaNodeImpl l = (ListSchemaNodeImpl) currentParent;
-            ListSchemaNodeBuilder lb = l.toBuilder();
-            fillAugmentTarget(augment, lb);
-            ((AugmentationTargetBuilder) lb).addAugmentation(augment);
-            SchemaPath oldPath = lb.getPath();
-            lb.rebuild();
-            augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-            augment.setResolved(true);
-        } else if (currentParent instanceof ChoiceNodeImpl) {
-            ChoiceNodeImpl ch = (ChoiceNodeImpl) currentParent;
-            ChoiceBuilder chb = ch.toBuilder();
-            fillAugmentTarget(augment, chb);
-            ((AugmentationTargetBuilder) chb).addAugmentation(augment);
-            SchemaPath oldPath = chb.getPath();
-            chb.rebuild();
-            augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-            augment.setResolved(true);
-        } else if (currentParent instanceof ChoiceCaseNodeImpl) {
-            ChoiceCaseNodeImpl chc = (ChoiceCaseNodeImpl) currentParent;
-            ChoiceCaseBuilder chcb = chc.toBuilder();
-            fillAugmentTarget(augment, chcb);
-            ((AugmentationTargetBuilder) chcb).addAugmentation(augment);
-            SchemaPath oldPath = chcb.getPath();
-            chcb.rebuild();
-            augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-            augment.setResolved(true);
-        } else if (currentParent instanceof NotificationDefinitionImpl) {
-            NotificationDefinitionImpl nd = (NotificationDefinitionImpl) currentParent;
-            NotificationBuilder nb = nd.toBuilder();
-            fillAugmentTarget(augment, nb);
-            ((AugmentationTargetBuilder) nb).addAugmentation(augment);
-            SchemaPath oldPath = nb.getPath();
-            nb.rebuild();
-            augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-            augment.setResolved(true);
-        } else {
-            throw new YangParseException(module.getName(), line, "Target of type " + currentParent.getClass()
-                    + " cannot be augmented.");
-        }
-
-        return true;
-    }
-
-    public static QName findFullQName(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, final IdentityrefTypeBuilder idref) {
-        QName result = null;
-        String baseString = idref.getBaseString();
-        if (baseString.contains(":")) {
-            String[] splittedBase = baseString.split(":");
-            if (splittedBase.length > 2) {
-                throw new YangParseException(module.getName(), idref.getLine(), "Failed to parse identityref base: "
-                        + baseString);
-            }
-            String prefix = splittedBase[0];
-            String name = splittedBase[1];
-            ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, prefix, idref.getLine());
-            result = new QName(dependentModule.getNamespace(), dependentModule.getRevision(), prefix, name);
-        } else {
-            result = new QName(module.getNamespace(), module.getRevision(), module.getPrefix(), baseString);
-        }
-        return result;
-    }
-
-    /**
-     * Get module in which this node is defined.
-     *
-     * @param node
-     * @return builder of module where this node is defined
-     */
-    public static ModuleBuilder getParentModule(Builder node) {
-        if (node instanceof ModuleBuilder) {
-            return (ModuleBuilder) node;
-        }
-
-        Builder parent = node.getParent();
-        while (!(parent instanceof ModuleBuilder)) {
-            parent = parent.getParent();
-        }
-        return (ModuleBuilder) parent;
-    }
-
-}
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend
new file mode 100644 (file)
index 0000000..4bd5a24
--- /dev/null
@@ -0,0 +1,553 @@
+/*
+ * 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.parser.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.ModuleImport;
+import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
+import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder.ChoiceNodeImpl;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceCaseBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceCaseBuilder.ChoiceCaseNodeImpl;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder.ContainerSchemaNodeImpl;
+import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ListSchemaNodeBuilder.ListSchemaNodeImpl;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.impl.NotificationBuilder.NotificationDefinitionImpl;
+import org.opendaylight.yangtools.yang.model.api.AugmentationTarget
+import org.opendaylight.yangtools.yang.parser.builder.impl.RpcDefinitionBuilder
+
+
+public final class ParserUtils {
+
+    private new() {
+    }
+
+    /**
+     * Create new SchemaPath from given path and qname.
+     *
+     * @param schemaPath
+     * @param qname
+     * @return
+     */
+    public static def SchemaPath createSchemaPath(SchemaPath schemaPath, QName... qname) {
+        val path = new ArrayList<QName>(schemaPath.getPath());
+        path.addAll(Arrays.asList(qname));
+        return new SchemaPath(path, schemaPath.isAbsolute());
+    }
+
+    /**
+     * Get module import referenced by given prefix.
+     *
+     * @param builder
+     *            module to search
+     * @param prefix
+     *            prefix associated with import
+     * @return ModuleImport based on given prefix
+     */
+    public static def ModuleImport getModuleImport(ModuleBuilder builder, String prefix) {
+        for (ModuleImport mi : builder.getModuleImports()) {
+            if (mi.getPrefix().equals(prefix)) {
+                return mi;
+
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Find dependent module based on given prefix
+     *
+     * @param modules
+     *            all available modules
+     * @param module
+     *            current module
+     * @param prefix
+     *            target module prefix
+     * @param line
+     *            current line in yang model
+     * @return module builder if found, null otherwise
+     */
+    public static def ModuleBuilder findDependentModuleBuilder(Map<String, TreeMap<Date, ModuleBuilder>> modules,
+        ModuleBuilder module, String prefix, int line) {
+        var ModuleBuilder dependentModule = null;
+        var Date dependentModuleRevision = null;
+
+        if (prefix.equals(module.getPrefix())) {
+            dependentModule = module;
+        } else {
+            val ModuleImport dependentModuleImport = getModuleImport(module, prefix);
+            if (dependentModuleImport === null) {
+                throw new YangParseException(module.getName(), line, "No import found with prefix '" + prefix + "'.");
+            }
+            val String dependentModuleName = dependentModuleImport.getModuleName();
+            dependentModuleRevision = dependentModuleImport.getRevision();
+
+            val TreeMap<Date, ModuleBuilder> moduleBuildersByRevision = modules.get(dependentModuleName);
+            if (moduleBuildersByRevision === null) {
+                return null;
+            }
+            if (dependentModuleRevision === null) {
+                dependentModule = moduleBuildersByRevision.lastEntry().getValue();
+            } else {
+                dependentModule = moduleBuildersByRevision.get(dependentModuleRevision);
+            }
+        }
+        return dependentModule;
+    }
+
+    /**
+     * Find module from context based on prefix.
+     *
+     * @param context
+     *            schema context
+     * @param currentModule
+     *            current module
+     * @param prefix
+     *            current prefix used to reference dependent module
+     * @param line
+     *            current line in yang model
+     * @return module based on given prefix if found in context, null otherwise
+     */
+    public static def Module findModuleFromContext(SchemaContext context, ModuleBuilder currentModule,
+        String prefix, int line) {
+        val modulesByRevision = new TreeMap<Date, Module>();
+
+        val dependentModuleImport = ParserUtils.getModuleImport(currentModule, prefix);
+        if (dependentModuleImport === null) {
+            throw new YangParseException(currentModule.getName(), line, "No import found with prefix '" + prefix + "'.");
+        }
+        val dependentModuleName = dependentModuleImport.getModuleName();
+        val dependentModuleRevision = dependentModuleImport.getRevision();
+
+        for (Module contextModule : context.getModules()) {
+            if (contextModule.getName().equals(dependentModuleName)) {
+                var revision = contextModule.getRevision();
+                if (revision === null) {
+                    revision = new Date(0L);
+                }
+                modulesByRevision.put(revision, contextModule);
+            }
+        }
+
+        var Module result = null;
+        if (dependentModuleRevision === null) {
+            result = modulesByRevision.get(modulesByRevision.firstKey());
+        } else {
+            result = modulesByRevision.get(dependentModuleRevision);
+        }
+        return result;
+    }
+
+    /**
+     * Parse XPath string.
+     *
+     * @param xpathString
+     *            as String
+     * @return SchemaPath from given String
+     */
+    public static def SchemaPath parseXPathString(String xpathString) {
+        val absolute = xpathString.startsWith("/");
+        val String[] splittedPath = xpathString.split("/");
+        val path = new ArrayList<QName>();
+        var QName name;
+        for (String pathElement : splittedPath) {
+            if (pathElement.length() > 0) {
+                val String[] splittedElement = pathElement.split(":");
+                if (splittedElement.length == 1) {
+                    name = new QName(null, null, null, splittedElement.get(0));
+                } else {
+                    name = new QName(null, null, splittedElement.get(0), splittedElement.get(1));
+                }
+                path.add(name);
+            }
+        }
+        return new SchemaPath(path, absolute);
+    }
+
+    /**
+     * Add all augment's child nodes to given target.
+     *
+     * @param augment
+     *            builder of augment statement
+     * @param target
+     *            augmentation target node
+     */
+    public static def void fillAugmentTarget(AugmentationSchemaBuilder augment, DataNodeContainerBuilder target) {
+        for (DataSchemaNodeBuilder child : augment.getChildNodeBuilders()) {
+            val childCopy = CopyUtils.copy(child, target, false);
+            childCopy.setAugmenting(true);
+            correctNodePath(child, target.getPath());
+            correctNodePath(childCopy, target.getPath());
+            try {
+                target.addChildNode(childCopy);
+            } catch (YangParseException e) {
+
+                // more descriptive message
+                throw new YangParseException(augment.getModuleName(), augment.getLine(),
+                    "Failed to perform augmentation: " + e.getMessage());
+            }
+
+        }
+        for (UsesNodeBuilder usesNode : augment.getUsesNodes()) {
+            val copy = CopyUtils.copyUses(usesNode, target);
+            target.addUsesNode(copy);
+        }
+    }
+
+    /**
+     * Add all augment's child nodes to given target.
+     *
+     * @param augment
+     *            builder of augment statement
+     * @param target
+     *            augmentation target choice node
+     */
+    public static def void fillAugmentTarget(AugmentationSchemaBuilder augment, ChoiceBuilder target) {
+        for (DataSchemaNodeBuilder builder : augment.getChildNodeBuilders()) {
+            val childCopy = CopyUtils.copy(builder, target, false);
+            childCopy.setAugmenting(true);
+            correctNodePath(builder, target.getPath());
+            correctNodePath(childCopy, target.getPath());
+            target.addCase(childCopy);
+        }
+        for (UsesNodeBuilder usesNode : augment.getUsesNodes()) {
+            if (usesNode !== null) {
+                throw new YangParseException(augment.getModuleName(), augment.getLine(),
+                    "Error in augment parsing: cannot augment uses to choice");
+            }
+        }
+    }
+
+    /**
+     * Create new schema path of node based on parent node schema path.
+     *
+     * @param node
+     *            node to correct
+     * @param parentSchemaPath
+     *            schema path of node parent
+     */
+    static def void correctNodePath(SchemaNodeBuilder node, SchemaPath parentSchemaPath) {
+
+        // set correct path
+        val targetNodePath = new ArrayList<QName>(parentSchemaPath.getPath());
+        targetNodePath.add(node.getQName());
+        node.setPath(new SchemaPath(targetNodePath, true));
+
+        // set correct path for all child nodes
+        if (node instanceof DataNodeContainerBuilder) {
+            val dataNodeContainer = node as DataNodeContainerBuilder;
+            for (DataSchemaNodeBuilder child : dataNodeContainer.getChildNodeBuilders()) {
+                correctNodePath(child, node.getPath());
+            }
+        }
+
+        // set correct path for all cases
+        if (node instanceof ChoiceBuilder) {
+            val choiceBuilder = node as ChoiceBuilder;
+            for (ChoiceCaseBuilder choiceCaseBuilder : choiceBuilder.getCases()) {
+                correctNodePath(choiceCaseBuilder, node.getPath());
+            }
+        }
+    }
+
+
+
+    public static dispatch def SchemaNodeBuilder findNode(ModuleBuilder parent,List<QName> path) {
+        var node = _findNode(parent as DataNodeContainerBuilder,path);
+        if(node !== null) return node;
+        
+        val current = path.get(0);
+        node = parent.getRpc(current.localName);
+        if(node !== null) return _findNode(node as RpcDefinitionBuilder,path.nextLevel);
+        node = parent.getNotification(current.localName);
+        return node;
+    }
+    
+    public static dispatch def SchemaNodeBuilder findNode(DataNodeContainerBuilder parent,List<QName> path) {
+        if(path.empty) return parent as SchemaNodeBuilder;
+        
+        var current = path.get(0);
+        var node = parent.getDataChildByName(current.localName)
+        if(node !== null) return findNode(node,path.nextLevel);
+        for (UsesNodeBuilder unb : parent.usesNodes) {
+            node  = findNodeInUses(current.localName, unb);
+            if (node !== null) {
+                 return findNode(node,path.nextLevel);
+            }
+        }
+    }
+    
+    public static dispatch def SchemaNodeBuilder findNode(RpcDefinitionBuilder parent,List<QName> path) {
+        val current = path.get(0);
+        switch(current.localName) {
+            case "input": return findNode(parent.input,path.nextLevel)
+            case "output": return findNode(parent.output,path.nextLevel)
+        }
+        return null;
+    }
+    
+    public static dispatch def SchemaNodeBuilder findNode(ChoiceBuilder parent,List<QName> path) {
+        if(path.empty) return parent as SchemaNodeBuilder;
+        var current = path.get(0);
+        val node = parent.getCaseNodeByName(current.localName);
+        if(node === null) return null;
+        return findNode(node,path.nextLevel);
+    }
+    
+    public static def getRpc(ModuleBuilder module,String name) {
+        for(rpc : module.rpcs) {
+            if(name == rpc.QName.localName) {
+                return rpc;
+            }
+        }
+        return null;
+    }
+    
+    public static def getNotification(ModuleBuilder module,String name) {
+        for(notification : module.notifications) {
+            if(name == notification.QName.localName) {
+                return notification;
+            }
+        }
+    }
+    
+    private static def nextLevel(List<QName> path){
+        return path.subList(1,path.size)
+    }
+    
+    /**
+     * Find augment target node and perform augmentation.
+     *
+     * @param augment
+     * @param firstNodeParent
+     *            parent of first node in path
+     * @param path
+     *            path to augment target
+     * @return true if augmentation process succeed, false otherwise
+     */
+    public static def boolean processAugmentation(AugmentationSchemaBuilder augment, Builder firstNodeParent,
+        List<QName> path) {
+
+            // traverse augment target path and try to reach target node
+            val currentParent = findNode(firstNodeParent,path);
+            if (currentParent === null) return false;
+            
+            if ((currentParent instanceof DataNodeContainerBuilder)) {
+                fillAugmentTarget(augment, currentParent as DataNodeContainerBuilder);
+            } else if (currentParent instanceof ChoiceBuilder) {
+                fillAugmentTarget(augment, currentParent as ChoiceBuilder);
+            } else {
+                throw new YangParseException(augment.getModuleName(), augment.getLine(),
+                    "Error in augment parsing: The target node MUST be either a container, list, choice, case, input, output, or notification node.");
+            }
+            (currentParent as AugmentationTargetBuilder).addAugmentation(augment);
+            val oldPath = (currentParent as SchemaNodeBuilder).getPath();
+            augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+            augment.setResolved(true);
+            return true;
+        }
+
+        /**
+     * Find node with given name in uses target.
+     *
+     * @param localName
+     *            name of node to find
+     * @param uses
+     *            uses node which target grouping should be searched
+     * @return node with given name if found, null otherwise
+     */
+        private static def DataSchemaNodeBuilder findNodeInUses(String localName, UsesNodeBuilder uses) {
+            val target = uses.getGroupingBuilder();
+            for (DataSchemaNodeBuilder child : target.getChildNodeBuilders()) {
+                if (child.getQName().getLocalName().equals(localName)) {
+                    return child;
+                }
+            }
+            for (UsesNodeBuilder usesNode : target.getUsesNodes()) {
+                val result = findNodeInUses(localName, usesNode);
+                if (result !== null) {
+                    return result;
+                }
+            }
+            return null;
+        }
+
+        /**
+     * Find augment target node in given context and perform augmentation.
+     *
+     * @param augment
+     * @param path
+     *            path to augment target
+     * @param module
+     *            current module
+     * @param prefix
+     *            current prefix of target module
+     * @param context
+     *            SchemaContext containing already resolved modules
+     * @return true if augment process succeed, false otherwise
+     */
+        public static def boolean processAugmentationOnContext(AugmentationSchemaBuilder augment, List<QName> path,
+            ModuleBuilder module, String prefix, SchemaContext context) {
+            val int line = augment.getLine();
+            val Module dependentModule = findModuleFromContext(context, module, prefix, line);
+            if (dependentModule === null) {
+                throw new YangParseException(module.getName(), line,
+                    "Error in augment parsing: failed to find module with prefix " + prefix + ".");
+            }
+
+            var currentName = path.get(0).getLocalName();
+            var SchemaNode currentParent = dependentModule.getDataChildByName(currentName);
+            if (currentParent === null) {
+                val notifications = dependentModule.getNotifications();
+                for (NotificationDefinition ntf : notifications) {
+                    if (ntf.getQName().getLocalName().equals(currentName)) {
+                        currentParent = ntf;
+                    }
+                }
+            }
+            if (currentParent === null) {
+                throw new YangParseException(module.getName(), line,
+                    "Error in augment parsing: failed to find node " + currentName + ".");
+            }
+
+            for (qname : path.nextLevel) {
+                currentName = qname.getLocalName();
+                if (currentParent instanceof DataNodeContainer) {
+                    currentParent = (currentParent as DataNodeContainer).getDataChildByName(currentName);
+                } else if (currentParent instanceof ChoiceNode) {
+                    currentParent = (currentParent as ChoiceNode).getCaseNodeByName(currentName);
+                } else {
+                    throw new YangParseException(augment.getModuleName(), line,
+                        "Error in augment parsing: failed to find node " + currentName);
+                }
+
+                // if node in path not found, return false
+                if (currentParent === null) {
+                    throw new YangParseException(module.getName(), line,
+                        "Error in augment parsing: failed to find node " + currentName + ".");
+                }
+            }
+
+            val oldPath = currentParent.path;
+
+            if (!(currentParent instanceof AugmentationTarget)) {
+                throw new YangParseException(module.getName(), line,
+                    "Target of type " + currentParent.class + " cannot be augmented.");
+            }
+
+            switch (currentParent) {
+                case (currentParent instanceof ContainerSchemaNodeImpl): {
+
+                    // includes container, input and output statement
+                    val c = currentParent as ContainerSchemaNodeImpl;
+                    val cb = c.toBuilder();
+                    fillAugmentTarget(augment, cb);
+                    (cb as AugmentationTargetBuilder ).addAugmentation(augment);
+                    cb.rebuild();
+                }
+                case (currentParent instanceof ListSchemaNodeImpl): {
+                    val l = currentParent as ListSchemaNodeImpl;
+                    val lb = l.toBuilder();
+                    fillAugmentTarget(augment, lb);
+                    (lb as AugmentationTargetBuilder ).addAugmentation(augment);
+                    lb.rebuild();
+                    augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                    augment.setResolved(true);
+                }
+                case (currentParent instanceof ChoiceNodeImpl): {
+                    val ch = currentParent as ChoiceNodeImpl;
+                    val chb = ch.toBuilder();
+                    fillAugmentTarget(augment, chb);
+                    (chb as AugmentationTargetBuilder ).addAugmentation(augment);
+                    chb.rebuild();
+                    augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                    augment.setResolved(true);
+                }
+                case (currentParent instanceof ChoiceCaseNodeImpl): {
+                    val chc = currentParent as ChoiceCaseNodeImpl;
+                    val chcb = chc.toBuilder();
+                    fillAugmentTarget(augment, chcb);
+                    (chcb as AugmentationTargetBuilder ).addAugmentation(augment);
+                    chcb.rebuild();
+                    augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                    augment.setResolved(true);
+                }
+                case (currentParent instanceof NotificationDefinitionImpl): {
+                    val nd = currentParent as NotificationDefinitionImpl;
+                    val nb = nd.toBuilder();
+                    fillAugmentTarget(augment, nb);
+                    (nb as AugmentationTargetBuilder ).addAugmentation(augment);
+                    nb.rebuild();
+                    augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                    augment.setResolved(true);
+                }
+            }
+            augment.setTargetPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+            augment.setResolved(true);
+            return true;
+        }
+
+        public static def QName findFullQName(Map<String, TreeMap<Date, ModuleBuilder>> modules,
+            ModuleBuilder module, IdentityrefTypeBuilder idref) {
+            var QName result = null;
+            val String baseString = idref.getBaseString();
+            if (baseString.contains(":")) {
+                val String[] splittedBase = baseString.split(":");
+                if (splittedBase.length > 2) {
+                    throw new YangParseException(module.getName(), idref.getLine(),
+                        "Failed to parse identityref base: " + baseString);
+                }
+                val prefix = splittedBase.get(0);
+                val name = splittedBase.get(1);
+                val dependentModule = findDependentModuleBuilder(modules, module, prefix, idref.getLine());
+                result = new QName(dependentModule.getNamespace(), dependentModule.getRevision(), prefix, name);
+            } else {
+                result = new QName(module.getNamespace(), module.getRevision(), module.getPrefix(), baseString);
+            }
+            return result;
+        }
+
+        /**
+     * Get module in which this node is defined.
+     *
+     * @param node
+     * @return builder of module where this node is defined
+     */
+        public static def ModuleBuilder getParentModule(Builder node) {
+            if (node instanceof ModuleBuilder) {
+                return node as ModuleBuilder;
+            }
+            var parent = node.getParent();
+            while (!(parent instanceof ModuleBuilder)) {
+                parent = parent.getParent();
+            }
+            return parent as ModuleBuilder;
+        }
+    }
+    
\ No newline at end of file