Improve NonJavaCharsConverter 39/54939/1
authorJakub Toth <jatoth@cisco.com>
Mon, 10 Apr 2017 09:17:19 +0000 (11:17 +0200)
committerJakub Toth <jatoth@cisco.com>
Thu, 13 Apr 2017 07:59:17 +0000 (07:59 +0000)
  * rename NonJavaCharsConverter to JavaIdentifierNormalizer
  * rename public methods of JavaIdentifierNormalizer from 'convert*'
    to 'normalizeIdentifier'
  * add new checking of identifiers by set of SPECIAL_RESERVED_WORDS

Change-Id: Ia603a4876065fe9f7420cafe5128c3ce89e47555
Signed-off-by: Jakub Toth <jatoth@cisco.com>
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/impl/GenHelperUtil.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/BaseYangTypes.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeProviderImpl.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/AbstractBaseType.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/BindingGeneratorUtil.java
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java [moved from binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/NonJavaCharsConverter.java with 84% similarity]
binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java
binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizerTest.java [moved from binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/NonJavaCharsConverterTest.java with 87% similarity]
binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/yangModuleInfoTemplate.scala.txt

index 55c37a9903409cd6d9cfedf90051a72cb919f57d..95da08fbff5830f12a27ce5ebade1825e5b99067 100644 (file)
@@ -30,7 +30,7 @@ import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForN
 import org.opendaylight.mdsal.binding.javav2.generator.impl.util.YangTextTemplate;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier;
-import org.opendaylight.mdsal.binding.javav2.generator.util.NonJavaCharsConverter;
+import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
@@ -160,7 +160,7 @@ final class AuxiliaryGenUtils {
         }
         // underscore used as separator for distinction of method parts in convertIdentifier()
         method.append('_').append(localName);
