Fixed generation of UnionBuilders for anonymous unions. 90/16390/2
authorTony Tkacik <ttkacik@cisco.com>
Thu, 12 Mar 2015 13:27:22 +0000 (14:27 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Thu, 12 Mar 2015 13:55:38 +0000 (14:55 +0100)
Change-Id: I18e90e7d7227efe31767734df1ce525df60104d5
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/Types.java
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/UnionTemplate.xtend
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java

index b6e3598ce1fc21126ce2e9f19be1e7f5f29efb30..d9796236ed5aeb4db543ba5728bd30885f40124d 100644 (file)
@@ -25,6 +25,7 @@ import static org.opendaylight.yangtools.binding.generator.util.Types.typeForCla
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findNodeInSchemaContext;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule;
+
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterables;
@@ -228,20 +229,20 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
         schemaContext = context;
         typeProvider = new TypeProviderImpl(context);
-        Module[] modulesArray = new Module[context.getModules().size()];
+        final Module[] modulesArray = new Module[context.getModules().size()];
         context.getModules().toArray(modulesArray);
         final List<Module> contextModules = ModuleDependencySort.sort(modulesArray);
         genTypeBuilders = new HashMap<>();
 
-        for (Module contextModule : contextModules) {
+        for (final Module contextModule : contextModules) {
             moduleToGenTypes(contextModule, context);
         }
-        for (Module contextModule : contextModules) {
+        for (final Module contextModule : contextModules) {
             allAugmentsToGenTypes(contextModule);
         }
 
         final List<Type> filteredGenTypes = new ArrayList<>();
-        for (Module m : modules) {
+        for (final Module m : modules) {
             final ModuleContext ctx = checkNotNull(genCtx.get(m), "Module context not found for module %s", m);
             filteredGenTypes.addAll(ctx.getGeneratedTypes());
             final Set<Type> additionalTypes = ((TypeProviderImpl) typeProvider).getAdditionalTypes().get(m);
@@ -290,7 +291,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         final List<TypeDefinition<?>> typeDefinitions = it.allTypedefs();
         checkState(typeDefinitions != null, "Type Definitions for module «module.name» cannot be NULL.");
 
-        for (TypeDefinition<?> typedef : typeDefinitions) {
+        for (final TypeDefinition<?> typedef : typeDefinitions) {
             if (typedef != null) {
                 final Type type = ((TypeProviderImpl) typeProvider).generatedTypeForExtendedDefinitionType(typedef,
                         typedef);
@@ -348,7 +349,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                 genType.addImplementsType(identifiableMarker);
             }
 
-            for (DataSchemaNode schemaNode : node.getChildNodes()) {
+            for (final DataSchemaNode schemaNode : node.getChildNodes()) {
                 if (!schemaNode.isAugmenting()) {
                     addSchemaNodeToListBuilders(basePackageName, schemaNode, genType, genTOBuilder, listKeys, module);
                 }
@@ -367,8 +368,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
     private void processUsesAugments(final DataNodeContainer node, final Module module) {
         final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule());
-        for (UsesNode usesNode : node.getUses()) {
-            for (AugmentationSchema augment : usesNode.getAugmentations()) {
+        for (final UsesNode usesNode : node.getUses()) {
+            for (final AugmentationSchema augment : usesNode.getAugmentations()) {
                 usesAugmentationToGenTypes(basePackageName, augment, module, usesNode, node);
                 processUsesAugments(augment, module);
             }
@@ -397,7 +398,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
         final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule());
         final List<AugmentationSchema> augmentations = resolveAugmentations(module);
-        for (AugmentationSchema augment : augmentations) {
+        for (final AugmentationSchema augment : augmentations) {
             augmentationToGenTypes(basePackageName, augment, module);
         }
     }
@@ -421,7 +422,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         checkState(module.getAugmentations() != null, "Augmentations Set cannot be NULL.");
 
         final Set<AugmentationSchema> augmentations = module.getAugmentations();
-        List<AugmentationSchema> sortedAugmentations = new ArrayList<>(augmentations);
+        final List<AugmentationSchema> sortedAugmentations = new ArrayList<>(augmentations);
         Collections.sort(sortedAugmentations, Comparators.AUGMENT_COMP);
 
         return sortedAugmentations;
@@ -479,7 +480,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         interfaceBuilder.addImplementsType(Types.typeForClass(RpcService.class));
         interfaceBuilder.setDescription(createDescription(rpcDefinitions, module.getName(), module.getModuleSourcePath()));
 
-        for (RpcDefinition rpc : rpcDefinitions) {
+        for (final RpcDefinition rpc : rpcDefinitions) {
             if (rpc != null) {
                 final String rpcName = BindingMapping.getClassName(rpc.getQName());
                 final String rpcMethodName = BindingMapping.getPropertyName(rpcName);
@@ -550,7 +551,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
 
 
-        for (NotificationDefinition notification : notifications) {
+        for (final NotificationDefinition notification : notifications) {
             if (notification != null) {
                 processUsesAugments(notification, module);
 
@@ -590,7 +591,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule());
 
         if (schemaIdentities != null && !schemaIdentities.isEmpty()) {
-            for (IdentitySchemaNode identity : schemaIdentities) {
+            for (final IdentitySchemaNode identity : schemaIdentities) {
                 identityToGenType(module, basePackageName, identity, context);
             }
         }
@@ -652,7 +653,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
     private static Constant qnameConstant(final GeneratedTypeBuilderBase<?> toBuilder, final String constantName,
             final QName name) {
-        StringBuilder sb = new StringBuilder("org.opendaylight.yangtools.yang.common.QName");
+        final StringBuilder sb = new StringBuilder("org.opendaylight.yangtools.yang.common.QName");
         sb.append(".create(");
         sb.append('"');
         sb.append(name.getNamespace());
@@ -682,7 +683,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule());
         final List<GroupingDefinition> groupingsSortedByDependencies = new GroupingDefinitionDependencySort()
         .sort(groupings);
-        for (GroupingDefinition grouping : groupingsSortedByDependencies) {
+        for (final GroupingDefinition grouping : groupingsSortedByDependencies) {
             groupingToGenType(basePackageName, grouping, module);
         }
     }
@@ -825,7 +826,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         }
 
         if (!(targetSchemaNode instanceof ChoiceSchemaNode)) {
-            String packageName = augmentPackageName;
+            final String packageName = augmentPackageName;
             final Type targetType = new ReferencedTypeImpl(targetTypeBuilder.getPackageName(),
                     targetTypeBuilder.getName());
             addRawAugmentGenTypeDefinition(module, packageName, augmentPackageName, targetType, augSchema);
@@ -845,7 +846,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
         processUsesAugments(augSchema, module);
         final SchemaPath targetPath = augSchema.getTargetPath();
-        SchemaNode targetSchemaNode = findOriginalTargetFromGrouping(targetPath, usesNode);
+        final SchemaNode targetSchemaNode = findOriginalTargetFromGrouping(targetPath, usesNode);
         if (targetSchemaNode == null) {
             throw new IllegalArgumentException("augment target not found: " + targetPath);
         }
@@ -882,15 +883,15 @@ public class BindingGeneratorImpl implements BindingGenerator {
      * @return node from its original location in grouping
      */
     private DataSchemaNode findOriginalTargetFromGrouping(final SchemaPath targetPath, final UsesNode parentUsesNode) {
-        SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, parentUsesNode.getGroupingPath()
+        final SchemaNode targetGrouping = findNodeInSchemaContext(schemaContext, parentUsesNode.getGroupingPath()
                 .getPathFromRoot());
         if (!(targetGrouping instanceof GroupingDefinition)) {
             throw new IllegalArgumentException("Failed to generate code for augment in " + parentUsesNode);
         }
 
-        GroupingDefinition grouping = (GroupingDefinition) targetGrouping;
+        final GroupingDefinition grouping = (GroupingDefinition) targetGrouping;
         SchemaNode result = grouping;
-        for (QName node : targetPath.getPathFromRoot()) {
+        for (final QName node : targetPath.getPathFromRoot()) {
             // finding by local name is valid, grouping cannot contain nodes
             // with same name and different namespace
             if (result instanceof DataNodeContainer) {
@@ -904,7 +905,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         }
 
         boolean fromUses = ((DataSchemaNode) result).isAddedByUses();
-        Iterator<UsesNode> groupingUses = grouping.getUses().iterator();
+        final Iterator<UsesNode> groupingUses = grouping.getUses().iterator();
         while (groupingUses.hasNext() && fromUses) {
             result = findOriginalTargetFromGrouping(targetPath, groupingUses.next());
             if (result != null) {
@@ -981,7 +982,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
      * @return nodeParameter of UnknownSchemaNode
      */
     private String getAugmentIdentifier(final List<UnknownSchemaNode> unknownSchemaNodes) {
-        for (UnknownSchemaNode unknownSchemaNode : unknownSchemaNodes) {
+        for (final UnknownSchemaNode unknownSchemaNode : unknownSchemaNodes) {
             final QName nodeType = unknownSchemaNode.getNodeType();
             if (AUGMENT_IDENTIFIER_NAME.equals(nodeType.getLocalName())
                     && YANG_EXT_NAMESPACE.equals(nodeType.getNamespace().toString())) {
@@ -1041,7 +1042,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
     private GeneratedTypeBuilder resolveDataSchemaNodes(final Module module, final String basePackageName,
             final GeneratedTypeBuilder parent, final GeneratedTypeBuilder childOf, final Iterable<DataSchemaNode> schemaNodes) {
         if (schemaNodes != null && parent != null) {
-            for (DataSchemaNode schemaNode : schemaNodes) {
+            for (final DataSchemaNode schemaNode : schemaNodes) {
                 if (!schemaNode.isAugmenting() && !schemaNode.isAddedByUses()) {
                     addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, parent, childOf, module);
                 }
@@ -1076,7 +1077,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             final GeneratedTypeBuilder typeBuilder, final GeneratedTypeBuilder childOf,
             final Iterable<DataSchemaNode> schemaNodes) {
         if ((schemaNodes != null) && (typeBuilder != null)) {
-            for (DataSchemaNode schemaNode : schemaNodes) {
+            for (final DataSchemaNode schemaNode : schemaNodes) {
                 if (!schemaNode.isAugmenting()) {
                     addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, typeBuilder, childOf, module);
                 }
@@ -1200,7 +1201,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             return;
         }
 
-        for (ChoiceCaseNode caseNode : caseNodes) {
+        for (final ChoiceCaseNode caseNode : caseNodes) {
             if (caseNode != null && !caseNode.isAddedByUses() && !caseNode.isAugmenting()) {
                 final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath());
                 final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode, module);
@@ -1278,7 +1279,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         checkArgument(targetType != null, "Referenced Choice Type cannot be NULL.");
         checkArgument(augmentedNodes != null, "Set of Choice Case Nodes cannot be NULL.");
 
-        for (DataSchemaNode caseNode : augmentedNodes) {
+        for (final DataSchemaNode caseNode : augmentedNodes) {
             if (caseNode != null) {
                 final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath());
                 final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode, module);
@@ -1385,7 +1386,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
     private void processContextRefExtension(final LeafSchemaNode leaf, final MethodSignatureBuilder getter,
             final Module module) {
-        for (UnknownSchemaNode node : leaf.getUnknownSchemaNodes()) {
+        for (final UnknownSchemaNode node : leaf.getUnknownSchemaNodes()) {
             final QName nodeType = node.getNodeType();
             if ("context-reference".equals(nodeType.getLocalName())) {
                 final String nodeParam = node.getNodeParameter();
@@ -1398,7 +1399,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                     identity = findIdentityByName(module.getIdentities(), iterator.next());
                     basePackageName = BindingMapping.getRootPackageName(module.getQNameModule());
                 } else if (length == 2) {
-                    String prefix = iterator.next();
+                    final String prefix = iterator.next();
                     final Module dependentModule = findModuleFromImports(module.getImports(), prefix);
                     if (dependentModule == null) {
                         throw new IllegalArgumentException("Failed to process context-reference: unknown prefix "
@@ -1426,7 +1427,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
     }
 
     private IdentitySchemaNode findIdentityByName(final Set<IdentitySchemaNode> identities, final String name) {
-        for (IdentitySchemaNode id : identities) {
+        for (final IdentitySchemaNode id : identities) {
             if (id.getQName().getLocalName().equals(name)) {
                 return id;
             }
@@ -1435,7 +1436,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
     }
 
     private Module findModuleFromImports(final Set<ModuleImport> imports, final String prefix) {
-        for (ModuleImport imp : imports) {
+        for (final ModuleImport imp : imports) {
             if (imp.getPrefix().equals(prefix)) {
                 return schemaContext.findModuleByName(imp.getModuleName(), imp.getRevision());
             }
@@ -1458,8 +1459,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
                 if (typeDef instanceof UnionTypeDefinition) {
                     // GeneratedType for this type definition should be already
                     // created
-                    QName qname = typeDef.getQName();
-                    Module unionModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(),
+                    final QName qname = typeDef.getQName();
+                    final Module unionModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(),
                             qname.getRevision());
                     final ModuleContext mc = genCtx.get(unionModule);
                     returnType = mc.getTypedefs().get(typeDef.getPath());
@@ -1578,10 +1579,11 @@ public class BindingGeneratorImpl implements BindingGenerator {
         genTOBuilder.setIsUnion(true);
         ((TypeProviderImpl) typeProvider).addUnitsToGenTO(genTOBuilder, typeDef.getUnits());
 
-        // union builder
-        final GeneratedTOBuilder unionBuilder = new GeneratedTOBuilderImpl(typeBuilder.getPackageName(),
-                genTOBuilder.getName() + "Builder");
-        unionBuilder.setIsUnionBuilder(true);
+
+
+        final GeneratedTOBuilder unionBuilder = createUnionBuilder(genTOBuilder,typeBuilder);
+
+
         final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance");
         method.setReturnType(returnType);
         method.addParameter(Types.STRING, "defaultValue");
@@ -1598,6 +1600,22 @@ public class BindingGeneratorImpl implements BindingGenerator {
         return returnType.toInstance();
     }
 
+    private GeneratedTOBuilder createUnionBuilder(final GeneratedTOBuilder genTOBuilder, final GeneratedTypeBuilder typeBuilder) {
+
+        final String outerCls = Types.getOuterClassName(genTOBuilder);
+        final StringBuilder name;
+        if(outerCls != null) {
+            name = new StringBuilder(outerCls);
+        } else {
+            name = new StringBuilder();
+        }
+        name.append(genTOBuilder.getName());
+        name.append("Builder");
+        final GeneratedTOBuilderImpl unionBuilder = new GeneratedTOBuilderImpl(typeBuilder.getPackageName(),name.toString());
+        unionBuilder.setIsUnionBuilder(true);
+        return unionBuilder;
+    }
+
     private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode,
             final Module module) {
         return addDefaultInterfaceDefinition(packageName, schemaNode, null, module);
@@ -1740,7 +1758,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         } else {
             method.append("get");
         }
-        String name = BindingMapping.toFirstUpper(BindingMapping.getPropertyName(localName));
+        final String name = BindingMapping.toFirstUpper(BindingMapping.getPropertyName(localName));
         method.append(name);
         return method.toString();
     }
@@ -1834,7 +1852,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         checkArgument(typeBuilder != null, "Generated Type Builder cannot be NULL.");
 
         if (genTOBuilder != null) {
-            GeneratedTransferObject genTO = genTOBuilder.toInstance();
+            final GeneratedTransferObject genTO = genTOBuilder.toInstance();
             constructGetter(typeBuilder, "key", "Returns Primary Key of Yang List Type", genTO);
             genCtx.get(module).addGeneratedTOBuilder(genTOBuilder);
         }
@@ -1853,9 +1871,9 @@ public class BindingGeneratorImpl implements BindingGenerator {
     private List<String> listKeys(final ListSchemaNode list) {
         final List<String> listKeys = new ArrayList<>();
 
-        List<QName> keyDefinition = list.getKeyDefinition();
+        final List<QName> keyDefinition = list.getKeyDefinition();
         if (keyDefinition != null) {
-            for (QName keyDef : keyDefinition) {
+            for (final QName keyDef : keyDefinition) {
                 listKeys.add(keyDef.getLocalName());
             }
         }
@@ -1922,7 +1940,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                 throw new IllegalStateException("No GeneratedTOBuilder objects generated from union " + typeDef);
             }
             resultTOBuilder = types.remove(0);
-            for (GeneratedTOBuilder genTOBuilder : types) {
+            for (final GeneratedTOBuilder genTOBuilder : types) {
                 resultTOBuilder.addEnclosingTransferObject(genTOBuilder);
             }
 
@@ -1937,7 +1955,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                     packageName, typeDef, classNameFromLeaf, parentModule.getName()));
         }
         if (genTOBuilders != null && !genTOBuilders.isEmpty()) {
-            for (GeneratedTOBuilder genTOBuilder : genTOBuilders) {
+            for (final GeneratedTOBuilder genTOBuilder : genTOBuilders) {
                 typeBuilder.addEnclosingTransferObject(genTOBuilder);
             }
             return genTOBuilders.get(0);
@@ -1964,7 +1982,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
      */
     private GeneratedTypeBuilder addImplementedInterfaceFromUses(final DataNodeContainer dataNodeContainer,
             final GeneratedTypeBuilder builder) {
-        for (UsesNode usesNode : dataNodeContainer.getUses()) {
+        for (final UsesNode usesNode : dataNodeContainer.getUses()) {
             if (usesNode.getGroupingPath() != null) {
                 final GeneratedType genType = findGroupingByPath(usesNode.getGroupingPath()).toInstance();
                 if (genType == null) {
@@ -2031,7 +2049,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             final Module module = findParentModule(schemaContext, schemaNode);
             final StringBuilder linkToBuilderClass = new StringBuilder();
             final String[] namespace = Iterables.toArray(BSDOT_SPLITTER.split(fullyQualifiedName), String.class);
-            String className = namespace[namespace.length - 1];
+            final String className = namespace[namespace.length - 1];
 
             if (hasBuilderClass(schemaNode)) {
                 linkToBuilderClass.append(className);
@@ -2122,8 +2140,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
     }
 
     private GeneratedTypeBuilder findChildNodeByPath(final SchemaPath path) {
-        for (ModuleContext ctx : genCtx.values()) {
-            GeneratedTypeBuilder result = ctx.getChildNode(path);
+        for (final ModuleContext ctx : genCtx.values()) {
+            final GeneratedTypeBuilder result = ctx.getChildNode(path);
             if (result != null) {
                 return result;
             }
@@ -2132,8 +2150,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
     }
 
     private GeneratedTypeBuilder findGroupingByPath(final SchemaPath path) {
-        for (ModuleContext ctx : genCtx.values()) {
-            GeneratedTypeBuilder result = ctx.getGrouping(path);
+        for (final ModuleContext ctx : genCtx.values()) {
+            final GeneratedTypeBuilder result = ctx.getGrouping(path);
             if (result != null) {
                 return result;
             }
@@ -2142,8 +2160,8 @@ public class BindingGeneratorImpl implements BindingGenerator {
     }
 
     private GeneratedTypeBuilder findCaseByPath(final SchemaPath path) {
-        for (ModuleContext ctx : genCtx.values()) {
-            GeneratedTypeBuilder result = ctx.getCase(path);
+        for (final ModuleContext ctx : genCtx.values()) {
+            final GeneratedTypeBuilder result = ctx.getCase(path);
             if (result != null) {
                 return result;
             }
index def0b2766a782fb9894d7324afbc10f37ee4e3a8..be9b3d7a49235b7b1ddedb74369b31b807323153 100644 (file)
@@ -7,13 +7,17 @@
  */
 package org.opendaylight.yangtools.binding.generator.util;
 
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Splitter;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Iterables;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Future;
+import javax.annotation.Nullable;
 import org.opendaylight.yangtools.sal.binding.model.api.ConcreteType;
 import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType;
 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions;
@@ -43,6 +47,7 @@ public final class Types {
     public static final ConcreteType VOID = typeForClass(Void.class);
     public static final ConcreteType BYTE_ARRAY = primitiveType("byte[]", null);
     public static final ConcreteType CHAR_ARRAY = primitiveType("char[]", null);
+    private static final Splitter DOT_SPLITTER = Splitter.on('.');
 
     /**
      * It is not desirable to create instance of this class
@@ -203,6 +208,16 @@ public final class Types {
         return parameterizedTypeFor(augmentation, valueType);
     }
 
+
+    public static  @Nullable String getOuterClassName(final Type valueType) {
+        final String pkgName = valueType.getPackageName();
+        if(CharMatcher.JAVA_UPPER_CASE.indexIn(pkgName) >= 0) {
+            // It is inner class.
+            return Iterables.getLast(DOT_SPLITTER.split(pkgName));
+        }
+        return null;
+    }
+
     /**
      *
      * Represents concrete JAVA type.
index 1d8a156e2492f5ef7aacc0ed8a3faab0ac523704..e8ddb9673f423e1e48a9280c744b3d9da726c79a 100644 (file)
@@ -49,7 +49,7 @@ class UnionTemplate extends ClassTemplate {
                 @«ConstructorProperties.importedName»("«property.name»")
                 public «type.name»(«propRet.importedName» «property.fieldName») {
                     «String.importedName» defVal = new «String.importedName»(«property.fieldName»);
-                    «type.name» defInst = «type.name»Builder.getDefaultInstance(defVal);
+                    «type.name» defInst = «typeBuilder()».getDefaultInstance(defVal);
                     «FOR other : finalProperties»
                         «IF other.name.equals("value")»
                             «IF other.returnType.importedName.contains("[]")»
@@ -104,6 +104,14 @@ class UnionTemplate extends ClassTemplate {
             «ENDIF»
         «ENDFOR»
     '''
+    
+    def typeBuilder() {
+        val outerCls = getOuterClassName(type);
+        if(outerCls !== null) {
+            return outerCls + type.name + "Builder"
+        }
+        return type.name + "Builder"
+    }
 
     private def unionConstructorsParentProperties() '''
         «FOR property : parentProperties SEPARATOR "\n"»
index 073f6a9d775aacc8de7e05350fe5f6550777f0ed..517382fa6fcea61329a4e29d0bc8a3c3b642f7c5 100644 (file)
@@ -27,6 +27,7 @@ import static org.opendaylight.yangtools.sal.java.api.generator.test.Compilation
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.cleanUp;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.getSourceFiles;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.testCompilation;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableSet;
@@ -87,11 +88,11 @@ public class CompilationTest extends BaseCompilationTest {
 
         // Test if all sources are generated
         File parent = new File(sourcesOutputDir, NS_TEST);
-        File keyArgs = new File(parent, "KeyArgs.java");
-        File links = new File(parent, "Links.java");
-        File linksBuilder = new File(parent, "LinksBuilder.java");
-        File linksKey = new File(parent, "LinksKey.java");
-        File testData = new File(parent, "TestData.java");
+        final File keyArgs = new File(parent, "KeyArgs.java");
+        final File links = new File(parent, "Links.java");
+        final File linksBuilder = new File(parent, "LinksBuilder.java");
+        final File linksKey = new File(parent, "LinksKey.java");
+        final File testData = new File(parent, "TestData.java");
         assertTrue(keyArgs.exists());
         assertTrue(links.exists());
         assertTrue(linksBuilder.exists());
@@ -100,13 +101,13 @@ public class CompilationTest extends BaseCompilationTest {
         assertFilesCount(parent, 6);
 
         parent = new File(sourcesOutputDir, NS_TEST + FS + "links");
-        File level = new File(parent, "Level.java");
-        File linkGroup = new File(parent, "LinkGroup.java");
-        File node = new File(parent, "Node.java");
-        File nodeBuilder = new File(parent, "NodeBuilder.java");
-        File nodeList = new File(parent, "NodeList.java");
-        File nodeListBuilder = new File(parent, "NodeListBuilder.java");
-        File nodesType = new File(parent, "NodesType.java");
+        final File level = new File(parent, "Level.java");
+        final File linkGroup = new File(parent, "LinkGroup.java");
+        final File node = new File(parent, "Node.java");
+        final File nodeBuilder = new File(parent, "NodeBuilder.java");
+        final File nodeList = new File(parent, "NodeList.java");
+        final File nodeListBuilder = new File(parent, "NodeListBuilder.java");
+        final File nodesType = new File(parent, "NodesType.java");
         assertTrue(level.exists());
         assertTrue(linkGroup.exists());
         assertTrue(node.exists());
@@ -119,10 +120,10 @@ public class CompilationTest extends BaseCompilationTest {
         // Test if sources are compilable
         testCompilation(sourcesOutputDir, compiledOutputDir);
 
-        ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
-        Class<?> keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader);
-        Class<?> linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
-        Class<?> linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
+        final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
+        final Class<?> keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader);
+        final Class<?> linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
+        final Class<?> linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
 
         // Test generated 'grouping key-args'
         assertTrue(keyArgsClass.isInterface());
@@ -139,7 +140,7 @@ public class CompilationTest extends BaseCompilationTest {
         // Test list key constructor arguments ordering
         assertContainsConstructor(linksKeyClass, Byte.class, String.class, Integer.class);
         // Test serialVersionUID generation
-        Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE);
+        final Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE);
         suid.setAccessible(true);
         assertEquals(-8829501012356283881L, suid.getLong(null));
 
@@ -262,10 +263,10 @@ public class CompilationTest extends BaseCompilationTest {
 
         // Test if all sources were generated from 'module foo'
         File parent = new File(sourcesOutputDir, NS_FOO);
-        File fooListener = new File(parent, "FooListener.java");
+        final File fooListener = new File(parent, "FooListener.java");
         File pathAttributes = new File(parent, "PathAttributes.java");
-        File update = new File(parent, "Update.java");
-        File updateBuilder = new File(parent, "UpdateBuilder.java");
+        final File update = new File(parent, "Update.java");
+        final File updateBuilder = new File(parent, "UpdateBuilder.java");
         assertTrue(fooListener.exists());
         assertTrue(pathAttributes.exists());
         assertTrue(update.exists());
@@ -276,23 +277,23 @@ public class CompilationTest extends BaseCompilationTest {
         assertFilesCount(parent, 1);
         parent = new File(parent, "attributes");
         assertFilesCount(parent, 2);
-        File origin = new File(parent, "Origin.java");
-        File originBuilder = new File(parent, "OriginBuilder.java");
+        final File origin = new File(parent, "Origin.java");
+        final File originBuilder = new File(parent, "OriginBuilder.java");
         assertTrue(origin.exists());
         assertTrue(originBuilder.exists());
 
         parent = new File(sourcesOutputDir, NS_FOO + FS + "update");
         assertFilesCount(parent, 2);
         pathAttributes = new File(parent, "PathAttributes.java");
-        File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java");
+        final File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java");
         assertTrue(pathAttributes.exists());
         assertTrue(pathAttributesBuilder.exists());
 
         // Test if all sources were generated from 'module bar'
         parent = new File(sourcesOutputDir, NS_BAR);
-        File destination = new File(parent, "Destination.java");
-        File pathAttributes1 = new File(parent, "PathAttributes1.java");
-        File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java");
+        final File destination = new File(parent, "Destination.java");
+        final File pathAttributes1 = new File(parent, "PathAttributes1.java");
+        final File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java");
         assertTrue(destination.exists());
         assertTrue(pathAttributes1.exists());
         assertTrue(pathAttributes1Builder.exists());
@@ -300,15 +301,15 @@ public class CompilationTest extends BaseCompilationTest {
 
         parent = new File(sourcesOutputDir, NS_BAR + FS + "destination");
         assertFilesCount(parent, 2);
-        File destinationType = new File(parent, "DestinationType.java");
+        final File destinationType = new File(parent, "DestinationType.java");
         assertTrue(destinationType.exists());
 
         parent = new File(parent, "destination");
         assertFilesCount(parent, 1);
         parent = new File(parent, "type");
         assertFilesCount(parent, 2);
-        File destinationIpv4 = new File(parent, "DestinationIp.java");
-        File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java");
+        final File destinationIpv4 = new File(parent, "DestinationIp.java");
+        final File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java");
         assertTrue(destinationIpv4.exists());
         assertTrue(destinationIpv4Builder.exists());
 
@@ -317,8 +318,8 @@ public class CompilationTest extends BaseCompilationTest {
         parent = new File(parent, "path");
         assertFilesCount(parent, 1);
         parent = new File(parent, "attributes");
-        File mpUnreachNlri = new File(parent, "MpUnreachNlri.java");
-        File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java");
+        final File mpUnreachNlri = new File(parent, "MpUnreachNlri.java");
+        final File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java");
         assertTrue(mpUnreachNlri.exists());
         assertTrue(mpUnreachNlriBuilder.exists());
         assertFilesCount(parent, 3);
@@ -328,8 +329,8 @@ public class CompilationTest extends BaseCompilationTest {
         parent = new File(parent, "unreach");
         assertFilesCount(parent, 1);
         parent = new File(parent, "nlri");
-        File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java");
-        File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java");
+        final File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java");
+        final File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java");
         assertTrue(withdrawnRoutes.exists());
         assertTrue(withdrawnRoutesBuilder.exists());
         assertFilesCount(parent, 2);
@@ -337,7 +338,7 @@ public class CompilationTest extends BaseCompilationTest {
         // Test if all sources were generated from 'module baz'
         parent = new File(sourcesOutputDir, NS_BAZ);
         assertFilesCount(parent, 2);
-        File linkstateDestination = new File(parent, "LinkstateDestination.java");
+        final File linkstateDestination = new File(parent, "LinkstateDestination.java");
         assertTrue(linkstateDestination.exists());
 
         parent = new File(sourcesOutputDir, NS_BAZ + FS + "update");
@@ -359,28 +360,28 @@ public class CompilationTest extends BaseCompilationTest {
         parent = new File(parent, "destination");
         assertFilesCount(parent, 1);
         parent = new File(parent, "type");
-        File destinationLinkstate = new File(parent, "DestinationLinkstate.java");
-        File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java");
+        final File destinationLinkstate = new File(parent, "DestinationLinkstate.java");
+        final File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java");
         assertTrue(destinationLinkstate.exists());
         assertTrue(destinationLinkstateBuilder.exists());
         assertFilesCount(parent, 3);
         parent = new File(parent, "destination");
         assertFilesCount(parent, 1);
         parent = new File(parent, "linkstate");
-        File links = new File(parent, "Links.java");
-        File linksBuilder = new File(parent, "LinksBuilder.java");
+        final File links = new File(parent, "Links.java");
+        final File linksBuilder = new File(parent, "LinksBuilder.java");
         assertTrue(links.exists());
         assertTrue(linksBuilder.exists());
         assertFilesCount(parent, 3);
         parent = new File(parent, "links");
-        File source = new File(parent, "Source.java");
-        File sourceBuilder = new File(parent, "SourceBuilder.java");
+        final File source = new File(parent, "Source.java");
+        final File sourceBuilder = new File(parent, "SourceBuilder.java");
         assertTrue(source.exists());
         assertTrue(sourceBuilder.exists());
         assertFilesCount(parent, 3);
         parent = new File(parent, "source");
-        File address = new File(parent, "Address.java");
-        File addressBuilder = new File(parent, "AddressBuilder.java");
+        final File address = new File(parent, "Address.java");
+        final File addressBuilder = new File(parent, "AddressBuilder.java");
         assertTrue(address.exists());
         assertTrue(addressBuilder.exists());
         assertFilesCount(parent, 2);
@@ -400,24 +401,24 @@ public class CompilationTest extends BaseCompilationTest {
 
         generateTestSources("/compilation/leaf-return-types", sourcesOutputDir);
 
-        File parent = new File(sourcesOutputDir, NS_TEST);
+        final File parent = new File(sourcesOutputDir, NS_TEST);
         assertTrue(new File(parent, "TestData.java").exists());
         assertTrue(new File(parent, "Nodes.java").exists());
         assertTrue(new File(parent, "NodesBuilder.java").exists());
         assertTrue(new File(parent, "Alg.java").exists());
-        assertTrue(new File(parent, "IdUnionBuilder.java").exists());
+        assertTrue(new File(parent, "NodesIdUnionBuilder.java").exists());
         assertFilesCount(parent, 5);
 
         // Test if sources are compilable
         testCompilation(sourcesOutputDir, compiledOutputDir);
 
-        String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008";
-        ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
-        Class<?> nodesClass = Class.forName(pkg + ".Nodes", true, loader);
-        Class<?> builderClass = Class.forName(pkg + ".NodesBuilder", true, loader);
+        final String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008";
+        final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
+        final Class<?> nodesClass = Class.forName(pkg + ".Nodes", true, loader);
+        final Class<?> builderClass = Class.forName(pkg + ".NodesBuilder", true, loader);
 
         // Test methods return type
-        byte[] b = new byte[] {};
+        final byte[] b = new byte[] {};
         assertContainsMethod(nodesClass, b.getClass(), "getIdBinary");
         assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader);
         assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean");
@@ -438,17 +439,17 @@ public class CompilationTest extends BaseCompilationTest {
         assertContainsMethod(nodesClass, BigInteger.class, "getIdU64");
         assertContainsMethod(nodesClass, pkg + ".Nodes$IdUnion", "getIdUnion", loader);
 
-        Object builderObj = builderClass.newInstance();
+        final Object builderObj = builderClass.newInstance();
 
         Method m = assertContainsMethod(builderClass, builderClass, "setIdBinary", b.getClass());
-        List<Range<Integer>> lengthConstraints = new ArrayList<>();
+        final List<Range<Integer>> lengthConstraints = new ArrayList<>();
         lengthConstraints.add(Range.closed(1, 10));
         Object arg = new byte[] {};
         String expectedMsg = String.format("Invalid length: %s, expected: %s.", arg, lengthConstraints);
         assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg);
 
         m = assertContainsMethod(builderClass, builderClass, "setIdDecimal64", BigDecimal.class);
-        List<Range<BigDecimal>> rangeConstraints = new ArrayList<>();
+        final List<Range<BigDecimal>> rangeConstraints = new ArrayList<>();
         rangeConstraints.add(Range.closed(new BigDecimal("1.5"), new BigDecimal("5.5")));
         arg = new BigDecimal("1.4");
         expectedMsg = String.format("Invalid range: %s, expected: %s.", arg, rangeConstraints);
@@ -467,41 +468,41 @@ public class CompilationTest extends BaseCompilationTest {
         generateTestSources("/compilation/context-reference", sourcesOutputDir);
 
         // Test if all sources are generated
-        File fooParent = new File(sourcesOutputDir, NS_FOO);
+        final File fooParent = new File(sourcesOutputDir, NS_FOO);
         assertFilesCount(fooParent, 3);
         assertTrue(new File(fooParent, "FooData.java").exists());
         assertTrue(new File(fooParent, "Nodes.java").exists());
         assertTrue(new File(fooParent, "NodesBuilder.java").exists());
 
-        File barParent = new File(sourcesOutputDir, NS_BAR);
+        final File barParent = new File(sourcesOutputDir, NS_BAR);
         assertFilesCount(barParent, 1);
         assertTrue(new File(barParent, "IdentityClass.java").exists());
 
         // Test if sources are compilable
         testCompilation(sourcesOutputDir, compiledOutputDir);
 
-        ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
-        Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader);
-        Class<?> identityClass = Class
+        final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
+        final Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader);
+        final Class<?> identityClass = Class
                 .forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader);
 
         // test identity
         try {
             identityClass.getConstructor();
-            Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
+            final Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
             assertEquals(baseIdentity, identityClass.getSuperclass());
-        } catch (NoSuchMethodException e) {
+        } catch (final NoSuchMethodException e) {
             throw new AssertionError("IdentityClass must have no-arg constructor");
         }
 
         // Test annotation
         try {
-            Method getId = nodesClass.getMethod("getId");
-            Annotation[] annotations = getId.getAnnotations();
+            final Method getId = nodesClass.getMethod("getId");
+            final Annotation[] annotations = getId.getAnnotations();
             assertEquals(1, annotations.length);
-            Annotation routingContext = annotations[0];
+            final Annotation routingContext = annotations[0];
             assertEquals(RoutingContext.class, routingContext.annotationType());
-        } catch (NoSuchMethodException e) {
+        } catch (final NoSuchMethodException e) {
             throw new AssertionError("Method getId() not found");
         }
 
@@ -575,10 +576,10 @@ public class CompilationTest extends BaseCompilationTest {
         // Test if sources are compilable
         testCompilation(sourcesOutputDir, compiledOutputDir);
 
-        ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
-        Class<?> outputActionClass = Class.forName(BASE_PKG
+        final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
+        final Class<?> outputActionClass = Class.forName(BASE_PKG
                 + ".urn.test.foo.rev140717.action.action.output.action._case.OutputAction", true, loader);
-        Class<?> actionClass = Class.forName(BASE_PKG + ".urn.test.foo.rev140717.Action", true, loader);
+        final Class<?> actionClass = Class.forName(BASE_PKG + ".urn.test.foo.rev140717.Action", true, loader);
 
         // Test generated 'container output-action'
         assertTrue(outputActionClass.isInterface());
@@ -621,14 +622,14 @@ public class CompilationTest extends BaseCompilationTest {
             assertEquals(java.lang.Class.class, method.getReturnType());
             returnType = method.getGenericReturnType();
             assertTrue(returnType instanceof ParameterizedType);
-            ParameterizedType pt = (ParameterizedType) returnType;
-            java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
+            final ParameterizedType pt = (ParameterizedType) returnType;
+            final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
             assertEquals(1, parameters.length);
-            java.lang.reflect.Type parameter = parameters[0];
+            final java.lang.reflect.Type parameter = parameters[0];
             assertTrue(parameter instanceof WildcardType);
-            WildcardType wildcardType = (WildcardType) parameter;
+            final WildcardType wildcardType = (WildcardType) parameter;
             assertEquals("? extends " + returnTypeStr, wildcardType.toString());
-        } catch (NoSuchMethodException e) {
+        } catch (final NoSuchMethodException e) {
             throw new AssertionError("Method '" + methodName + "' not found");
         }
     }
@@ -644,14 +645,14 @@ public class CompilationTest extends BaseCompilationTest {
             assertEquals(rawReturnType, method.getReturnType());
             returnType = method.getGenericReturnType();
             assertTrue(returnType instanceof ParameterizedType);
-            ParameterizedType pt = (ParameterizedType) returnType;
-            java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
+            final ParameterizedType pt = (ParameterizedType) returnType;
+            final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
             assertEquals(1, parameters.length);
-            java.lang.reflect.Type parameter = parameters[0];
+            final java.lang.reflect.Type parameter = parameters[0];
             assertTrue(parameter instanceof WildcardType);
-            WildcardType wildcardType = (WildcardType) parameter;
+            final WildcardType wildcardType = (WildcardType) parameter;
             assertEquals("?", wildcardType.toString());
-        } catch (NoSuchMethodException e) {
+        } catch (final NoSuchMethodException e) {
             throw new AssertionError("Method '" + methodName + "' not found");
         }
     }