From 992fd3bfd71217eae8718a13c3bd75cfc0f8502e Mon Sep 17 00:00:00 2001
From: Victor Verbitsky <vektor@krista.ru>
Date: Fri, 11 Jul 2014 11:18:47 +0400
Subject: [PATCH] Fix decomposition of collections, maps and arrays.
 Collections and maps can becomes a null. Arrays can be of scalar type.

---
 .../serial/graph/node/AccessNode.java          | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/serial/base/src/main/java/org/switchyard/serial/graph/node/AccessNode.java b/serial/base/src/main/java/org/switchyard/serial/graph/node/AccessNode.java
index fe53e11cd..bdd5480f5 100644
--- a/serial/base/src/main/java/org/switchyard/serial/graph/node/AccessNode.java
+++ b/serial/base/src/main/java/org/switchyard/serial/graph/node/AccessNode.java
@@ -23,6 +23,7 @@
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -138,15 +139,26 @@ public void run() {
                                 Class<?> accessType = access.getType();
                                 if (access instanceof FieldAccess) {
                                     if (NodeBuilder.isCollection(accessType) && value instanceof Collection) {
-                                        ((Collection)access.read(obj)).addAll((Collection)value);
+                                        Collection list = (Collection)access.read(obj);
+                                        if (list == null) {
+                                            access.write(obj, new ArrayList((Collection)value));
+                                        } else {
+                                            list.addAll((Collection)value);
+                                        }
                                         skip = true;
                                     } else if (NodeBuilder.isMap(accessType) && value instanceof Map) {
-                                        ((Map)access.read(obj)).putAll((Map)value);
+                                        Map map = (Map)access.read(obj);
+                                        if (map == null) {
+                                            access.write(obj, new HashMap((Map)value));
+                                        } else {
+                                            map.putAll((Map)value);
+                                        }
                                         skip = true;
                                     }
                                 }
                                 if (!skip) {
-                                    if (NodeBuilder.isArray(accessType) && value.getClass().isArray()) {
+                                    if (NodeBuilder.isArray(accessType) && value.getClass().isArray() &&
+                                            !accessType.getComponentType().isPrimitive()) {
                                         Object[] old_array = (Object[])value;
                                         Object[] new_array = (Object[])Array.newInstance(accessType.getComponentType(), old_array.length);
                                         System.arraycopy(old_array, 0, new_array, 0, old_array.length);