Bug 1411 #1 BindingGeneratorImpl decomposition - Container schema nodes
[mdsal.git] / binding2 / mdsal-binding2-util / src / main / java / org / opendaylight / mdsal / binding / javav2 / util / BindingMapping.java
index e451014a3aac127b68fed1d9fc866868d569331b..217eff14d2b4a7a8773809eae6e6e38d089aad8e 100644 (file)
@@ -19,7 +19,7 @@ import java.text.SimpleDateFormat;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.opendaylight.yangtools.concepts.SemVer;
+import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
 import org.opendaylight.yangtools.yang.model.api.Module;
 
 /**
@@ -36,7 +36,11 @@ public final class BindingMapping {
             "true", "try", "void", "volatile", "while");
 
     public static final String QNAME_STATIC_FIELD_NAME = "QNAME";
-    public static final String PACKAGE_PREFIX = "org.opendaylight.yang.gen.v2";
+
+    /**
+     * Package prefix for Binding v2 generated Java code structures
+     */
+    public static final String PACKAGE_PREFIX = "org.opendaylight.mdsal.gen.javav2";
 
     private static final Splitter DOT_SPLITTER = Splitter.on('.');
     private static final Interner<String> PACKAGE_INTERNER = Interners.newWeakInterner();
@@ -105,16 +109,30 @@ public final class BindingMapping {
             packageNameBuilder.append('.');
         }
 
-        final SemVer semVer = module.getSemanticVersion();
-        if (semVer != null) {
-            packageNameBuilder.append(semVer.toString());
-        } else {
-            packageNameBuilder.append("rev");
-            packageNameBuilder.append(PACKAGE_DATE_FORMAT.get().format(module.getRevision()));
-        }
-        return normalizePackageName(packageNameBuilder.toString());
+        //TODO: per yangtools dev, semantic version not used yet
+//        final SemVer semVer = module.getSemanticVersion();
+//        if (semVer != null) {
+//            packageNameBuilder.append(semVer.toString());
+//        } else {
+//            packageNameBuilder.append("rev");
+//            packageNameBuilder.append(PACKAGE_DATE_FORMAT.get().format(module.getRevision()));
+//        }
+
+        packageNameBuilder.append("rev");
+        packageNameBuilder.append(PACKAGE_DATE_FORMAT.get().format(module.getRevision()));
+
+        //seems to be duplicate call, because normalizing is run again on full packagename + localName
+        //return normalizePackageName(packageNameBuilder.toString(), null);
+        return packageNameBuilder.toString();
     }
 
+    /**
+     * This method normalizes input package name to become valid package identifier
+     * and appends Binding v2 specific namespace type
+     *
+     * @param packageName package name
+     * @return normalized package name
+     */
     public static String normalizePackageName(final String packageName) {
         if (packageName == null) {
             return null;
@@ -130,10 +148,15 @@ public final class BindingMapping {
                 builder.append('.');
             }
 
-            //FIXME: don't use underscore in v2
+            //TODO: incorporate use of PackageNameNormalizer (impl in progress)
+            //TODO: to not to worry about various characters in identifiers,
+            //TODO: relying on https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html
+
+            //FIXME: delete this custom check when naming convention patch above is merged
             if (Character.isDigit(p.charAt(0)) || BindingMapping.JAVA_RESERVED_WORDS.contains(p)) {
                 builder.append('_');
             }
+
             builder.append(p);
         }
 
@@ -141,6 +164,11 @@ public final class BindingMapping {
         return PACKAGE_INTERNER.intern(builder.toString());
     }
 
+    /**
+     * Prepares valid Java class name
+     * @param localName
+     * @return class name
+     */
     public static String getClassName(final String localName) {
         Preconditions.checkArgument(localName != null, "Name should not be null.");
         return toFirstUpper(toCamelCase(localName));
@@ -193,6 +221,44 @@ public final class BindingMapping {
         return s.substring(0, 1).toUpperCase() + s.substring(1);
     }
 
+    /**
+     * Prepares Java property name for method getter code generation
+     * @param yangIdentifier given YANG element local name
+     * @return property name
+     */
+    public static String getPropertyName(final String yangIdentifier) {
+        final String potential = toFirstLower(toCamelCase(yangIdentifier));
+        if ("class".equals(potential)) {
+            return "xmlClass";
+        }
+        return potential;
+    }
+
+    /**
+     * Returns the {@link String} {@code s} with an
+     * {@link Character#isLowerCase(char) lower case} first character. This
+     * function is null-safe.
+     *
+     * @param s
+     *            the string that should get an lower case first character. May
+     *            be <code>null</code>.
+     * @return the {@link String} {@code s} with an lower case first character
+     *         or <code>null</code> if the input {@link String} {@code s} was
+     *         <code>null</code>.
+     */
+    private static String toFirstLower(final String s) {
+        if (s == null || s.length() == 0) {
+            return s;
+        }
+        if (Character.isLowerCase(s.charAt(0))) {
+            return s;
+        }
+        if (s.length() == 1) {
+            return s.toLowerCase();
+        }
+        return s.substring(0, 1).toLowerCase() + s.substring(1);
+    }
+
     //TODO: further implementation of static util methods...
 
 }