public static Object copy(Object oid,
ClassMetaData meta) {
if (meta == null || oid == null)
return null;
if (meta.isOpenJPAIdentity()) {
// use meta type instead of oid type in case it's a subclass
Class cls = meta.getDescribedType();
OpenJPAId koid = (OpenJPAId) oid;
FieldMetaData pk = meta.getPrimaryKeyFields()[0];
switch (pk.getObjectIdFieldTypeCode()) {
case JavaTypes.BYTE:
case JavaTypes.BYTE_OBJ:
return new ByteId(cls, ((ByteId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.CHAR:
case JavaTypes.CHAR_OBJ:
return new CharId(cls, ((CharId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.DOUBLE:
case JavaTypes.DOUBLE_OBJ:
return new DoubleId(cls, ((DoubleId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.FLOAT:
case JavaTypes.FLOAT_OBJ:
return new FloatId(cls, ((FloatId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.INT:
case JavaTypes.INT_OBJ:
return new IntId(cls, ((IntId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.LONG:
case JavaTypes.LONG_OBJ:
return new LongId(cls, ((LongId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.SHORT:
case JavaTypes.SHORT_OBJ:
return new ShortId(cls, ((ShortId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.STRING:
return new StringId(cls, oid.toString(),
koid.hasSubclasses());
case JavaTypes.OID:
ClassMetaData embed = pk.getEmbeddedMetaData();
Object inner = koid.getIdObject();
if (embed != null)
inner = copy(inner, embed, embed.getFields());
return new ObjectId(cls, inner, koid.hasSubclasses());
case JavaTypes.OBJECT:
return new ObjectId(cls, koid.getIdObject(),
koid.hasSubclasses());
case JavaTypes.DATE:
return new DateId(cls, ((DateId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.BIGDECIMAL:
return new BigDecimalId(cls, ((BigDecimalId) oid).getId(),
koid.hasSubclasses());
case JavaTypes.BIGINTEGER:
return new BigIntegerId(cls, ((BigIntegerId) oid).getId(),
koid.hasSubclasses());
default:
throw new InternalException();
}
}
// create a new pc instance of the right type, set its key fields
// to the original oid values, then copy its key fields to a new
// oid instance
if (!Modifier.isAbstract(meta.getDescribedType().getModifiers())
&& !hasPCPrimaryKeyFields(meta)) {
Class type = meta.getDescribedType();
PersistenceCapable pc = PCRegistry.newInstance(type, null, oid,
false);
Object copy = pc.pcNewObjectIdInstance();
pc.pcCopyKeyFieldsToObjectId(copy);
return copy;
}
Object copy = (!meta.isObjectIdTypeShared()) ? oid
: ((ObjectId) oid).getId();
copy = copy(copy, meta, meta.getPrimaryKeyFields());
if (meta.isObjectIdTypeShared())
copy = new ObjectId(meta.getDescribedType(), copy,
((OpenJPAId) oid).hasSubclasses());
return copy;
}
Copy the given oid value. |