Binding generator v2 - namespace fix #3 71/59571/1
authorJie Han <han.jie@zte.com.cn>
Thu, 22 Jun 2017 09:01:45 +0000 (17:01 +0800)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Tue, 27 Jun 2017 13:45:18 +0000 (13:45 +0000)
- support generate type from uses grouping
- fix imports for builders in dto
- fiex merge conflicts

Change-Id: I211306a14243d5625a1af914329bca525ba54d7f
Signed-off-by: Jie Han <han.jie@zte.com.cn>
(cherry picked from commit dd0a3c05d76d6576c66099eaefbbb9dc2dc90722)

binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java
binding2/mdsal-binding2-generator-impl/src/test/resources/namespace/class-type-test.yang [new file with mode: 0644]
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/BindingGeneratorUtil.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTypeBuilderImpl.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BaseRenderer.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 d705c27c38bc69c8eb7973b0c802954932ed0708..9a4a8ac2ea566bae1ac4375dbb1c7492e08cbccd 100644 (file)
@@ -59,6 +59,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
 import org.opendaylight.mdsal.binding.javav2.spec.base.BaseIdentity;
 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
@@ -432,7 +433,8 @@ final class GenHelperUtil {
             }
         }
 
-        if (namespaceType.equals(BindingNamespaceType.Data)) {
+        //TODO: it's not correct for some special cases
+        if (namespaceType.equals(BindingNamespaceType.Data) && !(schemaNode instanceof GroupingDefinition)) {
             it.addImplementsType(BindingTypes.augmentable(it));
         }
 
@@ -630,7 +632,14 @@ final class GenHelperUtil {
         final GeneratedTypeBuilder genType = processDataSchemaNode(module, basePackageName, childOf, node,
                 schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType);
         if (genType != null) {
-            constructGetter(parent, node.getQName().getLocalName(), node.getDescription(), genType, node.getStatus());
+            StringBuilder getterName = new StringBuilder(node.getQName().getLocalName());
+            if (!namespaceType.equals(BindingNamespaceType.Data)) {
+                getterName.append('_').append(BindingNamespaceType.Data);
+            }
+            final MethodSignatureBuilder getter = constructGetter(parent, getterName.toString(), node.getDescription(), genType, node.getStatus());
+            if (!namespaceType.equals(BindingNamespaceType.Data)) {
+                getter.setAccessModifier(AccessModifier.DEFAULT);
+            }
             resolveDataSchemaNodes(module, basePackageName, genType, genType, node.getChildNodes(), genCtx,
                     schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
         }
@@ -703,7 +712,7 @@ final class GenHelperUtil {
     private static Type resolveLeafSchemaNodeAsMethod(final String nodeName, final SchemaContext schemaContext,
             final GeneratedTypeBuilder typeBuilder, final Map<Module, ModuleContext> genCtx, final LeafSchemaNode leaf,
             final Module module, final TypeProvider typeProvider) {
-        if (leaf == null || typeBuilder == null || leaf.isAddedByUses()) {
+        if (leaf == null || typeBuilder == null) {
             return null;
         }
 
@@ -1083,7 +1092,7 @@ final class GenHelperUtil {
         final boolean verboseClassComments, Map<Module, ModuleContext> genCtx, final Map<String, Map<String,
         GeneratedTypeBuilder>> genTypeBuilders, final TypeProvider typeProvider, final BindingNamespaceType namespaceType) {
 
-        if (node.isAugmenting() || node.isAddedByUses()) {
+        if (node.isAugmenting()) {
             return null;
         }
         final String packageName = packageNameForGeneratedType(basePackageName, node.getPath(), namespaceType);
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/namespace/class-type-test.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/namespace/class-type-test.yang
new file mode 100644 (file)
index 0000000..be38c8a
--- /dev/null
@@ -0,0 +1,25 @@
+module class-type-test {\r
+\r
+    description "ODL BGPCEP snippet challenge";\r
+\r
+    prefix "class";\r
+    namespace "org.class.type.test";\r
+\r
+    container my-cont {         //data.myCont, dto.myContBuilder\r
+        uses classtype-object;   //data.my_cont.ClassType, dto.my_cont.ClassTypeBuilder\r
+    }\r
+\r
+    typedef class-type {        //type.classType\r
+        type uint8 {\r
+            range 1..7;\r
+        }\r
+    }\r
+\r
+    grouping classtype-object { //grp.ClassTypeObjectGrouping\r
+        container class-type {   //grp.classtype_object.ClassTypeData\r
+        leaf class-type {     //public type.ClassType getClassType()\r
+                type class-type;\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
index 23493939722b4e36de7c065e72df58b4c0e6bde7..58094163c5345b692f8d9406bde511bd1d3e9b5e 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.javav2.generator.util;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.CharMatcher;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Interner;
@@ -36,6 +37,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.TypeMemberBu
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
@@ -399,6 +401,39 @@ public final class BindingGeneratorUtil {
         return generateNormalizedPackageName(parentAugmentPackageName, last);
     }
 
+    public static String packageNameForSubGeneratedType(final String parentPackageName,
+        final SchemaNode node) {
+        final QName last = node.getPath().getLastComponent();
+
+        return generateNormalizedPackageName(parentPackageName, last);
+    }
+
+    public static String replacePackageTopNamespace(final String basePackageName,
+            final String toReplacePackageName,
+            final BindingNamespaceType toReplaceNameSpace,
+            final BindingNamespaceType replacedNameSpace) {
+        Preconditions.checkArgument(basePackageName != null);
+        String normalizeBasePackageName = JavaIdentifierNormalizer.normalizeFullPackageName(basePackageName);
+
+        if (!normalizeBasePackageName.equals(toReplacePackageName)) {
+            final String topPackageName = new StringBuilder(normalizeBasePackageName)
+                    .append('.').append(toReplaceNameSpace.getPackagePrefix()).toString();
+
+            Preconditions.checkState(toReplacePackageName.equals(topPackageName)
+                            || toReplacePackageName.contains(topPackageName),
+                    "Package name to replace does not belong to the given namespace to replace!");
+
+            return new StringBuilder(normalizeBasePackageName)
+                    .append('.')
+                    .append(replacedNameSpace.getPackagePrefix())
+                    .append(toReplacePackageName.substring(topPackageName.length()))
+                    .toString();
+        } else {
+            return new StringBuilder(normalizeBasePackageName)
+                    .append('.').append(replacedNameSpace.getPackagePrefix()).toString();
+        }
+    }
+
     private static final ThreadLocal<MessageDigest> SHA1_MD = new ThreadLocal<MessageDigest>() {
         @Override
         protected MessageDigest initialValue() {
index 1ed403f5198c804c6ebaef606a3e5adfca37c9ba..c8b4e5b7209a00db5cfa820b7e43916f5b55d39d 100644 (file)
@@ -12,6 +12,7 @@ import com.google.common.annotations.Beta;
 import java.util.List;
 import java.util.Optional;
 import com.google.common.base.Preconditions;
+import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder;
@@ -150,26 +151,8 @@ public final class GeneratedTypeBuilderImpl extends AbstractGeneratedTypeBuilder
         }
 
         private String generatePackageNameForBuilder() {
-            Preconditions.checkArgument(this.basePackageName != null);
-            String normalizeBasePackageName = JavaIdentifierNormalizer.normalizeFullPackageName(this.basePackageName);
-
-            if (!normalizeBasePackageName.equals(this.getPackageName())) {
-                final String baseName = new StringBuilder(normalizeBasePackageName)
-                        .append(".").append(BindingNamespaceType.Data.getPackagePrefix()).toString();
-
-                Preconditions.checkState(this.getPackageName().equals(baseName)
-                                || this.getPackageName().contains(baseName),
-                        "Package name does not contain base name!");
-
-                return new StringBuilder(normalizeBasePackageName)
-                        .append(".")
-                        .append(BindingNamespaceType.Builder.getPackagePrefix())
-                        .append(this.getPackageName().substring(baseName.length()))
-                        .toString();
-            } else {
-                return new StringBuilder(normalizeBasePackageName)
-                        .append(".").append(BindingNamespaceType.Builder.getPackagePrefix()).toString();
-            }
+            return BindingGeneratorUtil.replacePackageTopNamespace(this.basePackageName, this.getPackageName(),
+                    BindingNamespaceType.Data, BindingNamespaceType.Builder);
         }
 
         @Override
index 32652194e4ee51c780fcfbd154e42e3fc762bbac..41454b63f8a99689aad76f2c3942b7c8047e7b23 100644 (file)
@@ -84,7 +84,7 @@ public abstract class BaseRenderer {
     /**
      * @return package definition for template
      */
-    private String packageDefinition() {
+    protected String packageDefinition() {
         final StringBuilder sb = new StringBuilder();
         sb.append("package ")
                 .append(type.getPackageName())
@@ -138,7 +138,7 @@ public abstract class BaseRenderer {
      * @param importedTypePackageName imported types package name
      * @return equals packages
      */
-    private boolean hasSamePackage(final String importedTypePackageName) {
+    protected boolean hasSamePackage(final String importedTypePackageName) {
         return type.getPackageName().equals(importedTypePackageName);
     }
 
index 4642cd4d7c6b71f461b132f3b58643a58c8780a1..95a34df1f4e78ed813ffaafdf5edf13468801673 100644 (file)
@@ -40,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;
@@ -80,6 +81,22 @@ public class BuilderRenderer extends BaseRenderer {
         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);
     }
 
     /**
index 629c8a072bca12fcc5d2f2edeb4229272e48c041..d7eb8d7114614cf501bb694234e671332fa11b32 100644 (file)
@@ -261,7 +261,8 @@ public class @{genType.getName}Builder implements @{getSimpleNameForBuilder} <@{
                 getRestrictions(field.getReturnType).getLengthConstraints)}
             }
         }
-        public @{genType.getName}Builder set@{toFirstUpper(field.getName)}(final @{field.getReturnType.getName} value) {
+
+        public @{genType.getName}Builder set@{toFirstUpper(field.getName)}(final @{field.getReturnType.getFullyQualifiedName} value) {
         @if(!field.getReturnType.isInstanceOf[GeneratedType] && getRestrictions(field.getReturnType) != null) {
             if (value != null) {
             @if(getRestrictions(field.getReturnType).getRangeConstraints != null && !getRestrictions(field.getReturnType).getRangeConstraints.isEmpty) {