Code generator prototype - Binding specification v2 77/56377/2
authorMartin Ciglan <mciglan@cisco.com>
Tue, 2 May 2017 11:55:36 +0000 (13:55 +0200)
committerRobert Varga <nite@hq.sk>
Thu, 4 May 2017 11:54:31 +0000 (11:54 +0000)
- fixes NPE & compilability issue for data schema node
builders when node is a child of root

Change-Id: Iaec542989cbeb9583f814986371b22cbb70f7858
Signed-off-by: Martin Ciglan <mciglan@cisco.com>
binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedType.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/GenHelperUtil.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/EnumerationBuilderImpl.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/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt

index 7645ecc560144d6e78c0da0c15ed4ff2d3a2d944..0d1d61e5736d6a991e2f3b512ac9e0ccc162dfce 100644 (file)
@@ -116,4 +116,8 @@ public interface GeneratedType extends Type, DocumentedType {
      */
     List<GeneratedProperty> getProperties();
 
+    /**
+     * Returns parent type for data schema node builder
+     */
+    Type getParentTypeForBuilder();
 }
index 592d2332a77e03bb983ebe95081b3503f5848541..65b217b6f30aa66fe70d7aacba931d2dc0ab1bc7 100644 (file)
@@ -10,8 +10,8 @@ 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.model.api.Type;
 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;
 
 @Beta
@@ -132,6 +132,14 @@ public interface GeneratedTypeBuilderBase<T extends GeneratedTypeBuilderBase<T>>
      */
     EnumBuilder addEnumeration(String name);
 
