X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=binding2%2Fmdsal-binding2-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fjavav2%2Fgenerator%2Fimpl%2FAuxiliaryGenUtils.java;h=e8591dcccb45d9224082da96a4ed6b3ea9e4e607;hb=3cc71d48d6f1e686ac949827459041e281d9b3db;hp=071c133f3bf0220d680279fe89941a4396946200;hpb=9f1c7a47c852b775c62d723f5d6d5d2f2209bf82;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 071c133f3b..e8591dcccb 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 @@ -15,26 +15,22 @@ import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.BOOLEAN import com.google.common.annotations.Beta; 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 java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.regex.Pattern; -import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForModule; -import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForNode; -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.context.ModuleContext; 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.JavaIdentifierNormalizer; +import org.opendaylight.mdsal.binding.javav2.generator.util.TypeComments; 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.Constant; import org.opendaylight.mdsal.binding.javav2.model.api.Type; +import org.opendaylight.mdsal.binding.javav2.model.api.YangSourceDefinition; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder; @@ -43,13 +39,13 @@ import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTyp import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder; import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; 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; @@ -59,7 +55,6 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; /** * Auxiliary util class for {@link GenHelperUtil} class @@ -67,7 +62,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"); @@ -91,14 +86,6 @@ 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; - } - static Constant qNameConstant(final GeneratedTypeBuilderBase toBuilder, final String constantName, final QName name) { return toBuilder.addConstant(Types.typeForClass(QName.class), constantName, name); @@ -128,7 +115,7 @@ final class AuxiliaryGenUtils { * interfaceBuilder */ static MethodSignatureBuilder constructGetter(final GeneratedTypeBuilder interfaceBuilder, - final String schemaNodeName, final String comment, final Type returnType, final Status status) { + final String schemaNodeName, final String comment, final Type returnType, final Status status) { final MethodSignatureBuilder getMethod = interfaceBuilder .addMethod(getterMethodName(schemaNodeName, returnType)); @@ -150,133 +137,27 @@ final class AuxiliaryGenUtils { * @return string with the name of the getter method for * methodName in JAVA method format */ - private static String getterMethodName(final String localName, final Type returnType) { + @VisibleForTesting + static String getterMethodName(final String localName, final Type returnType) { final StringBuilder method = new StringBuilder(); if (BOOLEAN.equals(returnType)) { method.append("is"); } else { method.append("get"); } - // underscore used as separator for distinction of method parts in convertIdentifier() - method.append('_').append(localName); - return JavaIdentifierNormalizer.normalizeSpecificIdentifier(method.toString(), JavaIdentifier.METHOD); - } - - static String createDescription(final SchemaNode schemaNode, final String fullyQualifiedName, - final SchemaContext schemaContext, final boolean verboseClassComments) { - final StringBuilder sb = new StringBuilder(); - final String nodeDescription = encodeAngleBrackets(schemaNode.getDescription()); - final String formattedDescription = YangTextTemplate.formatToParagraph(nodeDescription, 0); - - if (!Strings.isNullOrEmpty(formattedDescription)) { - sb.append(formattedDescription); - sb.append(NEW_LINE); - } - - 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()); - sb.append(""); - sb.append(NEW_LINE); - sb.append("

");
-            sb.append(NEW_LINE);
-            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"); - sb.append(NEW_LINE); - sb.append(""); - sb.append(YangTextTemplate.formatSchemaPath(module.getName(), schemaNode.getPath().getPathFromRoot())); - sb.append(""); - sb.append(NEW_LINE); - - if (hasBuilderClass(schemaNode) && !(schemaNode instanceof OperationDefinition)) { - sb.append(NEW_LINE); - sb.append("

To create instances of this class use " + "{@link " + linkToBuilderClass + "}."); - sb.append(NEW_LINE); - sb.append("@see "); - sb.append(linkToBuilderClass); - sb.append(NEW_LINE); - if (schemaNode instanceof ListSchemaNode) { - final List keyDef = ((ListSchemaNode)schemaNode).getKeyDefinition(); - if (keyDef != null && !keyDef.isEmpty()) { - sb.append("@see "); - sb.append(className); - sb.append("Key"); - } - sb.append(NEW_LINE); - } - } - } - - return replaceAllIllegalChars(sb); - } - - static String createDescription(final Module module, final boolean verboseClassComments) { - final StringBuilder sb = new StringBuilder(); - final String moduleDescription = encodeAngleBrackets(module.getDescription()); - final String formattedDescription = YangTextTemplate.formatToParagraph(moduleDescription, 0); - - if (!Strings.isNullOrEmpty(formattedDescription)) { - sb.append(formattedDescription); - sb.append(NEW_LINE); - } - - if (verboseClassComments) { - sb.append("

"); - sb.append("This class represents the following YANG schema fragment defined in module "); - sb.append(module.getName()); - sb.append(""); - sb.append(NEW_LINE); - sb.append("

");
-            sb.append(NEW_LINE);
-            String formedYang = YangSnippetCleaner.clean(yangTemplateForModule.render(module).body());
-            sb.append(encodeAngleBrackets(formedYang));
-            sb.append("
"); - } - - return replaceAllIllegalChars(sb); + return method.append(JavaIdentifierNormalizer.normalizeSpecificIdentifier(localName, JavaIdentifier.CLASS)) + .toString(); } - static String createDescription(final Set schemaNodes, final Module module, final - boolean verboseClassComments) { - final StringBuilder sb = new StringBuilder(); - - if (!isNullOrEmpty(schemaNodes)) { - final SchemaNode node = schemaNodes.iterator().next(); - - if (node instanceof RpcDefinition) { - sb.append("Interface for implementing the following YANG RPCs defined in module " + module.getName() + ""); - } else if (node instanceof NotificationDefinition) { - sb.append("Interface for receiving the following YANG notifications defined in module " + module.getName() + ""); - } - } - sb.append(NEW_LINE); - - if (verboseClassComments) { - sb.append("
");
-            sb.append(NEW_LINE);
-            sb.append(encodeAngleBrackets(yangTemplateForNodes.render(schemaNodes, module).body()));
-            sb.append("
"); - sb.append(NEW_LINE); - } - - return replaceAllIllegalChars(sb); + 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 CaseSchemaNode)); } - private static boolean isNullOrEmpty(final Collection list) { + @VisibleForTesting + static boolean isNullOrEmpty(final Collection list) { return list == null || list.isEmpty(); } @@ -337,10 +218,10 @@ final class AuxiliaryGenUtils { * enumTypeDef */ static EnumBuilder resolveInnerEnumFromTypeDefinition(final EnumTypeDefinition enumTypeDef, final QName enumName, - final Map genCtx, final GeneratedTypeBuilder typeBuilder, final Module module) { + final Map genCtx, final GeneratedTypeBuilder typeBuilder, final Module module) { if (enumTypeDef != null && typeBuilder != null && enumTypeDef.getQName().getLocalName() != null) { - final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName.getLocalName()); - final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription()); + final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName.getLocalName(), genCtx.get(module)); + final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription().orElse(null)); enumBuilder.setDescription(enumTypedefDescription); enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef); final ModuleContext ctx = genCtx.get(module); @@ -374,7 +255,7 @@ final class AuxiliaryGenUtils { */ static GeneratedTOBuilder addTOToTypeBuilder(final TypeDefinition typeDef, final GeneratedTypeBuilder typeBuilder, final DataSchemaNode leaf, final Module parentModule, final TypeProvider typeProvider, - final SchemaContext schemaContext) { + final SchemaContext schemaContext, ModuleContext context, final Map genCtx) { final String classNameFromLeaf = leaf.getQName().getLocalName(); GeneratedTOBuilder genTOBuilder = null; final String packageName = typeBuilder.getFullyQualifiedName(); @@ -382,13 +263,14 @@ final class AuxiliaryGenUtils { genTOBuilder = ((TypeProviderImpl) typeProvider) .provideGeneratedTOBuilderForUnionTypeDef(packageName, ((UnionTypeDefinition) typeDef), classNameFromLeaf, leaf, schemaContext, - ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap()); + ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap(), context); } else if (typeDef instanceof BitsTypeDefinition) { genTOBuilder = (((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition( - packageName, typeDef, classNameFromLeaf, parentModule.getName()); + packageName, typeDef, classNameFromLeaf, parentModule.getName(), context); } if (genTOBuilder != null) { typeBuilder.addEnclosingTransferObject(genTOBuilder); + genCtx.get(parentModule).addInnerTypedefType(typeDef.getPath(), genTOBuilder); return genTOBuilder; } return null; @@ -397,31 +279,29 @@ 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 GeneratedTypeBuilder typeBuilder, final Module parentModule, final TypeProvider typeProvider, + final boolean verboseClassComments) { final GeneratedTOBuilderImpl returnType = (GeneratedTOBuilderImpl) genTOBuilder; - final String typedefDescription = encodeAngleBrackets(typeDef.getDescription()); - returnType.setDescription(typedefDescription); - returnType.setReference(typeDef.getReference()); + if (verboseClassComments) { + returnType.setYangSourceDefinition(YangSourceDefinition.of(parentModule, typeDef)); + TypeComments.description(typeDef).ifPresent(returnType::addComment); + typeDef.getDescription().ifPresent(returnType::setDescription); + typeDef.getReference().ifPresent(returnType::setReference); + } returnType.setSchemaPath((List) typeDef.getPath().getPathFromRoot()); returnType.setModuleName(parentModule.getName()); genTOBuilder.setTypedef(true); genTOBuilder.setIsUnion(true); - TypeProviderImpl.addUnitsToGenTO(genTOBuilder, typeDef.getUnits()); + TypeProviderImpl.addUnitsToGenTO(genTOBuilder, typeDef.getUnits().orElse(null)); return returnType.toInstance(); } 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; } /** @@ -436,18 +316,32 @@ final class AuxiliaryGenUtils { * list or empty TO builder if list is null or list of * key definitions is null or empty. */ - static GeneratedTOBuilder resolveListKeyTOBuilder(final String packageName, final ListSchemaNode list) { + static GeneratedTOBuilder resolveListKeyTOBuilder(final String packageName, final ListSchemaNode list, + ModuleContext context) { GeneratedTOBuilder genTOBuilder = 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(); - genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName); + genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName, context); } return genTOBuilder; } + static GeneratedTypeBuilder resolveListKeyTypeBuilder(final String packageName, final ListSchemaNode list, + ModuleContext context) { + 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, context); + } + return genTypeBuilder; + } + /** * Converts leaf schema node to property of generated TO * builder. @@ -469,16 +363,26 @@ 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 leafDesc = encodeAngleBrackets(leaf.getDescription()); + final String leafGetterName; + + if ("key".equals(leafName.toLowerCase())) { + StringBuilder sb = new StringBuilder(leafName) + .append('_').append("RESERVED_WORD"); + leafGetterName = sb.toString(); + } else { + leafGetterName = leafName; + } + + final String leafDesc = encodeAngleBrackets(leaf.getDescription().orElse(null)); final GeneratedPropertyBuilder propBuilder = - toBuilder.addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(leafName, JavaIdentifier.METHOD)); + toBuilder.addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(leafGetterName, JavaIdentifier.METHOD)); propBuilder.setReadOnly(isReadOnly); propBuilder.setReturnType(returnType); propBuilder.setComment(leafDesc);