Refactor mdsal-binding-generator artifacts
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / yang / types / AbstractTypeProvider.java
@@ -8,21 +8,26 @@
 package org.opendaylight.mdsal.binding.yang.types;
 
 import static java.util.Objects.requireNonNull;
-import static org.opendaylight.mdsal.binding.model.util.BindingTypes.TYPE_OBJECT;
+import static org.opendaylight.mdsal.binding.model.ri.BindingTypes.TYPE_OBJECT;
 
+import com.google.common.base.CharMatcher;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeMap;
+import org.opendaylight.mdsal.binding.generator.BindingGeneratorUtil;
+import org.opendaylight.mdsal.binding.generator.impl.reactor.SerialVersionHelper;
 import org.opendaylight.mdsal.binding.model.api.AccessModifier;
 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
 import org.opendaylight.mdsal.binding.model.api.Enumeration;
@@ -37,14 +42,14 @@ import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
-import org.opendaylight.mdsal.binding.model.util.BaseYangTypes;
-import org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil;
-import org.opendaylight.mdsal.binding.model.util.BindingTypes;
-import org.opendaylight.mdsal.binding.model.util.TypeConstants;
-import org.opendaylight.mdsal.binding.model.util.Types;
-import org.opendaylight.mdsal.binding.model.util.generated.type.builder.AbstractEnumerationBuilder;
-import org.opendaylight.mdsal.binding.model.util.generated.type.builder.GeneratedPropertyBuilderImpl;
+import org.opendaylight.mdsal.binding.model.ri.BaseYangTypes;
+import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
+import org.opendaylight.mdsal.binding.model.ri.TypeConstants;
+import org.opendaylight.mdsal.binding.model.ri.Types;
+import org.opendaylight.mdsal.binding.model.ri.generated.type.builder.AbstractEnumerationBuilder;
+import org.opendaylight.mdsal.binding.model.ri.generated.type.builder.GeneratedPropertyBuilderImpl;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
@@ -67,6 +72,7 @@ import org.opendaylight.yangtools.yang.model.spi.ModuleDependencySort;
 @Deprecated(forRemoval = true)
 abstract class AbstractTypeProvider implements TypeProvider {
     private static final JavaTypeName DEPRECATED_ANNOTATION = JavaTypeName.create(Deprecated.class);
+    private static final CharMatcher DASH_COLON_MATCHER = CharMatcher.anyOf("-:");
 
     /**
      * Contains the schema data red from YANG files.
@@ -735,7 +741,7 @@ abstract class AbstractTypeProvider implements TypeProvider {
     private GeneratedTOBuilder typedefToTransferObject(final String basePackageName,
             final TypeDefinition<?> typedef, final String moduleName) {
         final JavaTypeName name = JavaTypeName.create(
-                BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typedef.getPath()),
+                packageNameForGeneratedType(basePackageName, typedef.getPath()),
                 BindingMapping.getClassName(typedef.getQName().getLocalName()));
 
         final GeneratedTOBuilder newType = newGeneratedTOBuilder(name);
@@ -745,6 +751,39 @@ abstract class AbstractTypeProvider implements TypeProvider {
         return newType;
     }
 
+    /**
+     * Creates package name from specified <code>basePackageName</code> (package name for module)
+     * and <code>schemaPath</code>. Resulting package name is concatenation of <code>basePackageName</code>
+     * and all local names of YANG nodes which are parents of some node for which <code>schemaPath</code> is specified.
+     *
+     * @param basePackageName string with package name of the module, MUST be normalized, otherwise this method may
+     *                        return an invalid string.
+     * @param schemaPath list of names of YANG nodes which are parents of some node + name of this node
+     * @return string with valid JAVA package name
+     * @throws NullPointerException if any of the arguments are null
+     */
+    private static String packageNameForGeneratedType(final String basePackageName, final SchemaPath schemaPath) {
+        final int size = Iterables.size(schemaPath.getPathTowardsRoot()) - 1;
+        if (size <= 0) {
+            return basePackageName;
+        }
+
+        return generateNormalizedPackageName(basePackageName, schemaPath.getPathFromRoot(), size);
+    }
+
+    private static String generateNormalizedPackageName(final String base, final Iterable<QName> path, final int size) {
+        final StringBuilder builder = new StringBuilder(base);
+        final Iterator<QName> iterator = path.iterator();
+        for (int i = 0; i < size; ++i) {
+            builder.append('.');
+            final String nodeLocalName = iterator.next().getLocalName();
+            // FIXME: Collon ":" is invalid in node local name as per RFC6020, identifier statement.
+            builder.append(DASH_COLON_MATCHER.replaceFrom(nodeLocalName, '.'));
+        }
+        return BindingMapping.normalizePackageName(builder.toString());
+    }
+
+
     /**
      * Converts <code>typeDef</code> which should be of the type <code>BitsTypeDefinition</code>
      * to <code>GeneratedTOBuilder</code>. All the bits of the typeDef are added to returning generated TO as
@@ -873,7 +912,7 @@ abstract class AbstractTypeProvider implements TypeProvider {
     private static void makeSerializable(final GeneratedTOBuilder gto) {
         gto.addImplementsType(Types.serializableType());
         final GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("serialVersionUID");
-        prop.setValue(Long.toString(BindingGeneratorUtil.computeDefaultSUID(gto)));
+        prop.setValue(Long.toString(SerialVersionHelper.computeDefaultSUID(gto)));
         gto.setSUID(prop);
     }