JavaIdentifierNormalizer ThreadSafe/Memory leak fix 58/61258/1
authorMartin Ciglan <martin.ciglan@pantheon.tech>
Thu, 6 Jul 2017 07:33:19 +0000 (09:33 +0200)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Mon, 7 Aug 2017 09:10:50 +0000 (11:10 +0200)
1. make it thread-safe
2. memory leak fix
3. avoid deep indentations by obeying code conventions

Result "org.opendaylight.coretutorials.MyBenchmark.testBindingV2":
  165.567 ±(99.9%) 1.548 ops/s [Average]
  (min, avg, max) = (146.161, 165.567, 180.523), stdev = 6.553
  CI (99.9%): [164.019, 167.115] (assumes normal distribution)

Benchmark                   Mode  Cnt    Score   Error  Units
MyBenchmark.testBindingV2  thrpt  200  165.567 ± 1.548  ops/s

We're still around 2.8x slower than binding v1 generator,
so there will be follow-up activity to analyse/profile
architecture vs. implementation weakness and fixes
should/might be necessary to improve binding v2 generator.

Change-Id: Id1ca6e5f530c0340c3234526d6babf1f9e3c62b0
Signed-off-by: Martin Ciglan <martin.ciglan@pantheon.tech>
33 files changed:
binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/context/ModuleContext.java [moved from binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleContext.java with 88% similarity]
binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/spi/TypeProvider.java
binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImpl.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelper.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/BaseYangTypes.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeGenHelper.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeProviderImpl.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtilsTest.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GeneratedClassLoadingStrategyTest.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelperTest.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/AbstractBaseType.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/BindingGeneratorUtil.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifier.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/ReferencedTypeImpl.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/Types.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AnnotationTypeBuilderImpl.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTypeBuilderImpl.java
binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizerTest.java
binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImplTest.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java
binding2/mdsal-binding2-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java
binding2/mdsal-binding2-runtime/src/main/java/org/opendaylight/mdsal/binding/javav2/runtime/context/BindingRuntimeContext.java

@@ -1,17 +1,19 @@
 /*
- * Copyright (c) 2017 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.mdsal.binding.javav2.generator.impl;
+package org.opendaylight.mdsal.binding.javav2.generator.context;
 
 import com.google.common.annotations.Beta;
+import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.HashBiMap;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
@@ -58,8 +60,11 @@ public final class ModuleContext {
     private final BiMap<Type,ChoiceCaseNode> caseTypeToSchema = HashBiMap.create();
     private final Map<SchemaPath, Type> innerTypes = new HashMap<>();
     private final Map<SchemaPath,GeneratedTypeBuilder> keyTypes = new HashMap<>();
+    //map is getting manipulated based on unique YANG module namespace rule
+    private final ListMultimap<String, String> packagesMap = Multimaps.synchronizedListMultimap
+            (ArrayListMultimap.create());
 
-    List<Type> getGeneratedTypes() {
+    public List<Type> getGeneratedTypes() {
         final List<Type> result = new ArrayList<>();
 
         if (this.moduleNode != null) {
@@ -204,7 +209,7 @@ public final class ModuleContext {
         return Collections.unmodifiableMap(this.typeToSchema);
     }
 
-    protected void addTypeToSchema(final Type type, final TypeDefinition<?> typedef) {
+    public void addTypeToSchema(final Type type, final TypeDefinition<?> typedef) {
         this.typeToSchema.put(type, typedef);
     }
 
@@ -214,7 +219,7 @@ public final class ModuleContext {
      * @param path
      * @param enumBuilder
      */
-    void addInnerTypedefType(final SchemaPath path, final EnumBuilder enumBuilder) {
+    public void addInnerTypedefType(final SchemaPath path, final EnumBuilder enumBuilder) {
         this.innerTypes.put(path, enumBuilder);
     }
 
@@ -223,7 +228,7 @@ public final class ModuleContext {
     }
 
 
-    void addKeyType(final SchemaPath path, final GeneratedTypeBuilder genType) {
+    public void addKeyType(final SchemaPath path, final GeneratedTypeBuilder genType) {
         this.keyTypes.put(path, genType);
     }
 
@@ -234,4 +239,16 @@ public final class ModuleContext {
     public GeneratedTOBuilder getKeyGenTO(final SchemaPath path) {
         return this.genTOs.get(path);
     }
+
+    public ListMultimap<String, String> getPackagesMap() {
+        return Multimaps.unmodifiableListMultimap(packagesMap);
+    }
+
+    public void putToPackagesMap(final String packageName, final String actualClassName) {
+        this.packagesMap.put(packageName, actualClassName);
+    }
+
+    public void cleanPackagesMap() {
+        this.packagesMap.clear();
+    }
 }
index e33d63f4c4335b27d1ce274c1f5024f345692802..6989c3e8ed9425cbf2f542cdbe9ffab0e1f00479 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.mdsal.binding.javav2.generator.spi;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
@@ -38,7 +39,7 @@ public interface TypeProvider {
      * @param parentNode parent node
      * @return Resolved Type
      */
-    Type javaTypeForSchemaDefinitionType(TypeDefinition<?> type, SchemaNode parentNode);
+    Type javaTypeForSchemaDefinitionType(TypeDefinition<?> type, SchemaNode parentNode, ModuleContext context);
 
     /**
      *
@@ -47,7 +48,8 @@ public interface TypeProvider {
      * @param restrictions restrictions applied to given type definition
      * @return Resolved Type
      */
-    Type javaTypeForSchemaDefinitionType(TypeDefinition<?> type, SchemaNode parentNode, Restrictions restrictions);
+    Type javaTypeForSchemaDefinitionType(TypeDefinition<?> type, SchemaNode parentNode, Restrictions restrictions,
+            ModuleContext context);
 
     /**
      * Returns string containing code for creation of new type instance.
index 65b217b6f30aa66fe70d7aacba931d2dc0ab1bc7..73e87d5ff075dcac9529c021690a64f260a84841 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.javav2.model.api.type.builder;
 
 import com.google.common.annotations.Beta;
 import java.util.List;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -130,7 +131,7 @@ public interface GeneratedTypeBuilderBase<T extends GeneratedTypeBuilderBase<T>>
      *            Enumeration Name
      * @return <code>new</code> instance of Enumeration Builder.
      */
-    EnumBuilder addEnumeration(String name);
+    EnumBuilder addEnumeration(String name, ModuleContext context);
 
     /**
      * Sets parent type for data schema node node builder
index 641b71232c5cac92d30cff32516452df569cddd1..1f72bf5578fb184ff5f903745298f08738e5af3e 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
index 369b7db33313a25f08ea7b67046a2ec95fc86270..980ae343bbaeb6855e9bd418f23842d726ae34fd 100644 (file)
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForModule;
 import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForNode;
 import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForNodes;
@@ -350,9 +351,9 @@ final class AuxiliaryGenUtils {
      *         <code>enumTypeDef</code>
      */
     static EnumBuilder resolveInnerEnumFromTypeDefinition(final EnumTypeDefinition enumTypeDef, final QName enumName,
-        final Map<Module, ModuleContext> genCtx, final GeneratedTypeBuilder typeBuilder, final Module module) {
+            final Map<Module, ModuleContext> genCtx, final GeneratedTypeBuilder typeBuilder, final Module module) {
         if (enumTypeDef != null && typeBuilder != null && enumTypeDef.getQName().getLocalName() != null) {
-            final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName.getLocalName());
+            final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName.getLocalName(), genCtx.get(module));
             final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription());
             enumBuilder.setDescription(enumTypedefDescription);
             enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
@@ -387,7 +388,7 @@ final class AuxiliaryGenUtils {
      */
     static GeneratedTOBuilder addTOToTypeBuilder(final TypeDefinition<?> typeDef, final GeneratedTypeBuilder
             typeBuilder, final DataSchemaNode leaf, final Module parentModule, final TypeProvider typeProvider,
-            final SchemaContext schemaContext) {
+            final SchemaContext schemaContext, ModuleContext context) {
         final String classNameFromLeaf = leaf.getQName().getLocalName();
         GeneratedTOBuilder genTOBuilder = null;
         final String packageName = typeBuilder.getFullyQualifiedName();
@@ -395,10 +396,10 @@ final class AuxiliaryGenUtils {
             genTOBuilder = ((TypeProviderImpl) typeProvider)
                     .provideGeneratedTOBuilderForUnionTypeDef(packageName, ((UnionTypeDefinition) typeDef),
                             classNameFromLeaf, leaf, schemaContext,
-                            ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap());
+                            ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap(), context);
         } else if (typeDef instanceof BitsTypeDefinition) {
             genTOBuilder = (((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition(
-                    packageName, typeDef, classNameFromLeaf, parentModule.getName());
+                    packageName, typeDef, classNameFromLeaf, parentModule.getName(), context);
         }
         if (genTOBuilder != null) {
             typeBuilder.addEnclosingTransferObject(genTOBuilder);
@@ -443,26 +444,28 @@ final class AuxiliaryGenUtils {
      *         <code>list</code> or empty TO builder if <code>list</code> is null or list of
      *         key definitions is null or empty.
      */
-    static GeneratedTOBuilder resolveListKeyTOBuilder(final String packageName, final ListSchemaNode list) {
+    static GeneratedTOBuilder resolveListKeyTOBuilder(final String packageName, final ListSchemaNode list,
+            ModuleContext context) {
         GeneratedTOBuilder genTOBuilder = null;
         if ((list.getKeyDefinition() != null) && (!list.getKeyDefinition().isEmpty())) {
             // underscore used as separator for distinction of class name parts
             final String genTOName =
                     new StringBuilder(list.getQName().getLocalName()).append('_').append(BindingNamespaceType.Key)
                             .toString();
-            genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName);
+            genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName, context);
         }
         return genTOBuilder;
     }
 
-    static GeneratedTypeBuilder resolveListKeyTypeBuilder(final String packageName, final ListSchemaNode list) {
+    static GeneratedTypeBuilder resolveListKeyTypeBuilder(final String packageName, final ListSchemaNode list,
+            ModuleContext context) {
         GeneratedTypeBuilder genTypeBuilder = null;
         if ((list.getKeyDefinition() != null) && (!list.getKeyDefinition().isEmpty())) {
             // underscore used as separator for distinction of class name parts
             final String genTOName =
                     new StringBuilder(list.getQName().getLocalName()).append('_').append(BindingNamespaceType.Key)
                             .toString();
-            genTypeBuilder = new GeneratedTypeBuilderImpl(packageName, genTOName);
+            genTypeBuilder = new GeneratedTypeBuilderImpl(packageName, genTOName, context);
         }
         return genTypeBuilder;
     }
index ba89513fd8bde69ff5cda62cf0a5102dd4664868..1adff7f4005c65c8913ed826859816f832422c0f 100644 (file)
@@ -15,6 +15,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.javav2.generator.api.BindingGenerator;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
@@ -117,18 +118,18 @@ public class BindingGeneratorImpl implements BindingGenerator {
         Preconditions.checkArgument(modules != null, "Set of Modules cannot be NULL.");
 
         this.typeProvider = new TypeProviderImpl(context);
-        final Module[] modulesArray = new Module[context.getModules().size()];
-        context.getModules().toArray(modulesArray);
-        final List<Module> contextModules = ModuleDependencySort.sort(modulesArray);
+        final List<Module> contextModules = ModuleDependencySort.sort(context.getModules());
         this.genTypeBuilders = new HashMap<>();
 
         for (final Module contextModule : contextModules) {
             this.genCtx = ModuleToGenType.generate(contextModule, this.genTypeBuilders, context, this.typeProvider,
                     this.genCtx, this.verboseClassComments);
+            this.genCtx.get(contextModule).cleanPackagesMap();
         }
         for (final Module contextModule : contextModules) {
             this.genCtx = AugmentToGenType.generate(contextModule, context, this.typeProvider, this.genCtx,
                     this.genTypeBuilders, this.verboseClassComments);
+            this.genCtx.get(contextModule).cleanPackagesMap();
         }
 
         final List<Type> filteredGenTypes = new ArrayList<>();
index fbe25ae6b56cfe1d78a41dca41fcd78790c30949..11ac9465a138eead5950c6a9729e82432a176608 100644 (file)
@@ -37,6 +37,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
@@ -120,7 +121,8 @@ final class GenHelperUtil {
     static GeneratedTypeBuilder moduleToDataType(final Module module, final Map<Module, ModuleContext> genCtx, final boolean verboseClassComments) {
         Preconditions.checkArgument(module != null, "Module reference cannot be NULL.");
 
-        final GeneratedTypeBuilder moduleDataTypeBuilder = moduleTypeBuilder(module, "Data", verboseClassComments);
+        final GeneratedTypeBuilder moduleDataTypeBuilder = moduleTypeBuilder(module, "Data", verboseClassComments,
+                genCtx.get(module));
         addImplementedInterfaceFromUses(module, moduleDataTypeBuilder, genCtx);
         moduleDataTypeBuilder.addImplementsType(BindingTypes.TREE_ROOT);
         moduleDataTypeBuilder.addComment(module.getDescription());
@@ -145,13 +147,13 @@ final class GenHelperUtil {
      *             if <code>module</code> is null
      */
     static GeneratedTypeBuilder moduleTypeBuilder(final Module module, final String postfix, final boolean
-            verboseClassComments) {
+            verboseClassComments, ModuleContext context) {
         Preconditions.checkArgument(module != null, "Module reference cannot be NULL.");
         final String packageName = BindingMapping.getRootPackageName(module);
         // underscore used as separator for distinction of module name parts
         final String moduleName = new StringBuilder(module.getName()).append('_').append(postfix).toString();
 
-        final GeneratedTypeBuilderImpl moduleBuilder = new GeneratedTypeBuilderImpl(packageName, moduleName);
+        final GeneratedTypeBuilderImpl moduleBuilder = new GeneratedTypeBuilderImpl(packageName, moduleName, context);
         moduleBuilder.setDescription(createDescription(module, verboseClassComments));
         moduleBuilder.setReference(module.getReference());
         moduleBuilder.setModuleName(moduleName);
@@ -256,7 +258,6 @@ final class GenHelperUtil {
         if (!schemaNode.isAugmenting()) {
             return true;
         } else if (schemaNode.isAugmenting()) {
-            Preconditions.checkState(schemaNode instanceof ModelStatement<?>);
             QName qname = schemaNode.getPath().getLastComponent();
             final Module originalModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(),
                     qname.getRevision());
@@ -417,7 +418,7 @@ final class GenHelperUtil {
         }
 
         GeneratedTypeBuilderImpl augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augIdentifier,
-                true, false);
+                true, false, genCtx.get(module));
 
         augTypeBuilder.addImplementsType(BindingTypes.TREE_NODE);
         augTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, augTypeBuilder));
@@ -518,7 +519,7 @@ final class GenHelperUtil {
         }
 
         GeneratedTypeBuilder it = addRawInterfaceDefinition(basePackageName, schemaNode, schemaContext, "", suffix,
-                verboseClassComments, genTypeBuilders, namespaceType);
+                verboseClassComments, genTypeBuilders, namespaceType, genCtx.get(module));
         if (namespaceType.equals(BindingNamespaceType.Data)) {
             if (parent == null) {
                 it.addImplementsType(BindingTypes.TREE_NODE);
@@ -606,7 +607,7 @@ final class GenHelperUtil {
     static GeneratedTypeBuilder addRawInterfaceDefinition(final String basePackageName, final SchemaNode schemaNode,
             final SchemaContext schemaContext, final String prefix, final String suffix,
             final boolean verboseClassComments, final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders,
-            final BindingNamespaceType namespaceType) {
+            final BindingNamespaceType namespaceType, ModuleContext context) {
 
         Preconditions.checkArgument(schemaNode != null, "Data Schema Node cannot be NULL.");
         Preconditions.checkArgument(basePackageName != null, "Base package Name for Generated Type cannot be NULL.");
@@ -624,7 +625,7 @@ final class GenHelperUtil {
         }
 
         final String packageName = packageNameForGeneratedType(basePackageName, schemaNode.getPath(), namespaceType);
-        final GeneratedTypeBuilderImpl newType = new GeneratedTypeBuilderImpl(packageName, schemaNodeName);
+        final GeneratedTypeBuilderImpl newType = new GeneratedTypeBuilderImpl(packageName, schemaNodeName, context);
         final Module module = SchemaContextUtil.findParentModule(schemaContext, schemaNode);
         qNameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, schemaNode.getQName());
         newType.addComment(schemaNode.getDescription());
@@ -709,7 +710,7 @@ final class GenHelperUtil {
         checkArgument(choiceNode != null, "Choice Schema Node cannot be NULL.");
 
         final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(basePackageName, choiceNode,
-                schemaContext, "", "", verboseClasssComments, genTypeBuilders, namespaceType);
+                schemaContext, "", "", verboseClasssComments, genTypeBuilders, namespaceType, genCtx.get(module));
         constructGetter(parent, choiceNode.getQName().getLocalName(),
                 choiceNode.getDescription(), choiceTypeBuilder, choiceNode.getStatus());
         if (namespaceType.equals(BindingNamespaceType.Data)) {
@@ -752,7 +753,7 @@ final class GenHelperUtil {
             Type getterReturnType = Types.listTypeFor(genType);
             if (namespaceType.equals(BindingNamespaceType.Grouping)) {
                 getterReturnType = Types.listTypeFor(wildcardTypeFor(genType.getPackageName(), genType.getName(),
-                                true, true));
+                                true, true, null));
             }
             constructGetter(parent, nodeName, node.getDescription(), getterReturnType, node.getStatus());
 
@@ -761,7 +762,7 @@ final class GenHelperUtil {
                     BindingNamespaceType.Key)).append('.').append(nodeName).toString();
             //FIXME: Is it neccessary to generate interface of key and implemented by class?
             if (namespaceType.equals(BindingNamespaceType.Grouping)) {
-                final GeneratedTypeBuilder genTypeBuilder = resolveListKeyTypeBuilder(packageName, node);
+                final GeneratedTypeBuilder genTypeBuilder = resolveListKeyTypeBuilder(packageName, node, genCtx.get(module));
                 for (final DataSchemaNode schemaNode : node.getChildNodes()) {
                     if (resolveDataSchemaNodesCheck(module, schemaContext, schemaNode)) {
                         addSchemaNodeToListTypeBuilders(nodeName, basePackageName, schemaNode, genType, genTypeBuilder, listKeys,
@@ -773,7 +774,7 @@ final class GenHelperUtil {
                     genCtx.get(module).addKeyType(node.getPath(), genTypeBuilder);
                 }
             } else {
-                final GeneratedTOBuilder genTOBuilder = resolveListKeyTOBuilder(packageName, node);
+                final GeneratedTOBuilder genTOBuilder = resolveListKeyTOBuilder(packageName, node, genCtx.get(module));
                 for (final DataSchemaNode schemaNode : node.getChildNodes()) {
                     if (resolveDataSchemaNodesCheck(module, schemaContext, schemaNode)) {
                         addSchemaNodeToListBuilders(nodeName, basePackageName, schemaNode, genType, genTOBuilder, listKeys,
@@ -802,7 +803,7 @@ final class GenHelperUtil {
             Type returnKeyType = keyType;
             if (namespaceType.equals(BindingNamespaceType.Grouping)) {
                 returnKeyType = wildcardTypeFor(keyType.getPackageName(), keyType.getName(),
-                        true, true);
+                        true, true, null);
             }
             constructGetter(typeBuilder, "key", "Returns Primary Key of Yang List Type", returnKeyType, Status.CURRENT);
 
@@ -846,7 +847,7 @@ final class GenHelperUtil {
         final TypeDefinition<?> typeDef = leaf.getType();
         if (isInnerType(leaf, typeDef)) {
             if (typeDef instanceof EnumTypeDefinition) {
-                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf);
+                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, genCtx.get(module));
                 final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef;
                 final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, leaf.getQName(),
                         genCtx, typeBuilder, module);
@@ -856,14 +857,14 @@ final class GenHelperUtil {
                 ((TypeProviderImpl) typeProvider).putReferencedType(leaf.getPath(), returnType);
             } else if (typeDef instanceof UnionTypeDefinition) {
                 final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule,
-                        typeProvider, schemaContext);
+                        typeProvider, schemaContext, genCtx.get(module));
                 if (genTOBuilder != null) {
                     //TODO: https://bugs.opendaylight.org/show_bug.cgi?id=2289
                     returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider);
                 }
             } else if (typeDef instanceof BitsTypeDefinition) {
                 final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule,
-                        typeProvider, schemaContext);
+                        typeProvider, schemaContext, genCtx.get(module));
                 if (genTOBuilder != null) {
                     returnType = genTOBuilder.toInstance();
                 }
@@ -874,11 +875,11 @@ final class GenHelperUtil {
                 // and apply restrictions from leaf type
                 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
                 returnType = typeProvider.javaTypeForSchemaDefinitionType(getBaseOrDeclaredType(typeDef), leaf,
-                        restrictions);
+                        restrictions, genCtx.get(module));
             }
         } else {
             final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
-            returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions);
+            returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions, genCtx.get(module));
         }
 
         if (returnType == null) {
@@ -941,29 +942,30 @@ final class GenHelperUtil {
         Type returnType = null;
         if (typeDef.getBaseType() == null) {
             if (typeDef instanceof EnumTypeDefinition) {
-                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node);
+                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, genCtx.get(module));
                 final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef;
                 final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, nodeName,
                         genCtx, typeBuilder, module);
-                returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName());
+                returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName(),
+                        genCtx.get(module));
                 ((TypeProviderImpl) typeProvider).putReferencedType(node.getPath(), returnType);
             } else if (typeDef instanceof UnionTypeDefinition) {
                 final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule,
-                        typeProvider, schemaContext);
+                        typeProvider, schemaContext, genCtx.get(module));
                 if (genTOBuilder != null) {
                     returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider);
                 }
             } else if (typeDef instanceof BitsTypeDefinition) {
                 final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule,
-                        typeProvider, schemaContext);
+                        typeProvider, schemaContext, genCtx.get(module));
                 returnType = genTOBuilder.toInstance();
             } else {
                 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
-                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions);
+                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions, genCtx.get(module));
             }
         } else {
             final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
-            returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions);
+            returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions, genCtx.get(module));
         }
 
         final ParameterizedType listType = Types.listTypeFor(returnType);
