BUG-1377: fixed code generation for nodes defined under grouping. 13/9113/2
authorMartin Vitez <mvitez@cisco.com>
Thu, 17 Jul 2014 10:23:54 +0000 (12:23 +0200)
committerMartin Vitez <mvitez@cisco.com>
Thu, 17 Jul 2014 11:42:15 +0000 (13:42 +0200)
If node was defined in choice case which parent choice was defined in grouping,
node does not implement ChildOf interface. Fixed by adding search for parent node
also from groupings.

Added test.

Change-Id: Ibfbb4deb719804fd16cce5c091cc0969aeaf821e
Signed-off-by: Martin Vitez <mvitez@cisco.com>
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTestUtils.java
code-generator/binding-java-api-generator/src/test/resources/compilation/bug1377/foo.yang [new file with mode: 0644]

index c45fc386eae9072529f66b89ea80433d6471bf8a..d7c5532af8fccec139ccf34df9d4d4730bc137e4 100644 (file)
@@ -1176,6 +1176,9 @@ public class BindingGeneratorImpl implements BindingGenerator {
                         parent = findDataSchemaNode(schemaContext, sp.getParent());
                     }
                     GeneratedTypeBuilder childOfType = findChildNodeByPath(parent.getPath());
+                    if (childOfType == null) {
+                        childOfType = findGroupingByPath(parent.getPath());
+                    }
                     resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder, childOfType, caseChildNodes);
                 }
             }
index 5597486584d53d219d12217e75d44f6ae33bbca7..635b3f3447b42eda4b79922f97df6c390500b5f4 100644 (file)
@@ -23,6 +23,7 @@ import static org.opendaylight.yangtools.sal.java.api.generator.test.Compilation
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsRestrictionCheck;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertFilesCount;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertImplementsIfc;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertImplementsParameterizedIfc;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.cleanUp;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.getSourceFiles;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.testCompilation;
@@ -44,6 +45,7 @@ import java.util.List;
 import org.junit.Test;
 import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
+import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
@@ -535,6 +537,35 @@ public class CompilationTest extends BaseCompilationTest {
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }
 
+    /**
+     * Test if class generated for node from grouping implements ChildOf.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testBug1377() throws Exception {
+        final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug1377");
+        assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
+        final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug1377");
+        assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
+
+        generateTestSources("/compilation/bug1377", sourcesOutputDir);
+
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
+
+        ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
+        Class<?> outputActionClass = Class.forName(BASE_PKG
+                + ".urn.test.foo.rev140717.action.action.output.action._case.OutputAction", true, loader);
+        Class<?> actionClass = Class.forName(BASE_PKG + ".urn.test.foo.rev140717.Action", true, loader);
+
+        // Test generated 'container output-action'
+        assertTrue(outputActionClass.isInterface());
+        assertImplementsParameterizedIfc(outputActionClass, ChildOf.class.toString(), actionClass.getCanonicalName());
+
+        cleanUp(sourcesOutputDir, compiledOutputDir);
+    }
+
     @Test
     public void classNamesColisionTest() throws Exception {
         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "class-name-collision");
index 755b3af7b2febfab103ac907eb3637bd788e4ddb..d3ac8d7eec5bc0c2e0e3c127143f8fbb77751155 100644 (file)
@@ -40,6 +40,8 @@ public class CompilationTestUtils {
     static final String COMPILER_OUTPUT_PATH = TEST_PATH + FS + "bin";
     static final File COMPILER_OUTPUT_DIR = new File(COMPILER_OUTPUT_PATH);
 
+    static final String AUGMENTATION = "interface org.opendaylight.yangtools.yang.binding.Augmentation";
+
     static final String BASE_PATH = "org" + FS + "opendaylight" + FS + "yang" + FS + "gen" + FS + "v1";
     static final String NS_TEST = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "test" + FS + "rev131008";
     static final String NS_FOO = BASE_PATH + FS + "urn" + FS + "opendaylight" + FS + "foo" + FS + "rev131008";
@@ -322,8 +324,7 @@ public class CompilationTestUtils {
      *            fully qualified name of expected parameter type
      */
     static void testAugmentation(Class<?> clazz, String genericTypeName) {
-        final String ifcName = "interface org.opendaylight.yangtools.yang.binding.Augmentation";
-        assertImplementsParameterizedIfc(clazz, ifcName, genericTypeName);
+        assertImplementsParameterizedIfc(clazz, AUGMENTATION, genericTypeName);
     }
 
     /**
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/bug1377/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/bug1377/foo.yang
new file mode 100644 (file)
index 0000000..b31a891
--- /dev/null
@@ -0,0 +1,21 @@
+module foo {
+  namespace "urn:test:foo";
+  prefix foo;
+
+  revision 2014-07-17 {
+  }
+
+
+    grouping action {
+        choice action {
+            case output-action-case {
+                container output-action {
+                    leaf id {
+                        type string;
+                    }
+                }
+            }
+        }
+    }
+
+}