Extended builders constructors.
authorMartin Vitez <mvitez@cisco.com>
Mon, 28 Oct 2013 14:13:48 +0000 (15:13 +0100)
committerMartin Vitez <mvitez@cisco.com>
Mon, 28 Oct 2013 14:33:26 +0000 (15:33 +0100)
Constructors are generated also for implemented types from uses of nested nodes.

Change-Id: I7591c6124706b7104bcafec6d70cce16309bede4
Signed-off-by: Martin Vitez <mvitez@cisco.com>
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CascadeUsesCompilationTest.java

index 484cc7ee59e7e8ffc3e05671d45c713356967af2..7534f3895946dd66cbba2584545ada627ff17dad 100644 (file)
@@ -233,18 +233,26 @@ class BuilderTemplate extends BaseTemplate {
     '''\r
 \r
 \r
-    def private generateBuilderConstructor(Type implementedIfc) '''\r
+    def private generateBuilderConstructor(Type type) '''\r
         public «type.name»«BUILDER»() {\r
         }\r
-\r
-        «IF (implementedIfc instanceof GeneratedType && !(implementedIfc instanceof GeneratedTransferObject))»\r
-        «val ifc = implementedIfc as GeneratedType»\r
+        «IF (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject))»\r
+        «val ifc = type as GeneratedType»\r
         «FOR impl : ifc.implements»\r
-            «IF (impl instanceof GeneratedType) &&  !((impl as GeneratedType).methodDefinitions.empty)»\r
-                public «type.name»«BUILDER»(«impl.fullyQualifiedName» arg) {\r
-                    «printBuilderConstructorProperties(impl)»\r
-                }\r
-            «ENDIF»\r
+            «generateSingleBuilderConstructor(impl)»\r
+        «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
+    def private generateSingleBuilderConstructor(Type impl) '''\r
+        «IF (impl instanceof GeneratedType) &&  !((impl as GeneratedType).methodDefinitions.empty)»\r
+        \r
+        «val implType = impl as GeneratedType»\r
+        public «type.name»«BUILDER»(«implType.fullyQualifiedName» arg) {\r
+            «printBuilderConstructorProperties(implType)»\r
+        }\r
+        «FOR implTypeImplement : implType.implements»\r
+            «generateSingleBuilderConstructor(implTypeImplement)»\r
         «ENDFOR»\r
         «ENDIF»\r
     '''\r
index 846126eec969a99955ce971cb54fd7f6ad99167d..c29d28bd8524eeb0fc21f254aad269f9aa2eb0ea 100644 (file)
@@ -75,6 +75,8 @@ public class CascadeUsesCompilationTest extends BaseCompilationTest {
                 loader);
         Class<?> fooGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.FooGr1", true, loader);
         Class<?> barGr2Class = Class.forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.BarGr2", true, loader);
+        Class<?> barGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.BarGr1", true, loader);
+        Class<?> bazGr1Class = Class.forName(BASE_PKG + ".urn.opendaylight.baz.rev131008.BazGr1", true, loader);
 
         // test generated interface from 'container nodes'
         testImplementsIfc(nodesClass, fooGr1Class);
@@ -83,12 +85,14 @@ public class CascadeUsesCompilationTest extends BaseCompilationTest {
         // test generated builder for 'container nodes'
         assertFalse(nodesBuilderClass.isInterface());
         Constructor<?>[] nodesBuilderConstructors = nodesBuilderClass.getConstructors();
-        assertEquals(3, nodesBuilderConstructors.length);
+        assertEquals(5, nodesBuilderConstructors.length);
 
         // test generation of builder constructors from uses in 'container nodes'
         Constructor<?> defaultConstructor = null;
         Constructor<?> usesFooGr1 = null;
         Constructor<?> usesBarGr2 = null;
+        Constructor<?> usesBarGr1 = null;
+        Constructor<?> usesBazGr1 = null;
         for (Constructor<?> c : nodesBuilderConstructors) {
             Class<?>[] params = c.getParameterTypes();
             if (params.length == 0) {
@@ -99,12 +103,18 @@ public class CascadeUsesCompilationTest extends BaseCompilationTest {
                     usesFooGr1 = c;
                 } else if (params[0].equals(barGr2Class)) {
                     usesBarGr2 = c;
+                } else if (params[0].equals(barGr1Class)) {
+                    usesBarGr1 = c;
+                } else if (params[0].equals(bazGr1Class)) {
+                    usesBazGr1 = c;
                 }
             }
         }
         assertNotNull(defaultConstructor);
         assertNotNull(usesFooGr1);
         assertNotNull(usesBarGr2);
+        assertNotNull(usesBarGr1);
+        assertNotNull(usesBazGr1);
 
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }