Bug 8634: list & leaf-list compilability fix 97/58897/1
authorMartin Ciglan <martin.ciglan@pantheon.tech>
Tue, 13 Jun 2017 10:39:12 +0000 (12:39 +0200)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Tue, 13 Jun 2017 20:58:18 +0000 (20:58 +0000)
- compilability fix for list & leaf-list generated code
- tested yangs
- make sure 'leaf key' as key makes no harm

Change-Id: I1b4e5f4ac7c0070672d6a33b0db62976c2b3f507
Signed-off-by: Martin Ciglan <martin.ciglan@pantheon.tech>
(cherry picked from commit d680dcd8d76d637bb67112074d609f855c63fee6)

binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java
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/list/test-leaf-list.yang [moved from binding2/mdsal-binding2-generator-impl/src/test/resources/leaf-list/test-leaf-list.yang with 100% similarity]
binding2/mdsal-binding2-generator-impl/src/test/resources/list/test-list.yang [new file with mode: 0644]
binding2/mdsal-binding2-generator-impl/src/test/resources/list/test-list2.yang [new file with mode: 0644]

index e76f95ad45a692cc546671f27187fa4b8970ec9f..a0ee17e183fdc426610109ad8b1aac29922d8333 100644 (file)
@@ -496,7 +496,7 @@ final class AuxiliaryGenUtils {
                     new StringBuilder(list.getQName().getLocalName()).append('_').append(BindingNamespaceType.Key)
                             .toString();
             genTOBuilder =
-                    new GeneratedTOBuilderImpl(new StringBuilder(packageName).append(".wrapper").toString(), genTOName);
+                    new GeneratedTOBuilderImpl(new StringBuilder(packageName).toString(), genTOName);
         }
         return genTOBuilder;
     }
index 45dbb9c84526685a668eaeb83c47948c8daaaf9c..1b542527ce5754c9f35aa0d5b243c76a68bbd32e 100644 (file)
@@ -91,6 +91,7 @@ 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;
+import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
 
 /**
  * Helper util class used for generation of types in Binding spec v2.
@@ -542,7 +543,7 @@ final class GenHelperUtil {
                 resolveLeafListSchemaNode(schemaContext, typeBuilder, (LeafListSchemaNode) node, module,
                             typeProvider, genCtx);
             } else if (node instanceof LeafSchemaNode) {
-                resolveLeafSchemaNodeAsMethod(schemaContext, typeBuilder, genCtx, (LeafSchemaNode) node, module,
+                resolveLeafSchemaNodeAsMethod("", schemaContext, typeBuilder, genCtx, (LeafSchemaNode) node, module,
                         typeProvider);
             } else if (node instanceof ListSchemaNode) {
                 listToGenType(module, basePackageName, typeBuilder, childOf, (ListSchemaNode) node, schemaContext,
@@ -619,12 +620,12 @@ final class GenHelperUtil {
             parent, final GeneratedTypeBuilder childOf, final ListSchemaNode node, final SchemaContext schemaContext,
             final boolean verboseClassComments, final Map<Module, ModuleContext> genCtx,
             final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final TypeProvider typeProvider) {
+
         final GeneratedTypeBuilder genType = processDataSchemaNode(module, basePackageName, childOf, node,
                 schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider);
         if (genType != null) {
             final String nodeName = node.getQName().getLocalName();
-            constructGetter(parent, nodeName, node.getDescription(),
-                    Types.listTypeFor(genType), node.getStatus());
+            constructGetter(parent, nodeName, node.getDescription(), Types.listTypeFor(genType), node.getStatus());
             final List<QName> listKeys = node.getKeyDefinition();
             final String packageName = new StringBuilder(packageNameForGeneratedType(basePackageName, node.getPath(),
                     BindingNamespaceType.Key)).append('.').append(nodeName).toString();
@@ -678,9 +679,9 @@ final class GenHelperUtil {
      *         <li>true - in other cases</li>
      *         </ul>
      */
