Binding generator v2 - namespace fix #1 66/59566/1
authorJie Han <han.jie@zte.com.cn>
Wed, 21 Jun 2017 06:27:02 +0000 (14:27 +0800)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Tue, 27 Jun 2017 12:41:33 +0000 (12:41 +0000)
- put builders to dto package
- add test yang
- fix merge conflicts
TODO
     #2 - fix namespace of data type in grouping namespace

        - add "Grouping" suffix for grouping type name
        & "Data" for data type name

     #3 - support generate type from uses grouping

Change-Id: Iac9fb8f76c8308860f166019d47b8849fb41f95e
ChangeId: I08aa15ebdc6ebefb5aa38869d9fb04bfe9664ee9
Signed-off-by: Jie Han <han.jie@zte.com.cn>
(cherry picked from commit 8d45e9e792a02e5aba4cef141f4df3955b21a378)

binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedTypeForBuilder.java [new file with mode: 0644]
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-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java
binding2/mdsal-binding2-generator-impl/src/test/resources/namespace/namespace-test-dto.yang [new file with mode: 0644]
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/GeneratedTypeBuilderImpl.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/GeneratorJavaFile.java

diff --git a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedTypeForBuilder.java b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/GeneratedTypeForBuilder.java
new file mode 100644 (file)
index 0000000..ff1a2e2
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.javav2.model.api;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Java interface for builders to get package name and so on.
+ */
+@Beta
+public interface GeneratedTypeForBuilder {
+    /**
+     * Returns name of the package that builder class belongs to.
+     *
+     * @return name of the package that  builder class belongs to
+     */
+    String getPackageNameForBuilder();
+
+}
index 65b217b6f30aa66fe70d7aacba931d2dc0ab1bc7..deba64cabe0766a422265fe9ca549b0d32144ab2 100644 (file)
@@ -209,6 +209,15 @@ public interface GeneratedTypeBuilderBase<T extends GeneratedTypeBuilderBase<T>>
      */
     void setModuleName(String moduleName);
 
