Optimize JavaIdentifierNormalizer.normalizeFullPackageName()
[mdsal.git] / binding2 / mdsal-binding2-generator-util / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / util / JavaIdentifierNormalizer.java
index 66dd4d327ccaa9dc9a0441f77501e5661e04f1dc..03bac43cc3c04fe38ec6a9ede9001fe8acb60ef0 100644 (file)
@@ -8,9 +8,11 @@
 package org.opendaylight.mdsal.binding.javav2.generator.util;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Splitter;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ListMultimap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
@@ -194,6 +196,14 @@ import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
 @Beta
 public final class JavaIdentifierNormalizer {
 
+    public static final Set<String> SPECIAL_RESERVED_PATHS = ImmutableSet.of(
+        "org.opendaylight.yangtools.concepts",
+        "org.opendaylight.yangtools.yang.common",
+        "org.opendaylight.yangtools.yang.model",
+        "org.opendaylight.mdsal.binding.javav2.spec",
+        "java",
+        "com");
+
     private static final int FIRST_CHAR = 0;
     private static final int FIRST_INDEX = 1;
     private static final char UNDERSCORE = '_';
@@ -201,9 +211,9 @@ 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();
-    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");
+    private static final Set<String> PRIMITIVE_TYPES = ImmutableSet.of("char[]", "byte[]");
+
+    private static final Splitter DOT_SPLITTER = Splitter.on('.');
 
     private JavaIdentifierNormalizer() {
         throw new UnsupportedOperationException("Util class");
@@ -247,15 +257,19 @@ public final class JavaIdentifierNormalizer {
      * @return normalized name
      */
     public static String normalizeFullPackageName(final String fullPackageName) {
-        final String[] packageNameParts = fullPackageName.split("\\.");
-        final StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < packageNameParts.length; i++) {
-            sb.append(normalizePartialPackageName(packageNameParts[i]));
-            if (i != (packageNameParts.length - 1)) {
-                sb.append(".");
+        final Iterator<String> it = DOT_SPLITTER.split(fullPackageName).iterator();
+        if (!it.hasNext()) {
+            return fullPackageName;
+        }
+
+        final StringBuilder sb = new StringBuilder(fullPackageName.length());
+        while (true) {
+            sb.append(normalizePartialPackageName(it.next()));
+            if (!it.hasNext()) {
+                return sb.toString();
             }
+            sb.append('.');
         }
-        return sb.toString();
     }
 
     /**
@@ -310,13 +324,41 @@ 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++) {
+                    if (!Character.isUpperCase(packageNameParts[i].charAt(FIRST_CHAR))) {
+                        sb.append(packageNameParts[i]);
+                        if (i != packageNameParts.length - 2 &&
+                                !Character.isUpperCase(packageNameParts[i+1].charAt(FIRST_CHAR))) {
+                            sb.append('.');
+                        }
+                    } else {
+                        break;
+                    }
+                }
+                suppInnerClassPackageName = sb.toString();
+            }
+        }
+
+        return normalizeClassIdentifier(suppInnerClassPackageName, convertedClassName, convertedClassName, FIRST_INDEX);
     }
 
     /**
@@ -355,8 +397,8 @@ public final class JavaIdentifierNormalizer {
             final char actualChar = identifier.charAt(i);
             // ignore single dash as non java char - if there is more dashes in a row or dash is as
             // the last char in identifier then parse these dashes as non java chars
-            if ((actualChar == '-') && existNext(identifier, i)) {
-                if ((identifier.charAt(i - 1) != DASH) && (identifier.charAt(i + 1) != DASH)) {
+            if (actualChar == '-' && existNext(identifier, i)) {
+                if (identifier.charAt(i - 1) != DASH && identifier.charAt(i + 1) != DASH) {
                     sb.append(UNDERSCORE);
                     continue;
                 }
@@ -467,7 +509,7 @@ public final class JavaIdentifierNormalizer {
      * @return true if there is another char, false otherwise
      */
     private static boolean existNext(final String identifier, final int actual) {
-      return (identifier.length() - 1) < (actual + 1) ? false : true;
+        return identifier.length() > actual + 1;
     }
 
     /**
@@ -485,7 +527,7 @@ public final class JavaIdentifierNormalizer {
         if (name.contains(String.valueOf(DASH))) {
             name = name.replaceAll(String.valueOf(DASH), String.valueOf(UNDERSCORE));
         }
-        name = existNext ? (name + "_") : name;
+        name = existNext ? name + "_" : name;
         return name.contains(" ") ? name.replaceAll(" ", "_") : name;
     }