From 883ae26ee98953a5df7cc0956afa807a82d58a3a Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Thu, 17 Jul 2014 16:18:00 +0200 Subject: [PATCH] BUG-1097: implemented check for null or empty list in builder classes. 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() Added test. Change-Id: I83e5aaf4f4253aa2e195c23ff5b48b04fc883052 Signed-off-by: Martin Vitez --- .../java/api/generator/BuilderTemplate.xtend | 12 ++++- .../api/generator/test/CompilationTest.java | 49 +++++++++++++++++++ .../resources/compilation/bug1097/foo.yang | 17 +++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 code-generator/binding-java-api-generator/src/test/resources/compilation/bug1097/foo.yang diff --git a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend index 3d0d19c436..8b465758d0 100644 --- a/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend +++ b/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend @@ -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 { ''' } - diff --git a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java index 635b3f3447..db2fa44ac5 100644 --- a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java +++ b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java @@ -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 index 0000000000..fc0c4e2fce --- /dev/null +++ b/code-generator/binding-java-api-generator/src/test/resources/compilation/bug1097/foo.yang @@ -0,0 +1,17 @@ +module foo { + namespace "urn:test:foo"; + prefix foo; + + revision 2014-07-17 { + } + + + container link { + list node { + leaf id { + type string; + } + } + } + +} -- 2.36.6