+    /**
+     * Sets parent type for data schema node node builder
+     *
+     * @param type generated parent type
+     * @return generated type
+     */
+    Type setParentTypeForBuilder(Type type);
+
     List<MethodSignatureBuilder> getMethodDefinitions();
 
     /**
index 1e45f2be39bdb20d6d7a61378572ee0f4744eebc..e091d43a69fedeeb1662c57a91a3359c8195c355 100644 (file)
@@ -786,6 +786,7 @@ final class GenHelperUtil {
         genType.setModuleName(module.getName());
         genType.setReference(node.getReference());
         genType.setSchemaPath((List) node.getPath().getPathFromRoot());
+        genType.setParentTypeForBuilder(childOf);
         if (node instanceof DataNodeContainer) {
             genCtx.get(module).addChildNodeType(node, genType);
             genCtx = groupingsToGenTypes(module, ((DataNodeContainer) node).getGroupings(), genCtx, schemaContext,
index c8768a336be56c74cca80aedcdb69272567ccdf3..752cac29ce553ff5b81cb1bf3fdc3814449d8672 100644 (file)
@@ -33,6 +33,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignat
 abstract class AbstractGeneratedType extends AbstractBaseType implements GeneratedType {
 
     private final Type parent;
+    private final Type parentTypeForBuilder;
     private final String comment;
     private final List<AnnotationType> annotations;
     private final List<Type> implementsTypes;
@@ -46,6 +47,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
     public AbstractGeneratedType(final AbstractGeneratedTypeBuilder<?> builder) {
         super(builder.getPackageName(), builder.getName(), true);
         this.parent = builder.getParent();
+        this.parentTypeForBuilder = builder.getParentTypeForBuilder();
         this.comment = builder.getComment();
         this.annotations = toUnmodifiableAnnotations(builder.getAnnotations());
         this.implementsTypes = makeUnmodifiable(builder.getImplementsTypes());
@@ -63,9 +65,10 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
                                  final List<Type> implementsTypes, final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
                                  final List<GeneratedTOBuilder> enclosedGenTOBuilders, final List<EnumBuilder> enumBuilders,
                                  final List<Constant> constants, final List<MethodSignatureBuilder> methodBuilders,
-                                 final List<GeneratedPropertyBuilder> propertyBuilders) {
+                                 final List<GeneratedPropertyBuilder> propertyBuilders, final Type parentTypeForBuilder) {
         super(packageName, name);
         this.parent = parent;
+        this.parentTypeForBuilder = parentTypeForBuilder;
         this.comment = comment;
         this.annotations = toUnmodifiableAnnotations(annotationBuilders);
         this.implementsTypes = makeUnmodifiable(implementsTypes);
@@ -127,6 +130,11 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
         return this.parent;
     }
 
+    @Override
+    public Type getParentTypeForBuilder() {
+        return this.parentTypeForBuilder;
+    }
+
     @Override
     public String getComment() {
         return this.comment;
index e8efb6b73d1c715fb583e01beccac239be62091e..b2f3ce25d99928d07e1390e7758248cbb8f1961b 100644 (file)
@@ -40,6 +40,7 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     private List<GeneratedPropertyBuilder> properties = ImmutableList.of();
     private String comment = "";
     private boolean isAbstract;
+    private Type parentTypeForBuilder;
 
     protected AbstractGeneratedTypeBuilder(final String packageName, final String name) {
         super(packageName, name);
@@ -147,6 +148,11 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return constant;
     }
 
+    @Override
+    public Type setParentTypeForBuilder(Type type) {
+        return this.parentTypeForBuilder = type;
+    }
+
     public boolean containsConstant(final String name) {
         Preconditions.checkArgument(name != null, "Parameter name can't be null");
         for (Constant constant : constants) {
@@ -239,6 +245,10 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return null;
     }
 
+    public Type getParentTypeForBuilder() {
+        return parentTypeForBuilder;
+    }
+
     @Override
     public List<GeneratedPropertyBuilder> getProperties() {
         return properties;
index bc14f7853f034d0c67a9a6723c4ec44d718a720c..a75fb64d5002c787d0b0951b8c6e20ad6b2bbbe6 100644 (file)
@@ -332,5 +332,10 @@ public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuil
         public List<GeneratedProperty> getProperties() {
             return ImmutableList.of();
         }
+
+        @Override
+        public Type getParentTypeForBuilder() {
+            return null;
+        }
     }
 }
index 9e6afb35626469d2ac34214c82cc59fed175d5c4..53a7b94899aa1523160519d2b88b989dc1e5318e 100644 (file)
@@ -240,6 +240,7 @@ public class BuilderRenderer extends BaseRenderer {
 
     @Override
     protected String body() {
+        String parentTypeForBuilderName;
         importedNames.put("genType", importedName(getType()));
         importedNames.put("objects", importedName(Objects.class));
         importedNames.put("object", importedName(Object.class));
@@ -250,8 +251,10 @@ public class BuilderRenderer extends BaseRenderer {
         importedNames.put("item", importedName(Item.class));
         if (getType().getParentType() != null) {
             importedNames.put("parent", importedName(getType().getParentType()));
+            parentTypeForBuilderName = getType().getParentType().getName();
         } else {
-            //TODO implement - get module as type
+            importedNames.put("parentTypeForBuilder", importedName(getType().getParentTypeForBuilder()));
+            parentTypeForBuilderName = getType().getParentTypeForBuilder().getName();
         }
         importedNames.put("augmentation", importedName(Augmentation.class));
         importedNames.put("classInstMap", importedName(ClassToInstanceMap.class));
@@ -261,7 +264,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)
+                copyConstructorHelper, getterMethods, parentTypeForBuilderName)
                 .body();
     }
 
index d659bc9b00d163c431774053111dd75023cd3280..e7f212af5a03c1cab43f160a9cba01e4e2859d38 100644 (file)
@@ -29,7 +29,7 @@
 
 @(genType: GeneratedType, properties: Set[GeneratedProperty], importedNames: Map[String, String],
 ImportedNamesWithProperties: Map[GeneratedProperty, String], augmentField: GeneratedProperty, copyConstructorHelper: String,
-getterMethods: List[String])
+getterMethods: List[String], parentTypeForBuilderName: String)
 @if(genType != null) {
 @{wrapToDocumentation(formatDataForJavaDocBuilder(importedNames.get("genType")))}
 public class @{genType.getName}Builder implements @{getSimpleNameForBuilder} <@{importedNames.get("genType")}> {
@@ -401,7 +401,7 @@ public class @{genType.getName}Builder implements @{getSimpleNameForBuilder} <@{
 
 @generateImplementedMethods() = {
         @@Override
-        public @{importedNames.get("item")}<@{genType.getParentType.getName}> treeIdentifier() {
+        public @{importedNames.get("item")}<@{parentTypeForBuilderName}> treeIdentifier() {
             //TODO implement
             return null;
         }