@@ -1222,7 +1224,7 @@ final class GenHelperUtil {
                         qname.getRevision());
                 returnType = genCtx.get(enumModule).getInnerType(originalLeaf.getType().getPath());
             } else {
-                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf);
+                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, genCtx.get(module));
             }
             return AuxiliaryGenUtils.resolveLeafSchemaNodeAsProperty(nodeName, toBuilder, leaf, returnType, isReadOnly);
         }
@@ -1374,13 +1376,14 @@ final class GenHelperUtil {
 
             final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, identity.getPath(),
                     BindingNamespaceType.Identity);
-            newType = new GeneratedTOBuilderImpl(packageName, identity.getQName().getLocalName(), true, false);
+            newType = new GeneratedTOBuilderImpl(packageName, identity.getQName().getLocalName(), true, false,
+                    genCtx.get(module));
 
             final Set<IdentitySchemaNode> baseIdentities = identity.getBaseIdentities();
             if (baseIdentities.size() == 0) {
                 //no base - abstract
                 final GeneratedTOBuilderImpl gto = new GeneratedTOBuilderImpl(BaseIdentity.class.getPackage().getName(),
-                        BaseIdentity.class.getSimpleName());
+                        BaseIdentity.class.getSimpleName(), genCtx.get(module));
                 newType.setExtendsType(gto.toInstance());
             } else {
                 //one base - inheritance
index f9c5d041951ffff2d47bbf4b951701871dcd99b8..72eaa569ef6acb2957ed90606973a6bcb0481081 100644 (file)
@@ -20,18 +20,16 @@ import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
-import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
@@ -131,7 +129,7 @@ final class ModuleToGenType {
      *            iterate over them
      * @param schemaContext
      *            schema context only used as input parameter for method
-     *            {@link GenHelperUtil#identityToGenType(Module, String, IdentitySchemaNode, SchemaContext, Map, boolean, Map, TypeProvider, Map)}
+     *            {@link GenHelperUtil#identityToGenType(Module, String, IdentitySchemaNode, SchemaContext, Map, boolean)}
      * @param genCtx generated context
      * @return returns generated context
      *
@@ -179,7 +177,8 @@ final class ModuleToGenType {
             return genCtx;
         }
 
-        final GeneratedTypeBuilder listenerInterface = moduleTypeBuilder(module, "Listener", verboseClassComments);
+        final GeneratedTypeBuilder listenerInterface = moduleTypeBuilder(module, "Listener", verboseClassComments,
+                genCtx.get(module));
         listenerInterface.addImplementsType(NOTIFICATION_LISTENER);
         final String basePackageName = BindingMapping.getRootPackageName(module);
 
index 5c969e8ea8f41d5ca2837bb0b4786340efecf755..d04c5dccd1f41679ea7ce5311a97bcfdb0a37e5d 100644 (file)
@@ -17,7 +17,6 @@ import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.moduleTypeBuilder;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.processUsesImplements;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.encodeAngleBrackets;
-import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.packageNameForGeneratedType;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.ACTION;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.INPUT;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.INSTANCE_IDENTIFIER;
@@ -38,6 +37,7 @@ import com.google.common.base.Optional;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
@@ -101,8 +101,8 @@ final class RpcActionGenHelper {
      * @return generated context
      */
     static Map<Module, ModuleContext> actionMethodsToGenType(final Module module, Map<Module, ModuleContext> genCtx,
-            final SchemaContext schemaContext, final boolean verboseClassComments, Map<String, Map<String,
-            GeneratedTypeBuilder>> genTypeBuilders, TypeProvider typeProvider) {
+            final SchemaContext schemaContext, final boolean verboseClassComments,
+            Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, TypeProvider typeProvider) {
 
         checkModuleAndModuleName(module);
         final Collection<DataSchemaNode> potentials = module.getChildNodes();
@@ -203,7 +203,7 @@ final class RpcActionGenHelper {
             sb.append("Rpc");
         }
         final GeneratedTypeBuilder interfaceBuilder = moduleTypeBuilder(module, sb.toString(),
-                verboseClassComments);
+                verboseClassComments, genCtx.get(module));
 
         final String basePackageName = interfaceBuilder.getPackageName();
 
@@ -281,7 +281,7 @@ final class RpcActionGenHelper {
             GeneratedTypeBuilder>> genTypeBuilders, final Map<Module, ModuleContext> genCtx, final boolean isInput,
             final BindingNamespaceType namespaceType) {
         final GeneratedTypeBuilder nodeType = addRawInterfaceDefinition(basePackageName, operationNode, schemaContext,
-                operationName, "", verboseClassComments, genTypeBuilders, namespaceType);
+                operationName, "", verboseClassComments, genTypeBuilders, namespaceType, genCtx.get(module));
         addImplementedInterfaceFromUses(operationNode, nodeType, genCtx);
         nodeType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor
                 (BindingTypes.ITEM, parent)));
index 01cb8a702440b71654bc0b0a1a4c8780ed9a4330..f471a32d063bc366e31a9a9bb3144c4eeea8aba8 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.collect.ImmutableMap.Builder;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Map;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
@@ -154,7 +155,8 @@ public final class BaseYangTypes {
          *         returned.
          */
         @Override
-        public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode) {
+        public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode,
+                ModuleContext context) {
             if (type != null) {
                 return TYPE_MAP.get(type.getQName().getLocalName());
             }
@@ -164,7 +166,7 @@ public final class BaseYangTypes {
 
         @Override
         public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode,
-                final Restrictions restrictions) {
+                final Restrictions restrictions, ModuleContext context) {
 
             final String typeName = type.getQName().getLocalName();
             switch (typeName) {
@@ -195,7 +197,7 @@ public final class BaseYangTypes {
                 case "union" :
                     return UNION_TYPE;
                 default:
-                    return javaTypeForSchemaDefinitionType(type, parentNode);
+                    return javaTypeForSchemaDefinitionType(type, parentNode, context);
             }
         }
 
index bb9da5da3911a1696343795ec270716aec5a9f1c..7374bd7bd731544135fd22d34643506d1f1e76a5 100644 (file)
@@ -25,6 +25,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 import org.apache.commons.lang3.StringEscapeUtils;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.generator.util.TypeConstants;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
@@ -123,14 +124,15 @@ final class TypeGenHelper {
     @SuppressWarnings({ "rawtypes", "unchecked" })
     static GeneratedTransferObject provideGeneratedTOFromExtendedType(final TypeDefinition<?> typedef, final
             TypeDefinition<?> innerExtendedType, final String basePackageName, final String moduleName, final SchemaContext
-            schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+            schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap,
+            ModuleContext context) {
 
         Preconditions.checkArgument(innerExtendedType != null, "Extended type cannot be NULL!");
         Preconditions.checkArgument(basePackageName != null, "String with base package name cannot be NULL!");
 
         final String typedefName = typedef.getQName().getLocalName();
         final String innerTypeDef = innerExtendedType.getQName().getLocalName();
-        final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typedefName);
+        final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typedefName, context);
         final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
 
         genTOBuilder.setDescription(typedefDescription);
@@ -179,11 +181,12 @@ final class TypeGenHelper {
      *            JAVA <code>Type</code> to which is <code>typedef</code> mapped
      * @return generated transfer object which represent<code>javaType</code>
      */
-    static GeneratedTransferObject wrapJavaTypeIntoTO(final String basePackageName, final TypeDefinition<?> typedef, final Type javaType, final String moduleName) {
+    static GeneratedTransferObject wrapJavaTypeIntoTO(final String basePackageName, final TypeDefinition<?> typedef,
+           final Type javaType, final String moduleName, ModuleContext context) {
         Preconditions.checkNotNull(javaType, "javaType cannot be null");
         final String propertyName = "value";
 
-        final GeneratedTOBuilder genTOBuilder = typedefToTransferObject(basePackageName, typedef, moduleName);
+        final GeneratedTOBuilder genTOBuilder = typedefToTransferObject(basePackageName, typedef, moduleName, context);
         genTOBuilder.setRestrictions(BindingGeneratorUtil.getRestrictions(typedef));
         final GeneratedPropertyBuilder genPropBuilder = genTOBuilder.addProperty(propertyName);
         genPropBuilder.setReturnType(javaType);
@@ -437,8 +440,8 @@ final class TypeGenHelper {
      *             </ul>
      */
     @SuppressWarnings({ "rawtypes", "unchecked" })
-    static Enumeration provideTypeForEnum(final EnumTypeDefinition enumTypeDef, final String enumName, final
-    SchemaNode parentNode, final SchemaContext schemaContext) {
+    static Enumeration provideTypeForEnum(final EnumTypeDefinition enumTypeDef, final String enumName,
+           final SchemaNode parentNode, final SchemaContext schemaContext, ModuleContext context) {
         Preconditions.checkArgument(enumTypeDef != null, "EnumTypeDefinition reference cannot be NULL!");
         Preconditions.checkArgument(enumTypeDef.getQName().getLocalName() != null,
                 "Local Name in EnumTypeDefinition QName cannot be NULL!");
@@ -454,7 +457,7 @@ final class TypeGenHelper {
             packageName = basePackageName;
         }
 
-        final EnumerationBuilderImpl enumBuilder = new EnumerationBuilderImpl(packageName, enumName);
+        final EnumerationBuilderImpl enumBuilder = new EnumerationBuilderImpl(packageName, enumName, context);
         final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription());
         enumBuilder.setDescription(enumTypedefDescription);
         enumBuilder.setReference(enumTypeDef.getReference());
@@ -475,11 +478,12 @@ final class TypeGenHelper {
      *         <code>typedef</code> and <code>basePackageName</code>
      */
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    private static GeneratedTOBuilderImpl typedefToTransferObject(final String basePackageName, final TypeDefinition<?> typedef, final String moduleName) {
+    private static GeneratedTOBuilderImpl typedefToTransferObject(final String basePackageName,
+            final TypeDefinition<?> typedef, final String moduleName, ModuleContext context) {
         final String typeDefTOName = typedef.getQName().getLocalName();
 
         if ((basePackageName != null) && (typeDefTOName != null)) {
-            final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(basePackageName, typeDefTOName);
+            final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(basePackageName, typeDefTOName, context);
             final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
 
             newType.setDescription(typedefDescription);
index 9ec117fd87e09c9444b08404101c635dbf0c4b3a..bc4f30078ce6e4d43c7e69f645ec465ad73c8183 100644 (file)
@@ -40,6 +40,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier;
@@ -82,10 +83,11 @@ import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
+import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort;
 import org.opendaylight.yangtools.yang.parser.util.YangValidationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 @Beta
 public final class TypeProviderImpl implements TypeProvider {
 
@@ -129,8 +131,9 @@ public final class TypeProviderImpl implements TypeProvider {
     }
 
     @Override
-    public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode) {
-        return javaTypeForSchemaDefinitionType(type, parentNode, null);
+    public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode,
+            ModuleContext context) {
+        return javaTypeForSchemaDefinitionType(type, parentNode, null, context);
     }
 
     /**
@@ -147,8 +150,10 @@ public final class TypeProviderImpl implements TypeProvider {
      *             </ul>
      */
     @Override
-    public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode, final Restrictions restrictions) {
-        return javaTypeForSchemaDefType(type, parentNode, restrictions, this.schemaContext, this.genTypeDefsContextMap);
+    public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode, final
+            Restrictions restrictions, ModuleContext context) {
+        return javaTypeForSchemaDefType(type, parentNode, restrictions, this.schemaContext, this
+                .genTypeDefsContextMap, context);
     }
 
     @Override
@@ -185,17 +190,11 @@ public final class TypeProviderImpl implements TypeProvider {
      *
      */
     private void resolveTypeDefsFromContext(final SchemaContext schemaContext, final Map<String, Map<Date, Map<String,
-            Type>>> genTypeDefsContextMap,  final Map<Module, Set<Type>> additionalTypes) {
+            Type>>> genTypeDefsContextMap, final Map<Module, Set<Type>> additionalTypes) {
 
         final Set<Module> modules = schemaContext.getModules();
         Preconditions.checkArgument(modules != null, "Set of Modules cannot be NULL!");
-        final Module[] modulesArray = new Module[modules.size()];
-        int i = 0;
-        for (final Module modul : modules) {
-            modulesArray[i++] = modul;
-        }
-        final List<Module> modulesSortedByDependency = org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort
-                .sort(modulesArray);
+        final List<Module> modulesSortedByDependency = ModuleDependencySort.sort(modules);
 
         for (final Module module : modulesSortedByDependency) {
             Map<Date, Map<String, Type>> dateTypeMap = genTypeDefsContextMap.get(module.getName());
@@ -207,6 +206,7 @@ public final class TypeProviderImpl implements TypeProvider {
         }
 
         modulesSortedByDependency.stream().filter(module -> module != null).forEach(module -> {
+            ModuleContext context = new ModuleContext();
             final String basePackageName = packageNameWithNamespacePrefix(getRootPackageName(module),
                     BindingNamespaceType.Typedef);
             final List<TypeDefinition<?>> typeDefinitions = getAllTypedefs(module);
@@ -214,7 +214,7 @@ public final class TypeProviderImpl implements TypeProvider {
             if (listTypeDefinitions != null) {
                 for (final TypeDefinition<?> typedef : listTypeDefinitions) {
                     typedefToGeneratedType(basePackageName, module, typedef, genTypeDefsContextMap,
-                            additionalTypes, schemaContext);
+                            additionalTypes, schemaContext, context);
                 }
             }
         });
@@ -297,8 +297,8 @@ public final class TypeProviderImpl implements TypeProvider {
      *             </ul>
      */
     @SuppressWarnings({ "rawtypes", "unchecked" })
-    public GeneratedTOBuilder provideGeneratedTOBuilderForBitsTypeDefinition(final String basePackageName, final
-    TypeDefinition<?> typeDef, final String typeDefName, final String moduleName) {
+    public GeneratedTOBuilder provideGeneratedTOBuilderForBitsTypeDefinition(final String basePackageName,
+            final TypeDefinition<?> typeDef, final String typeDefName, final String moduleName, ModuleContext context) {
 
         Preconditions.checkArgument(typeDef != null, "typeDef cannot be NULL!");
         Preconditions.checkArgument(basePackageName != null, "Base Package Name cannot be NULL!");
@@ -306,7 +306,8 @@ public final class TypeProviderImpl implements TypeProvider {
         if (typeDef instanceof BitsTypeDefinition) {
             final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef;
 
-            final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false);
+            final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName,
+                    true, false, context);
             final String typedefDescription = encodeAngleBrackets(typeDef.getDescription());
 
             genTOBuilder.setDescription(typedefDescription);
@@ -356,8 +357,8 @@ public final class TypeProviderImpl implements TypeProvider {
      */
     @SuppressWarnings({ "rawtypes", "unchecked" })
     public List<GeneratedTOBuilder> provideGeneratedTOBuildersForUnionTypeDef(final String basePackageName,
-        final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode, final SchemaContext
-         schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+            final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode,
+            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap, ModuleContext context) {
         Preconditions.checkNotNull(basePackageName, "Base Package Name cannot be NULL!");
         Preconditions.checkNotNull(typedef, "Type Definition cannot be NULL!");
         Preconditions.checkNotNull(typedef.getQName(), "Type definition QName cannot be NULL!");
@@ -367,7 +368,8 @@ public final class TypeProviderImpl implements TypeProvider {
         final Module module = findParentModule(schemaContext, parentNode);
 
         final GeneratedTOBuilderImpl unionGenTOBuilder;
-        unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false);
+        unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false,
+                context);
         final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
         unionGenTOBuilder.setDescription(typedefDescription);
         unionGenTOBuilder.setReference(typedef.getReference());
@@ -384,14 +386,15 @@ public final class TypeProviderImpl implements TypeProvider {
                         parentNode, schemaContext, genTypeDefsContextMap);
             } else if (unionType instanceof UnionTypeDefinition) {
                 generatedTOBuilders.add(resolveUnionSubtypeAsUnion(unionGenTOBuilder, (UnionTypeDefinition) unionType,
-                        unionGenTOBuilder.getFullyQualifiedName(), parentNode, schemaContext, genTypeDefsContextMap));
+                        unionGenTOBuilder.getFullyQualifiedName(), parentNode, schemaContext, genTypeDefsContextMap,
+                        context));
             } else if (unionType instanceof EnumTypeDefinition) {
                 final Enumeration enumeration = addInnerEnumerationToTypeBuilder((EnumTypeDefinition) unionType,
-                        unionTypeName, unionGenTOBuilder);
+                        unionTypeName, unionGenTOBuilder, context);
                 updateUnionTypeAsProperty(unionGenTOBuilder, enumeration, unionTypeName);
             } else {
                 final Type javaType = javaTypeForSchemaDefType(unionType, parentNode, null, schemaContext,
-                        genTypeDefsContextMap);
+                        genTypeDefsContextMap, context);
                 updateUnionTypeAsProperty(unionGenTOBuilder, javaType, unionTypeName);
             }
         }
@@ -417,8 +420,9 @@ public final class TypeProviderImpl implements TypeProvider {
         }
     }
 
-    private Type javaTypeForSchemaDefType(final TypeDefinition<?> typeDefinition, final SchemaNode
-            parentNode, final Restrictions r, final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+    private Type javaTypeForSchemaDefType(final TypeDefinition<?> typeDefinition, final SchemaNode parentNode,
+            final Restrictions r, final SchemaContext schemaContext,
+            final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap, ModuleContext context) {
         Preconditions.checkArgument(typeDefinition != null, "Type Definition cannot be NULL!");
         final String typedefName = typeDefinition.getQName().getLocalName();
         Preconditions.checkArgument(typedefName != null, "Type Definitions Local Name cannot be NULL!");
@@ -429,19 +433,22 @@ public final class TypeProviderImpl implements TypeProvider {
             // and generated an enclosing ExtendedType to hold any range constraints. The new parser instantiates
             // a base type which holds these constraints.
             if (typeDefinition instanceof DecimalTypeDefinition) {
-                final Type ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, parentNode, r);
+                final Type ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType
+                        (typeDefinition, parentNode, r, null);
                 if (ret != null) {
                     return ret;
                 }
             }
 
             // Deal with leafrefs/identityrefs
-            Type ret = javaTypeForLeafrefOrIdentityRef(typeDefinition, parentNode, schemaContext, genTypeDefsContextMap);
+            Type ret = javaTypeForLeafrefOrIdentityRef(typeDefinition, parentNode, schemaContext,
+                    genTypeDefsContextMap, context);
             if (ret != null) {
                 return ret;
             }
 
-            ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, parentNode);
+            ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, parentNode,
+                    null);
             if (ret == null) {
                 LOG.debug("Failed to resolve Java type for {}", typeDefinition);
             }
@@ -449,7 +456,7 @@ public final class TypeProviderImpl implements TypeProvider {
             return ret;
         }
 
-        Type returnType = javaTypeForExtendedType(typeDefinition, schemaContext, genTypeDefsContextMap);
+        Type returnType = javaTypeForExtendedType(typeDefinition, schemaContext, genTypeDefsContextMap, context);
         if (r != null && !r.isEmpty() && returnType instanceof GeneratedTransferObject) {
             final GeneratedTransferObject gto = (GeneratedTransferObject) returnType;
             final Module module = findParentModule(schemaContext, parentNode);
@@ -461,7 +468,7 @@ public final class TypeProviderImpl implements TypeProvider {
                     JavaIdentifierNormalizer.normalizeSpecificIdentifier(typedefName, JavaIdentifier.CLASS);
             final String name = packageName + "." + genTOName;
             if (module.equals(module1) && !(returnType.getFullyQualifiedName().equals(name))) {
-                returnType = shadedTOWithRestrictions(gto, r);
+                returnType = shadedTOWithRestrictions(gto, r, context);
             }
         }
         return returnType;
@@ -482,9 +489,9 @@ public final class TypeProviderImpl implements TypeProvider {
      *         <code>modulName</code> or <code>typedef</code> or Q name of
      *         <code>typedef</code> equals <code>null</code>
      */
-    private Type typedefToGeneratedType(final String basePackageName, final Module module, final
-    TypeDefinition<?> typedef, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap, final Map<Module,
-            Set<Type>> additionalTypes, final SchemaContext schemaContext) {
+    private Type typedefToGeneratedType(final String basePackageName, final Module module,
+            final TypeDefinition<?> typedef, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap,
+            final Map<Module, Set<Type>> additionalTypes, final SchemaContext schemaContext, ModuleContext context) {
         final String moduleName = module.getName();
         final Date moduleRevision = module.getRevision();
         if ((basePackageName != null) && (moduleName != null) && (typedef != null)) {
@@ -495,10 +502,11 @@ public final class TypeProviderImpl implements TypeProvider {
                 Type returnType;
                 if (innerTypeDefinition.getBaseType() != null) {
                     returnType = provideGeneratedTOFromExtendedType(typedef, innerTypeDefinition, basePackageName,
-                            module.getName(), schemaContext, genTypeDefsContextMap);
+                            module.getName(), schemaContext, genTypeDefsContextMap, context);
                 } else if (innerTypeDefinition instanceof UnionTypeDefinition) {
                     final GeneratedTOBuilder genTOBuilder = provideGeneratedTOBuilderForUnionTypeDef(basePackageName,
-                            (UnionTypeDefinition) innerTypeDefinition, typedefName, typedef, schemaContext, genTypeDefsContextMap);
+                            (UnionTypeDefinition) innerTypeDefinition, typedefName, typedef, schemaContext,
+                            genTypeDefsContextMap, context);
                     genTOBuilder.setTypedef(true);
                     genTOBuilder.setIsUnion(true);
                     addUnitsToGenTO(genTOBuilder, typedef.getUnits());
@@ -508,20 +516,20 @@ public final class TypeProviderImpl implements TypeProvider {
                     // enums are automatically Serializable
                     final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) innerTypeDefinition;
                     // TODO units for typedef enum
-                    returnType = provideTypeForEnum(enumTypeDef, typedefName, typedef, schemaContext);
+                    returnType = provideTypeForEnum(enumTypeDef, typedefName, typedef, schemaContext, context);
                 } else if (innerTypeDefinition instanceof BitsTypeDefinition) {
                     final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) innerTypeDefinition;
                     final GeneratedTOBuilder genTOBuilder =
                             provideGeneratedTOBuilderForBitsTypeDefinition(
-                                    basePackageName, bitsTypeDefinition, typedefName, module.getName());
+                                    basePackageName, bitsTypeDefinition, typedefName, module.getName(), context);
                     genTOBuilder.setTypedef(true);
                     addUnitsToGenTO(genTOBuilder, typedef.getUnits());
                     makeSerializable((GeneratedTOBuilderImpl) genTOBuilder);
                     returnType = genTOBuilder.toInstance();
                 } else {
                     final Type javaType = javaTypeForSchemaDefType(innerTypeDefinition, typedef, null,
-                            schemaContext, genTypeDefsContextMap);
-                    returnType = wrapJavaTypeIntoTO(basePackageName, typedef, javaType, module.getName());
+                            schemaContext, genTypeDefsContextMap, context);
+                    returnType = wrapJavaTypeIntoTO(basePackageName, typedef, javaType, module.getName(), context);
                 }
                 if (returnType != null) {
                     final Map<Date, Map<String, Type>> modulesByDate = genTypeDefsContextMap.get(moduleName);
@@ -548,12 +556,13 @@ public final class TypeProviderImpl implements TypeProvider {
      *            type definition which is converted to JAVA <code>Type</code>
      * @return JAVA <code>Type</code> instance for <code>typeDefinition</code>
      */
-    private Type javaTypeForExtendedType(final TypeDefinition<?> typeDefinition, final SchemaContext
-            schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+    private Type javaTypeForExtendedType(final TypeDefinition<?> typeDefinition, final SchemaContext schemaContext,
+            final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap, ModuleContext context) {
 
         final String typedefName = typeDefinition.getQName().getLocalName();
         final TypeDefinition<?> baseTypeDef = baseTypeDefForExtendedType(typeDefinition);
-        Type returnType = javaTypeForLeafrefOrIdentityRef(baseTypeDef, typeDefinition, schemaContext, genTypeDefsContextMap);
+        Type returnType = javaTypeForLeafrefOrIdentityRef(baseTypeDef, typeDefinition, schemaContext,
+                genTypeDefsContextMap, context);
         if (returnType == null) {
             final Module module = findParentModule(schemaContext, typeDefinition);
             final Restrictions r = BindingGeneratorUtil.getRestrictions(typeDefinition);
@@ -565,7 +574,7 @@ public final class TypeProviderImpl implements TypeProvider {
                 }
                 if (returnType == null) {
                     returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(
-                            baseTypeDef, typeDefinition, r);
+                            baseTypeDef, typeDefinition, r, null);
                 }
             }
         }
@@ -582,14 +591,15 @@ public final class TypeProviderImpl implements TypeProvider {
      * @return JAVA <code>Type</code> instance for <code>typeDefinition</code>
      */
     private Type javaTypeForLeafrefOrIdentityRef(final TypeDefinition<?> typeDefinition, final SchemaNode parentNode,
-            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap,
+            ModuleContext context) {
         if (typeDefinition instanceof LeafrefTypeDefinition) {
             final LeafrefTypeDefinition leafref = (LeafrefTypeDefinition) typeDefinition;
             if (isLeafRefSelfReference(leafref, parentNode, schemaContext)) {
                 throw new YangValidationException("Leafref " + leafref.toString() + " is referencing itself, incoming" +
                         " StackOverFlowError detected.");
             }
-            return provideTypeForLeafref(leafref, parentNode, schemaContext, genTypeDefsContextMap);
+            return provideTypeForLeafref(leafref, parentNode, schemaContext, genTypeDefsContextMap, context);
         } else if (typeDefinition instanceof IdentityrefTypeDefinition) {
             final IdentityrefTypeDefinition idref = (IdentityrefTypeDefinition) typeDefinition;
             return provideTypeForIdentityref(idref, schemaContext);
@@ -616,7 +626,8 @@ public final class TypeProviderImpl implements TypeProvider {
      *
      */
     public Type provideTypeForLeafref(final LeafrefTypeDefinition leafrefType, final SchemaNode parentNode,
-            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap,
+            ModuleContext context) {
 
         Type returnType = null;
         Preconditions.checkArgument(leafrefType != null, "Leafref Type Definition reference cannot be NULL!");
@@ -646,7 +657,7 @@ public final class TypeProviderImpl implements TypeProvider {
                 } else if (leafListContainsEnumDefinition(dataNode)) {
                     returnType = Types.listTypeFor(this.referencedTypes.get(dataNode.getPath()));
                 } else {
-                    returnType = resolveTypeFromDataSchemaNode(dataNode, schemaContext, genTypeDefsContextMap);
+                    returnType = resolveTypeFromDataSchemaNode(dataNode, schemaContext, genTypeDefsContextMap, context);
                 }
             } else {
                 returnType = Types.typeForClass(Object.class);
@@ -713,17 +724,18 @@ public final class TypeProviderImpl implements TypeProvider {
      * @return JAVA <code>Type</code> representation of <code>dataNode</code>
      */
     private Type resolveTypeFromDataSchemaNode(final SchemaNode dataNode, final SchemaContext schemaContext,
-        final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+            final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap, ModuleContext context) {
         Type returnType = null;
         if (dataNode != null) {
             if (dataNode instanceof LeafSchemaNode) {
                 final LeafSchemaNode leaf = (LeafSchemaNode) dataNode;
                 //not using CompatUtils here anymore
                 final TypeDefinition<?> type = leaf.getType();
-                returnType = javaTypeForSchemaDefType(type, leaf, null, schemaContext, genTypeDefsContextMap);
+                returnType = javaTypeForSchemaDefType(type, leaf, null, schemaContext, genTypeDefsContextMap, context);
             } else if (dataNode instanceof LeafListSchemaNode) {
                 final LeafListSchemaNode leafList = (LeafListSchemaNode) dataNode;
-                returnType = javaTypeForSchemaDefType(leafList.getType(), leafList, null, schemaContext, genTypeDefsContextMap);
+                returnType = javaTypeForSchemaDefType(leafList.getType(), leafList, null, schemaContext,
+                        genTypeDefsContextMap, context);
             }
         }
         return returnType;
@@ -765,43 +777,13 @@ public final class TypeProviderImpl implements TypeProvider {
                 JavaIdentifier.CLASS);
 
         final Type baseType = Types.typeForClass(Class.class);
-        final Type paramType = Types.wildcardTypeFor(packageName, genTypeName, true, true);
+        final Type paramType = Types.wildcardTypeFor(packageName, genTypeName, true, true, null);
         return Types.parameterizedTypeFor(baseType, paramType);
     }
 
-    /**
-     * Converts <code>typedef</code> to the generated TO builder.
-     *
-     * @param basePackageName
-     *            string with name of package to which the module belongs
-     * @param typedef
-     *            type definition from which is the generated TO builder created
-     * @return generated TO builder which contains data from
-     *         <code>typedef</code> and <code>basePackageName</code>
-     */
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    private static GeneratedTOBuilderImpl typedefToTransferObject(final String basePackageName, final TypeDefinition<?> typedef, final String moduleName) {
-
-        final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typedef.getPath
-                (), BindingNamespaceType.Typedef);
-        final String typeDefTOName = typedef.getQName().getLocalName();
-
-        if ((packageName != null) && (typeDefTOName != null)) {
-            final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(packageName, typeDefTOName);
-            final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
-
-            newType.setDescription(typedefDescription);
-            newType.setReference(typedef.getReference());
-            newType.setSchemaPath((List) typedef.getPath().getPathFromRoot());
-            newType.setModuleName(moduleName);
-
-            return newType;
-        }
-        return null;
-    }
-
-    private static GeneratedTransferObject shadedTOWithRestrictions(final GeneratedTransferObject gto, final Restrictions r) {
-        final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl(gto.getPackageName(), gto.getName());
+    private static GeneratedTransferObject shadedTOWithRestrictions(final GeneratedTransferObject gto,
+            final Restrictions r, ModuleContext context) {
+        final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl(gto.getPackageName(), gto.getName(), context);
         final GeneratedTransferObject parent = gto.getSuperType();
         if (parent != null) {
             gtob.setExtendsType(parent);
@@ -850,8 +832,7 @@ public final class TypeProviderImpl implements TypeProvider {
      *
      * In this case the new generated TO is created for union subtype (recursive
      * call of method
-     * {@link #provideGeneratedTOBuildersForUnionTypeDef(String, UnionTypeDefinition,
-     * String, SchemaNode, SchemaContext, Map)}
+     * {@link #provideGeneratedTOBuilderForUnionTypeDef(String, UnionTypeDefinition, String, SchemaNode, SchemaContext, Map, ModuleContext)}
      * provideGeneratedTOBuilderForUnionTypeDef} and in parent TO builder
      * <code>parentUnionGenTOBuilder</code> is created property which type is
      * equal to new generated TO.
@@ -867,13 +848,15 @@ public final class TypeProviderImpl implements TypeProvider {
      *         bigger one due to recursive call of
      *         <code>provideGeneratedTOBuildersForUnionTypeDef</code> method.
      */
-    private GeneratedTOBuilder resolveUnionSubtypeAsUnion(final GeneratedTOBuilder
-        parentUnionGenTOBuilder, final UnionTypeDefinition unionSubtype, final String basePackageName,
-        final SchemaNode parentNode, final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+    private GeneratedTOBuilder resolveUnionSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder,
+            final UnionTypeDefinition unionSubtype, final String basePackageName, final SchemaNode parentNode,
+            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap,
+            ModuleContext context) {
 
         final String newTOBuilderName = provideAvailableNameForGenTOBuilder(parentUnionGenTOBuilder.getName());
         final GeneratedTOBuilder subUnionGenTOBUilder = provideGeneratedTOBuilderForUnionTypeDef(
-                basePackageName, unionSubtype, newTOBuilderName, parentNode, schemaContext, genTypeDefsContextMap);
+                basePackageName, unionSubtype, newTOBuilderName, parentNode, schemaContext, genTypeDefsContextMap,
+                context);
 
         final GeneratedPropertyBuilder propertyBuilder;
         propertyBuilder = parentUnionGenTOBuilder
@@ -900,11 +883,12 @@ public final class TypeProviderImpl implements TypeProvider {
      *         builders
      */
     public GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName,
-        final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode, final SchemaContext
-              schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+            final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode,
+            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap,
+            ModuleContext context) {
 
         final List<GeneratedTOBuilder> builders = provideGeneratedTOBuildersForUnionTypeDef(basePackageName,
-                typedef, typeDefName, parentNode, schemaContext, genTypeDefsContextMap);
+                typedef, typeDefName, parentNode, schemaContext, genTypeDefsContextMap, context);
         Preconditions.checkState(!builders.isEmpty(), "No GeneratedTOBuilder objects generated from union %s", typedef);
 
         final GeneratedTOBuilder resultTOBuilder = builders.remove(0);
@@ -926,7 +910,7 @@ public final class TypeProviderImpl implements TypeProvider {
 
 
     private GeneratedTOBuilder provideGeneratedTOBuilderForUnionBuilder(final Module parentModule,
-                                                 final GeneratedTOBuilder genTOBuilder) {
+            final GeneratedTOBuilder genTOBuilder) {
         final String outerCls = Types.getOuterClassName(genTOBuilder);
         final StringBuilder name;
         if (outerCls != null) {
@@ -976,9 +960,9 @@ public final class TypeProviderImpl implements TypeProvider {
      *            parent Schema Node for Extended Subtype
      *
      */
-    private static void resolveExtendedSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, final
-        TypeDefinition<?> unionSubtype, final List<String> regularExpressions, final SchemaNode parentNode,
-        final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+    private static void resolveExtendedSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder,
+            final TypeDefinition<?> unionSubtype, final List<String> regularExpressions, final SchemaNode parentNode,
+            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
 
         final String unionTypeName = unionSubtype.getQName().getLocalName();
         final Type genTO = findGenTO(unionTypeName, unionSubtype, schemaContext, genTypeDefsContextMap);
@@ -988,7 +972,7 @@ public final class TypeProviderImpl implements TypeProvider {
             final TypeDefinition<?> baseType = baseTypeDefForExtendedType(unionSubtype);
             if (unionTypeName.equals(baseType.getQName().getLocalName())) {
                 final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(baseType,
-                        parentNode);
+                        parentNode, null);
                 if (javaType != null) {
                     updateUnionTypeAsProperty(parentUnionGenTOBuilder, javaType, unionTypeName);
                 }
@@ -1028,7 +1012,7 @@ public final class TypeProviderImpl implements TypeProvider {
      *         <code>null</code> it it doesn't exist
      */
     private static Type findGenTO(final String searchedTypeName, final SchemaNode parentNode,
-        final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
+            final SchemaContext schemaContext, final Map<String, Map<Date, Map<String, Type>>> genTypeDefsContextMap) {
 
         final Module typeModule = findParentModule(schemaContext, parentNode);
         if (typeModule != null && typeModule.getName() != null) {
@@ -1064,13 +1048,14 @@ public final class TypeProviderImpl implements TypeProvider {
      *             </ul>
      *
      */
-    private static Enumeration addInnerEnumerationToTypeBuilder(final EnumTypeDefinition enumTypeDef, final String enumName, final GeneratedTypeBuilderBase<?> typeBuilder) {
+    private static Enumeration addInnerEnumerationToTypeBuilder(final EnumTypeDefinition enumTypeDef,
+            final String enumName, final GeneratedTypeBuilderBase<?> typeBuilder, ModuleContext context) {
         Preconditions.checkArgument(enumTypeDef != null, "EnumTypeDefinition reference cannot be NULL!");
         Preconditions.checkArgument(enumTypeDef.getQName().getLocalName() != null,
                 "Local Name in EnumTypeDefinition QName cannot be NULL!");
         Preconditions.checkArgument(typeBuilder != null, "Generated Type Builder reference cannot be NULL!");
 
-        final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName);
+        final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName, context);
         final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription());
         enumBuilder.setDescription(enumTypedefDescription);
         enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
@@ -1078,7 +1063,7 @@ public final class TypeProviderImpl implements TypeProvider {
     }
 
     private static boolean isLeafRefSelfReference(final LeafrefTypeDefinition leafref, final SchemaNode parentNode,
-                                                  final SchemaContext schemaContext) {
+            final SchemaContext schemaContext) {
         final SchemaNode leafRefValueNode;
         final RevisionAwareXPath leafRefXPath = leafref.getPathStatement();
         final RevisionAwareXPath leafRefStrippedXPath = new RevisionAwareXPathImpl(leafRefXPath.toString()
index 1c0557cc181d405a3d42e4e6f7b3950c42be6c88..fd5f15e370c753a034c292ceb8d7e3e9a7acb020 100644 (file)
@@ -25,8 +25,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.junit.Ignore;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
@@ -34,7 +34,6 @@ import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
 import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable;
-import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentation;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
@@ -195,7 +194,7 @@ public class AugmentToGenTypeTest {
         final QName create = QName.create("urn:test:simple:test", "2017-02-06", "my-cont");
         final SchemaNode schemaNode = mock(SchemaNode.class);
         when(schemaNode.getPath()).thenReturn(SchemaPath.create(true, create));
-        moduleContext.addChildNodeType(schemaNode, new GeneratedTypeBuilderImpl("test", "Test"));
+        moduleContext.addChildNodeType(schemaNode, new GeneratedTypeBuilderImpl("test", "Test", moduleContext));
         when(genCtx.values()).thenReturn(moduleContexts);
         when(genCtx.get(context.getModules().iterator().next())).thenReturn(moduleContext);
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders = new HashMap<>();
@@ -642,7 +641,7 @@ public class AugmentToGenTypeTest {
         final Map genCtx = mock(Map.class);
         final Collection<ModuleContext> moduleContexts = new ArrayList<>();
         final ModuleContext mc = new ModuleContext();
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm", mc);
         mc.addChildNodeType(targetSchNode, gtb);
         moduleContexts.add(mc);
         when(genCtx.values()).thenReturn(moduleContexts);
@@ -706,7 +705,7 @@ public class AugmentToGenTypeTest {
 
         final Collection<ModuleContext> moduleContexts = new ArrayList<>();
         final ModuleContext mc = new ModuleContext();
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm", mc);
         mc.addChildNodeType(targetSchNode, gtb);
         moduleContexts.add(mc);
         genCtx.put(moduleAug, mc);
@@ -910,7 +909,7 @@ public class AugmentToGenTypeTest {
 
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final ModuleContext mc = new ModuleContext();
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm", mc);
         mc.addChildNodeType(schNode, gtb);
         genCtx.put(moduleAug, mc);
 
@@ -960,7 +959,7 @@ public class AugmentToGenTypeTest {
 
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final ModuleContext mc = new ModuleContext();
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm", mc);
         mc.addChildNodeType(schNode, gtb);
         genCtx.put(moduleAug, mc);
 
@@ -1343,9 +1342,9 @@ public class AugmentToGenTypeTest {
         final ChoiceSchemaNode targetNode = mock(ChoiceSchemaNode.class);
         when(targetNode.getPath()).thenReturn(path);
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
-        final ModuleContext moduleContext = new ModuleContext();
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment");
-        moduleContext.addCaseType(path, gtb);
+        genCtx.put(module, new ModuleContext());
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment", genCtx.get(module));
+        genCtx.get(module).addCaseType(path, gtb);
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
 
         when(schemaContext.findModuleByNamespaceAndRevision(qnamePath.getNamespace(), qnamePath.getRevision()))
@@ -1409,7 +1408,7 @@ public class AugmentToGenTypeTest {
         when(targetNode.getPath()).thenReturn(path);
         final Map<Module, ModuleContext> genCtx = new HashMap<>();
         final ModuleContext moduleContext = new ModuleContext();
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment", moduleContext);
         moduleContext.addCaseType(path, gtb);
         genCtx.put(module, moduleContext);
         final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilder = new HashMap<>();
index b29d96ac3327f636641b636f3703c42a04175c78..bb43516d6df0d0a669d21086c19f6e6d84d0ccfe 100644 (file)
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
@@ -84,7 +85,7 @@ public class AuxiliaryGenUtilsTest {
         generate.setAccessible(true);
 
         final GeneratedTypeBuilderImpl generatedTypeBuilder =
-                new GeneratedTypeBuilderImpl("test.deprecated", "Non_Deprecated");
+                new GeneratedTypeBuilderImpl("test.deprecated", "Non_Deprecated", new ModuleContext());
         final Status status = Status.CURRENT;
 
         final Object[] args = { status, generatedTypeBuilder };
@@ -102,7 +103,7 @@ public class AuxiliaryGenUtilsTest {
         generate.setAccessible(true);
 
         final GeneratedTypeBuilderImpl generatedTypeBuilder =
-                new GeneratedTypeBuilderImpl("test.deprecated", "Deprecated");
+                new GeneratedTypeBuilderImpl("test.deprecated", "Deprecated", new ModuleContext());
         final Status status = Status.DEPRECATED;
 
         final Object[] args = { status, generatedTypeBuilder };
@@ -144,7 +145,7 @@ public class AuxiliaryGenUtilsTest {
         assertNotNull(generate);
         generate.setAccessible(true);
 
-        final GeneratedTypeBuilderBase gtbb = new GeneratedTypeBuilderImpl("test", "qname_constants");
+        final GeneratedTypeBuilderBase gtbb = new GeneratedTypeBuilderImpl("test", "qname_constants", new ModuleContext());
         final String constantName = "ConstantName";
         final QName constantQName = QName.create("urn:constant", "2017-04-06", constantName);
 
@@ -162,7 +163,7 @@ public class AuxiliaryGenUtilsTest {
         assertNotNull(generate);
         generate.setAccessible(true);
 
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "Getter_of");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "Getter_of", new ModuleContext());
         final String schemaNodeName = "schema_node_getter";
         final String comment = null;
         final Type returnType = Types.STRING;
@@ -337,8 +338,8 @@ public class AuxiliaryGenUtilsTest {
         generate.setAccessible(true);
 
         final Map<String, GeneratedTypeBuilder> builders = new HashMap<>();
-        builders.put("genTypeName1", new GeneratedTypeBuilderImpl("pckg.a1", "gen_a_1"));
-        builders.put("genTypeName2", new GeneratedTypeBuilderImpl("pckg.a2", "gen_a_2"));
+        builders.put("genTypeName1", new GeneratedTypeBuilderImpl("pckg.a1", "gen_a_1", new ModuleContext()));
+        builders.put("genTypeName2", new GeneratedTypeBuilderImpl("pckg.a2", "gen_a_2", new ModuleContext()));
         final String genTypeName = "genTypeName";
 
         final Object[] args_n = { builders, genTypeName };
@@ -424,7 +425,7 @@ public class AuxiliaryGenUtilsTest {
         when(enumTypeDefinition.getQName()).thenReturn(enumQName);
         final SchemaPath schemaPath = SchemaPath.create(true, enumQName);
         when(enumTypeDefinition.getPath()).thenReturn(schemaPath);
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("urn.enum.test.pckg", "enum-test");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("urn.enum.test.pckg", "enum-test", new ModuleContext());
         final Map<Module, ModuleContext> map = new HashMap<>();
         final Module module = mock(Module.class);
         final ModuleContext moduleContext = new ModuleContext();
@@ -440,14 +441,14 @@ public class AuxiliaryGenUtilsTest {
     public void addTOToTypeBuilderNullTest() throws Exception {
         final Class[] parameterTypes =
                 { TypeDefinition.class, GeneratedTypeBuilder.class, DataSchemaNode.class, Module.class,
-                        TypeProvider.class, SchemaContext.class };
+                        TypeProvider.class, SchemaContext.class, ModuleContext.class };
         final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("addTOToTypeBuilder", parameterTypes);
         assertNotNull(generate);
         generate.setAccessible(true);
 
         final BooleanTypeDefinition typeDef = mock(BooleanTypeDefinition.class);
         final GeneratedTypeBuilder typeBuilder =
-                new GeneratedTypeBuilderImpl("test.boolean.type.def", "boolean-type-def");
+                new GeneratedTypeBuilderImpl("test.boolean.type.def", "boolean-type-def", new ModuleContext());
         final DataSchemaNode leaf = mock(DataSchemaNode.class);
         final QName qnameLeaf = QName.create("urn:leaf:qname:test", "2017-12-04", "leaf-qname-test");
         when(leaf.getQName()).thenReturn(qnameLeaf);
@@ -457,7 +458,7 @@ public class AuxiliaryGenUtilsTest {
         when(schemaContext.getModules()).thenReturn(modules);
         final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
 
-        final Object[] args1 = { typeDef, typeBuilder, leaf, parentModule, typeProvider, schemaContext };
+        final Object[] args1 = { typeDef, typeBuilder, leaf, parentModule, typeProvider, schemaContext, new ModuleContext() };
         final GeneratedTOBuilder result = (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1);
         assertEquals(null, result);
     }
@@ -477,20 +478,20 @@ public class AuxiliaryGenUtilsTest {
             throws NoSuchMethodException, ReactorException, FileNotFoundException, URISyntaxException,
             IllegalAccessException, InvocationTargetException {
         final Class[] parameterTypes = { TypeDefinition.class, GeneratedTypeBuilder.class, DataSchemaNode.class,
-                Module.class, TypeProvider.class, SchemaContext.class };
+                Module.class, TypeProvider.class, SchemaContext.class, ModuleContext.class };
         final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("addTOToTypeBuilder", parameterTypes);
         assertNotNull(generate);
         generate.setAccessible(true);
 
         final GeneratedTypeBuilder typeBuilder =
-                new GeneratedTypeBuilderImpl("test.boolean.spc.def", "spec-type-def");
+                new GeneratedTypeBuilderImpl("test.boolean.spc.def", "spec-type-def", new ModuleContext());
         final SchemaContext schemaContext = YangParserTestUtils.parseYangSource(yangPath);
         final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
         final LeafSchemaNode leafSchemaNode =
                 (LeafSchemaNode) schemaContext.getModules().iterator().next().getChildNodes().iterator().next();
         final TypeDefinition<? extends TypeDefinition<?>> typeDef = leafSchemaNode.getType();
         final Object[] args1 = { typeDef, typeBuilder, leafSchemaNode, schemaContext.getModules().iterator().next(),
-                typeProvider, schemaContext };
+                typeProvider, schemaContext, new ModuleContext() };
         return (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1);
     }
 
@@ -503,7 +504,8 @@ public class AuxiliaryGenUtilsTest {
         assertNotNull(generate);
         generate.setAccessible(true);
 
-        final GeneratedTypeBuilder typeBuilder = new GeneratedTypeBuilderImpl("test.boolean.spc.def", "spec-type-def");
+        final GeneratedTypeBuilder typeBuilder = new GeneratedTypeBuilderImpl("test.boolean.spc.def",
+                "spec-type-def", new ModuleContext());
         final SchemaContext schemaContext = YangParserTestUtils.parseYangSource("/base/test-union.yang");
         final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
         final LeafSchemaNode leafSchemaNode =
@@ -575,7 +577,7 @@ public class AuxiliaryGenUtilsTest {
     @SuppressWarnings({ "rawtypes" })
     @Test
     public void resolveListKeyTOBuilderTest() throws Exception {
-        final Class[] parameterTypes = { String.class, ListSchemaNode.class };
+        final Class[] parameterTypes = { String.class, ListSchemaNode.class, ModuleContext.class };
         final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("resolveListKeyTOBuilder", parameterTypes);
         assertNotNull(generate);
         generate.setAccessible(true);
@@ -588,7 +590,7 @@ public class AuxiliaryGenUtilsTest {
         when(list.getKeyDefinition()).thenReturn(keyDefs);
         when(list.getQName()).thenReturn(qname);
 
-        final Object[] args1 = { pckgName, list };
+        final Object[] args1 = { pckgName, list, new ModuleContext() };
         final GeneratedTOBuilder result = (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1);
         assertNotNull(result);
         assertEquals("LocalnameKey", result.getName());
@@ -623,7 +625,7 @@ public class AuxiliaryGenUtilsTest {
         assertNotNull(generate);
         generate.setAccessible(true);
 
-        final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl("pckg.name.gto.tst", "gto_name");
+        final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl("pckg.name.gto.tst", "gto_name", true);
         final LeafSchemaNode leaf = mock(LeafSchemaNode.class);
         final boolean isReadOnly = true;
         final Type type = mock(Type.class);
index cd2299e0199f1a0974f9c4967598784c8114e08e..1b411a2a3a5cc4eb1728a16741d206ba7b56ac7b 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.javav2.generator.impl;
 
 import org.junit.Assert;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 
@@ -17,7 +18,7 @@ public class GeneratedClassLoadingStrategyTest {
     @Test
     public void loadClassTest() throws Exception {
         final Dummy dummy = new Dummy();
-        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "dummy");
+        final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "dummy", new ModuleContext());
         final Class<?> loadClass = dummy.loadClass(gtb.toInstance());
         Assert.assertNotNull(loadClass);
     }
index 12d04dcf79680ff8b11ea0fc37ec65dee291bfdf..2e2b62572f3375bf636505bdb00dd675fbe882e6 100644 (file)
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Set;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.yangtools.yang.common.QName;
index c57565bd53024c34f47187789738f26f7c20cddf..de719fee4a873c2eafd96c052202022ecb63126b 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.mdsal.binding.javav2.generator.util;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 import java.util.Objects;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 
 /**
@@ -39,11 +40,13 @@ public abstract class AbstractBaseType implements Type {
      * @param name
      *            string with the name for this <code>Type</code>
      */
-    protected AbstractBaseType(final String pkName, final String name) {
+    protected AbstractBaseType(final String pkName, final String name, ModuleContext context) {
         Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!");
         Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!");
         this.packageName = JavaIdentifierNormalizer.normalizeFullPackageName(pkName);
-        this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name);
+        Preconditions.checkNotNull(context, "In case of not having identifiers normalized, " +
+                "ModuleContext instance must be provided.");
+        this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name, context);
     }
 
     /**
@@ -58,7 +61,8 @@ public abstract class AbstractBaseType implements Type {
      * @param isNormalized
      *            true if pkName and name are normalized
      */
-    protected AbstractBaseType(final String pkName, final String name, final boolean isNormalized) {
+    protected AbstractBaseType(final String pkName, final String name, final boolean isNormalized,
+            ModuleContext context) {
         Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!");
         Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!");
         if (isNormalized) {
@@ -66,13 +70,14 @@ public abstract class AbstractBaseType implements Type {
             this.name = name;
         } else {
             this.packageName = JavaIdentifierNormalizer.normalizeFullPackageName(pkName);
-            this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name);
+            Preconditions.checkNotNull(context, "In case of not having identifiers normalized, " +
+                    "ModuleContext instance must be provided.");
+            this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name, context);
         }
     }
 
-
     protected AbstractBaseType(final String pkName, final String name, final boolean isPkNameNormalized,
-                               final boolean isTypeNormalized) {
+            final boolean isTypeNormalized, ModuleContext context ) {
         Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!");
         Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!");
         if (isPkNameNormalized) {
@@ -84,7 +89,9 @@ public abstract class AbstractBaseType implements Type {
         if (isTypeNormalized) {
             this.name = name;
         } else {
-            this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name);
+            Preconditions.checkNotNull(context, "In case of not having identifiers normalized, " +
+                    "ModuleContext instance must be provided.");
+            this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name, context);
         }
     }
 
index 029bf486068b44e2c6b844df7fc05b165d49f876..b2cc55207aafde6a3e07e6d6863d1ce07ef1f449 100644 (file)
@@ -10,13 +10,13 @@ package org.opendaylight.mdsal.binding.javav2.generator.util;
 import com.google.common.annotations.Beta;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Splitter;
-import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ListMultimap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration.Pair;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
@@ -221,9 +221,6 @@ public final class JavaIdentifierNormalizer {
     private static final Set<String> WINDOWS_RESERVED_WORDS = BindingMapping.WINDOWS_RESERVED_WORDS.stream()
             .map(String::toLowerCase).collect(Collectors.collectingAndThen(Collectors.toSet(), ImmutableSet::copyOf));
 
-    // FIXME: this thing makes this class non-threadsafe and leak memory
-    private static final ListMultimap<String, String> PACKAGES_MAP = ArrayListMultimap.create();
-
     private JavaIdentifierNormalizer() {
         throw new UnsupportedOperationException("Util class");
     }
@@ -288,7 +285,7 @@ public final class JavaIdentifierNormalizer {
      *            - part of package name
      * @return normalized name
      */
-    public static String normalizePartialPackageName(final String packageNamePart) {
+    static String normalizePartialPackageName(final String packageNamePart) {
         // if part of package name consist from java or windows reserved word, return it with
         // underscore at the end and in lower case
         final String lowerPart = packageNamePart.toLowerCase();
@@ -332,7 +329,8 @@ public final class JavaIdentifierNormalizer {
      *            - name of identifier
      * @return - java acceptable identifier
      */
-    public static String normalizeClassIdentifier(final String packageName, final String className) {
+    static String normalizeClassIdentifier(final String packageName, final String className,
+            ModuleContext context) {
         if (packageName.isEmpty() && PRIMITIVE_TYPES.contains(className)) {
             return className;
         }
@@ -354,7 +352,7 @@ public final class JavaIdentifierNormalizer {
             basePackageName = packageName;
         }
 
-        return normalizeClassIdentifier(basePackageName, convertedClassName, convertedClassName, 1);
+        return normalizeClassIdentifier(basePackageName, convertedClassName, convertedClassName, 1, context);
     }
 
     /**
@@ -422,18 +420,22 @@ public final class JavaIdentifierNormalizer {
      * @return converted identifier
      */
     private static String normalizeClassIdentifier(final String packageName, final String origClassName,
-            final String actualClassName, final int rank) {
+            final String actualClassName, final int rank, ModuleContext context) {
+
+        final ListMultimap<String, String> packagesMap = context.getPackagesMap();
 
-        // FIXME: this does not look thread-safe and seems to leak memory
-        if (PACKAGES_MAP.containsKey(packageName)) {
-            for (final String existingName : PACKAGES_MAP.get(packageName)) {
-                if (actualClassName.equalsIgnoreCase(existingName)) {
-                    return normalizeClassIdentifier(packageName, origClassName, origClassName + rank, rank + 1);
+        synchronized (packagesMap) {
+            if (packagesMap.containsKey(packageName)) {
+                for (final String existingName : packagesMap.get(packageName)) {
+                    if (actualClassName.equalsIgnoreCase(existingName)) {
+                       return normalizeClassIdentifier(packageName, origClassName, origClassName + rank,
+                     rank + 1, context);
+                    }
                 }
             }
+            context.putToPackagesMap(packageName, actualClassName);
+            return actualClassName;
         }
-        PACKAGES_MAP.put(packageName, actualClassName);
-        return actualClassName;
     }
 
     /**
index 03a812e497862e341e7da80601fb5705a48e661c..66fb631dd03f0758db4cdd50d465a9442d6cc435 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.mdsal.binding.javav2.generator.util;
 
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
+
 /**
  *
  * Wraps combination of <code>packageName</code> and <code>name</code> to the
@@ -24,8 +26,8 @@ public final class ReferencedTypeImpl extends AbstractBaseType {
      * @param name
      *            string with the name for referenced type
      */
-    public ReferencedTypeImpl(String packageName, String name) {
-        super(packageName, name);
+    public ReferencedTypeImpl(String packageName, String name, ModuleContext context) {
+        super(packageName, name, context);
     }
 
     /**
@@ -39,8 +41,8 @@ public final class ReferencedTypeImpl extends AbstractBaseType {
      * @param isNormalized
      *            indicates if identifier name is normalized
      */
-    public ReferencedTypeImpl(String packageName, String name, boolean isNormalized) {
-        super(packageName, name, isNormalized);
+    public ReferencedTypeImpl(String packageName, String name, boolean isNormalized, ModuleContext context) {
+        super(packageName, name, isNormalized, context);
     }
 
     @Override
@@ -50,7 +52,7 @@ public final class ReferencedTypeImpl extends AbstractBaseType {
         builder.append(getPackageName());
         builder.append(", name=");
         builder.append(getName());
-        builder.append("]");
+        builder.append(']');
         return builder.toString();
     }
 }
index 2c223713119f6f5732a7426805f9d2ffcee38edf..3d3a8f4bd049ee8ed01cd4994437592748af54bb 100644 (file)
@@ -24,6 +24,7 @@ import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.model.api.BaseTypeWithRestrictions;
 import org.opendaylight.mdsal.binding.javav2.model.api.ConcreteType;
 import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType;
@@ -209,8 +210,8 @@ public final class Types {
      *         <code>packageName</code> and <code>typeName</code>
      */
     public static WildcardType wildcardTypeFor(final String packageName, final String typeName,
-                                               final boolean isPkNameNormalized, final boolean isTypeNormalized) {
-        return new WildcardTypeImpl(packageName, typeName, isPkNameNormalized, isTypeNormalized);
+            final boolean isPkNameNormalized, final boolean isTypeNormalized, ModuleContext context) {
+        return new WildcardTypeImpl(packageName, typeName, isPkNameNormalized, isTypeNormalized, context);
     }
 
     /**
@@ -289,7 +290,7 @@ public final class Types {
          *            string with the name of the type
          */
         private ConcreteTypeImpl(final String pkName, final String name, final Restrictions restrictions) {
-            super(pkName, name);
+            super(pkName, name, true,null);
             this.restrictions = restrictions;
         }
 
@@ -317,7 +318,7 @@ public final class Types {
          *            string with the name of the type
          */
         private BaseTypeWithRestrictionsImpl(final String pkName, final String name, final Restrictions restrictions) {
-            super(pkName, name);
+            super(pkName, name, null);
             this.restrictions = Preconditions.checkNotNull(restrictions);
         }
 
@@ -353,7 +354,7 @@ public final class Types {
          *            array of actual parameters
          */
         public ParameterizedTypeImpl(final Type rawType, final Type[] actTypes) {
-            super(rawType.getPackageName(), rawType.getName(), true);
+            super(rawType.getPackageName(), rawType.getName(), true, null);
             this.rawType = rawType;
             this.actualTypes = actTypes.clone();
         }
@@ -384,8 +385,9 @@ public final class Types {
          * @param typeName
          *            string with the name of type
          */
+        //FIXME: doesn't seem to be called at all
         public WildcardTypeImpl(final String packageName, final String typeName) {
-            super(packageName, typeName);
+            super(packageName, typeName, null);
         }
 
         /**
@@ -401,8 +403,8 @@ public final class Types {
          *            if the type name has been normalized
          */
         public WildcardTypeImpl(final String packageName, final String typeName, final boolean isPkNameNormalized,
-                                final boolean isTypeNormalized) {
-            super(packageName, typeName, isPkNameNormalized, isTypeNormalized);
+                final boolean isTypeNormalized, ModuleContext context) {
+            super(packageName, typeName, isPkNameNormalized, isTypeNormalized, context);
         }
     }
 
index 752cac29ce553ff5b81cb1bf3fdc3814449d8672..e36bbcb35fdeb354d660f6b4034c4c1ebefb20b6 100644 (file)
@@ -45,7 +45,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
     private final boolean isAbstract;
 
     public AbstractGeneratedType(final AbstractGeneratedTypeBuilder<?> builder) {
-        super(builder.getPackageName(), builder.getName(), true);
+        super(builder.getPackageName(), builder.getName(), true, null);
         this.parent = builder.getParent();
         this.parentTypeForBuilder = builder.getParentTypeForBuilder();
         this.comment = builder.getComment();
@@ -66,7 +66,8 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
                                  final List<GeneratedTOBuilder> enclosedGenTOBuilders, final List<EnumBuilder> enumBuilders,
                                  final List<Constant> constants, final List<MethodSignatureBuilder> methodBuilders,
                                  final List<GeneratedPropertyBuilder> propertyBuilders, final Type parentTypeForBuilder) {
-        super(packageName, name);
+        //TODO: not called by actual codebase, fix this up (provide context) if needed - 07/20/2017
+        super(packageName, name, null);
         this.parent = parent;
         this.parentTypeForBuilder = parentTypeForBuilder;
         this.comment = comment;
index c51a4bca774e0acd7031729343b18c149fcc7107..01d7c0d15672041fecb8611478b3d6cdad52beaa 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.Objects;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType;
 import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
@@ -42,18 +43,18 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     private boolean isAbstract;
     private Type parentTypeForBuilder;
 
-    protected AbstractGeneratedTypeBuilder(final String packageName, final String name) {
-        super(packageName, name);
+    protected AbstractGeneratedTypeBuilder(final String packageName, final String name, ModuleContext context) {
+        super(packageName, name, context);
     }
 
-    protected AbstractGeneratedTypeBuilder(final String packageName, final String name, final boolean isNormalized) {
-        super(packageName, name, true);
+    protected AbstractGeneratedTypeBuilder(final String packageName, final String name, final boolean isNormalized,
+            ModuleContext context) {
+        super(packageName, name, true, null);
     }
 
-    protected AbstractGeneratedTypeBuilder(final String packageName, final String name,
-                                           final boolean isPkNameNormalized,
-                                           final boolean isTypeNormalized) {
-        super(packageName, name, isPkNameNormalized, isTypeNormalized);
+    protected AbstractGeneratedTypeBuilder(final String packageName, final String name, final boolean isPkNameNormalized,
+            final boolean isTypeNormalized, ModuleContext context) {
+        super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
     }
 
     protected String getComment() {
@@ -100,7 +101,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     @Override
     public GeneratedTOBuilder addEnclosingTransferObject(final String name) {
         Preconditions.checkArgument(name != null, "Name for Enclosing Generated Transfer Object cannot be null!");
-        GeneratedTOBuilder builder = new GeneratedTOBuilderImpl(getFullyQualifiedName(), name);
+        GeneratedTOBuilder builder = new GeneratedTOBuilderImpl(getFullyQualifiedName(), name, true);
 
         Preconditions.checkArgument(!enclosedTransferObjects.contains(builder), "This generated type already contains equal enclosing transfer object.");
         enclosedTransferObjects = LazyCollections.lazyAdd(enclosedTransferObjects, builder);
@@ -174,9 +175,10 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     }
 
     @Override
-    public EnumBuilder addEnumeration(final String name) {
+    public EnumBuilder addEnumeration(final String name, ModuleContext context) {
         Preconditions.checkArgument(name != null, "Name of enumeration cannot be null!");
-        final EnumBuilder builder = new EnumerationBuilderImpl(getFullyQualifiedName(), name, true, false);
+        final EnumBuilder builder = new EnumerationBuilderImpl(getFullyQualifiedName(), name, true, false,
+                context);
 
         Preconditions.checkArgument(!enumDefinitions.contains(builder), "This generated type already contains equal enumeration.");
         enumDefinitions = LazyCollections.lazyAdd(enumDefinitions, builder);
index 03c2936d8b0c953b3dc16461ccd6a0472e40ac20..4844bf67f474c8b79517cd82ecb41f643579dca5 100644 (file)
@@ -29,7 +29,7 @@ final class AnnotationTypeBuilderImpl extends AbstractBaseType implements Annota
     private List<AnnotationType.Parameter> parameters = ImmutableList.of();
 
     public AnnotationTypeBuilderImpl(final String packageName, final String name) {
-        super(packageName, name);
+        super(packageName, name, true, null);
         this.packageName = packageName;
         this.name = name;
     }
index 323baac46fea4b47de8567dae2eec24bffc9040e..a8dcb1cdb928e919cf7794e8bb3631efcfb3e9cd 100644 (file)
@@ -16,6 +16,7 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType;
@@ -44,14 +45,13 @@ public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuil
     private String moduleName;
     private List<QName> schemaPath;
 
-    public EnumerationBuilderImpl(final String packageName, final String name) {
-        super(packageName, name);
+    public EnumerationBuilderImpl(final String packageName, final String name, ModuleContext context) {
+        super(packageName, name, context);
     }
 
-    public EnumerationBuilderImpl(final String packageName, final String name,
-                                  final boolean isPkNameNormalized,
-                                  final boolean isTypeNormalized) {
-        super(packageName, name, isPkNameNormalized, isTypeNormalized);
+    public EnumerationBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized,
+            final boolean isTypeNormalized, ModuleContext context) {
+        super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
     }
 
     public void setReference(final String reference) {
@@ -222,7 +222,7 @@ public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuil
         public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
                                final String packageName, final String name, final List<Pair> values, final String description,
                 final String reference, final String moduleName, final List<QName> schemaPath) {
-            super(packageName, name, true);
+            super(packageName, name, true, null);
             this.definingType = definingType;
             this.values = values;
             this.description = description;
index e04cc400f55f08b1abde3d4ca0f5136a1de6f693..d6faa03f898d73152def5ef338be93345f08bbb2 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.Optional;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
 import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType;
@@ -44,19 +45,18 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
     private String moduleName;
     private List<QName> schemaPath;
 
-    public GeneratedTOBuilderImpl(final String packageName, final String name) {
-        super(packageName, name);
+    public GeneratedTOBuilderImpl(final String packageName, final String name, ModuleContext context) {
+        super(packageName, name, context);
         setAbstract(false);
     }
 
     public GeneratedTOBuilderImpl(final String packageName, final String name, final boolean isNormalized) {
-        super(packageName, name, true);
+        super(packageName, name, true, null);
     }
 
-    public GeneratedTOBuilderImpl(final String packageName, final String name,
-                                  final boolean isPkNameNormalized,
-                                  final boolean isTypeNormalized) {
-        super(packageName, name, isPkNameNormalized, isTypeNormalized);
+    public GeneratedTOBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized,
+            final boolean isTypeNormalized, ModuleContext context) {
+        super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
         setAbstract(false);
     }
 
index 78ff3a60c9edf26066249afb19fee92cb5b10829..349865dd19eb71d87ca268999b83980558cf6b82 100644 (file)
@@ -9,9 +9,10 @@
 package org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
 import java.util.List;
 import java.util.Optional;
-import com.google.common.base.Preconditions;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder;
@@ -30,15 +31,14 @@ public final class GeneratedTypeBuilderImpl extends AbstractGeneratedTypeBuilder
     private boolean isWithBuilder = false;
     private String basePackageName = null;
 
-    public GeneratedTypeBuilderImpl(final String packageName, final String name) {
-        super(packageName, name);
+    public GeneratedTypeBuilderImpl(final String packageName, final String name, ModuleContext context) {
+        super(packageName, name, context);
         setAbstract(true);
     }
 
-    public GeneratedTypeBuilderImpl(final String packageName, final String name,
-                                    final boolean isPkNameNormalized,
-                                    final boolean isTypeNormalized) {
-        super(packageName, name, isPkNameNormalized, isTypeNormalized);
+    public GeneratedTypeBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized,
+            final boolean isTypeNormalized, ModuleContext context) {
+        super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
         setAbstract(true);
     }
 
index ab80a93b389d844196add39f61c443504784aae9..32210f52b2ca27bf7f4766b880a0c0db48c3cf28 100644 (file)
@@ -11,68 +11,72 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
 
 public class JavaIdentifierNormalizerTest {
 
     @Test
     public void specialPathsTest() {
+        ModuleContext context = new ModuleContext();
         // QName - reserved & non reserved
         String normalizeIdentifier =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common", "QName");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common",
+                        "QName", context);
         assertEquals("QName", normalizeIdentifier);
         // again reserved
         normalizeIdentifier =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common", "QName");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common",
+                        "QName", context);
         assertEquals("QName", normalizeIdentifier);
         // non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName", context);
         assertEquals("Qname", normalizeIdentifier);
         // again non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName", context);
         assertEquals("Qname1", normalizeIdentifier);
 
         // Augmentable - reserved & non reserved
         normalizeIdentifier = JavaIdentifierNormalizer
-                .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable");
+                .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable", context);
         assertEquals("Augmentable", normalizeIdentifier);
         // again reserved
         normalizeIdentifier = JavaIdentifierNormalizer
-                .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable");
+                .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable", context);
         assertEquals("Augmentable", normalizeIdentifier);
         // non reserved
         normalizeIdentifier = JavaIdentifierNormalizer
-                .normalizeClassIdentifier("augmentable.non.reserved", "Augmentable");
+                .normalizeClassIdentifier("augmentable.non.reserved", "Augmentable", context);
         assertEquals("Augmentable", normalizeIdentifier);
         // again non reserved
         normalizeIdentifier =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("augmentable.non.reserved", "Augmentable");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("augmentable.non.reserved", "Augmentable", context);
         assertEquals("Augmentable1", normalizeIdentifier);
 
         // List - reserved & non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List", context);
         assertEquals("List", normalizeIdentifier);
         // again reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List", context);
         assertEquals("List", normalizeIdentifier);
         // non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List", context);
         assertEquals("List", normalizeIdentifier);
         // again non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List", context);
         assertEquals("List1", normalizeIdentifier);
 
         // String - reserved & non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String", context);
         assertEquals("String", normalizeIdentifier);
         // again reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String", context);
         assertEquals("String", normalizeIdentifier);
         // non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String", context);
         assertEquals("String", normalizeIdentifier);
         // again non reserved
-        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String");
+        normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String", context);
         assertEquals("String1", normalizeIdentifier);
     }
 
@@ -81,16 +85,21 @@ public class JavaIdentifierNormalizerTest {
      */
     @Test
     public void sameClassNamesSamePackageTest() {
-        String normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "Foo");
-        String normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "fOo");
+        ModuleContext context = new ModuleContext();
+        String normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package",
+                "Foo", context);
+        String normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package",
+                "fOo", context);
         final String normalizeIdentifier3 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "foo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "foo", context);
         assertEquals(normalizeIdentifier1, "Foo");
         assertEquals(normalizeIdentifier2, "Foo1");
         assertEquals(normalizeIdentifier3, "Foo2");
 
-        normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "*");
-        normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "asterisk");
+        normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "*",
+                context);
+        normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package",
+                "asterisk", context);
         assertEquals(normalizeIdentifier1, "Asterisk");
         assertEquals(normalizeIdentifier2, "Asterisk1");
     }
@@ -100,19 +109,21 @@ public class JavaIdentifierNormalizerTest {
      */
     @Test
     public void sameClassNamesOtherPackageTest() {
+        ModuleContext context = new ModuleContext();
         String normalizeIdentifier1 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "Foo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "Foo", context);
         String normalizeIdentifier2 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "fOo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "fOo", context);
         final String normalizeIdentifier3 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next.next", "foo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next.next", "foo", context);
         assertEquals(normalizeIdentifier1, "Foo");
         assertEquals(normalizeIdentifier2, "Foo");
         assertEquals(normalizeIdentifier3, "Foo");
 
-        normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "*");
+        normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "*",
+                context);
         normalizeIdentifier2 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "asterisk");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "asterisk", context);
         assertEquals(normalizeIdentifier1, "Asterisk");
         assertEquals(normalizeIdentifier2, "Asterisk");
     }
@@ -122,12 +133,13 @@ public class JavaIdentifierNormalizerTest {
      */
     @Test
     public void sameClassNamesSamePackageReservedWordsTest() {
+        ModuleContext context = new ModuleContext();
         final String normalizeIdentifier1 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "int");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "int", context);
         final String normalizeIdentifier2 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "InT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "InT", context);
         final String normalizeIdentifier3 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "inT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "inT", context);
         assertEquals(normalizeIdentifier1, "IntReservedKeyword");
         assertEquals(normalizeIdentifier2, "IntReservedKeyword1");
         assertEquals(normalizeIdentifier3, "IntReservedKeyword2");
@@ -138,12 +150,14 @@ public class JavaIdentifierNormalizerTest {
      */
     @Test
     public void sameClassNamesOtherPackageReservedWordsTest() {
+        ModuleContext context = new ModuleContext();
         final String normalizeIdentifier1 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package", "int");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package", "int", context);
         final String normalizeIdentifier2 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next", "InT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next", "InT", context);
         final String normalizeIdentifier3 =
-                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next.next", "inT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next.next",
+                        "inT", context);
         assertEquals(normalizeIdentifier1, "IntReservedKeyword");
         assertEquals(normalizeIdentifier2, "IntReservedKeyword");
         assertEquals(normalizeIdentifier3, "IntReservedKeyword");
index 307b41ea32ac7d7b4dd9a894ba634ffa5975f477..e192f426c272b4781c77ce509b3dd15f638a8fa7 100644 (file)
@@ -11,6 +11,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
 import org.opendaylight.yangtools.yang.model.api.Status;
 
@@ -18,7 +19,8 @@ public class EnumerationBuilderImplTest {
 
     @Test
     public void sameEnumTest() {
-        EnumerationBuilderImpl enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "test");
+        ModuleContext context = new ModuleContext();
+        EnumerationBuilderImpl enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "test", context);
         Enumeration enumeration = enumerationBuilderImpl.toInstance(enumerationBuilderImpl);
         String formattedString = enumeration.toFormattedString();
 
@@ -26,7 +28,7 @@ public class EnumerationBuilderImplTest {
         assertTrue(!formattedString.isEmpty());
         assertTrue(formattedString.contains("Test"));
 
-        enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "Test");
+        enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "Test", context);
         enumeration = enumerationBuilderImpl.toInstance(enumerationBuilderImpl);
         formattedString = enumeration.toFormattedString();
 
@@ -38,7 +40,7 @@ public class EnumerationBuilderImplTest {
     @Test
     public void enumTest() {
         final EnumerationBuilderImpl enumerationBuilderImpl =
-                new EnumerationBuilderImpl("package.test", "test**");
+                new EnumerationBuilderImpl("package.test", "test**", new ModuleContext());
         enumerationBuilderImpl.addValue("value", 1, "des", "ref", Status.CURRENT);
         final Enumeration enumeration = enumerationBuilderImpl.toInstance(enumerationBuilderImpl);
         final String formattedString = enumeration.toFormattedString();
@@ -52,7 +54,7 @@ public class EnumerationBuilderImplTest {
     @Test
     public void enumUniqueTest() {
         final EnumerationBuilderImpl enumerationBuilderImpl =
-                new EnumerationBuilderImpl("package.ex.ex.ex.test", "test");
+                new EnumerationBuilderImpl("package.ex.ex.ex.test", "test", new ModuleContext());
         enumerationBuilderImpl.addValue("foo", 1, "des", "ref", Status.CURRENT);
         enumerationBuilderImpl.addValue("Foo", 1, "des", "ref", Status.CURRENT);
         enumerationBuilderImpl.addValue("foo1", 1, "des", "ref", Status.CURRENT);
@@ -110,7 +112,7 @@ public class EnumerationBuilderImplTest {
     @Test
     public void asteriskInEnumTest() {
         final EnumerationBuilderImpl enumerationBuilderImpl =
-                new EnumerationBuilderImpl("package.ex.test", "test**");
+                new EnumerationBuilderImpl("package.ex.test", "test**", new ModuleContext());
         enumerationBuilderImpl.addValue("val**ue", 1, "des", "ref", Status.CURRENT);
         enumerationBuilderImpl.addValue("val*ue", 1, "des", "ref", Status.CURRENT);
         enumerationBuilderImpl.addValue("*value*", 1, "des", "ref", Status.CURRENT);
@@ -130,7 +132,7 @@ public class EnumerationBuilderImplTest {
     @Test
     public void reverseSolidusInEnumTest() {
         final EnumerationBuilderImpl enumerationBuilderImpl =
-                new EnumerationBuilderImpl("package.ex.ex.test", "test\\\\");
+                new EnumerationBuilderImpl("package.ex.ex.test", "test\\\\", new ModuleContext());
         enumerationBuilderImpl.addValue("val\\\\ue", 1, "des", "ref", Status.CURRENT);
         enumerationBuilderImpl.addValue("val\\ue", 1, "des", "ref", Status.CURRENT);
         enumerationBuilderImpl.addValue("\\value\\", 1, "des", "ref", Status.CURRENT);
index 9decef13106f62e22979bf98335a78bbfb19425c..31e3520f55db18f8ccfb1b6db42c017916a5281f 100644 (file)
@@ -138,7 +138,7 @@ public class BuilderRenderer extends BaseRenderer {
         final String prefix = Types.BOOLEAN.equals(method.getReturnType()) ? "is" : "get";
         if (method.getName().startsWith(prefix)) {
             final String fieldName = toFirstLower(method.getName().substring(prefix.length()));
-            final GeneratedTOBuilderImpl tmpGenTO = new GeneratedTOBuilderImpl("foo", "foo");
+            final GeneratedTOBuilderImpl tmpGenTO = new GeneratedTOBuilderImpl("foo", "foo", true);
             tmpGenTO.addProperty(fieldName)
                     .setReturnType(method.getReturnType());
             return tmpGenTO.toInstance().getProperties().get(0);
@@ -185,10 +185,12 @@ public class BuilderRenderer extends BaseRenderer {
                             final String fullyQualifiedName = method.getReturnType().getName();
                             final String aPackage = getPackage(fullyQualifiedName);
                             final String name = getName(fullyQualifiedName);
-                            final GeneratedTOBuilderImpl generatedTOBuilder = new GeneratedTOBuilderImpl(aPackage, name);
-                            final ReferencedTypeImpl referencedType = new ReferencedTypeImpl(aPackage, name, true);
+                            final GeneratedTOBuilderImpl generatedTOBuilder = new GeneratedTOBuilderImpl(aPackage,
+                                    name, true);
+                            final ReferencedTypeImpl referencedType = new ReferencedTypeImpl(aPackage, name, true,
+                                    null);
                             final ReferencedTypeImpl generic = new ReferencedTypeImpl(getType().getPackageName(),
-                                    getType().getName(), true);
+                                    getType().getName(), true, null);
                             final ParameterizedType parametrizedReturnType = Types.parameterizedTypeFor(referencedType, generic);
                             generatedTOBuilder.addMethod(method.getName()).setReturnType(parametrizedReturnType);
                             augmentField = propertyFromGetter(generatedTOBuilder.toInstance().getMethodDefinitions().get(0));
index c8b18d35528bf2779811f1eeaafc395001cf3af1..11a8c5c22aad65655e61a42bdd305906378b2688 100644 (file)
@@ -11,9 +11,11 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
+
 import java.util.ArrayList;
 import java.util.List;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
@@ -123,7 +125,8 @@ public class BuilderRendererTest {
         final GeneratedType genType = spy(GeneratedType.class);
         doReturn(TEST).when(genType).getName();
         doReturn(TEST).when(genType).getPackageName();
-        doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName)
+        doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName,
+                new ModuleContext())
                 .toInstance()).when(genType).getParentTypeForBuilder();
 
         final List<MethodSignature> listMethodSign = new ArrayList<>();
@@ -147,7 +150,8 @@ public class BuilderRendererTest {
         final GeneratedType genType = spy(GeneratedType.class);
         doReturn(TEST).when(genType).getName();
         doReturn(TEST).when(genType).getPackageName();
-        doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName)
+        doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName,
+                new ModuleContext())
                 .toInstance()).when(genType).getParentTypeForBuilder();
 
         final List<MethodSignature> listMethodSign = new ArrayList<>();
index 11a1646fe574ae12a520c9f496a21a838a2c2bd3..3389b96f1627dd1f9cc21783d6b61ed6465660fa 100644 (file)
@@ -30,7 +30,7 @@ import java.util.Set;
 import javax.annotation.Nullable;
 import org.opendaylight.mdsal.binding.javav2.generator.api.ClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.javav2.generator.impl.BindingGeneratorImpl;
-import org.opendaylight.mdsal.binding.javav2.generator.impl.ModuleContext;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.generator.util.ReferencedTypeImpl;
@@ -287,13 +287,13 @@ public class BindingRuntimeContext implements Immutable {
     }
 
     private static Type referencedType(final Class<?> type) {
-        return new ReferencedTypeImpl(type.getPackage().getName(), type.getSimpleName(), true);
+        return new ReferencedTypeImpl(type.getPackage().getName(), type.getSimpleName(), true, null);
     }
 
     static Type referencedType(final String type) {
         final int packageClassSeparator = type.lastIndexOf(DOT);
         return new ReferencedTypeImpl(type.substring(0, packageClassSeparator),
-            type.substring(packageClassSeparator + 1), true);
+            type.substring(packageClassSeparator + 1), true, null);
     }
 
     /**
@@ -447,7 +447,7 @@ public class BindingRuntimeContext implements Immutable {
         if (type instanceof ReferencedTypeImpl) {
             return type;
         }
-        return new ReferencedTypeImpl(type.getPackageName(), type.getName());
+        return new ReferencedTypeImpl(type.getPackageName(), type.getName(), true, null);
     }
 
     private static Set<Type> collectAllContainerTypes(final GeneratedType type, final Set<Type> collection) {