public ArrayValue createArrayValue(ArrayMetaType type, Object value, Map<Object, MetaValue> mapping)
{
if (value == null)
return null;
ArrayValueSupport result = new ArrayValueSupport(type);
mapping.put(value, result);
Object[] array;
MetaType elementType = type.getElementType();
int dimension = type.getDimension();
Object[] oldArray;
Class<?> componentType;
try
{
componentType = Class.forName(type.getClassName());
}
catch (Exception e)
{
throw new RuntimeException("Unable to determine component type for " + type, e);
}
ClassInfo classInfo = configuration.getClassInfo(value.getClass());
if (classInfo.isArray())
{
// See if this is a primitive array
ArrayInfo arrayInfo = ArrayInfo.class.cast(classInfo);
TypeInfo compInfo = arrayInfo.getComponentType();
while(compInfo instanceof ArrayInfo)
{
arrayInfo = ArrayInfo.class.cast(compInfo);
compInfo = arrayInfo.getComponentType();
}
// Translate
if (compInfo.isPrimitive())
oldArray = convertPrimativeArray(classInfo, value);
else
oldArray = (Object[]) value;
}
else
throw new UnsupportedOperationException("Cannot construct array for " + value.getClass());
array = createArray(elementType, componentType.getComponentType(), dimension, oldArray);
result.setValue(array);
return result;
}