Binding generator v2 - Unions fix
[mdsal.git] / binding2 / mdsal-binding2-generator-util / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / util / JavaIdentifierNormalizer.java
index 4e3f50b8ab40dfa268c94650196f697013f20795..ff53cf4c2ec2eed67db4293520ea13c31c505801 100644 (file)
@@ -201,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.common", "org.opendaylight.mdsal.binding.javav2.spec",
-                    "java", "com");
+            ImmutableSet.of("org.opendaylight.yangtools.yang.model","org.opendaylight.yangtools.concepts","org.opendaylight.yangtools.yang.common",
+                    "org.opendaylight.mdsal.binding.javav2.spec", "java", "com");
 
     private JavaIdentifierNormalizer() {
         throw new UnsupportedOperationException("Util class");
@@ -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 = packageNameParts[i];
+            }
+
+            sb.append(normalizedPartialPackageName);
+
             if (i != (packageNameParts.length - 1)) {
                 sb.append(".");
             }
@@ -310,13 +321,36 @@ 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;
             }
         }
         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);
     }
 
     /**