/**
* Computes the type of a field.
*/
private Class getFieldClass(Field field) throws SpeedoException {
PType ptype = field.getType();
String className = null;
switch(ptype.getTypeCode()) {
case PType.TYPECODE_BIGDECIMAL:
return BigDecimal.class;
case PType.TYPECODE_BIGINTEGER:
return BigInteger.class;
case PType.TYPECODE_BOOLEAN:
case PType.TYPECODE_OBJBOOLEAN:
return Boolean.class;
case PType.TYPECODE_BYTE:
case PType.TYPECODE_OBJBYTE:
return Byte.class;
case PType.TYPECODE_BYTEARRAY:
return Byte[].class;
case PType.TYPECODE_CHAR:
case PType.TYPECODE_OBJCHAR:
return Character.class;
case PType.TYPECODE_CHARARRAY:
return Character[].class;
case PType.TYPECODE_DATE:
return Date.class;
case PType.TYPECODE_DOUBLE:
case PType.TYPECODE_OBJDOUBLE:
return Double.class;
case PType.TYPECODE_FLOAT:
case PType.TYPECODE_OBJFLOAT:
return Float.class;
case PType.TYPECODE_INT:
case PType.TYPECODE_OBJINT:
return Integer.class;
case PType.TYPECODE_LONG:
case PType.TYPECODE_OBJLONG:
return Long.class;
case PType.TYPECODE_SERIALIZED:
return Serializable.class;
case PType.TYPECODE_SHORT:
case PType.TYPECODE_OBJSHORT:
return Integer.class;
case PType.TYPECODE_STRING:
return String.class;
case PType.TYPECODE_REFERENCE:
if (field instanceof PropagatedField) {
Field f = ((PropagatedField) field).getOriginFields()[0];
if (f instanceof PNameField) {
PNameField pnf = (PNameField) f;
if (pnf.isClassPName()) {
if (pnf.isInGenClass()) {
//identifier of the genclass
className = pnf.getGenClassRef().getGenClassId();
} else {
//identifier of a class
className = pnf.getMetaObjectClass().getFQName();
}
} else {
Reference ref = pnf.getReference();
if (ref instanceof ClassRef) {
//reference to a class
className = ((ClassRef) ref).getMOClass().getFQName();
} else if (ref instanceof GenClassRef) {
//reference to a genclass
className = ((GenClassRef) ref).getGenClassId();
}
}
}
}
break;
default:
className = ptype.getJavaName();
}
if (className == null) {
throw new SpeedoException(
"Type '" + ptype.getJavaName()
+ "' not found for projected field:"
+ field.getName());
} else {
try {
return classloader.loadClass(className);