Binding generator v2 - Unions fix 21/58221/2
authorJakub Toth <jakub.toth@pantheon.tech>
Thu, 1 Jun 2017 14:51:48 +0000 (16:51 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 6 Jun 2017 09:31:59 +0000 (09:31 +0000)
- generate Java code fixes

TODO: template compilability issues

Change-Id: Icfa857df13617edec93b3a8de47bbba5d4a9b966
Signed-off-by: Martin Ciglan <martin.ciglan@pantheon.tech>
Signed-off-by: Jakub Toth <jakub.toth@pantheon.tech>
(cherry picked from commit 555a8d1dc3d75f642fff33acda73b9d31564dd2f)

binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeProviderImpl.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImplTest.java
binding2/mdsal-binding2-generator-impl/src/test/resources/generator/test-typedef.yang [new file with mode: 0644]
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.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/ClassRenderer.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/InterfaceRenderer.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/UnionRenderer.java

index 2b0dd1a10647dc1397f4a7e40b8b4ced5240dcaf..41bd28a1d2b4a5f05ec57e0f8a45d0a50592dd53 100644 (file)
@@ -419,8 +419,7 @@ final class AuxiliaryGenUtils {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     static Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final TypeDefinition<?> typeDef,
             final GeneratedTypeBuilder typeBuilder, final Module parentModule, final TypeProvider typeProvider) {
-        final GeneratedTOBuilderImpl returnType = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(),
-                genTOBuilder.getName());
+        final GeneratedTOBuilderImpl returnType = (GeneratedTOBuilderImpl) genTOBuilder;
         final String typedefDescription = encodeAngleBrackets(typeDef.getDescription());
 
         returnType.setDescription(typedefDescription);
index a57f29cce67bb94e4fd752effc25242e2746432f..fc7341b87d39bfecada5493a6afcd23135e4ded4 100644 (file)
@@ -457,7 +457,8 @@ public final class TypeProviderImpl implements TypeProvider {
             final String basePackageName = BindingMapping.getRootPackageName(module);
             final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typeDefinition
                     .getPath(), BindingNamespaceType.Typedef);
-            final String genTOName = JavaIdentifierNormalizer.normalizeClassIdentifier(packageName, typedefName);
+            final String genTOName =
+                    JavaIdentifierNormalizer.normalizeSpecificIdentifier(typedefName, JavaIdentifier.CLASS);
             final String name = packageName + "." + genTOName;
             if (!(returnType.getFullyQualifiedName().equals(name))) {
                 returnType = shadedTOWithRestrictions(gto, r);
index 779841026276e0a6c11cc06649df5de05995b8aa..3ee4f22438211d28f1222cb41636a8b7820ebcf8 100644 (file)
@@ -11,7 +11,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
-
 import java.util.List;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.javav2.generator.api.BindingGenerator;
@@ -26,6 +25,25 @@ import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
 public class BindingGeneratorImplTest {
 
+    @Test
+    public void genTypesTypeDefTest() throws Exception {
+        final BindingGeneratorImpl bg = new BindingGeneratorImpl(false);
+        final SchemaContext schemaContext = YangParserTestUtils.parseYangSource("/generator/test-typedef.yang");
+        final List<Type> generateTypes = bg.generateTypes(schemaContext);
+        assertNotNull(generateTypes);
+        for (final Type genType : generateTypes) {
+            if (genType.getName().equals("MyInnerCont") && genType.getPackageName()
+                    .equals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.rev170206.data.asteriskmy_cont")) {
+                final GeneratedType gt = (GeneratedType) genType;
+                for (final MethodSignature methodSignature : gt.getMethodDefinitions()) {
+                    if (methodSignature.getName().equals("getMyLeaf2")) {
+                        assertEquals(methodSignature.getReturnType().getName(), "MyType");
+                    }
+                }
+            }
+        }
+    }
+
     @Test
     public void generatedTypesEnumTest() throws Exception {
         final BindingGenerator bg = new BindingGeneratorImpl(false);
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/generator/test-typedef.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/generator/test-typedef.yang
new file mode 100644 (file)
index 0000000..1529078
--- /dev/null
@@ -0,0 +1,38 @@
+module test {
+    yang-version 1;
+
+    namespace "urn:test:simple:test";
+    prefix test;
+    organization "test.org";
+    revision "2017-02-06";
+
+    typedef my-type {
+      type int8;
+    }
+
+    container *my-cont {
+      container my-inner-cont {
+        leaf my-leaf {
+          type string;
+        }
+
+        leaf my-leaf2 {
+          type my-type;
+        }
+      }
+    }
+
+    container my-union-cont {
+      leaf my-union-leaf {
+        type union {
+          type int8;
+          type int16;
+        }
+      }
+    }
+
+    grouping my-grouping {
+      container *my-cont {
+      }
+    }
+}
\ No newline at end of file
index f52bb39470fffbdb785b2828fbe26ac320131790..ff53cf4c2ec2eed67db4293520ea13c31c505801 100644 (file)
@@ -13,7 +13,6 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ListMultimap;
 import java.util.List;
 import java.util.Set;
-import org.apache.commons.lang3.StringUtils;
 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration.Pair;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
@@ -202,9 +201,10 @@ public final class JavaIdentifierNormalizer {
     private static final String EMPTY_STRING = "";
     private static final String RESERVED_KEYWORD = "reserved_keyword";
     private static final ListMultimap<String, String> PACKAGES_MAP = ArrayListMultimap.create();
+    private static final Set<String> PRIMITIVE_TYPES = ImmutableSet.of("char[]", "byte[]");
     public static final Set<String> SPECIAL_RESERVED_PATHS =
             ImmutableSet.of("org.opendaylight.yangtools.yang.model","org.opendaylight.yangtools.concepts","org.opendaylight.yangtools.yang.common",
-                    "org.opendaylight.mdsal.binding.javav2.spec","java", "com");
+                    "org.opendaylight.mdsal.binding.javav2.spec", "java", "com");
 
     private JavaIdentifierNormalizer() {
         throw new UnsupportedOperationException("Util class");
@@ -257,7 +257,7 @@ public final class JavaIdentifierNormalizer {
             // capitalize last part of normalized package name
             if (packageNameParts.length != 1 && i == packageNameParts.length - 1
                     && Character.isUpperCase(packageNameParts[i].charAt(FIRST_CHAR))) {
-                normalizedPartialPackageName = StringUtils.capitalize(normalizedPartialPackageName);
+                normalizedPartialPackageName = packageNameParts[i];
             }
 
             sb.append(normalizedPartialPackageName);
@@ -321,6 +321,9 @@ public final class JavaIdentifierNormalizer {
      * @return - java acceptable identifier
      */
     public static String normalizeClassIdentifier(final String packageName, final String className) {
+        if (packageName.isEmpty() && PRIMITIVE_TYPES.contains(className)) {
+            return className;
+        }
         for (final String reservedPath : SPECIAL_RESERVED_PATHS) {
             if (packageName.startsWith(reservedPath)) {
                 return className;
index 41d3d81323dc13343f3e105e666ad4286f198a2c..d82678f980164006c3a882d72d3339f9595fe3e7 100644 (file)
@@ -60,6 +60,10 @@ public abstract class BaseRenderer {
         importMap.put(typeName, typePackageName);
     }
 
+    protected void putAllToImportMap(@NonNull Map<String, String> imports) {
+        importMap.putAll(imports);
+    }
+
     protected Map<String, String> getImportMap() {
         return ImmutableMap.copyOf(importMap);
     }
index 7af731732b531e7bea8b488812a1a0d28df852d6..dc28c0a591a2d1c9f4b5ad7f8237a431b343b5c9 100644 (file)
@@ -295,7 +295,7 @@ public class ClassRenderer extends BaseRenderer {
      *         set to true
      */
     private List<GeneratedProperty> resolveReadOnlyPropertiesFromTO(final List<GeneratedProperty> properties) {
-        return new ArrayList(Collections2.transform(properties, GeneratedProperty::isReadOnly));
+        return new ArrayList<>(Collections2.filter(properties, GeneratedProperty::isReadOnly));
     }
 
     /**
index da48a4cb6eccf6250d966e11c240aa788f52322b..b911d69b249f7e2b2472c13c7d1bc12b449aa7c3 100644 (file)
@@ -83,11 +83,11 @@ public class InterfaceRenderer extends BaseRenderer {
                 if (((GeneratedTransferObject) innerClass).isUnionType()) {
                     final UnionRenderer unionRenderer = new UnionRenderer((GeneratedTransferObject) innerClass);
                     innerClasses.add(unionRenderer.body());
-                    this.getImportMap().putAll(unionRenderer.getImportMap());
+                    this.putAllToImportMap(unionRenderer.getImportMap());
                 } else {
                     final ClassRenderer classRenderer = new ClassRenderer((GeneratedTransferObject) innerClass);
                     innerClasses.add(classRenderer.generateAsInnerClass());
-                    this.getImportMap().putAll(classRenderer.getImportMap());
+                    this.putAllToImportMap(classRenderer.getImportMap());
                 }
             }
         }
index 106edd98687d5c093f664bbcb778fc14ba9b72b4..3148c944bb344f1f2f3ff51340d32e3720bc3be8 100644 (file)
@@ -10,9 +10,8 @@ package org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers;
 
 import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.BOOLEAN;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import com.google.common.collect.Collections2;
 import java.beans.ConstructorProperties;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -101,12 +100,9 @@ public class UnionRenderer extends ClassRenderer {
             return super.getterMethod(field);
         }
 
-        final Function<GeneratedProperty, Boolean> tempFunction = (GeneratedProperty p) -> {
-            String name = p.getName();
-            return !"value".equals(name);
-        };
-        List<GeneratedProperty> filtered = (List) Iterables.filter(this.getFinalProperties(),
-                (Predicate<? super GeneratedProperty>) tempFunction);
+        Predicate<GeneratedProperty> predicate = input -> !"value".equals(input.getName());
+        final List<GeneratedProperty> filtered = new ArrayList<>(Collections2.filter(this.getFinalProperties(),
+            predicate));
 
         final List<CharSequence> strings = new ArrayList<>(filtered.size());