BUG-1097: implemented check for null or empty list in builder classes. 20/9120/3
authorMartin Vitez <mvitez@cisco.com>
Thu, 17 Jul 2014 14:18:00 +0000 (16:18 +0200)
committerMartin Vitez <mvitez@cisco.com>
Mon, 21 Jul 2014 08:34:02 +0000 (10:34 +0200)
If one of builder variable is List, do following:
 - for null value create Collections.emptyList()
 - for empty list create Collections.emptyList()
 - for any other list create ImmutableList.copyOf(<arg>)

Added test.

Change-Id: I83e5aaf4f4253aa2e195c23ff5b48b04fc883052
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/CompilationTest.java
code-generator/binding-java-api-generator/src/test/resources/compilation/bug1097/foo.yang [new file with mode: 0644]

index 3d0d19c436b2889f9eb5b15f664c88580d149b49..8b465758d0691ca67c386b5c7dbef63104b3cfb9 100644 (file)
@@ -31,6 +31,7 @@ import java.util.Collection
 import org.opendaylight.yangtools.yang.binding.Identifiable
 import com.google.common.collect.Range
 import org.opendaylight.yangtools.sal.binding.model.api.ConcreteType
+import com.google.common.collect.ImmutableList
 
 /**
  * Template for generating JAVA builder classes. 
@@ -536,7 +537,15 @@ class BuilderTemplate extends BaseTemplate {
                 }
             «ENDIF»
             «FOR field : allProps»
-                this.«field.fieldName» = base.«field.getterMethodName»();
+                «IF List.canonicalName.equals(field.returnType.fullyQualifiedName)»
+                    if (base.«field.getterMethodName»() == null || base.«field.getterMethodName»().isEmpty()) {
+                        this.«field.fieldName» = «Collections.importedName».emptyList();
+                    } else {
+                        this.«field.fieldName» = «ImmutableList.importedName».copyOf(base.«field.getterMethodName»());
+                    }
+                «ELSE»
+                    this.«field.fieldName» = base.«field.getterMethodName»();
+                «ENDIF»
             «ENDFOR»
             «IF augmentField != null»
                 «IF !impl»if (base instanceof «type.name»«IMPL») {«ENDIF»
@@ -734,4 +743,3 @@ class BuilderTemplate extends BaseTemplate {
     '''
 
 }
-
index 635b3f3447b42eda4b79922f97df6c390500b5f4..db2fa44ac5abcb9f0c1b05ceebdcfd330f2a34e4 100644 (file)
@@ -28,6 +28,8 @@ import static org.opendaylight.yangtools.sal.java.api.generator.test.Compilation
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.getSourceFiles;
 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.testCompilation;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Range;
 import java.io.File;
 import java.lang.annotation.Annotation;
@@ -40,9 +42,11 @@ import java.math.BigInteger;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import org.junit.Test;
+import org.mockito.Mockito;
 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;
@@ -566,6 +570,51 @@ public class CompilationTest extends BaseCompilationTest {
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }
 
+    @Test
+    public void testBug1097() throws Exception {
+        final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug1097");
+        assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
+        final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug1097");
+        assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
+
+        generateTestSources("/compilation/bug1097", sourcesOutputDir);
+
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
+
+        ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
+        Class<?> linkClass = Class.forName(BASE_PKG + ".urn.test.foo.rev140717.Link", true, loader);
+        Class<?> linkBuilderClass = Class.forName(BASE_PKG + ".urn.test.foo.rev140717.LinkBuilder", true, loader);
+        Class<?> nodeClass = Class.forName(BASE_PKG + ".urn.test.foo.rev140717.link.Node", true, loader);
+
+        // Test LinkBuilder without setting any value
+        Object linkBuilder = linkBuilderClass.newInstance();
+        Method build = linkBuilderClass.getDeclaredMethod("build");
+        Object link = build.invoke(linkBuilder);
+        Method getNodes = linkClass.getDeclaredMethod("getNode");
+        Object node = getNodes.invoke(link);
+        assertEquals(Collections.emptyList(), node);
+
+        // Test LinkBuilder with setting an empty list
+        linkBuilder = linkBuilderClass.newInstance();
+        Method setNode = linkBuilderClass.getDeclaredMethod("setNode", List.class);
+        setNode.invoke(linkBuilder, Collections.emptyList());
+        link = build.invoke(linkBuilder);
+        node = getNodes.invoke(link);
+        assertEquals(Collections.emptyList(), node);
+
+        // Test LinkBuilder with setting list with values
+        linkBuilder = linkBuilderClass.newInstance();
+        List<?> testList = Lists.newArrayList(Mockito.mock(nodeClass), Mockito.mock(nodeClass));
+        setNode.invoke(linkBuilder, testList);
+        link = build.invoke(linkBuilder);
+        node = getNodes.invoke(link);
+        assertEquals(testList, node);
+        assertTrue(node instanceof ImmutableList);
+
+        cleanUp(sourcesOutputDir, compiledOutputDir);
+    }
+
     @Test
     public void classNamesColisionTest() throws Exception {
         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "class-name-collision");
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/bug1097/foo.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/bug1097/foo.yang
new file mode 100644 (file)
index 0000000..fc0c4e2
--- /dev/null
@@ -0,0 +1,17 @@
+module foo {
+  namespace "urn:test:foo";
+  prefix foo;
+
+  revision 2014-07-17 {
+  }
+
+
+    container link {
+        list node {
+            leaf id {
+                type string;
+            }
+        }
+    }
+
+}