Binding generator v2 - uses statement - support choice
[mdsal.git] / binding2 / mdsal-binding2-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / javav2 / java / api / generator / renderers / BuilderRenderer.java
index 8fae7f7fa7dfef24d458a229384710a10253d197..9decef13106f62e22979bf98335a78bbfb19425c 100644 (file)
@@ -19,6 +19,7 @@ import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableSortedSet;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -29,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
 import org.opendaylight.mdsal.binding.javav2.generator.util.ReferencedTypeImpl;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
@@ -38,6 +40,7 @@ import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.Alphabetica
 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.GeneratedType;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder;
 import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
 import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
@@ -72,10 +75,28 @@ public class BuilderRenderer extends BaseRenderer {
      */
     private GeneratedProperty augmentField;
 
+    boolean instantiable = false;
+
     public BuilderRenderer(final GeneratedType type) {
         super(type);
         this.properties = propertiesFromMethods(createMethods());
         putToImportMap(Builder.class.getSimpleName(), Builder.class.getPackage().getName());
+        putToImportMap(type.getName(), type.getPackageName());
+    }
+
+    @Override
+    protected String packageDefinition() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("package ")
+                .append(((GeneratedTypeForBuilder)getType()).getPackageNameForBuilder())
+                .append(";\n\n");
+        return sb.toString();
+    }
+
+    @Override
+    protected boolean hasSamePackage(final String importedTypePackageName) {
+        return ((GeneratedTypeForBuilder)getType()).getPackageNameForBuilder()
+                .equals(importedTypePackageName);
     }
 
     /**
@@ -154,7 +175,9 @@ public class BuilderRenderer extends BaseRenderer {
             for (Type implementedIfc : implementedIfcs) {
                 if ((implementedIfc instanceof GeneratedType && !(implementedIfc instanceof GeneratedTransferObject))) {
                     final GeneratedType ifc = (GeneratedType) implementedIfc;
-                    methods.addAll(ifc.getMethodDefinitions());
+                    if (implementedIfc instanceof GeneratedTypeForBuilder) {
+                        methods.addAll(ifc.getMethodDefinitions());
+                    }
                     collectImplementedMethods(methods, ifc.getImplements());
                 } else if (Augmentable.class.getName().equals(implementedIfc.getFullyQualifiedName())) {
                     for (Method method : Augmentable.class.getMethods()) {
@@ -178,6 +201,9 @@ public class BuilderRenderer extends BaseRenderer {
                             importedNames.put("augmentFieldReturnType", importedName(augmentField.getReturnType()));
                         }
                     }
+                } else if (Instantiable.class.getName().equals(implementedIfc.getFullyQualifiedName())) {
+                    importedNames.put("class", importedName(Class.class));
+                    instantiable = true;
                 }
             }
         }
@@ -245,19 +271,26 @@ public class BuilderRenderer extends BaseRenderer {
         importedNames.put("objects", importedName(Objects.class));
         importedNames.put("object", importedName(Object.class));
         importedNames.put("string", importedName(String.class));
+        importedNames.put("arrays", importedName(Arrays.class));
         importedNames.put("stringBuilder", importedName(StringBuilder.class));
         importedNames.put("treeNode", importedName(TreeNode.class));
         importedNames.put("instantiable", importedName(Instantiable.class));
         importedNames.put("item", importedName(Item.class));
         if (getType().getParentType() != null) {
             importedNames.put("parent", importedName(getType().getParentType()));
-            parentTypeForBuilderName = getType().getParentType().getName();
+            parentTypeForBuilderName = getType().getParentType().getFullyQualifiedName();
         } else if (getType().getParentTypeForBuilder() != null) {
             importedNames.put("parentTypeForBuilder", importedName(getType().getParentTypeForBuilder()));
-            parentTypeForBuilderName = getType().getParentTypeForBuilder().getName();
+            parentTypeForBuilderName = getType().getParentTypeForBuilder().getFullyQualifiedName();
         } else {
             parentTypeForBuilderName = null;
         }
+
+        boolean childTreeNode = false;
+        if (getType().getImplements().contains(BindingTypes.TREE_CHILD_NODE)) {
+            childTreeNode = true;
+        }
+
         importedNames.put("augmentation", importedName(Augmentation.class));
         importedNames.put("classInstMap", importedName(ClassToInstanceMap.class));
 
@@ -266,7 +299,7 @@ public class BuilderRenderer extends BaseRenderer {
         List<String> getterMethods = new ArrayList<>(Collections2.transform(properties, this::getterMethod));
 
         return builderTemplate.render(getType(), properties, importedNames, importedNamesForProperties, augmentField,
-                copyConstructorHelper, getterMethods, parentTypeForBuilderName)
+            copyConstructorHelper, getterMethods, parentTypeForBuilderName, childTreeNode, instantiable)
                 .body();
     }