Binding generator v2 - Unions - Enclosing type fix 99/58999/1
authorJie Han <han.jie@zte.com.cn>
Thu, 8 Jun 2017 12:31:18 +0000 (20:31 +0800)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Thu, 15 Jun 2017 06:50:21 +0000 (06:50 +0000)
- fix enclosing type for recursive unoins
- fix package name for reursive  inner class
Change-Id: Ie1bd0df3afc1d600d94ff73b0c97aa349c242c78
Signed-off-by: Jie Han <han.jie@zte.com.cn>
(cherry picked from commit 30d64aed14584d69a4b8f9f09b29b4fc4c7f82e3)

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/yang/types/TypeProviderImpl.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/JavaIdentifierNormalizer.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/GeneratedTOBuilderImpl.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/ClassRenderer.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/InterfaceRenderer.java

index a0ee17e183fdc426610109ad8b1aac29922d8333..dbabe6a1fb3547740598bae50e50d3bf076b8d40 100644 (file)
@@ -379,38 +379,20 @@ final class AuxiliaryGenUtils {
             typeBuilder, final DataSchemaNode leaf, final Module parentModule, final TypeProvider typeProvider,
             final SchemaContext schemaContext) {
         final String classNameFromLeaf = leaf.getQName().getLocalName();
-        final List<GeneratedTOBuilder> genTOBuilders = new ArrayList<>();
+        GeneratedTOBuilder genTOBuilder = null;
         final String packageName = typeBuilder.getFullyQualifiedName();
         if (typeDef instanceof UnionTypeDefinition) {
-            final List<GeneratedTOBuilder> types = ((TypeProviderImpl) typeProvider)
-                    .provideGeneratedTOBuildersForUnionTypeDef(packageName, ((UnionTypeDefinition) typeDef),
-                            classNameFromLeaf, leaf, schemaContext, ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap());
-            genTOBuilders.addAll(types);
-
-            GeneratedTOBuilder resultTOBuilder;
-            if (types.isEmpty()) {
-                throw new IllegalStateException("No GeneratedTOBuilder objects generated from union " + typeDef);
-            }
-            resultTOBuilder = types.remove(0);
-            for (final GeneratedTOBuilder genTOBuilder : types) {
-                resultTOBuilder.addEnclosingTransferObject(genTOBuilder);
-            }
-
-            final GeneratedPropertyBuilder genPropBuilder = resultTOBuilder.addProperty("value");
-            genPropBuilder.setReturnType(Types.CHAR_ARRAY);
-            resultTOBuilder.addEqualsIdentity(genPropBuilder);
-            resultTOBuilder.addHashIdentity(genPropBuilder);
-            resultTOBuilder.addToStringProperty(genPropBuilder);
-
+            genTOBuilder = ((TypeProviderImpl) typeProvider)
+                    .provideGeneratedTOBuilderForUnionTypeDef(packageName, ((UnionTypeDefinition) typeDef),
+                            classNameFromLeaf, leaf, schemaContext,
+                            ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap());
         } else if (typeDef instanceof BitsTypeDefinition) {
-            genTOBuilders.add((((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition(
-                    packageName, typeDef, classNameFromLeaf, parentModule.getName()));
+            genTOBuilder = (((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition(
+                    packageName, typeDef, classNameFromLeaf, parentModule.getName());
         }
-        if (!genTOBuilders.isEmpty()) {
-            for (final GeneratedTOBuilder genTOBuilder : genTOBuilders) {
-                typeBuilder.addEnclosingTransferObject(genTOBuilder);
-            }
-            return genTOBuilders.get(0);
+        if (genTOBuilder != null) {
+            typeBuilder.addEnclosingTransferObject(genTOBuilder);
+            return genTOBuilder;
         }
         return null;
 
index fc7341b87d39bfecada5493a6afcd23135e4ded4..7f2f52de0c287baebfb1f886b8ae0fc9be8c198a 100644 (file)
@@ -303,7 +303,7 @@ public final class TypeProviderImpl implements TypeProvider {
         if (typeDef instanceof BitsTypeDefinition) {
             final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef;
 
-            final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName);
+            final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false);
             final String typedefDescription = encodeAngleBrackets(typeDef.getDescription());
 
             genTOBuilder.setDescription(typedefDescription);
@@ -365,7 +365,7 @@ public final class TypeProviderImpl implements TypeProvider {
 
         final GeneratedTOBuilderImpl unionGenTOBuilder;
         if (typeDefName != null && !typeDefName.isEmpty()) {
-            unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName);
+            unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false);
             final String typedefDescription = encodeAngleBrackets(typedef.getDescription());
             unionGenTOBuilder.setDescription(typedefDescription);
             unionGenTOBuilder.setReference(typedef.getReference());
@@ -384,8 +384,8 @@ public final class TypeProviderImpl implements TypeProvider {
                 resolveExtendedSubtypeAsUnion(unionGenTOBuilder, unionType, regularExpressions,
                         parentNode, schemaContext, genTypeDefsContextMap);
             } else if (unionType instanceof UnionTypeDefinition) {
-                generatedTOBuilders.addAll(resolveUnionSubtypeAsUnion(unionGenTOBuilder, (UnionTypeDefinition) unionType,
-                        basePackageName, parentNode, schemaContext, genTypeDefsContextMap));
+                generatedTOBuilders.add(resolveUnionSubtypeAsUnion(unionGenTOBuilder, (UnionTypeDefinition) unionType,
+                        unionGenTOBuilder.getFullyQualifiedName(), parentNode, schemaContext, genTypeDefsContextMap));
             } else if (unionType instanceof EnumTypeDefinition) {
                 final Enumeration enumeration = addInnerEnumerationToTypeBuilder((EnumTypeDefinition) unionType,
                         unionTypeName, unionGenTOBuilder);
@@ -451,7 +451,7 @@ public final class TypeProviderImpl implements TypeProvider {
         }
 
         Type returnType = javaTypeForExtendedType(typeDefinition, schemaContext, genTypeDefsContextMap);
-        if (r != null && returnType instanceof GeneratedTransferObject) {
+        if (r != null && !r.isEmpty() && returnType instanceof GeneratedTransferObject) {
             final GeneratedTransferObject gto = (GeneratedTransferObject) returnType;
             final Module module = findParentModule(schemaContext, parentNode);
             final String basePackageName = BindingMapping.getRootPackageName(module);
@@ -506,7 +506,7 @@ public final class TypeProviderImpl implements TypeProvider {
                     returnType = genTOBuilder.toInstance();
                     // union builder
                     final GeneratedTOBuilder unionBuilder = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(),
-                            genTOBuilder.getName() + "Builder");
+                            genTOBuilder.getName() + "Builder", true, true);
                     unionBuilder.setIsUnionBuilder(true);
                     final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance");
                     method.setReturnType(returnType);
@@ -887,22 +887,22 @@ public final class TypeProviderImpl implements TypeProvider {
      *         bigger one due to recursive call of
      *         <code>provideGeneratedTOBuildersForUnionTypeDef</code> method.
      */
-    private List<GeneratedTOBuilder> resolveUnionSubtypeAsUnion(final GeneratedTOBuilder
+    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) {
 
         final String newTOBuilderName = provideAvailableNameForGenTOBuilder(parentUnionGenTOBuilder.getName());
-        final List<GeneratedTOBuilder> subUnionGenTOBUilders = provideGeneratedTOBuildersForUnionTypeDef(
+        final GeneratedTOBuilder subUnionGenTOBUilder = provideGeneratedTOBuilderForUnionTypeDef(
                 basePackageName, unionSubtype, newTOBuilderName, parentNode, schemaContext, genTypeDefsContextMap);
 
         final GeneratedPropertyBuilder propertyBuilder;
         propertyBuilder = parentUnionGenTOBuilder
                 .addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(newTOBuilderName, JavaIdentifier.METHOD));
-        propertyBuilder.setReturnType(subUnionGenTOBUilders.get(0));
+        propertyBuilder.setReturnType(subUnionGenTOBUilder);
         parentUnionGenTOBuilder.addEqualsIdentity(propertyBuilder);
         parentUnionGenTOBuilder.addToStringProperty(propertyBuilder);
 
-        return subUnionGenTOBUilders;
+        return subUnionGenTOBUilder;
     }
 
     /**
@@ -919,7 +919,7 @@ public final class TypeProviderImpl implements TypeProvider {
      * @return generated TO builder with the list of enclosed generated TO
      *         builders
      */
-    private GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName,
+    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) {
 
@@ -932,7 +932,13 @@ public final class TypeProviderImpl implements TypeProvider {
             resultTOBuilder.addEnclosingTransferObject(genTOBuilder);
         }
 
-        resultTOBuilder.addProperty("value").setReturnType(Types.CHAR_ARRAY);
+        final GeneratedPropertyBuilder genPropBuilder;
+
+        genPropBuilder = resultTOBuilder.addProperty("value").setReturnType(Types.CHAR_ARRAY).setReadOnly(false);
+        resultTOBuilder.addEqualsIdentity(genPropBuilder);
+        resultTOBuilder.addHashIdentity(genPropBuilder);
+        resultTOBuilder.addToStringProperty(genPropBuilder);
+
         return resultTOBuilder;
     }
 
index 4615d2791e05a9795f7e999946a1aa3b639b6211..c57565bd53024c34f47187789738f26f7c20cddf 100644 (file)
@@ -70,6 +70,24 @@ public abstract class AbstractBaseType implements Type {
         }
     }
 
+
+    protected AbstractBaseType(final String pkName, final String name, final boolean isPkNameNormalized,
+                               final boolean isTypeNormalized) {
+        Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!");
+        Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!");
+        if (isPkNameNormalized) {
+            this.packageName = pkName;
+        } else {
+            this.packageName = JavaIdentifierNormalizer.normalizeFullPackageName(pkName);
+        }
+
+        if (isTypeNormalized) {
+            this.name = name;
+        } else {
+            this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name);
+        }
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(this.name, this.packageName);
index ff53cf4c2ec2eed67db4293520ea13c31c505801..a25dfe27a7b7619a243ed7e3d88fd26567df537c 100644 (file)
@@ -341,9 +341,14 @@ public final class JavaIdentifierNormalizer {
                 // to be normalizing according to original package of parent
                 // class
                 for (int i = 0; i < packageNameParts.length - 1; i++) {
-                    sb.append(packageNameParts[i]);
-                    if (i != (packageNameParts.length - 2)) {
-                        sb.append('.');
+                    if (!Character.isUpperCase(packageNameParts[i].charAt(FIRST_CHAR))) {
+                        sb.append(packageNameParts[i]);
+                        if (i != (packageNameParts.length - 2) &&
+                                !Character.isUpperCase(packageNameParts[i+1].charAt(FIRST_CHAR))) {
+                            sb.append('.');
+                        }
+                    } else {
+                        break;
                     }
                 }
                 suppInnerClassPackageName = sb.toString();
index 64b207f1f04ec232611c5626bbda9af724ba2c91..97a61710bd1139c7bf1fe2e57b07ce4195ae8c5d 100644 (file)
@@ -50,6 +50,12 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         super(packageName, name, true);
     }
 
+    protected AbstractGeneratedTypeBuilder(final String packageName, final String name,
+                                           final boolean isPkNameNormalized,
+                                           final boolean isTypeNormalized) {
+        super(packageName, name, isPkNameNormalized, isTypeNormalized);
+    }
+
     protected String getComment() {
         return comment;
     }
@@ -242,7 +248,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         }
 
         AbstractGeneratedTypeBuilder<?> other = (AbstractGeneratedTypeBuilder<?>) obj;
-        return Objects.equals(this, other);
+        return Objects.equals(getFullyQualifiedName(), other.getFullyQualifiedName());
     }
 
     public Type getParent() {
index 7d9c2f3e4041ff9130d3fd7c3900b64625f29604..e04cc400f55f08b1abde3d4ca0f5136a1de6f693 100644 (file)
@@ -53,6 +53,13 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
         super(packageName, name, true);
     }
 
+    public GeneratedTOBuilderImpl(final String packageName, final String name,
+                                  final boolean isPkNameNormalized,
+                                  final boolean isTypeNormalized) {
+        super(packageName, name, isPkNameNormalized, isTypeNormalized);
+        setAbstract(false);
+    }
+
     @Override
     public GeneratedTOBuilder setExtendsType(GeneratedTransferObject genTransObj) {
         Preconditions.checkArgument(genTransObj != null, "Generated Transfer Object cannot be null!");
index f28a9b04b249b862d91f96a87390aa2a2507ffee..2202070676d4eb3ceb944468a09dbe3314569249 100644 (file)
@@ -126,6 +126,13 @@ public class ClassRenderer extends BaseRenderer {
         return generateBody(false);
     }
 
+    protected String generateInnerClassBody(final GeneratedTransferObject innerClass) {
+        final ClassRenderer classRenderer = new ClassRenderer(innerClass);
+        final String body = classRenderer.generateAsInnerClass();
+        this.putAllToImportMap(classRenderer.getImportMap());
+        return body;
+    }
+
     protected String generateBody(final boolean isInnerClass) {
         importedNames.put("type", importedName(getType()));
         importedNames.put("arrays", importedName(Arrays.class));
@@ -153,7 +160,7 @@ public class ClassRenderer extends BaseRenderer {
         if (!enclosedGeneratedTypes.isEmpty()) {
             for (GeneratedType innerClass : enclosedGeneratedTypes) {
                 if (innerClass instanceof GeneratedTransferObject) {
-                    classTemplateBuilder.add(new ClassRenderer((GeneratedTransferObject) innerClass).generateAsInnerClass());
+                    classTemplateBuilder.add(generateInnerClassBody((GeneratedTransferObject)innerClass));
                 }
             }
         }
index b911d69b249f7e2b2472c13c7d1bc12b449aa7c3..52aa737521144ebe760250afba3fc208f39743bf 100644 (file)
@@ -82,7 +82,7 @@ public class InterfaceRenderer extends BaseRenderer {
             if (innerClass instanceof GeneratedTransferObject) {
                 if (((GeneratedTransferObject) innerClass).isUnionType()) {
                     final UnionRenderer unionRenderer = new UnionRenderer((GeneratedTransferObject) innerClass);
-                    innerClasses.add(unionRenderer.body());
+                    innerClasses.add(unionRenderer.generateAsInnerClass());
                     this.putAllToImportMap(unionRenderer.getImportMap());
                 } else {
                     final ClassRenderer classRenderer = new ClassRenderer((GeneratedTransferObject) innerClass);