-    private static Type resolveLeafSchemaNodeAsMethod(final SchemaContext schemaContext, final GeneratedTypeBuilder
-            typeBuilder, final Map<Module, ModuleContext> genCtx, final LeafSchemaNode leaf, final Module module,
-            final TypeProvider typeProvider) {
+    private static Type resolveLeafSchemaNodeAsMethod(final String nodeName, final SchemaContext schemaContext,
+            final GeneratedTypeBuilder typeBuilder, final Map<Module, ModuleContext> genCtx, final LeafSchemaNode leaf,
+            final Module module, final TypeProvider typeProvider) {
         if (leaf == null || typeBuilder == null || leaf.isAddedByUses()) {
             return null;
         }
@@ -744,7 +745,17 @@ final class GenHelperUtil {
             leafDesc = "";
         }
 
-        constructGetter(typeBuilder, leafName, leafDesc, returnType, leaf.getStatus());
+        final String leafGetterName;
+        if (!"".equals(nodeName)) {
+            StringBuilder sb = new StringBuilder(nodeName)
+                .append('_')
+                .append(leafName);
+            leafGetterName = sb.toString();
+        } else {
+            leafGetterName = leafName;
+        }
+
+        constructGetter(typeBuilder, leafGetterName, leafDesc, returnType, leaf.getStatus());
         return returnType;
     }
 
@@ -982,27 +993,16 @@ final class GenHelperUtil {
         if (schemaNode instanceof LeafSchemaNode) {
             final LeafSchemaNode leaf = (LeafSchemaNode) schemaNode;
             final QName leafQName = leaf.getQName();
-            final String leafName = leafQName.getLocalName();
-            String leafPckgName = basePackageName;
-            boolean isKeyPart = false;
-            if (listKeys.contains(leafQName)) {
-                leafPckgName = new StringBuilder(leafPckgName).append('.').append(BindingNamespaceType.Key).append('.')
-                        .append(nodeName).toString();
-                isKeyPart = true;
-            } else {
-                leafPckgName = new StringBuilder(leafPckgName).append('.').append(BindingNamespaceType.Data).append('.')
-                        .append(nodeName).toString();
-            }
 
-            final String leafGTOName = new StringBuilder(nodeName).append('_').append(leafName).toString();
-            final GeneratedTypeBuilder leafGTp = new GeneratedTypeBuilderImpl(leafPckgName, leafGTOName);
-            resolveLeafSchemaNodeAsMethod(schemaContext, leafGTp, genCtx, leaf, module,
+            final Type type = resolveLeafSchemaNodeAsMethod(nodeName, schemaContext, typeBuilder, genCtx, leaf, module,
                     typeProvider);
-
-            constructGetter(typeBuilder, leafGTOName, schemaNode.getDescription(), leafGTp, Status.CURRENT);
-
-            if (isKeyPart) {
-                AuxiliaryGenUtils.resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, leafGTp, true);
+            if (listKeys.contains(leafQName)) {
+                if (type == null) {
+                    resolveLeafSchemaNodeAsProperty(schemaContext, typeProvider, genCtx, genTOBuilder, leaf, true,
+                        module);
+                } else {
+                    AuxiliaryGenUtils.resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, type, true);
+                }
             }
         } else if (!schemaNode.isAddedByUses()) {
             if (schemaNode instanceof LeafListSchemaNode) {
@@ -1021,6 +1021,36 @@ final class GenHelperUtil {
         }
     }
 
+    private static boolean resolveLeafSchemaNodeAsProperty(final SchemaContext schemaContext, final TypeProvider
+            typeProvider, final Map<Module, ModuleContext> genCtx, final GeneratedTOBuilder
+            toBuilder, final LeafSchemaNode leaf, final boolean isReadOnly, final Module module) {
+
+        if (leaf != null && toBuilder != null) {
+            Type returnType;
+            final TypeDefinition<?> typeDef = leaf.getType();
+            if (typeDef instanceof UnionTypeDefinition) {
+                // GeneratedType for this type definition should be already
+                // created
+                final QName qname = typeDef.getQName();
+                final Module unionModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(),
+                        qname.getRevision());
+                final ModuleContext mc = genCtx.get(unionModule);
+                returnType = mc.getTypedefs().get(typeDef.getPath());
+            } else if (typeDef instanceof EnumTypeDefinition && typeDef.getBaseType() == null) {
+                // Annonymous enumeration (already generated, since it is inherited via uses).
+                LeafSchemaNode originalLeaf = (LeafSchemaNode) SchemaNodeUtils.getRootOriginalIfPossible(leaf);
+                QName qname = originalLeaf.getQName();
+                final Module enumModule =  schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(),
+                        qname.getRevision());
+                returnType = genCtx.get(enumModule).getInnerType(originalLeaf.getType().getPath());
+            } else {
+                returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf);
+            }
+            return AuxiliaryGenUtils.resolveLeafSchemaNodeAsProperty(toBuilder, leaf, returnType, isReadOnly);
+        }
+        return false;
+    }
+
     private static TypeDefinition<?> getBaseOrDeclaredType(final TypeDefinition<?> typeDef) {
         final TypeDefinition<?> baseType = typeDef.getBaseType();
         return (baseType != null && baseType.getBaseType() != null) ? baseType : typeDef;
index 3ee4f22438211d28f1222cb41636a8b7820ebcf8..aa92f2e44c75897fedc859f652e3c0105aa29e33 100644 (file)
@@ -11,6 +11,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+
 import java.util.List;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.javav2.generator.api.BindingGenerator;
@@ -81,21 +82,21 @@ public class BindingGeneratorImplTest {
             if (t instanceof GeneratedTransferObject) {
                 final GeneratedTransferObject genTransferObj = (GeneratedTransferObject) t;
                 assertBaseGeneratedType(genTransferObj, "MyListKey",
-                        "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list.wrapper");
+                        "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list");
                 assertEquals(3, genTransferObj.getProperties().size());
                 int test_j = 0;
                 for (final GeneratedProperty generatedProperty : genTransferObj.getProperties()) {
                     switch (generatedProperty.getName()) {
                         case "key":
-                            assertEquals("MyListKey", generatedProperty.getReturnType().getName());
+                            assertEquals("String", generatedProperty.getReturnType().getName());
                             test_j++;
                             break;
                         case "key1":
-                            assertEquals("MyListKey1", generatedProperty.getReturnType().getName());
+                            assertEquals("String", generatedProperty.getReturnType().getName());
                             test_j++;
                             break;
                         case "key2":
-                            assertEquals("MyListKey2", generatedProperty.getReturnType().getName());
+                            assertEquals("String", generatedProperty.getReturnType().getName());
                             test_j++;
                             break;
                         default:
@@ -180,32 +181,24 @@ public class BindingGeneratorImplTest {
                     switch (m.getName()) {
                         case "getKey":
                                 assertMethod(t, "getKey", "MyListKey",
-                                        "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list.wrapper",
+                                        "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
                                         m);
                             test_j++;
                             break;
                         case "getMyListKey1":
-                            assertMethod(t, "getMyListKey1", "MyListKey1",
-                                    "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
-                                    m);
+                            assertMethod(t, "getMyListKey1", "String","java.lang", m);
                             test_j++;
                             break;
                         case "getMyListKey2":
-                            assertMethod(t, "getMyListKey2", "MyListKey2",
-                                    "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
-                                    m);
+                            assertMethod(t, "getMyListKey2", "String","java.lang", m);
                             test_j++;
                             break;
                         case "getMyListFoo":
-                            assertMethod(t, "getMyListFoo", "MyListFoo",
-                                    "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.data.my_list",
-                                    m);
+                            assertMethod(t, "getMyListFoo", "String","java.lang", m);
                             test_j++;
                             break;
                         case "getMyListKey":
-                            assertMethod(t, "getMyListKey", "MyListKey",
-                                    "org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.list.rev170314.key.my_list",
-                                    m);
+                            assertMethod(t, "getMyListKey", "String","java.lang", m);
                             test_j++;
                             break;
                         default:
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/list/test-list.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/list/test-list.yang
new file mode 100644 (file)
index 0000000..752db99
--- /dev/null
@@ -0,0 +1,20 @@
+module test-list {
+    yang-version 1.1;
+
+    namespace "urn:test:simple:test:list";
+    prefix test-list;
+    organization "test.list.org";
+    revision "2017-03-14";
+
+    list my-list {
+        key "name";
+        leaf name {
+            type string;
+        }
+
+        leaf surname {
+            type string;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/list/test-list2.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/list/test-list2.yang
new file mode 100644 (file)
index 0000000..4eb8b57
--- /dev/null
@@ -0,0 +1,25 @@
+module test-list2 {
+    yang-version 1.1;
+
+    namespace "urn:test:simple:test:list2";
+    prefix test-list2;
+    organization "test.list2.org";
+    revision "2017-03-14";
+
+    list my-list {
+        key "key key1 key2";
+        leaf key{
+            type string;
+        }
+        leaf key1 {
+            type string;
+        }
+        leaf key2 {
+            type string;
+        }
+        leaf foo{
+            type string;
+        }
+    }
+
+}
\ No newline at end of file