#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 {