+    /**
+     * Set the base package name of the module, used to generate package name for
+     * builders by reusing the original package name.
+     *
+     * @param basePackageName
+     *            the base package name of the module
+     */
+    void setBasePackageName(String basePackageName);
+
     /**
      * Set a list of QNames which represent schema path in schema tree from
      * actual concrete type to the root.
index 4ca6c01b6a8148f8d7205ffb254619500d6aaed8..220c7b6b4a7d284cbebccbe8ba46bafbf5b4002e 100644 (file)
@@ -154,7 +154,7 @@ final class GenHelperUtil {
         moduleBuilder.setDescription(createDescription(module, verboseClassComments));
         moduleBuilder.setReference(module.getReference());
         moduleBuilder.setModuleName(moduleName);
-
+        moduleBuilder.setBasePackageName(packageName);
         return moduleBuilder;
     }
 
@@ -320,6 +320,7 @@ final class GenHelperUtil {
         augTypeBuilder.addImplementsType(BindingTypes.TREE_NODE);
         augTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, augTypeBuilder));
         augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef));
+        augTypeBuilder.setBasePackageName(BindingMapping.getRootPackageName(module));
         annotateDeprecatedIfNecessary(augSchema.getStatus(), augTypeBuilder);
 
         //produces getters for augTypeBuilder eventually
@@ -516,6 +517,7 @@ final class GenHelperUtil {
         newType.setReference(schemaNode.getReference());
         newType.setSchemaPath((List<QName>) schemaNode.getPath().getPathFromRoot());
         newType.setModuleName(module.getName());
+        newType.setBasePackageName(BindingMapping.getRootPackageName(module));
 
         if (!genTypeBuilders.containsKey(packageName)) {
             final Map<String, GeneratedTypeBuilder> builders = new HashMap<>();
index a91da673cf2d87df15e03415a687b18537373b02..b37669d56b2c37bd020a6e87d933548cd07acb98 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.build
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable;
 import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentation;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -1301,6 +1302,7 @@ public class AugmentToGenTypeTest {
         when(module.getNamespace()).thenReturn(qnamePath.getNamespace());
         final String pckgName = "test.augment.choice.cases";
         final Type targetType = mock(Type.class);
+        when(targetType.getFullyQualifiedName()).thenReturn(Augmentable.class.getName());
         final Set<DataSchemaNode> augmentNodes = new HashSet<>();
         final ChoiceCaseNode caseNode = mock(ChoiceCaseNode.class);
         when(caseNode.getPath()).thenReturn(path);
@@ -1364,6 +1366,7 @@ public class AugmentToGenTypeTest {
         when(module.getNamespace()).thenReturn(qnamePath.getNamespace());
         final String pckgName = "test.augment.choice.cases";
         final Type targetType = mock(Type.class);
+        when(targetType.getFullyQualifiedName()).thenReturn(Augmentable.class.getName());
         final Set<DataSchemaNode> augmentNodes = new HashSet<>();
         final ChoiceCaseNode caseNode = mock(ChoiceCaseNode.class);
         when(caseNode.getPath()).thenReturn(path);
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/namespace/namespace-test-dto.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/namespace/namespace-test-dto.yang
new file mode 100644 (file)
index 0000000..09b8c43
--- /dev/null
@@ -0,0 +1,21 @@
+module namespace-test-dto {
+    namespace "org.test.namespace.dto";
+    prefix "dto";
+    revision 2017-05-19;
+
+    container a {
+        container b {
+            leaf leaf-b {
+                type string;
+            }
+        }
+    }
+
+    grouping c {
+        container d {
+            leaf leaf-d {
+                type string;
+            }
+        }
+    }
+}
\ No newline at end of file
index c51a4bca774e0acd7031729343b18c149fcc7107..f9930624a7a513a8ed3ca263d4597ee10b72eb1d 100644 (file)
@@ -24,6 +24,8 @@ import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOB
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilderBase;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
+import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable;
+import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentation;
 import org.opendaylight.yangtools.util.LazyCollections;
 
 @Beta
@@ -41,6 +43,8 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
     private String comment = "";
     private boolean isAbstract;
     private Type parentTypeForBuilder;
+    private boolean isDataObjectType = false;
+    private String basePackageName = null;
 
     protected AbstractGeneratedTypeBuilder(final String packageName, final String name) {
         super(packageName, name);
@@ -95,6 +99,14 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return enclosedTransferObjects;
     }
 
+    protected boolean isDataObjectType() {
+        return isDataObjectType;
+    }
+
+    protected String getBasePackageName() {
+        return basePackageName;
+    }
+
     protected abstract T thisInstance();
 
     @Override
@@ -139,11 +151,21 @@ abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T
         return thisInstance();
     }
 
+    @Override
+    public void setBasePackageName(String basePackageName) {
+        this.basePackageName = basePackageName;
+    }
+
     @Override
     public T addImplementsType(final Type genType) {
         Preconditions.checkArgument(genType != null, "Type cannot be null");
         Preconditions.checkArgument(!implementsTypes.contains(genType), "This generated type already contains equal implements type.");
         implementsTypes = LazyCollections.lazyAdd(implementsTypes, genType);
+
+        if (genType.getFullyQualifiedName().equals(Augmentable.class.getName())
+                || genType.getFullyQualifiedName().equals(Augmentation.class.getName())) {
+            this.isDataObjectType = true;
+        }
         return thisInstance();
     }
 
index 9b0f0a5c16cc1b3a895fd925202e233da46b9a3d..fbe3fbef739f7d3117541f1bc8769666e7a8e8c4 100644 (file)
@@ -11,8 +11,12 @@ package org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.buil
 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.JavaIdentifierNormalizer;
 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.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
 import org.opendaylight.yangtools.yang.common.QName;
 
 @Beta
@@ -38,7 +42,11 @@ public final class GeneratedTypeBuilderImpl extends AbstractGeneratedTypeBuilder
 
     @Override
     public GeneratedType toInstance() {
-        return new GeneratedTypeImpl(this);
+        if (this.isDataObjectType()) {
+            return new GeneratedTypeWithBuilderImpl(this);
+        } else {
+            return new GeneratedTypeImpl(this);
+        }
     }
 
     @Override
@@ -92,7 +100,7 @@ public final class GeneratedTypeBuilderImpl extends AbstractGeneratedTypeBuilder
         return this;
     }
 
-    private static final class GeneratedTypeImpl extends AbstractGeneratedType {
+    private static class GeneratedTypeImpl extends AbstractGeneratedType {
 
         private final String description;
         private final String reference;
@@ -128,4 +136,44 @@ public final class GeneratedTypeBuilderImpl extends AbstractGeneratedTypeBuilder
             return moduleName;
         }
     }
+
+    private static final class GeneratedTypeWithBuilderImpl extends GeneratedTypeImpl
+            implements GeneratedTypeForBuilder {
+
+        private final String basePackageName;
+        private final String builderPackageName;
+
+        public GeneratedTypeWithBuilderImpl(GeneratedTypeBuilderImpl builder) {
+            super(builder);
+            this.basePackageName = builder.getBasePackageName();
+            this.builderPackageName = generatePackageNameForBuilder();
+        }
+
+        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().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();
+            }
+        }
+
+        @Override
+        public String getPackageNameForBuilder() {
+            return this.builderPackageName;
+        }
+    }
 }
index f245df5fa862ba52b67d02149eec7eb0633e7336..70a73c4843ec3bfba265c3223fe13d6301d7824b 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.CodeGenerator;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.model.api.UnitName;
+import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonatype.plexus.build.incremental.BuildContext;
@@ -182,13 +183,20 @@ public final class GeneratorJavaFile {
             LOG.error("Cannot generate Type into Java File because " + "Code Generator instance is NULL!");
             throw new IllegalArgumentException("Code Generator Cannot be NULL!");
         }
-        final File packageDir = packageToDirectory(parentDir, type.getPackageName());
-
-        if (!packageDir.exists()) {
-            packageDir.mkdirs();
-        }
 
         if (generator.isAcceptable(type)) {
+            File packageDir;
+            if (generator instanceof BuilderGenerator) {
+                Preconditions.checkState(type instanceof GeneratedTypeForBuilder);
+                packageDir = packageToDirectory(parentDir, ((GeneratedTypeForBuilder)type).getPackageNameForBuilder());
+            } else {
+                packageDir = packageToDirectory(parentDir, type.getPackageName());
+            }
+
+            if (!packageDir.exists()) {
+                packageDir.mkdirs();
+            }
+
             final String generatedCode = JavaCodePrettyPrint.perform(generator.generate(type));
             Preconditions.checkState(!generatedCode.isEmpty(), "Generated code should not be empty!");
             final File file = new File(packageDir, ((UnitName) generator.getUnitName(type)).getValue() + ".java");