Fix of generating inner class with same name like parent 72/56772/2
authorJakub Toth <jatoth@cisco.com>
Wed, 3 May 2017 20:40:28 +0000 (22:40 +0200)
committerMartin Ciglan <mciglan@cisco.com>
Wed, 10 May 2017 13:28:30 +0000 (13:28 +0000)
Change-Id: I9ad44f50e48f71145012fd32b1f5d9e7c322afb3
Signed-off-by: Jakub Toth <jatoth@cisco.com>
(cherry picked from commit 2a4e4ff779c1fcba0703e3df41c791fee8c10409)

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/apple-test.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-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizerTest.java

index 461befc75186040b47cab8f157fb332158ed9da3..d6b2188e1720cc497d61f245d3e197461938e4df 100644 (file)
@@ -15,6 +15,7 @@ import static org.junit.Assert.fail;
 import java.util.List;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.javav2.generator.api.BindingGenerator;
+import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
 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;
@@ -25,6 +26,29 @@ import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
 public class BindingGeneratorImplTest {
 
+    @Test
+    public void generatedTypesEnumTest() throws Exception {
+        final BindingGenerator bg = new BindingGeneratorImpl(false);
+        final SchemaContext context = YangParserTestUtils.parseYangSource("/generator/apple-test.yang");
+        final List<Type> generateTypes = bg.generateTypes(context);
+        assertNotNull(generateTypes);
+        assertTrue(!generateTypes.isEmpty());
+        for (final Type type : generateTypes) {
+            if (type.getName().equals("Apple") && type.getPackageName()
+                    .equals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.apple.rev170503.data")) {
+                final GeneratedType gt = (GeneratedType) type;
+                final Enumeration enumeration = gt.getEnumerations().get(0);
+                assertEquals("Apple1", enumeration.getName());
+                assertEquals("org.opendaylight.mdsal.gen.javav2.urn.test.simple.apple.rev170503.data.Apple",
+                        enumeration.getPackageName());
+                assertEquals("apple", enumeration.getValues().get(0).getName());
+                assertEquals("APPLE", enumeration.getValues().get(0).getMappedName());
+                assertEquals("apple1", enumeration.getValues().get(1).getName());
+                assertEquals("APPLE1", enumeration.getValues().get(1).getMappedName());
+            }
+        }
+    }
+
     @Test
     public void generatedTypesTest() throws Exception {
         final BindingGenerator bg = new BindingGeneratorImpl(false);
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/generator/apple-test.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/generator/apple-test.yang
new file mode 100644 (file)
index 0000000..b2c4e77
--- /dev/null
@@ -0,0 +1,21 @@
+module test-apple {
+
+    yang-version 1;
+    namespace "urn:test:simple:apple";
+    prefix "test-apple";
+
+    revision 2017-05-03;
+
+    container apple {
+        leaf apple {
+            type enumeration {
+                enum apple {
+                    value 0 ;
+                }
+                enum apple1 {
+                    value 1 ;
+                }
+            }
+        }
+    }
+}
index 66dd4d327ccaa9dc9a0441f77501e5661e04f1dc..f52bb39470fffbdb785b2828fbe26ac320131790 100644 (file)
@@ -13,6 +13,7 @@ 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;
@@ -250,7 +251,17 @@ public final class JavaIdentifierNormalizer {
         final String[] packageNameParts = fullPackageName.split("\\.");
         final StringBuilder sb = new StringBuilder();
         for (int i = 0; i < packageNameParts.length; i++) {
-            sb.append(normalizePartialPackageName(packageNameParts[i]));
+            String normalizedPartialPackageName = normalizePartialPackageName(packageNameParts[i]);
+
+            // check if fullPackageName contains class name at the end and
+            // 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);
+            }
+
+            sb.append(normalizedPartialPackageName);
+
             if (i != (packageNameParts.length - 1)) {
                 sb.append(".");
             }
@@ -316,7 +327,27 @@ public final class JavaIdentifierNormalizer {
             }
         }
         final String convertedClassName = normalizeSpecificIdentifier(className, JavaIdentifier.CLASS);
-        return normalizeClassIdentifier(packageName, convertedClassName, convertedClassName, FIRST_INDEX);
+        // if packageName contains class name at the end, then the className is
+        // name of inner class
+        final String[] packageNameParts = packageName.split("\\.");
+        String suppInnerClassPackageName = packageName;
+        if (packageNameParts.length > 1) {
+            if (Character.isUpperCase(packageNameParts[packageNameParts.length - 1].charAt(FIRST_CHAR))) {
+                final StringBuilder sb = new StringBuilder();
+                // ignore class name in package name - inner class name has
+                // to be normalizing according to original package of parent
+                // class
+                for (int i = 0; i < packageNameParts.length - 1; i++) {
+                    sb.append(packageNameParts[i]);
+                    if (i != (packageNameParts.length - 2)) {
+                        sb.append('.');
+                    }
+                }
+                suppInnerClassPackageName = sb.toString();
+            }
+        }
+
+        return normalizeClassIdentifier(suppInnerClassPackageName, convertedClassName, convertedClassName, FIRST_INDEX);
     }
 
     /**
index d108081993cdb6bc34c753ceb99e711febde8b51..b987706fdd47193570b71e3b0dbfb586590793b4 100644 (file)
@@ -468,10 +468,6 @@ public class JavaIdentifierNormalizerTest {
         tested = "org.opendaylight.example.test.rev000000.data.con";
         expected = "org.opendaylight.example.test.rev000000.data.con_";
         testRealPackageNameExample(tested, expected);
-
-        tested = "org.opendaylight.example.test.rev000000.data.CON";
-        expected = "org.opendaylight.example.test.rev000000.data.con_";
-        testRealPackageNameExample(tested, expected);
     }
 
     private void testRealPackageNameExample(final String tested, final String expected) {