in plugins/json/src/main/java/org/apache/struts2/json/JSONPopulator.java [182:244]
private Object convertToCollection(Class clazz, Type type, Object value, Method accessor)
throws JSONException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException, InstantiationException, NoSuchMethodException, IntrospectionException {
if (value == null)
return null;
else if (value instanceof List) {
Class itemClass = Object.class;
Type itemType = null;
if ((type != null) && (type instanceof ParameterizedType)) {
ParameterizedType ptype = (ParameterizedType) type;
itemType = ptype.getActualTypeArguments()[0];
if (itemType.getClass().equals(Class.class)) {
itemClass = (Class) itemType;
} else {
itemClass = (Class) ((ParameterizedType) itemType).getRawType();
}
}
List values = (List) value;
Collection newCollection = null;
try {
newCollection = (Collection) clazz.newInstance();
} catch (InstantiationException ex) {
// fallback if clazz represents an interface or abstract class
if (SortedSet.class.isAssignableFrom(clazz)) {
newCollection = new TreeSet();
} else if (Set.class.isAssignableFrom(clazz)) {
newCollection = new HashSet();
} else if (Queue.class.isAssignableFrom(clazz)) {
newCollection = new ArrayDeque();
} else {
newCollection = new ArrayList();
}
}
// create an object for each element
for (Object listValue : values) {
if (itemClass.equals(Object.class)) {
// Object[]
newCollection.add(listValue);
} else if (isJSONPrimitive(itemClass)) {
// primitive array
newCollection.add(this.convertPrimitive(itemClass, listValue, accessor));
} else if (Map.class.isAssignableFrom(itemClass)) {
Object newObject = convertToMap(itemClass, itemType, listValue, accessor);
newCollection.add(newObject);
} else if (List.class.isAssignableFrom(itemClass)) {
Object newObject = convertToCollection(itemClass, itemType, listValue, accessor);
newCollection.add(newObject);
} else if (listValue instanceof Map) {
// array of beans
Object newObject = itemClass.newInstance();
this.populateObject(newObject, (Map) listValue);
newCollection.add(newObject);
} else
throw new JSONException("Incompatible types for property " + accessor.getName());
}
return newCollection;
} else
throw new JSONException("Incompatible types for property " + accessor.getName());
}