From ec6debe00d863ac5f841ace0223013b4973bab70 Mon Sep 17 00:00:00 2001 From: Jie Han Date: Thu, 20 Jul 2017 15:02:27 +0800 Subject: [PATCH] Binding generator v2 - uses statement - uses inner type - for current implementation of yangtools does not copy "types" from groupings, but the original definition of a type is reused, so we should find inner type added by uses by original node. this patch should be merged with: - https://git.opendaylight.org/gerrit/60527 - https://git.opendaylight.org/gerrit/60529 - add yangs and test Change-Id: I4336bbf04c25b6caf2a1bd3101760fc3fc40421e Signed-off-by: Jie Han (cherry picked from commit b9086681167b83e5aa6887dabbb749807f4c6206) --- .../javav2/generator/impl/GenHelperUtil.java | 22 +++++---- .../impl/BindingGeneratorImplTest.java | 40 ++++++++++++++++- .../test-uses-leaf-innertype3-base.yang | 15 +++++++ .../test-uses-leaf-innertype3.yang | 45 +++++++++++++++++++ 4 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3-base.yang create mode 100644 binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3.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 d1c0719846..abc4611da7 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 @@ -859,21 +859,20 @@ final class GenHelperUtil { if (leaf.isAddedByUses()) { Preconditions.checkState(leaf instanceof DerivableSchemaNode); - LeafSchemaNode originalLeaf = (LeafSchemaNode)((DerivableSchemaNode) leaf).getOriginal().orNull(); - Preconditions.checkNotNull(originalLeaf); - if (isInnerType(originalLeaf, typeDef)) { - if (typeDef instanceof EnumTypeDefinition - || typeDef instanceof UnionTypeDefinition - || typeDef instanceof BitsTypeDefinition) { + if (isInnerType(leaf, typeDef)) { + final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); + returnType = typeProvider.javaTypeForSchemaDefinitionType(getBaseOrDeclaredType(typeDef), leaf, + restrictions, genCtx.get(module)); + } else { + if (typeDef.getBaseType() == null && (typeDef instanceof EnumTypeDefinition + || typeDef instanceof UnionTypeDefinition || typeDef instanceof BitsTypeDefinition)) { + LeafSchemaNode originalLeaf = (LeafSchemaNode) ((DerivableSchemaNode) leaf).getOriginal().orNull(); + Preconditions.checkNotNull(originalLeaf); returnType = genCtx.get(findParentModule(schemaContext, originalLeaf)).getInnerType(typeDef.getPath()); } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); - returnType = typeProvider.javaTypeForSchemaDefinitionType(getBaseOrDeclaredType(typeDef), leaf, - restrictions, genCtx.get(module)); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions, genCtx.get(module)); } - } else { - final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions, genCtx.get(module)); } } else if (isInnerType(leaf, typeDef)) { if (typeDef instanceof EnumTypeDefinition) { @@ -912,7 +911,6 @@ final class GenHelperUtil { returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions, genCtx.get(module)); } - if (returnType == null) { return null; } diff --git a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImplTest.java b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImplTest.java index a0187c22b9..fbfe586b69 100644 --- a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImplTest.java +++ b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImplTest.java @@ -22,7 +22,6 @@ 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.MethodSignature; import org.opendaylight.mdsal.binding.javav2.model.api.Type; -import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; @@ -199,6 +198,45 @@ public class BindingGeneratorImplTest { } } + @Test + public void generatedTypesUsesLeafInnertype3Test() throws Exception { + final BindingGenerator bg = new BindingGeneratorImpl(false); + final List sources = new ArrayList<>(); + sources.add("/uses-statement/test-uses-leaf-innertype3-base.yang"); + sources.add("/uses-statement/test-uses-leaf-innertype3.yang"); + final SchemaContext context = YangParserTestUtils.parseYangSources(sources); + final List generateTypes = bg.generateTypes(context); + assertNotNull(generateTypes); + assertTrue(!generateTypes.isEmpty()); + for (final Type type : generateTypes) { + if (type.getName().equals("MyCont") && type.getPackageName() + .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype3.rev170809.data")) { + final GeneratedType gt = (GeneratedType) type; + for (MethodSignature methodSignature : gt.getMethodDefinitions()) { + if (methodSignature.getName().equals("getBandwidth")) { + assertEquals("Bandwidth", methodSignature.getReturnType().getName()); + } + } + + } + + if (type.getName().equals("Open") && type.getPackageName() + .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype3.rev170809.data")) { + final GeneratedType gt = (GeneratedType) type; + for (MethodSignature methodSignature : gt.getMethodDefinitions()) { + if (methodSignature.getName().equals("getVersion")) { + assertEquals("ProtocolVersion", methodSignature.getReturnType().getName()); + } + + if (methodSignature.getName().equals("getLeafUnion")) { + assertEquals("LeafUnion", methodSignature.getReturnType().getName()); + } + } + + } + } + } + @Test public void generatedTypesTest() throws Exception { final BindingGenerator bg = new BindingGeneratorImpl(false); diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3-base.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3-base.yang new file mode 100644 index 0000000000..bf89889d36 --- /dev/null +++ b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3-base.yang @@ -0,0 +1,15 @@ +module test-uses-leaf-innertype3-base{ + namespace "urn:test:uses:leaf:innertype3:base"; + prefix base; + revision 2017-08-09; + + typedef float32 { + type binary { + length 4; + } + } + + typedef bandwidth { + type float32; + } +} \ No newline at end of file diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3.yang new file mode 100644 index 0000000000..7be844e8cf --- /dev/null +++ b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3.yang @@ -0,0 +1,45 @@ +module test-uses-leaf-innertype3{ + namespace "urn:test:uses:leaf:innertype3"; + prefix innertype3; + revision 2017-08-09; + import test-uses-leaf-innertype3-base { + prefix base; + } + + typedef protocol-version { + type uint8 { + range 1..7; + } + } + + grouping open-message { + leaf version { + type protocol-version; + default 4; + } + + leaf leaf-union { + type union { + type string; + type int64; + } + } + } + + grouping link-bandwidth-extended-community { + leaf bandwidth { + mandatory true; + type base:bandwidth; + units "bytes per second"; + } + } + + container my-cont { + uses link-bandwidth-extended-community; + } + + notification open { + uses open-message; + } + +} \ No newline at end of file -- 2.36.6