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;
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;
@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.
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);
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
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);
}