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;
@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 = '_';
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");
* @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();
}
/**
* @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);
}
/**
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;
}
* @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;
}
/**
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;
}