From 7923410efa344e2eed9200ee72d52d9bd926783f Mon Sep 17 00:00:00 2001 From: Martin Ciglan Date: Tue, 2 May 2017 13:55:36 +0200 Subject: [PATCH] Code generator prototype - Binding specification v2 - fixes NPE & compilability issue for data schema node builders when node is a child of root Change-Id: Iaec542989cbeb9583f814986371b22cbb70f7858 Signed-off-by: Martin Ciglan (cherry picked from commit 141e3def6accb5c75feed87d98cfa29acfcd8d61) --- .../mdsal/binding/javav2/model/api/GeneratedType.java | 4 ++++ .../api/type/builder/GeneratedTypeBuilderBase.java | 10 +++++++++- .../binding/javav2/generator/impl/GenHelperUtil.java | 1 + .../generated/type/builder/AbstractGeneratedType.java | 10 +++++++++- .../type/builder/AbstractGeneratedTypeBuilder.java | 10 ++++++++++ .../generated/type/builder/EnumerationBuilderImpl.java | 5 +++++ .../java/api/generator/renderers/BuilderRenderer.java | 7 +++++-- .../java/api/generator/builderTemplate.scala.txt | 4 ++-- 8 files changed, 45 insertions(+), 6 deletions(-) diff --git a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedType.java b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedType.java index 7645ecc560..0d1d61e573 100644 --- a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedType.java +++ b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedType.java @@ -116,4 +116,8 @@ public interface GeneratedType extends Type, DocumentedType { */ List getProperties(); + /** + * Returns parent type for data schema node builder + */ + Type getParentTypeForBuilder(); } diff --git a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java index 592d2332a7..65b217b6f3 100644 --- a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java +++ b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java @@ -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> */ 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 getMethodDefinitions(); /** diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java index 1e45f2be39..e091d43a69 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java @@ -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, diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java index c8768a336b..752cac29ce 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java @@ -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 annotations; private final List 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 implementsTypes, final List enclosedGenTypeBuilders, final List enclosedGenTOBuilders, final List enumBuilders, final List constants, final List methodBuilders, - final List propertyBuilders) { + final List 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; diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java index e8efb6b73d..b2f3ce25d9 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java @@ -40,6 +40,7 @@ abstract class AbstractGeneratedTypeBuilder 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 getProperties() { return properties; diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java index eb59b79627..a034125ff4 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java @@ -332,5 +332,10 @@ public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuil public List getProperties() { return ImmutableList.of(); } + + @Override + public Type getParentTypeForBuilder() { + return null; + } } } diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java index 9e6afb3562..53a7b94899 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java +++ b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java @@ -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 getterMethods = new ArrayList<>(Collections2.transform(properties, this::getterMethod)); return builderTemplate.render(getType(), properties, importedNames, importedNamesForProperties, augmentField, - copyConstructorHelper, getterMethods) + copyConstructorHelper, getterMethods, parentTypeForBuilderName) .body(); } diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt b/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt index d659bc9b00..e7f212af5a 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt +++ b/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/builderTemplate.scala.txt @@ -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; } -- 2.36.6