Binding generator v2 - Unions - fix getValue() 01/59001/1
authorJie Han <han.jie@zte.com.cn>
Tue, 6 Jun 2017 12:05:33 +0000 (20:05 +0800)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Thu, 15 Jun 2017 07:51:41 +0000 (07:51 +0000)
- set value NOT ReadOnly
- fix type instance identifier package
Change-Id: I8cfa676111952b169d6d6f31ce902adcce5bf45b
Signed-off-by: Jie Han <han.jie@zte.com.cn>
(cherry picked from commit f2767f1ad0882a6f267832fa48b8dc129a71c779)

binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/UnionRenderer.java
binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/unionTemplate.scala.txt

index 3148c944bb344f1f2f3ff51340d32e3720bc3be8..5babe332eab9b19d84457d0e99ad57a89688be1e 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers;
 
 import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.BOOLEAN;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import java.beans.ConstructorProperties;
@@ -23,6 +24,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
 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.Type;
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 
 public class UnionRenderer extends ClassRenderer {
     public UnionRenderer(final GeneratedTransferObject type) {
@@ -43,6 +45,14 @@ public class UnionRenderer extends ClassRenderer {
             importedNames.put(finalProperty.getName(), importedName(finalProperty.getReturnType()));
         }
 
+        for (GeneratedProperty property : getProperties()) {
+            if("char[]".equals(property.getReturnType().getName())) {
+                importedNames.put("constructorProperties", importedName(ConstructorProperties.class));
+                importedNames.put("string", importedName(String.class));
+                importedNames.put(property.getName(), importedName(property.getReturnType()));
+            }
+        }
+
         final StringBuilder sb = new StringBuilder();
         if (!getProperties().isEmpty()) {
             for (GeneratedProperty property : getProperties()) {
@@ -86,11 +96,90 @@ public class UnionRenderer extends ClassRenderer {
             .append(" = source.")
             .append(name);
         if (!"value".equals(name) && importedName(generatedProperty.getReturnType()).contains("[]")) {
-            sb.append(" == null ? null : source._")
+            sb.append(" == null ? null : source.")
                 .append(name)
                 .append(".clone()");
         }
-        sb.append(';');
+        sb.append(";\n");
+        return sb.toString();
+    }
+
+    private String generateCharArrayFieldForTypedef(final String fieldName, GeneratedTransferObject typedefType) {
+        Preconditions.checkState(typedefType.isTypedef(),"Not a typedef type!");
+
+        final StringBuilder sb = new StringBuilder();
+        final List<GeneratedProperty> retTypeCastProperties = typedefType.getProperties();
+
+        if (retTypeCastProperties != null &&
+                !retTypeCastProperties.isEmpty() && retTypeCastProperties.size() == 1 &&
+                retTypeCastProperties.get(0).getName().equals("value")) {
+
+            final StringBuilder sb1 = new StringBuilder(fieldName);
+            sb1.append(".")
+                    .append(TextTemplateUtil.getterMethodName(retTypeCastProperties.get(0)))
+                    .append("()");
+
+            sb.append(generateCharArrayField(sb1.toString(), retTypeCastProperties.get(0)));
+            // generated bits typedef
+        } else if (retTypeCastProperties != null && !retTypeCastProperties.isEmpty() &&
+                typedefType.getBaseType() instanceof BitsTypeDefinition) {
+            sb.append("java.util.Arrays.toString(")
+                    .append(fieldName)
+                    .append(".getValue()).toCharArray();");
+
+            //generated typedef typedef
+        } else if ((retTypeCastProperties == null || retTypeCastProperties.isEmpty())) {
+            Preconditions.checkState(typedefType.getSuperType() != null );
+
+            sb.append(generateCharArrayFieldForTypedef(fieldName,
+                    (GeneratedTransferObject) typedefType.getSuperType()));
+        }
+
+        return sb.toString();
+    }
+
+    private String generateCharArrayField(final String fieldName, final GeneratedProperty generatedProperty) {
+        final StringBuilder sb = new StringBuilder();
+        final Type propertyReturnType = generatedProperty.getReturnType();
+
+        // generated type String
+        if ("java.lang.String".equals(propertyReturnType.getFullyQualifiedName())) {
+            sb.append(fieldName).append(".toCharArray();");
+            // generated type InstanceIdentifier
+        } else if ("org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier".equals(propertyReturnType
+                .getFullyQualifiedName())) {
+                    sb.append(fieldName)
+                    .append(".toString().toCharArray();");
+            //generated type binary, boolean, empty
+        } else if (BOOLEAN.equals(propertyReturnType)) {
+            sb.append(fieldName).append(".toString().toCharArray();");
+            //generated type byte[]
+        } else if ("byte[]".equals(propertyReturnType.getName())) {
+            sb.append("BaseEncoding.base64().encode(").append(fieldName)
+                    .append(").toCharArray();");
+            //generated type int*, uint, decimal64 or enumeration*
+        } else if (propertyReturnType.getFullyQualifiedName().startsWith("java.lang") ||
+                propertyReturnType instanceof Enumeration ||
+                propertyReturnType.getFullyQualifiedName().startsWith("java.math")) {
+            sb.append(fieldName).append(".toString().toCharArray();");
+
+        } else if (propertyReturnType instanceof GeneratedTransferObject) {
+            final GeneratedTransferObject propRetTypeCast = (GeneratedTransferObject) propertyReturnType;
+
+            // generated union type
+            if (propRetTypeCast.isUnionType()) {
+                sb.append(fieldName).append(".getValue();");
+
+                // generated  typedef type
+            } else if (propRetTypeCast.isTypedef()) {
+                sb.append(generateCharArrayFieldForTypedef(fieldName, propRetTypeCast));
+            }
+            // generated type
+        } else {
+            sb.append(fieldName)
+                    .append(".getValue().toString().toCharArray();");
+        }
+
         return sb.toString();
     }
 
@@ -100,6 +189,15 @@ public class UnionRenderer extends ClassRenderer {
             return super.getterMethod(field);
         }
 
+        final StringBuilder sb1 = new StringBuilder();
+        final String name = TextTemplateUtil.fieldName(field);
+        final String importedName = Preconditions.checkNotNull(importedName(field.getReturnType()));
+        sb1.append("public ")
+                .append(importedName)
+                .append(' ')
+                .append(TextTemplateUtil.getterMethodName(field))
+                .append("() {\n");
+
         Predicate<GeneratedProperty> predicate = input -> !"value".equals(input.getName());
         final List<GeneratedProperty> filtered = new ArrayList<>(Collections2.filter(this.getFinalProperties(),
             predicate));
@@ -114,61 +212,32 @@ public class UnionRenderer extends ClassRenderer {
                 .append(TextTemplateUtil.fieldName(property))
                 .append(" != null) {")
                 .append(TextTemplateUtil.fieldName(field))
-                .append(" = ");
-
-            // generated type String
-            if ("java.lang.String".equals(propertyReturnType.getFullyQualifiedName())) {
-                sb.append(TextTemplateUtil.fieldName(property)).append(".toCharArray();");
-            // generated type InstanceIdentifier
-            } else if ("org.opendaylight.mdsal.binding2.spec.base.InstanceIdentifier".equals(propertyReturnType
-                    .getFullyQualifiedName())) {
-                sb.append(TextTemplateUtil.fieldName(field))
-                    .append(" = ")
-                    .append(TextTemplateUtil.fieldName(property))
-                    .append(".toString().toCharArray();");
-            //generated type binary
-            } else if ("byte[]".equals(propertyReturnType.getName())) {
-                sb.append("new ")
-                    .append(importedName(String.class))
-                    .append('(')
-                    .append(TextTemplateUtil.fieldName(property))
-                    .append(").toCharArray();");
-            //generated type int*, uint, decimal64 or enumeration*
-            } else if (propertyReturnType.getFullyQualifiedName().startsWith("java.lang") ||
-                    propertyReturnType instanceof Enumeration ||
-                    propertyReturnType.getFullyQualifiedName().startsWith("java.math")) {
-                sb.append(TextTemplateUtil.fieldName(property)).append(".toString().toCharArray();");
-
-            } else if (propertyReturnType instanceof GeneratedTransferObject) {
-                final GeneratedTransferObject propRetTypeCast = (GeneratedTransferObject) propertyReturnType;
-                final List<GeneratedProperty> retTypeCastProperties = propRetTypeCast.getProperties();
-
-                // generated union type
-                if (propRetTypeCast.isUnionType()) {
-                    sb.append(TextTemplateUtil.fieldName(property)).append(".getValue();");
-
-                // generated boolean typedef
-                } else if (propRetTypeCast.isTypedef() && retTypeCastProperties != null &&
-                        !retTypeCastProperties.isEmpty() && retTypeCastProperties.size() == 1 &&
-                        retTypeCastProperties.get(0).getName().equals("value") &&
-                        BOOLEAN.equals(retTypeCastProperties.get(0).getReturnType())) {
-                    sb.append(TextTemplateUtil.fieldName(property)).append(".isValue().toString().toCharArray();");
-
-                //generated byte[] typedef
-                } else if (propRetTypeCast.isTypedef() && retTypeCastProperties != null &&
-                        !retTypeCastProperties.isEmpty() && retTypeCastProperties.size() == 1 &&
-                        retTypeCastProperties.get(0).getName().equals("value") &&
-                        "byte[]".equals(retTypeCastProperties.get(0).getReturnType().getName())) {
-                    sb.append("BaseEncoding.base64().encode(").append(TextTemplateUtil.fieldName(property))
-                        .append(".getValue()).toCharArray();");
-                }
-            } else {
-                sb.append(TextTemplateUtil.fieldName(property))
-                        .append(".getValue().toString().toCharArray();");
-            }
-            sb.append("}");
+                .append(" = ")
+                .append(generateCharArrayField(TextTemplateUtil.fieldName(property), property))
+                .append("}\n");
             strings.add(sb);
         }
-        return String.join(" else ", strings);
+
+        sb1.append(String.join(" else ", strings))
+                .append("\n");
+
+        sb1.append("return ")
+                .append(name);
+        if (importedName.contains("[]")) {
+            sb1.append(" == null ? null : ")
+                    .append(name)
+                    .append(".clone()");
+        }
+        sb1.append(";\n}\n");
+
+        return sb1.toString();
+    }
+
+    @Override
+    protected String generateInnerClassBody(GeneratedTransferObject innerClass) {
+        final UnionRenderer unionRenderer = new UnionRenderer((GeneratedTransferObject) innerClass);
+        final String body = unionRenderer.generateAsInnerClass();
+        this.putAllToImportMap(unionRenderer.getImportMap());
+        return body;
     }
 }
\ No newline at end of file
index a0e2d87da84d626fce4d8896c5862905c7d3dbc2..13291564846740e594258351585b28a413b56182 100644 (file)
@@ -19,55 +19,52 @@ parentProperties: List[GeneratedProperty], properties: List[GeneratedProperty],
         super(@{fieldName(property)});
     }
 }
