in openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java [137:265]
public static Object fromPKValues(Object[] pks, ClassMetaData meta) {
if (meta == null || pks == null)
return null;
boolean convert = !meta.getRepository().getConfiguration().
getCompatibilityInstance().getStrictIdentityValues();
if (meta.isOpenJPAIdentity()) {
int type = meta.getPrimaryKeyFields()[0].getObjectIdFieldTypeCode();
Object val = (convert) ? JavaTypes.convert(pks[0], type) : pks[0];
switch (type) {
case JavaTypes.BYTE:
case JavaTypes.BYTE_OBJ:
if (!convert && !(val instanceof Byte))
throw new ClassCastException("!(x instanceof Byte)");
return new ByteId(meta.getDescribedType(),
val == null ? 0 : ((Number) val).byteValue());
case JavaTypes.CHAR:
case JavaTypes.CHAR_OBJ:
return new CharId(meta.getDescribedType(),
val == null ? 0 : (Character) val);
case JavaTypes.DOUBLE:
case JavaTypes.DOUBLE_OBJ:
if (!convert && !(val instanceof Double))
throw new ClassCastException("!(x instanceof Double)");
return new DoubleId(meta.getDescribedType(),
val == null ? 0 : ((Number) val).doubleValue());
case JavaTypes.FLOAT:
case JavaTypes.FLOAT_OBJ:
if (!convert && !(val instanceof Float))
throw new ClassCastException("!(x instanceof Float)");
return new FloatId(meta.getDescribedType(),
val == null ? 0 : ((Number) val).floatValue());
case JavaTypes.INT:
case JavaTypes.INT_OBJ:
if (!convert && !(val instanceof Integer))
throw new ClassCastException("!(x instanceof Integer)");
return new IntId(meta.getDescribedType(),
val == null ? 0 : ((Number) val).intValue());
case JavaTypes.LONG:
case JavaTypes.LONG_OBJ:
if (!convert && !(val instanceof Long))
throw new ClassCastException("!(x instanceof Long)");
return new LongId(meta.getDescribedType(),
val == null ? 0 : ((Number) val).longValue());
case JavaTypes.SHORT:
case JavaTypes.SHORT_OBJ:
if (!convert && !(val instanceof Short))
throw new ClassCastException("!(x instanceof Short)");
return new ShortId(meta.getDescribedType(),
val == null ? 0 : ((Number) val).shortValue());
case JavaTypes.STRING:
return new StringId(meta.getDescribedType(), (String) val);
case JavaTypes.DATE:
return new DateId(meta.getDescribedType(), (Date) val);
case JavaTypes.OID:
case JavaTypes.OBJECT:
return new ObjectId(meta.getDescribedType(), val);
case JavaTypes.BIGDECIMAL:
if (!convert && !(val instanceof BigDecimal))
throw new ClassCastException(
"!(x instanceof BigDecimal)");
return new BigDecimalId(meta.getDescribedType(),
(BigDecimal)val);
case JavaTypes.BIGINTEGER:
if (!convert && !(val instanceof BigInteger))
throw new ClassCastException(
"!(x instanceof BigInteger)");
return new BigIntegerId(meta.getDescribedType(),
(BigInteger)val);
case JavaTypes.BOOLEAN:
case JavaTypes.BOOLEAN_OBJ:
if (!convert && !(val instanceof Boolean))
throw new ClassCastException("!(x instanceof Boolean)");
return new BooleanId(meta.getDescribedType(),
val == null ? false : (Boolean)val);
case JavaTypes.UUID_OBJ:
if (convert && (val instanceof String))
return new UuidId(meta.getDescribedType(), UUID.fromString((String) val));
else if (val instanceof UUID)
return new UuidId(meta.getDescribedType(), (UUID) val);
throw new ClassCastException(String.format("Could not convert [%s] to UUID", val.getClass().getCanonicalName()));
default:
throw new InternalException();
}
}
// copy pks to oid
if (!Modifier.isAbstract(meta.getDescribedType().getModifiers())) {
Object oid = PCRegistry.newObjectId(meta.getDescribedType());
PrimaryKeyFieldManager producer = new PrimaryKeyFieldManager();
producer.setStore(pks);
if (convert)
producer.setMetaData(meta);
PCRegistry.copyKeyFieldsToObjectId(meta.getDescribedType(),
producer, oid);
return ApplicationIds.wrap(meta, oid);
}
// default to reflection
Class<?> oidType = meta.getObjectIdType();
if (Modifier.isAbstract(oidType.getModifiers()))
throw new UserException(_loc.get("objectid-abstract", meta));
Object copy = null;
try {
copy = AccessController.doPrivileged(
J2DoPrivHelper.newInstanceAction(oidType));
} catch (Throwable t) {
if (t instanceof PrivilegedActionException)
t = ((PrivilegedActionException) t).getException();
throw new GeneralException(t);
}
FieldMetaData[] fmds = meta.getPrimaryKeyFields();
Object val;
for (int i = 0; i < fmds.length; i++) {
val = (convert) ? JavaTypes.convert(pks[i],
fmds[i].getObjectIdFieldTypeCode()) : pks[i];
if (AccessCode.isField(meta.getAccessType()))
Reflection.set(copy, Reflection.findField(oidType,
fmds[i].getName(), true), val);
else
Reflection.set(copy, Reflection.findSetter(oidType,
fmds[i].getName(), fmds[i].getDeclaredType(), true), val);
}
if (meta.isObjectIdTypeShared())
copy = new ObjectId(meta.getDescribedType(), copy);
return copy;
}