Binding generator v2 - uses statement - uses inner type 99/61599/1
authorJie Han <han.jie@zte.com.cn>
Thu, 20 Jul 2017 07:02:27 +0000 (15:02 +0800)
committerJie Han <han.jie@zte.com.cn>
Mon, 14 Aug 2017 08:14:15 +0000 (16:14 +0800)
- 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 <han.jie@zte.com.cn>
(cherry picked from commit b9086681167b83e5aa6887dabbb749807f4c6206)

binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImplTest.java
binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3-base.yang [new file with mode: 0644]
binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-uses-leaf-innertype3.yang [new file with mode: 0644]

index d1c0719846ead5eac30518739071d92d1ae08c9e..abc4611da7e75e496e553b6383fedc80753ece5b 100644 (file)
@@ -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;
         }
index a0187c22b98082a4592c80f434fb07d522b4bfd7..fbfe586b692c6ff1493dfc51b90e3940039784b8 100644 (file)
@@ -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<String> 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<Type> 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 (file)
index 0000000..bf89889
--- /dev/null
@@ -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 (file)
index 0000000..7be844e
--- /dev/null
@@ -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