+
 @for(property <- finalProperties) {
-    @if("char[]".equals(property.getReturnType.getName)) {
-    /**
-     * Constructor provided only for using in JMX. Don't use it for
-     * construction new object of this union type.
-     */
-    @@@{importedNames.get("constructorProperties")}("@{property.getName}")
+    @*TO DO parentProperties + #[property] as argument to method below see  unionTemplate 84 *@
     public @{baseType.getName}(@{importedNames.get(property.getName)} @{fieldName(property)}) {
-        @{importedNames.get("string")} defVal = new @{importedNames.get("string")}(@{fieldName(property)});
-        @{baseType.getName} defInst = @{typeBuilder}.getDefaultInstance(defVal);
+        super();
+        this.@{fieldName(property)} = @{fieldName(property)};
         @for(otherProperty <- finalProperties) {
-            this.@{fieldName(otherProperty)} =
-            @if("value".equals(otherProperty.getName)) {
-                @if(importedNames.get(otherProperty.getName).contains("[]")) {
-                    @{fieldName(otherProperty)} == null ? null : @{fieldName(otherProperty)}.clone();
-                } else {
-                    @{fieldName(otherProperty)};
-                }
-            } else {
-                defInst.@{fieldName(otherProperty)};
+            @if(property != otherProperty && !"value".equals(otherProperty.getName)) {
+                this.@{fieldName(otherProperty)} = null;
             }
         }
     }
-    } else {
-        @*TO DO parentProperties + #[property] as argument to method below see  unionTemplate 84 *@
-        public @{baseType.getName}() {
-            super(@{asArguments(parentProperties)});
-            this.@{fieldName(property)} = @{fieldName(property)};
+}
+
+@for(property <- properties) {
+    @if("char[]".equals(property.getReturnType.getName)) {
+        /**
+         * Constructor provided only for using in JMX. Don't use it for
+         * construction new object of this union type.
+         */
+        @@@{importedNames.get("constructorProperties")}("@{property.getName}")
+        public @{baseType.getName}(@{importedNames.get(property.getName)} @{fieldName(property)}) {
+            @{importedNames.get("string")} defVal = new @{importedNames.get("string")}(@{fieldName(property)});
+            @{baseType.getName} defInst = @{typeBuilder}.getDefaultInstance(defVal);
             @for(otherProperty <- finalProperties) {
-                @if(property != otherProperty && !"value".equals(otherProperty.getName)) {
-                    this.@{fieldName(otherProperty)} = null;
-                }
+                this.@{fieldName(otherProperty)} = defInst.@{fieldName(otherProperty)};
             }
+
+            this.@{fieldName(property)} = @{fieldName(property)} == null ? null : @{fieldName(property)}.clone();
         }
     }
 }
-@if(!properties.isEmpty) {
-    /**
    * Creates a copy from Source Object.
    *
    * @@param source Source object
    */
-    public @{baseType.getName}
-    (@{baseType.getName}
-     source) {
-    @if(!parentProperties.isEmpty()) {super(source);}
-    @{propertyList}
+
+/**
+ * Creates a copy from Source Object.
+ *
+ * @@param source Source object
+ */
+public @{baseType.getName}(@{baseType.getName} source) {
+    @if(!parentProperties.isEmpty()) {
+        super(source);
+    } else {
+        @{propertyList}
     }
 }
+
 @if(properties.isEmpty && !parentProperties.isEmpty) {
     /**
      * Creates a new instance from @{importedNames.get("superType")}