InstructionHandle lv_o[] = new InstructionHandle[2];
String oidClassName = cmd.getObjectidClass();
if ((oidClassName != null) && (oidClassName.length() > 0))
{
ObjectType oidType = new ObjectType(oidClassName);
il.append(InstructionConstants.ALOAD_1);
BranchInstruction checkFmNotNull = new IFNONNULL(null);
il.append(checkFmNotNull);
createThrowException(ClassEnhancer.CN_IllegalArgumentException, "ObjectIdFieldConsumer is null");
checkFmNotNull.setTarget(il.append(InstructionConstants.ALOAD_2));
il.append(factory.createInstanceOf(oidType));
BranchInstruction isInstanceof = new IFNE(null);
il.append(isInstanceof);
createThrowException(ClassEnhancer.CN_ClassCastException, "oid is not instanceof " + oidClassName);
isInstanceof.setTarget(il.append(InstructionConstants.ALOAD_2));
il.append(factory.createCast(Type.OBJECT, oidType));
lv_o[0] = il.append(new ASTORE(3));
if (fields != null)
{
for (int i = 0; i < fields.length; i++)
{
AbstractMemberMetaData fieldConfig = (AbstractMemberMetaData)fields[i];
if (fieldConfig.isPrimaryKey())
{
BCELMember field = ((BCELFieldPropertyMetaData)targetFields[i]).getEnhanceField();
il.append(InstructionConstants.ALOAD_1);
il.append(BCELUtils.getBIPUSH(i));
//support for identifying relationships
//if the class has metadata, it is PersistenceCapable
//add JDOHelper.getObjectId(fieldXXXX);
MetaDataManager mgr = cmd.getMetaDataManager();
AbstractClassMetaData cmd = mgr.getMetaDataForClass(fieldConfig.getType(),
enhancer.getClassLoaderResolver());
if (cmd != null && cmd.getIdentityType() != IdentityType.NONDURABLE)
{
//jdoGetPersistenceManager().getObjectById(id.field,false)
// jdoGetPersistenceManager
il.append(InstructionConstants.ALOAD_0);
il.append(factory.createInvoke(ClassEnhancer.CN_PersistenceCapable, ClassEnhancer.MN_JdoGetPersistenceManager,
BCELClassEnhancer.OT_PersistenceManager, Type.NO_ARGS, Constants.INVOKEINTERFACE));
// getObjectById(id.field,false)
// id.field
createGetField(
oidClassName,
fieldConfig.getName(),
new ObjectType(cmd.getObjectidClass()),
fieldConfig.isProperty(),
getModifiers(oidClassName, fieldConfig.getName()),
new ALOAD(3));
// false
il.append(InstructionConstants.ICONST_0);
// getObjectById
il.append(factory.createInvoke(ClassEnhancer.CN_PersistenceManager, "getObjectById", Type.OBJECT,
new Type[]{Type.OBJECT, Type.BOOLEAN}, Constants.INVOKEINTERFACE));
il.append(factory.createCast(Type.OBJECT, ((BCELFieldPropertyMetaData)fieldConfig).getEnhanceField().getType()));
}
else
{
if (mgr.getApiAdapter().isSingleFieldIdentityClass(oidClassName))
{
Type getKeyReturnType = field.getType();
if (oidClassName.equals(LongIdentity.class.getName()))
{
getKeyReturnType = Type.LONG;
}
else if (oidClassName.equals(CharIdentity.class.getName()))
{
getKeyReturnType = Type.CHAR;
}
else if (oidClassName.equals(ByteIdentity.class.getName()))
{
getKeyReturnType = Type.BYTE;
}
else if (oidClassName.equals(IntIdentity.class.getName()))
{
getKeyReturnType = Type.INT;
}
else if (oidClassName.equals(ShortIdentity.class.getName()))
{
getKeyReturnType = Type.SHORT;
}
else if (oidClassName.equals(StringIdentity.class.getName()))
{
getKeyReturnType = Type.STRING;
}
else if (oidClassName.equals(ObjectIdentity.class.getName()))
{
getKeyReturnType = Type.OBJECT;
}
if (!getKeyReturnType.equals(field.getType()))
{
if (getKeyReturnType == Type.OBJECT)
{
// Return type from getKey() needs cast to correct object type
il.append(InstructionFactory.createLoad(Type.OBJECT, 3));
il.append(factory.createInvoke(oidClassName, "getKey", getKeyReturnType, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
il.append(factory.createCheckCast(new ObjectType(fieldConfig.getTypeName())));
}
else
{
// Return type from getKey() needs conversion to object wrapper
il.append(factory.createNew(fieldConfig.getTypeName()));