From 6487567fed64353bfa731ea425d0576e2ebe9b7a Mon Sep 17 00:00:00 2001 From: Martin Ciglan Date: Fri, 9 Jun 2017 15:27:22 +0200 Subject: [PATCH] Binding generator v2 - leaf-list support - generate types & Java code - test yang file Change-Id: Idccbcf49bddb7a465e5951d5fa5490e0304bf7f8 Signed-off-by: Martin Ciglan (cherry picked from commit be73e89f50304188e22b375dddd88eefdc1bf83a) --- .../javav2/generator/impl/GenHelperUtil.java | 83 +++++++++++++++++-- .../resources/leaf-list/test-leaf-list.yang | 24 ++++++ 2 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 binding2/mdsal-binding2-generator-impl/src/test/resources/leaf-list/test-leaf-list.yang diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java index e050053455..a62e85c2a6 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java @@ -42,6 +42,7 @@ import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes; 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.ReferencedTypeImpl; import org.opendaylight.mdsal.binding.javav2.generator.util.Types; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedPropertyBuilderImpl; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl; @@ -51,6 +52,7 @@ import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderIm import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType; +import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType; import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions; import org.opendaylight.mdsal.binding.javav2.model.api.Type; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder; @@ -73,6 +75,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; +import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; @@ -395,7 +398,7 @@ final class GenHelperUtil { * @param schemaContext schema context * @return generated type builder schemaNode */ - static GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode + private static GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode, final Type parent, final Module module, final Map genCtx, final SchemaContext schemaContext, final boolean verboseClassComments, final Map> genTypeBuilders, final TypeProvider typeProvider) { @@ -528,11 +531,14 @@ final class GenHelperUtil { final GeneratedTypeBuilder typeBuilder, final GeneratedTypeBuilder childOf, final Module module, final Map genCtx, final SchemaContext schemaContext, final boolean verboseClassComments, final Map> genTypeBuilders, final TypeProvider typeProvider) { - //TODO: implement rest of schema nodes GTO building + if (node != null && typeBuilder != null) { if (node instanceof ContainerSchemaNode) { containerToGenType(module, basePackageName, typeBuilder, childOf, (ContainerSchemaNode) node, schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider); + } else if (node instanceof LeafListSchemaNode) { + resolveLeafListSchemaNode(schemaContext, typeBuilder, (LeafListSchemaNode) node, module, + typeProvider, genCtx); } else if (node instanceof LeafSchemaNode) { resolveLeafSchemaNodeAsMethod(schemaContext, typeBuilder, genCtx, (LeafSchemaNode) node, module, typeProvider); @@ -547,7 +553,6 @@ final class GenHelperUtil { (ChoiceSchemaNode) node, genTypeBuilders, genCtx, typeProvider); } } - } /** @@ -742,6 +747,72 @@ final class GenHelperUtil { return returnType; } + /** + * Converts node leaf list schema node to getter method of + * typeBuilder. + * + * @param typeBuilder + * generated type builder to which is node added as + * getter method + * @param node + * leaf list schema node which is added to + * typeBuilder as getter method + * @param module module + * @param typeProvider type provider instance + * @param genCtx actual generated context + * @param genCtx actual generated context + * @return boolean value + *
    + *
  • true - if node, typeBuilder, + * nodeName equal null or node is added by uses
  • + *
  • false - other cases
  • + *
+ */ + private static boolean resolveLeafListSchemaNode(final SchemaContext schemaContext, final GeneratedTypeBuilder + typeBuilder, final LeafListSchemaNode node, final Module module, final TypeProvider typeProvider, + final Map genCtx) { + if (node == null || typeBuilder == null || node.isAddedByUses()) { + return false; + } + + final QName nodeName = node.getQName(); + + final TypeDefinition typeDef = node.getType(); + final Module parentModule = findParentModule(schemaContext, node); + + Type returnType = null; + if (typeDef.getBaseType() == null) { + if (typeDef instanceof EnumTypeDefinition) { + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node); + final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef; + final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, nodeName, + genCtx, typeBuilder, module); + returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName()); + ((TypeProviderImpl) typeProvider).putReferencedType(node.getPath(), returnType); + } else if (typeDef instanceof UnionTypeDefinition) { + final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule, + typeProvider, schemaContext); + if (genTOBuilder != null) { + returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider); + } + } else if (typeDef instanceof BitsTypeDefinition) { + final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule, + typeProvider, schemaContext); + returnType = genTOBuilder.toInstance(); + } else { + final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions); + } + } else { + final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions); + } + + final ParameterizedType listType = Types.listTypeFor(returnType); + constructGetter(typeBuilder, nodeName.getLocalName(), node.getDescription(), listType, node.getStatus()); + return true; + } + /** * Converts caseNodes set to list of corresponding generated * types. @@ -934,8 +1005,10 @@ final class GenHelperUtil { AuxiliaryGenUtils.resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, leafGTp, true); } } else if (!schemaNode.isAddedByUses()) { - //TODO: implement leaf list to generated type - if (schemaNode instanceof ContainerSchemaNode) { + if (schemaNode instanceof LeafListSchemaNode) { + resolveLeafListSchemaNode(schemaContext, typeBuilder, (LeafListSchemaNode) schemaNode, module, + typeProvider, genCtx); + } else if (schemaNode instanceof ContainerSchemaNode) { containerToGenType(module, basePackageName, typeBuilder, typeBuilder, (ContainerSchemaNode) schemaNode, schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider); } else if (schemaNode instanceof ListSchemaNode) { diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/leaf-list/test-leaf-list.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/leaf-list/test-leaf-list.yang new file mode 100644 index 0000000000..8b9ca7819d --- /dev/null +++ b/binding2/mdsal-binding2-generator-impl/src/test/resources/leaf-list/test-leaf-list.yang @@ -0,0 +1,24 @@ +module test-leaf-list { + yang-version 1; + namespace "org.test.leaf-list"; + prefix "ll"; + + container *1my-cont { + leaf-list min-max-leaf-list { + min-elements 1; + max-elements 3; + type string; + } + + leaf-list unbounded-leaf-list { + type string; + } + + list unkeyed-list { + max-elements 1; + leaf unkeyed-leaf { + type string; + } + } + } +} \ No newline at end of file -- 2.36.6