-        return NonJavaCharsConverter.convertIdentifier(method.toString(), JavaIdentifier.METHOD);
+        return JavaIdentifierNormalizer.normalizeSpecificIdentifier(method.toString(), JavaIdentifier.METHOD);
     }
 
     static String createDescription(final SchemaNode schemaNode, final String fullyQualifiedName,
@@ -530,7 +530,7 @@ final class AuxiliaryGenUtils {
         final String leafName = leaf.getQName().getLocalName();
         final String leafDesc = encodeAngleBrackets(leaf.getDescription());
         final GeneratedPropertyBuilder propBuilder =
-                toBuilder.addProperty(NonJavaCharsConverter.convertIdentifier(leafName, JavaIdentifier.METHOD));
+                toBuilder.addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(leafName, JavaIdentifier.METHOD));
         propBuilder.setReadOnly(isReadOnly);
         propBuilder.setReturnType(returnType);
         propBuilder.setComment(leafDesc);
index 2107c4230dae99f4de1e3d3ee92b98047add62c4..df05610c04bd14aa0e126c3f5babd6cf32ab175e 100644 (file)
@@ -35,7 +35,7 @@ import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier;
-import org.opendaylight.mdsal.binding.javav2.generator.util.NonJavaCharsConverter;
+import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedPropertyBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
@@ -431,7 +431,7 @@ final class GenHelperUtil {
         }
         sb.append(notificationInterface.getName());
 
-        listenerInterface.addMethod(NonJavaCharsConverter.convertIdentifier(sb.toString(), JavaIdentifier.METHOD))
+        listenerInterface.addMethod(JavaIdentifierNormalizer.normalizeSpecificIdentifier(sb.toString(), JavaIdentifier.METHOD))
                 .setAccessModifier(AccessModifier.PUBLIC).addParameter(notificationInterface, "notification")
                 .setComment(encodeAngleBrackets(notification.getDescription())).setReturnType(Types.VOID);
         return listenerInterface;
index ddeef41fb15284664d93551fd1377920e631669f..01cb8a702440b71654bc0b0a1a4c8780ed9a4330 100644 (file)
@@ -15,7 +15,7 @@ import java.math.BigInteger;
 import java.util.Map;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier;
-import org.opendaylight.mdsal.binding.javav2.generator.util.NonJavaCharsConverter;
+import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
 import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
@@ -211,7 +211,8 @@ public final class BaseYangTypes {
 
         @Override
         public String getParamNameFromType(final TypeDefinition<?> type) {
-            return NonJavaCharsConverter.convertIdentifier(type.getQName().getLocalName(), JavaIdentifier.METHOD);
+            return JavaIdentifierNormalizer.normalizeSpecificIdentifier(type.getQName().getLocalName(),
+                    JavaIdentifier.METHOD);
         }
     };
 
index 8b1f38011bde664c6f287aa914c028b8bed8660b..ef2109f478994ad8b27be64e89ad5f3214a286b5 100644 (file)
@@ -41,7 +41,7 @@ import java.util.regex.Pattern;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier;
-import org.opendaylight.mdsal.binding.javav2.generator.util.NonJavaCharsConverter;
+import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.generator.util.Types;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedPropertyBuilderImpl;
 import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
@@ -317,7 +317,7 @@ public final class TypeProviderImpl implements TypeProvider {
             for (final Bit bit : bitList) {
                 final String name = bit.getName();
                 genPropertyBuilder =
-                        genTOBuilder.addProperty(NonJavaCharsConverter.convertIdentifier(name, JavaIdentifier.METHOD));
+                        genTOBuilder.addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(name, JavaIdentifier.METHOD));
                 genPropertyBuilder.setReadOnly(true);
                 genPropertyBuilder.setReturnType(BaseYangTypes.BOOLEAN_TYPE);
 
@@ -457,7 +457,7 @@ 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 = NonJavaCharsConverter.normalizeClassIdentifier(packageName, typedefName);
+            final String genTOName = JavaIdentifierNormalizer.normalizeClassIdentifier(packageName, typedefName);
             final String name = packageName + "." + genTOName;
             if (!(returnType.getFullyQualifiedName().equals(name))) {
                 returnType = shadedTOWithRestrictions(gto, r);
@@ -781,7 +781,7 @@ public final class TypeProviderImpl implements TypeProvider {
         final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, identity.getPath
                 (), BindingNamespaceType.Typedef);
         final String genTypeName =
-                NonJavaCharsConverter.normalizeClassIdentifier(packageName, identity.getQName().getLocalName());
+                JavaIdentifierNormalizer.normalizeClassIdentifier(packageName, identity.getQName().getLocalName());
 
         final Type baseType = Types.typeForClass(Class.class);
         final Type paramType = Types.wildcardTypeFor(packageName, genTypeName);
@@ -854,7 +854,7 @@ public final class TypeProviderImpl implements TypeProvider {
     private static void updateUnionTypeAsProperty(final GeneratedTOBuilder unionGenTransObject, final Type type, final String propertyName) {
         if (unionGenTransObject != null && type != null && !unionGenTransObject.containsProperty(propertyName)) {
             final GeneratedPropertyBuilder propBuilder = unionGenTransObject
-                    .addProperty(NonJavaCharsConverter.convertIdentifier(propertyName, JavaIdentifier.METHOD));
+                    .addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(propertyName, JavaIdentifier.METHOD));
             propBuilder.setReturnType(type);
 
             unionGenTransObject.addEqualsIdentity(propBuilder);
@@ -896,7 +896,7 @@ public final class TypeProviderImpl implements TypeProvider {
 
         final GeneratedPropertyBuilder propertyBuilder;
         propertyBuilder = parentUnionGenTOBuilder
-                .addProperty(NonJavaCharsConverter.convertIdentifier(newTOBuilderName, JavaIdentifier.METHOD));
+                .addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(newTOBuilderName, JavaIdentifier.METHOD));
         propertyBuilder.setReturnType(subUnionGenTOBUilders.get(0));
         parentUnionGenTOBuilder.addEqualsIdentity(propertyBuilder);
         parentUnionGenTOBuilder.addToStringProperty(propertyBuilder);
index bd0b0478c300bbbec761466eb9d8dfcfa3cd7e78..4615d2791e05a9795f7e999946a1aa3b639b6211 100644 (file)
@@ -42,8 +42,8 @@ public abstract class AbstractBaseType implements Type {
     protected AbstractBaseType(final String pkName, final String name) {
         Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!");
         Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!");
-        this.packageName = NonJavaCharsConverter.convertFullPackageName(pkName);
-        this.name = NonJavaCharsConverter.normalizeClassIdentifier(pkName, name);
+        this.packageName = JavaIdentifierNormalizer.normalizeFullPackageName(pkName);
+        this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name);
     }
 
     /**
@@ -65,8 +65,8 @@ public abstract class AbstractBaseType implements Type {
             this.packageName = pkName;
             this.name = name;
         } else {
-            this.packageName = NonJavaCharsConverter.convertFullPackageName(pkName);
-            this.name = NonJavaCharsConverter.normalizeClassIdentifier(pkName, name);
+            this.packageName = JavaIdentifierNormalizer.normalizeFullPackageName(pkName);
+            this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name);
         }
     }
 
index bb3905c482302b487e2bb01df84399a97efaddd1..184a9089344e5c72022c07dae1bb78fc15950e50 100644 (file)
@@ -172,9 +172,9 @@ public final class BindingGeneratorUtil {
                 sb.append(basePackageName)
                   .append('.')
                   .append(namespaceType.getPackagePrefix());
-                return NonJavaCharsConverter.convertFullPackageName(sb.toString());
+                return JavaIdentifierNormalizer.normalizeFullPackageName(sb.toString());
             }
-            return NonJavaCharsConverter.convertFullPackageName(basePackageName);
+            return JavaIdentifierNormalizer.normalizeFullPackageName(basePackageName);
         }
 
         return generateNormalizedPackageName(basePackageName, pathFromRoot, size, namespaceType);
@@ -372,7 +372,7 @@ public final class BindingGeneratorUtil {
             final String nodeLocalName = iterator.next().getLocalName();
             builder.append(nodeLocalName);
         }
-        final String normalizedPackageName = NonJavaCharsConverter.convertFullPackageName(builder.toString());
+        final String normalizedPackageName = JavaIdentifierNormalizer.normalizeFullPackageName(builder.toString());
         // Prevent duplication of input
         PACKAGE_INTERNER.intern(normalizedPackageName);
         return normalizedPackageName;
@@ -9,25 +9,29 @@ package org.opendaylight.mdsal.binding.javav2.generator.util;
 
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ListMultimap;
 import java.util.List;
+import java.util.Set;
 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;
 
 /**
- * This util class converts every non-java char in identifier to java char by its unicode name
- * (<a href="http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.8">JAVA SE
- * SPEFICIATIONS - Identifiers</a>). There are special types of mapping non-java chars to original
- * identifiers according to specific {@linkplain JavaIdentifier java type}:
+ * This util class converts every non-java char in identifier to java char by
+ * its unicode name (<a href=
+ * "http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.8">JAVA SE
+ * SPECIFICATIONS - Identifiers</a>). There are special types of mapping
+ * non-java chars to original identifiers according to specific
+ * {@linkplain JavaIdentifier java type}:
  * <ul>
  * <li>class, enum, interface</li>
  * <li>
  * <ul>
  * <li>without special separator</li>
- * <li>the first character of identifier, any other first character of identifier part mapped by
- * non-Java char name from unicode and char in identifier behind non-java char name are converting
- * to upper case</li>
+ * <li>the first character of identifier, any other first character of
+ * identifier part mapped by non-Java char name from unicode and char in
+ * identifier behind non-java char name are converting to upper case</li>
  * <li>examples:</li>
  * <li>
  * <ul>
@@ -67,8 +71,9 @@ import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
  * <ul>
  * <li>without special separator</li>
  * <li>the first character of identifier is converting to lower case</li>
- * <li>any other first character of identifier part mapped by non-Java char name from unicode and
- * char in identifier behind non-java char name are converting to upper case</li>
+ * <li>any other first character of identifier part mapped by non-Java char name
+ * from unicode and char in identifier behind non-java char name are converting
+ * to upper case</li>
  * <li>examples:</li>
  * <li>
  * <ul>
@@ -83,19 +88,19 @@ import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
  * </li>
  * </ul>
  * </li>
- * <li>package - full package name
- * (<a href="https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html"> Naming a
- * package</a>)</li>
+ * <li>package - full package name (<a href=
+ * "https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html">
+ * Naming a package</a>)</li>
  * <li>
  * <li>
  * <ul>
  * <li>parts of package name are separated by dots</li>
  * <li>parts of package name are converting to lower case</li>
- * <li>if parts of package name are reserved Java or Windows keywords, such as 'int' the suggested
- * convention is to add an underscore to keyword</li>
- * <li>dash is parsed as underscore according to
- * <a href="https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html"> Naming a
- * package</a></li>
+ * <li>if parts of package name are reserved Java or Windows keywords, such as
+ * 'int' the suggested convention is to add an underscore to keyword</li>
+ * <li>dash is parsed as underscore according to <a href=
+ * "https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html">
+ * Naming a package</a></li>
  * <li>examples:</li>
  * <li>
  * <ul>
@@ -113,10 +118,11 @@ import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
  * </li>
  * </ul>
  *
- * There is special case in CLASS, INTERFACE, ENUM, ENUM VALUE, CONSTANT, METHOD and VARIABLE if
- * identifier contains single dash - then the converter ignores the single dash in the way of the
- * non-java chars. In other way, if dash is the first or the last char in the identifier or there is
- * more dashes in a row in the identifier, then these dashes are converted as non-java chars.
+ * There is special case in CLASS, INTERFACE, ENUM, ENUM VALUE, CONSTANT, METHOD
+ * and VARIABLE if identifier contains single dash - then the converter ignores
+ * the single dash in the way of the non-java chars. In other way, if dash is
+ * the first or the last char in the identifier or there is more dashes in a row
+ * in the identifier, then these dashes are converted as non-java chars.
  * Example:
  * <ul>
  * <li>class, enum, interface</li>
@@ -148,19 +154,22 @@ import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
  * </li>
  * </ul>
  *
- * Next special case talks about normalizing class name which already exists in package - but with
- * different camel cases (foo, Foo, fOo, ...). To every next classes with same names will by added
- * their actual rank (serial number), except the first one. This working for CLASS, ENUM and
- * INTEFACE java identifiers. If there exist the same ENUM VALUES in ENUM (with different camel
- * cases), then it's parsed with same logic like CLASSES, ENUMS and INTERFACES but according to list
- * of pairs of their ENUM parent. Example:
+ * Next special case talks about normalizing class name which already exists in
+ * package - but with different camel cases (foo, Foo, fOo, ...). To every next
+ * classes with same names will by added their actual rank (serial number),
+ * except the first one. This working for CLASS, ENUM and INTEFACE java
+ * identifiers. If there exist the same ENUM VALUES in ENUM (with different
+ * camel cases), then it's parsed with same logic like CLASSES, ENUMS and
+ * INTERFACES but according to list of pairs of their ENUM parent. Example:
  *
  * <ul>
  * <li>class, enum, interface</li>
  * <li>
  * <ul>
- * <li>package name org.example, class (or interface or enum) Foo - normalized to Foo
- * <li>package name org.example, class (or interface or enum) fOo - normalized to Foo1
+ * <li>package name org.example, class (or interface or enum) Foo - normalized
+ * to Foo
+ * <li>package name org.example, class (or interface or enum) fOo - normalized
+ * to Foo1
  * </ul>
  * </li>
  * <li>enum value</li>
@@ -176,13 +185,14 @@ import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
  * </pre>
  *
  * </li>
- * <li>YANG enum values will be mapped to 'FOO' and 'FOO_1' Java enum values.</li>
+ * <li>YANG enum values will be mapped to 'FOO' and 'FOO_1' Java enum
+ * values.</li>
  * </ul>
  * </li>
  * </ul>
  */
 @Beta
-public final class NonJavaCharsConverter {
+public final class JavaIdentifierNormalizer {
 
     private static final int FIRST_CHAR = 0;
     private static final int FIRST_INDEX = 1;
@@ -191,8 +201,9 @@ public final class NonJavaCharsConverter {
     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_WORDS = ImmutableSet.of("QName");
 
-    private NonJavaCharsConverter() {
+    private JavaIdentifierNormalizer() {
         throw new UnsupportedOperationException("Util class");
     }
 
@@ -222,7 +233,7 @@ public final class NonJavaCharsConverter {
      *            - list of all actual enum values
      * @return converted and fixed name of new enum value
      */
-    public static String convertIdentifierEnumValue(final String name, final List<Pair> values) {
+    public static String normalizeEnumValueIdentifier(final String name, final List<Pair> values) {
         return convertIdentifierEnumValue(name, name, values, FIRST_INDEX);
     }
 
@@ -233,11 +244,11 @@ public final class NonJavaCharsConverter {
      *            - full package name
      * @return normalized name
      */
-    public static String convertFullPackageName(final String fullPackageName) {
+    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(NonJavaCharsConverter.normalizePackageNamePart(packageNameParts[i]));
+            sb.append(normalizePartialPackageName(packageNameParts[i]));
             if (i != (packageNameParts.length - 1)) {
                 sb.append(".");
             }
@@ -252,7 +263,7 @@ public final class NonJavaCharsConverter {
      *            - part of package name
      * @return normalized name
      */
-    public static String normalizePackageNamePart(final String packageNamePart) {
+    public static String normalizePartialPackageName(final String packageNamePart) {
         // if part of package name consist from java or windows reserved word, return it with
         // underscore at the end and in lower case
         if (BindingMapping.JAVA_RESERVED_WORDS.contains(packageNamePart.toLowerCase())
@@ -268,7 +279,7 @@ public final class NonJavaCharsConverter {
         for (int i = 0; i < normalizedPackageNamePart.length(); i++) {
             if (normalizedPackageNamePart.charAt(i) == UNDERSCORE) {
                 if (!innserSb.toString().isEmpty()) {
-                    sb.append(convertIdentifier(innserSb.toString(), JavaIdentifier.PACKAGE));
+                    sb.append(normalizeSpecificIdentifier(innserSb.toString(), JavaIdentifier.PACKAGE));
                     innserSb = new StringBuilder();
                 }
                 sb.append(UNDERSCORE);
@@ -277,7 +288,7 @@ public final class NonJavaCharsConverter {
             }
         }
         if (!innserSb.toString().isEmpty()) {
-            sb.append(convertIdentifier(innserSb.toString(), JavaIdentifier.PACKAGE));
+            sb.append(normalizeSpecificIdentifier(innserSb.toString(), JavaIdentifier.PACKAGE));
         }
         // returned normalized part of package name
         return sb.toString();
@@ -297,39 +308,10 @@ public final class NonJavaCharsConverter {
      * @return - java acceptable identifier
      */
     public static String normalizeClassIdentifier(final String packageName, final String className) {
-        final String convertedClassName = convertIdentifier(className, JavaIdentifier.CLASS);
+        final String convertedClassName = normalizeSpecificIdentifier(className, JavaIdentifier.CLASS);
         return normalizeClassIdentifier(packageName, convertedClassName, convertedClassName, FIRST_INDEX);
     }
 
-    /**
-     * Checking while there doesn't exist any class name with the same name (regardless of camel
-     * cases) in package.
-     *
-     * @param packageName
-     *            - package of class name
-     * @param origClassName
-     *            - original class name
-     * @param actualClassName
-     *            - actual class name with rank (serial number)
-     * @param rank
-     *            - actual rank (serial number)
-     * @return converted identifier
-     */
-    private static String normalizeClassIdentifier(final String packageName, final String origClassName,
-            final String actualClassName, final int rank) {
-        if (PACKAGES_MAP.containsKey(packageName)) {
-            for (final String existingName : PACKAGES_MAP.get(packageName)) {
-                if (existingName.toLowerCase().equals(actualClassName.toLowerCase())) {
-                    final int nextRank = rank + 1;
-                    return normalizeClassIdentifier(packageName, origClassName,
-                            new StringBuilder(origClassName).append(rank).toString(), nextRank);
-                }
-            }
-        }
-        PACKAGES_MAP.put(packageName, actualClassName);
-        return actualClassName;
-    }
-
     /**
      * Find and convert non Java chars in identifiers of generated transfer objects, initially
      * derived from corresponding YANG.
@@ -340,7 +322,11 @@ public final class NonJavaCharsConverter {
      *            - java type of identifier
      * @return - java acceptable identifier
      */
-    public static String convertIdentifier(final String identifier, final JavaIdentifier javaIdentifier) {
+    public static String normalizeSpecificIdentifier(final String identifier, final JavaIdentifier javaIdentifier) {
+        if (SPECIAL_RESERVED_WORDS.contains(identifier)) {
+            return identifier;
+        }
+
         final StringBuilder sb = new StringBuilder();
 
         // if identifier isn't PACKAGE type then check it by reserved keywords
@@ -386,6 +372,35 @@ public final class NonJavaCharsConverter {
         return fixCasesByJavaType(sb.toString().replace("__", "_").toLowerCase(), javaIdentifier);
     }
 
+    /**
+     * Checking while there doesn't exist any class name with the same name
+     * (regardless of camel cases) in package.
+     *
+     * @param packageName
+     *            - package of class name
+     * @param origClassName
+     *            - original class name
+     * @param actualClassName
+     *            - actual class name with rank (serial number)
+     * @param rank
+     *            - actual rank (serial number)
+     * @return converted identifier
+     */
+    private static String normalizeClassIdentifier(final String packageName, final String origClassName,
+            final String actualClassName, final int rank) {
+        if (PACKAGES_MAP.containsKey(packageName)) {
+            for (final String existingName : PACKAGES_MAP.get(packageName)) {
+                if (existingName.toLowerCase().equals(actualClassName.toLowerCase())) {
+                    final int nextRank = rank + 1;
+                    return normalizeClassIdentifier(packageName, origClassName,
+                            new StringBuilder(origClassName).append(rank).toString(), nextRank);
+                }
+            }
+        }
+        PACKAGES_MAP.put(packageName, actualClassName);
+        return actualClassName;
+    }
+
     /**
      * Fix cases of converted identifiers by Java type
      *
@@ -509,6 +524,6 @@ public final class NonJavaCharsConverter {
                 newName = convertIdentifierEnumValue(actualNameBuilder.toString(), origName, values, ++actualRank);
             }
         }
-        return convertIdentifier(newName, JavaIdentifier.ENUM_VALUE);
+        return normalizeSpecificIdentifier(newName, JavaIdentifier.ENUM_VALUE);
     }
 }
index 734863f7774c9ba6de73acc055a04fb14f4746df..eb59b796277818a107534adc2f2439c91c33c8dd 100644 (file)
@@ -17,7 +17,7 @@ import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType;
-import org.opendaylight.mdsal.binding.javav2.generator.util.NonJavaCharsConverter;
+import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
 import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType;
 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
@@ -121,7 +121,7 @@ public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuil
                 final String reference, final Status status, final List<Pair> values) {
 
             this.name = name;
-            this.mappedName = NonJavaCharsConverter.convertIdentifierEnumValue(name, values);
+            this.mappedName = JavaIdentifierNormalizer.normalizeEnumValueIdentifier(name, values);
             this.value = value;
             this.description = description;
             this.reference = reference;
@@ -14,23 +14,29 @@ import static org.junit.Assert.assertTrue;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
 
-public class NonJavaCharsConverterTest {
+public class JavaIdentifierNormalizerTest {
+
+    @Test
+    public void specialWordsTest(){
+        String normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "QName");
+        assertEquals("QName", normalizeIdentifier);
+    }
 
     /**
      * This test tests normalizing of enum and interface identifiers too.
      */
     @Test
     public void sameClassNamesSamePackageTest() {
-        String normalizeIdentifier1 = NonJavaCharsConverter.normalizeClassIdentifier("org.example.same.package", "Foo");
-        String normalizeIdentifier2 = NonJavaCharsConverter.normalizeClassIdentifier("org.example.same.package", "fOo");
+        String normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "Foo");
+        String normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "fOo");
         final String normalizeIdentifier3 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.same.package", "foo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "foo");
         assertEquals(normalizeIdentifier1, "Foo");
         assertEquals(normalizeIdentifier2, "Foo1");
         assertEquals(normalizeIdentifier3, "Foo2");
 
-        normalizeIdentifier1 = NonJavaCharsConverter.normalizeClassIdentifier("org.example.same.package", "*");
-        normalizeIdentifier2 = NonJavaCharsConverter.normalizeClassIdentifier("org.example.same.package", "asterisk");
+        normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "*");
+        normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "asterisk");
         assertEquals(normalizeIdentifier1, "Asterisk");
         assertEquals(normalizeIdentifier2, "Asterisk1");
     }
@@ -41,18 +47,18 @@ public class NonJavaCharsConverterTest {
     @Test
     public void sameClassNamesOtherPackageTest() {
         String normalizeIdentifier1 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.other.package", "Foo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "Foo");
         String normalizeIdentifier2 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.other.package.next", "fOo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "fOo");
         final String normalizeIdentifier3 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.other.package.next.next", "foo");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next.next", "foo");
         assertEquals(normalizeIdentifier1, "Foo");
         assertEquals(normalizeIdentifier2, "Foo");
         assertEquals(normalizeIdentifier3, "Foo");
 
-        normalizeIdentifier1 = NonJavaCharsConverter.normalizeClassIdentifier("org.example.other.package", "*");
+        normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "*");
         normalizeIdentifier2 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.other.package.next", "asterisk");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "asterisk");
         assertEquals(normalizeIdentifier1, "Asterisk");
         assertEquals(normalizeIdentifier2, "Asterisk");
     }
@@ -63,11 +69,11 @@ public class NonJavaCharsConverterTest {
     @Test
     public void sameClassNamesSamePackageReservedWordsTest() {
         final String normalizeIdentifier1 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.keywords.same.package", "int");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "int");
         final String normalizeIdentifier2 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.keywords.same.package", "InT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "InT");
         final String normalizeIdentifier3 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.keywords.same.package", "inT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "inT");
         assertEquals(normalizeIdentifier1, "IntReservedKeyword");
         assertEquals(normalizeIdentifier2, "IntReservedKeyword1");
         assertEquals(normalizeIdentifier3, "IntReservedKeyword2");
@@ -79,11 +85,11 @@ public class NonJavaCharsConverterTest {
     @Test
     public void sameClassNamesOtherPackageReservedWordsTest() {
         final String normalizeIdentifier1 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.keywords.other.package", "int");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package", "int");
         final String normalizeIdentifier2 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.keywords.other.package.next", "InT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next", "InT");
         final String normalizeIdentifier3 =
-                NonJavaCharsConverter.normalizeClassIdentifier("org.example.keywords.other.package.next.next", "inT");
+                JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next.next", "inT");
         assertEquals(normalizeIdentifier1, "IntReservedKeyword");
         assertEquals(normalizeIdentifier2, "IntReservedKeyword");
         assertEquals(normalizeIdentifier3, "IntReservedKeyword");
@@ -293,7 +299,7 @@ public class NonJavaCharsConverterTest {
     }
 
     private void testPackageReservedKeyword(final String reservedKeyword) {
-        final String packageNameNormalizer = NonJavaCharsConverter.normalizePackageNamePart(reservedKeyword);
+        final String packageNameNormalizer = JavaIdentifierNormalizer.normalizePartialPackageName(reservedKeyword);
         final StringBuilder expected = new StringBuilder(reservedKeyword).append('_');
         assertEquals(expected.toString().toLowerCase(), packageNameNormalizer);
     }
@@ -302,7 +308,7 @@ public class NonJavaCharsConverterTest {
     public void digitAtStartTest() {
         for (int i = 0; i < 10; i++) {
             final String str_i = String.valueOf(i);
-            final String packageNameNormalizer = NonJavaCharsConverter.normalizePackageNamePart(str_i);
+            final String packageNameNormalizer = JavaIdentifierNormalizer.normalizePartialPackageName(str_i);
             final String expected = Character.getName(str_i.charAt(0)).replaceAll(" ", "").toLowerCase();
             assertEquals(expected.toString(), packageNameNormalizer);
         }
@@ -323,7 +329,7 @@ public class NonJavaCharsConverterTest {
     }
 
     private void dashTest(final String tested, final String expected) {
-        final String actual = NonJavaCharsConverter.normalizePackageNamePart(tested);
+        final String actual = JavaIdentifierNormalizer.normalizePartialPackageName(tested);
         assertEquals(expected, actual);
     }
 
@@ -349,14 +355,14 @@ public class NonJavaCharsConverterTest {
     }
 
     private void normalizePackageNameTest(final String tested, final Object expected) {
-        final String packageNameNormalizer = NonJavaCharsConverter.normalizePackageNamePart(tested);
+        final String packageNameNormalizer = JavaIdentifierNormalizer.normalizePartialPackageName(tested);
         assertEquals(expected, packageNameNormalizer);
     }
 
     private void assertTest(final String testedIdentifier, final String acceptable,
             final JavaIdentifier javaTypeOfIdentifier) {
         final String convertedIdentifier =
-                NonJavaCharsConverter.convertIdentifier(testedIdentifier, javaTypeOfIdentifier);
+                JavaIdentifierNormalizer.normalizeSpecificIdentifier(testedIdentifier, javaTypeOfIdentifier);
         assertNotNull(convertedIdentifier);
         assertTrue(!convertedIdentifier.isEmpty());
         assertEquals(acceptable, convertedIdentifier);
@@ -414,7 +420,7 @@ public class NonJavaCharsConverterTest {
     }
 
     private void testRealPackageNameExample(final String tested, final String expected) {
-        final String actual = NonJavaCharsConverter.convertFullPackageName(tested);
+        final String actual = JavaIdentifierNormalizer.normalizeFullPackageName(tested);
         assertEquals(expected, actual);
     }
 }
index a6e1d073b76500286eeb14e7202d4684bfcfa63a..94908b76cf3ed53977b8c72c40958de8d426e0ab 100644 (file)
@@ -7,7 +7,7 @@
  *@
 
 @import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier.CLASS
-@import org.opendaylight.mdsal.binding.javav2.generator.util.NonJavaCharsConverter.convertIdentifier
+@import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer.normalizeSpecificIdentifier
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.TextTemplateUtil.getFormattedRevision
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.TextTemplateUtil.getSourcePath
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers.YangModuleInfoTemplateRenderer.getSortedQName
@@ -38,9 +38,9 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
 
 @generateSubInfo(module: Module) = {
 @for(submodule <- module.getSubmodules) {
-    private static final class @{convertIdentifier(submodule.getName, CLASS)}Info implements @{importedNames.get("yangModuleInfo")} {
+    private static final class @{normalizeSpecificIdentifier(submodule.getName, CLASS)}Info implements @{importedNames.get("yangModuleInfo")} {
 
-        private static final @{importedNames.get("yangModuleInfo")} INSTANCE = new @{convertIdentifier(submodule.getName, CLASS)}Info();
+        private static final @{importedNames.get("yangModuleInfo")} INSTANCE = new @{normalizeSpecificIdentifier(submodule.getName, CLASS)}Info();
 
         private final @{importedNames.get("string")} name = "@{submodule.getName}";
         private final @{importedNames.get("string")} namespace = "@{submodule.getNamespace.toString}";
@@ -52,7 +52,7 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
             return INSTANCE;
         }
 
-        @{classBody(submodule, convertIdentifier(submodule.getName + "Info", CLASS))}
+        @{classBody(submodule, normalizeSpecificIdentifier(submodule.getName + "Info", CLASS))}
     }
 }
 }
@@ -73,7 +73,7 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
         }
         @if(!module.getSubmodules.isEmpty) {
             @for(submodule <- module.getSubmodules) {
-                set.add(@{convertIdentifier(submodule.getName, CLASS)}Info.getInstance());
+                set.add(@{normalizeSpecificIdentifier(submodule.getName, CLASS)}Info.getInstance());
             }
         }
         @if(!module.getImports.isEmpty && !module.getSubmodules.isEmpty) {