#1064: The setters generated for the array fields cause NPE if the passed in array was null
Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/jaxb-ri/xjc/pom.xml b/jaxb-ri/xjc/pom.xml
index 425a3a4..774fb6f 100644
--- a/jaxb-ri/xjc/pom.xml
+++ b/jaxb-ri/xjc/pom.xml
@@ -40,6 +40,7 @@
--add-exports org.glassfish.jaxb.xjc/com.sun.tools.xjc.outline=ALL-UNNAMED
--add-exports org.glassfish.jaxb.xjc/com.sun.tools.xjc.generator.bean=ALL-UNNAMED
--add-opens org.glassfish.jaxb.xjc/com.sun.tools.xjc.addon.code_injector=ALL-UNNAMED
+ --add-opens org.glassfish.jaxb.xjc/com.sun.tools.xjc.reader.xmlschema.bindinfo=org.glassfish.jaxb.core
--add-opens org.glassfish.jaxb.core/org.glassfish.jaxb.core.v2.model.nav=ALL-UNNAMED
-Djdk.attach.allowAttachSelf
</argLine>
diff --git a/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/generator/bean/field/ArrayField.java b/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/generator/bean/field/ArrayField.java
index 9d3d148..5706550 100644
--- a/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/generator/bean/field/ArrayField.java
+++ b/jaxb-ri/xjc/src/main/java/com/sun/tools/xjc/generator/bean/field/ArrayField.java
@@ -139,6 +139,10 @@
$getLength.body()._return(acc.ref(true).ref("length"));
// [RESULT] void setX(ET[] values) {
+ // if (values == null) {
+ // <ref> = null;
+ // return;
+ // }
// int len = values.length;
// for( int i=0; i<len; i++ )
// <ref>[i] = values[i];
@@ -149,6 +153,11 @@
writer.javadoc().append(prop.javadoc);
$value = writer.addParameter(exposedType.array(),"values");
+
+ $setAll.body()._if( $value.eq(JExpr._null()) )._then()
+ .assign((JAssignmentTarget) acc.ref(true), JExpr._null())
+ ._return();
+
JVar $len = $setAll.body().decl(codeModel.INT,"len", $value.ref("length"));
$setAll.body().assign(
diff --git a/jaxb-ri/xjc/src/test/java/com/sun/tools/xjc/CodeGenTest.java b/jaxb-ri/xjc/src/test/java/com/sun/tools/xjc/CodeGenTest.java
index d5c1bd1..c5d374a 100644
--- a/jaxb-ri/xjc/src/test/java/com/sun/tools/xjc/CodeGenTest.java
+++ b/jaxb-ri/xjc/src/test/java/com/sun/tools/xjc/CodeGenTest.java
@@ -32,7 +32,7 @@
*/
public class CodeGenTest extends TestCase {
- public void testGh1460() throws Throwable {
+ public void testGh1460_Gh1064() throws Throwable {
SchemaCompiler sc = XJC.createSchemaCompiler();
sc.forcePackageName("ghbugs.b1460");
sc.parseSchema(getInputSource("/schemas/ghbugs.xsd"));
@@ -41,7 +41,16 @@
String method = toString(code._getClass("ghbugs.b1460.Gh1460Type").getMethod("setBinaryAttr", new JType[]{code.parseType("byte[][]")}));
// com.sun.tools.xjc.api.Driver.dumpCode(code);
// System.out.println(method);
+
+ // wrong initialization of multi-dim array
+ // https://github.com/eclipse-ee4j/jaxb-ri/issues/1460
assertTrue(method, method.contains("new byte[len][]"));
+
+ // null check in setter
+ // https://github.com/eclipse-ee4j/jaxb-ri/issues/1064
+ assertTrue(method, method.contains("if (values == null) {"));
+ assertTrue(method, method.contains("this.binaryAttr = null;"));
+ assertTrue(method, method.contains("return ;"));
}
private InputSource getInputSource(String systemId) throws FileNotFoundException, URISyntaxException {