X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding2%2Fmdsal-binding2-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fjavav2%2Fgenerator%2Fimpl%2FAuxiliaryGenUtils.java;h=4432555e945577263895d51e69709f7a52aa8fd6;hb=d68c7fe825e06409bdd721dd15437ae72be097c5;hp=55c37a9903409cd6d9cfedf90051a72cb919f57d;hpb=366dfa184c09f8817df9a4ecdd17e6d46a07f65d;p=mdsal.git diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java index 55c37a9903..4432555e94 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java @@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.javav2.generator.impl; import static com.google.common.base.Preconditions.checkArgument; import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.encodeAngleBrackets; +import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.replacePackageTopNamespace; import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.BOOLEAN; import com.google.common.annotations.Beta; @@ -17,8 +18,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -29,12 +28,14 @@ import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForN import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForNodes; 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.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.YangSnippetCleaner; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl; +import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl; import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl; -import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier; import org.opendaylight.mdsal.binding.javav2.model.api.Constant; import org.opendaylight.mdsal.binding.javav2.model.api.Type; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder; @@ -44,13 +45,16 @@ import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTyp import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilderBase; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder; import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType; +import org.opendaylight.mdsal.binding.javav2.util.BindingMapping; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; +import org.opendaylight.yangtools.yang.model.api.OperationDefinition; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; @@ -68,7 +72,7 @@ import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; @Beta final class AuxiliaryGenUtils { - private static final Splitter BSDOT_SPLITTER = Splitter.on("\\."); + private static final Splitter BSDOT_SPLITTER = Splitter.on("."); private static final char NEW_LINE = '\n'; private static final Pattern UNICODE_CHAR_PATTERN = Pattern.compile("\\\\+u"); @@ -92,12 +96,11 @@ final class AuxiliaryGenUtils { } } - private static boolean hasBuilderClass(final SchemaNode schemaNode) { - if (schemaNode instanceof ContainerSchemaNode || schemaNode instanceof ListSchemaNode || - schemaNode instanceof RpcDefinition || schemaNode instanceof NotificationDefinition) { - return true; - } - return false; + public static boolean hasBuilderClass(final SchemaNode schemaNode, final BindingNamespaceType namespaceType) { + return (namespaceType.equals(BindingNamespaceType.Data) + && (schemaNode instanceof ContainerSchemaNode || schemaNode instanceof ListSchemaNode + || schemaNode instanceof RpcDefinition || schemaNode instanceof NotificationDefinition + || schemaNode instanceof ChoiceCaseNode)); } static Constant qNameConstant(final GeneratedTypeBuilderBase toBuilder, final String constantName, @@ -160,11 +163,12 @@ 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, - final SchemaContext schemaContext, final boolean verboseClassComments) { + final SchemaContext schemaContext, final boolean verboseClassComments, + final BindingNamespaceType namespaceType) { final StringBuilder sb = new StringBuilder(); final String nodeDescription = encodeAngleBrackets(schemaNode.getDescription()); final String formattedDescription = YangTextTemplate.formatToParagraph(nodeDescription, 0); @@ -174,17 +178,8 @@ final class AuxiliaryGenUtils { sb.append(NEW_LINE); } + final Module module = SchemaContextUtil.findParentModule(schemaContext, schemaNode); if (verboseClassComments) { - final Module module = SchemaContextUtil.findParentModule(schemaContext, schemaNode); - final StringBuilder linkToBuilderClass = new StringBuilder(); - final String[] namespace = Iterables.toArray(BSDOT_SPLITTER.split(fullyQualifiedName), String.class); - final String className = namespace[namespace.length - 1]; - - if (hasBuilderClass(schemaNode)) { - linkToBuilderClass.append(className); - linkToBuilderClass.append("Builder"); - } - sb.append("

"); sb.append("This class represents the following YANG schema fragment defined in module "); sb.append(module.getName()); @@ -192,7 +187,8 @@ final class AuxiliaryGenUtils { sb.append(NEW_LINE); sb.append("

");
             sb.append(NEW_LINE);
-            sb.append(encodeAngleBrackets(yangTemplateForNode.render(schemaNode, module).body()));
+            String formedYang = YangSnippetCleaner.clean(yangTemplateForNode.render(schemaNode, module).body());
+            sb.append(encodeAngleBrackets(formedYang));
             sb.append("
"); sb.append(NEW_LINE); sb.append("The schema path to identify an instance is"); @@ -202,7 +198,14 @@ final class AuxiliaryGenUtils { sb.append(""); sb.append(NEW_LINE); - if (hasBuilderClass(schemaNode)) { + if (hasBuilderClass(schemaNode, namespaceType) && !(schemaNode instanceof OperationDefinition)) { + final StringBuilder linkToBuilderClass = new StringBuilder(); + final String basePackageName = BindingMapping.getRootPackageName(module); + + linkToBuilderClass + .append(replacePackageTopNamespace(basePackageName, fullyQualifiedName, + namespaceType, BindingNamespaceType.Builder)) + .append("Builder"); sb.append(NEW_LINE); sb.append("

To create instances of this class use " + "{@link " + linkToBuilderClass + "}."); sb.append(NEW_LINE); @@ -210,11 +213,21 @@ final class AuxiliaryGenUtils { sb.append(linkToBuilderClass); sb.append(NEW_LINE); if (schemaNode instanceof ListSchemaNode) { + final StringBuilder linkToKeyClass = new StringBuilder(); + + final String[] namespace = Iterables.toArray(BSDOT_SPLITTER.split(fullyQualifiedName), String.class); + final String className = namespace[namespace.length - 1]; + + linkToKeyClass.append(BindingGeneratorUtil.packageNameForSubGeneratedType(basePackageName, schemaNode, + BindingNamespaceType.Key)) + .append('.') + .append(className) + .append("Key"); + final List keyDef = ((ListSchemaNode)schemaNode).getKeyDefinition(); if (keyDef != null && !keyDef.isEmpty()) { sb.append("@see "); - sb.append(className); - sb.append("Key"); + sb.append(linkToKeyClass); } sb.append(NEW_LINE); } @@ -242,7 +255,8 @@ final class AuxiliaryGenUtils { sb.append(NEW_LINE); sb.append("

");
             sb.append(NEW_LINE);
-            sb.append(encodeAngleBrackets(yangTemplateForModule.render(module).body()));
+            String formedYang = YangSnippetCleaner.clean(yangTemplateForModule.render(module).body());
+            sb.append(encodeAngleBrackets(formedYang));
             sb.append("
"); } @@ -302,7 +316,7 @@ final class AuxiliaryGenUtils { } /** - * @param unknownSchemaNodes unknows schema nodes + * @param unknownSchemaNodes unknown schema nodes * @return nodeParameter of UnknownSchemaNode */ static String getAugmentIdentifier(final List unknownSchemaNodes) { @@ -375,38 +389,20 @@ final class AuxiliaryGenUtils { typeBuilder, final DataSchemaNode leaf, final Module parentModule, final TypeProvider typeProvider, final SchemaContext schemaContext) { final String classNameFromLeaf = leaf.getQName().getLocalName(); - final List genTOBuilders = new ArrayList<>(); + GeneratedTOBuilder genTOBuilder = null; final String packageName = typeBuilder.getFullyQualifiedName(); if (typeDef instanceof UnionTypeDefinition) { - final List types = ((TypeProviderImpl) typeProvider) - .provideGeneratedTOBuildersForUnionTypeDef(packageName, ((UnionTypeDefinition) typeDef), - classNameFromLeaf, leaf, schemaContext, ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap()); - genTOBuilders.addAll(types); - - GeneratedTOBuilder resultTOBuilder; - if (types.isEmpty()) { - throw new IllegalStateException("No GeneratedTOBuilder objects generated from union " + typeDef); - } - resultTOBuilder = types.remove(0); - for (final GeneratedTOBuilder genTOBuilder : types) { - resultTOBuilder.addEnclosingTransferObject(genTOBuilder); - } - - final GeneratedPropertyBuilder genPropBuilder = resultTOBuilder.addProperty("value"); - genPropBuilder.setReturnType(Types.CHAR_ARRAY); - resultTOBuilder.addEqualsIdentity(genPropBuilder); - resultTOBuilder.addHashIdentity(genPropBuilder); - resultTOBuilder.addToStringProperty(genPropBuilder); - + genTOBuilder = ((TypeProviderImpl) typeProvider) + .provideGeneratedTOBuilderForUnionTypeDef(packageName, ((UnionTypeDefinition) typeDef), + classNameFromLeaf, leaf, schemaContext, + ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap()); } else if (typeDef instanceof BitsTypeDefinition) { - genTOBuilders.add((((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition( - packageName, typeDef, classNameFromLeaf, parentModule.getName())); + genTOBuilder = (((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition( + packageName, typeDef, classNameFromLeaf, parentModule.getName()); } - if (!genTOBuilders.isEmpty()) { - for (final GeneratedTOBuilder genTOBuilder : genTOBuilders) { - typeBuilder.addEnclosingTransferObject(genTOBuilder); - } - return genTOBuilders.get(0); + if (genTOBuilder != null) { + typeBuilder.addEnclosingTransferObject(genTOBuilder); + return genTOBuilder; } return null; @@ -415,8 +411,7 @@ final class AuxiliaryGenUtils { @SuppressWarnings({ "unchecked", "rawtypes" }) static Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final TypeDefinition typeDef, final GeneratedTypeBuilder typeBuilder, final Module parentModule, final TypeProvider typeProvider) { - final GeneratedTOBuilderImpl returnType = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(), - genTOBuilder.getName()); + final GeneratedTOBuilderImpl returnType = (GeneratedTOBuilderImpl) genTOBuilder; final String typedefDescription = encodeAngleBrackets(typeDef.getDescription()); returnType.setDescription(typedefDescription); @@ -428,51 +423,12 @@ final class AuxiliaryGenUtils { genTOBuilder.setIsUnion(true); TypeProviderImpl.addUnitsToGenTO(genTOBuilder, typeDef.getUnits()); - - - final GeneratedTOBuilder unionBuilder = createUnionBuilder(genTOBuilder,typeBuilder); - - - final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance"); - method.setReturnType(returnType); - method.addParameter(Types.STRING, "defaultValue"); - method.setAccessModifier(AccessModifier.PUBLIC); - method.setStatic(true); - - final Set types = ((TypeProviderImpl) typeProvider).getAdditionalTypes().get(parentModule); - if (types == null) { - ((TypeProviderImpl) typeProvider).getAdditionalTypes().put(parentModule, - Sets.newHashSet(unionBuilder.toInstance())); - } else { - types.add(unionBuilder.toInstance()); - } return returnType.toInstance(); } - private static GeneratedTOBuilder createUnionBuilder(final GeneratedTOBuilder genTOBuilder, final GeneratedTypeBuilder typeBuilder) { - final String outerCls = Types.getOuterClassName(genTOBuilder); - final StringBuilder name; - if (outerCls != null) { - name = new StringBuilder(outerCls); - } else { - name = new StringBuilder(); - } - name.append(genTOBuilder.getName()); - name.append("Builder"); - final GeneratedTOBuilderImpl unionBuilder = new GeneratedTOBuilderImpl(typeBuilder.getPackageName(),name.toString()); - unionBuilder.setIsUnionBuilder(true); - return unionBuilder; - } - static boolean isInnerType(final LeafSchemaNode leaf, final TypeDefinition type) { - if (leaf.getPath().equals(type.getPath())) { - return true; - } - if (leaf.getPath().equals(type.getPath().getParent())) { - return true; - } + return leaf.getPath().equals(type.getPath()) || leaf.getPath().equals(type.getPath().getParent()); - return false; } /** @@ -494,12 +450,23 @@ final class AuxiliaryGenUtils { final String genTOName = new StringBuilder(list.getQName().getLocalName()).append('_').append(BindingNamespaceType.Key) .toString(); - genTOBuilder = - new GeneratedTOBuilderImpl(new StringBuilder(packageName).append(".wrapper").toString(), genTOName); + genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName); } return genTOBuilder; } + static GeneratedTypeBuilder resolveListKeyTypeBuilder(final String packageName, final ListSchemaNode list) { + GeneratedTypeBuilder genTypeBuilder = null; + if ((list.getKeyDefinition() != null) && (!list.getKeyDefinition().isEmpty())) { + // underscore used as separator for distinction of class name parts + final String genTOName = + new StringBuilder(list.getQName().getLocalName()).append('_').append(BindingNamespaceType.Key) + .toString(); + genTypeBuilder = new GeneratedTypeBuilderImpl(packageName, genTOName); + } + return genTypeBuilder; + } + /** * Converts leaf schema node to property of generated TO * builder. @@ -521,16 +488,23 @@ final class AuxiliaryGenUtils { *
  • true - other cases
  • * */ - static boolean resolveLeafSchemaNodeAsProperty(final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf, + static boolean resolveLeafSchemaNodeAsProperty(final String nodeName, final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf, final Type returnType, final boolean isReadOnly) { if (returnType == null) { return false; } final String leafName = leaf.getQName().getLocalName(); + final String leafGetterName; + + StringBuilder sb = new StringBuilder(nodeName) + .append('_') + .append(leafName); + leafGetterName = sb.toString(); + final String leafDesc = encodeAngleBrackets(leaf.getDescription()); final GeneratedPropertyBuilder propBuilder = - toBuilder.addProperty(NonJavaCharsConverter.convertIdentifier(leafName, JavaIdentifier.METHOD)); + toBuilder.addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(leafGetterName, JavaIdentifier.METHOD)); propBuilder.setReadOnly(isReadOnly); propBuilder.setReturnType(returnType); propBuilder.setComment(leafDesc);