MetaMapper<?> mapper = MetaMapper.getMetaMapper(type);
if (mapper != null)
return mapper.unwrapMetaValue(metaValue);
MetaType metaType = metaValue.getMetaType();
if (metaType.isSimple())
{
Serializable value = ((SimpleValue)metaValue).getValue();
Object v = getValue(metaType, type, value);
if(v == null && metaType.isPrimitive())
{
if (type == null)
type = getTypeInfo(metaType, metaValue);
return mapNullToPrimitive(type);
}
else
return v;
}
else if (metaType.isEnum())
{
String value = ((EnumValue)metaValue).getValue();
return getValue(metaType, type, value);
}
else if (metaType.isGeneric())
{
Serializable value = ((GenericValue)metaValue).getValue();
return getValue(metaType, type, value);
}
else if (metaType.isArray())
{
ArrayValue arrayValue = (ArrayValue)metaValue;
if (type == null)
type = getTypeInfo(metaType, arrayValue.getValue());
Object array = newArrayInstance(type, arrayValue.getLength());
for (int i = 0; i < Array.getLength(array); i++)
{
Object element = arrayValue.getValue(i);
if (element instanceof MetaValue)
element = unwrapMetaValue((MetaValue)element, type, array);
else if (element != null && element.getClass().isArray())
element = unwrapArray(array, element);
Array.set(array, i, element);
}
return array;
}
else if (metaType.isProperties())
{
PropertiesMetaValue propsValue = (PropertiesMetaValue) metaValue;
return unwrapProperties(propsValue, type);
}
else if (metaType.isComposite())
{
CompositeValue compositeValue = (CompositeValue)metaValue;
return unwrapComposite(compositeValue, type);
}
else if (metaType.isCollection())
{
CollectionValue collectionValue = (CollectionValue)metaValue;
return unwrapCollection(collectionValue, type);
}
else if (metaType.isTable())
{
TableValue tableValue = (TableValue)metaValue;
return unwrapTable(tableValue, type);
}