int position = 0;
int[] pkPositions = cmd.getPKMemberPositions();
for (int i=0;i<pkPositions.length;i++)
{
AbstractMemberMetaData mmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(pkPositions[i]);
Object memberValue = null;
if (mmd instanceof FieldMetaData)
{
memberValue = ClassUtils.getValueOfFieldByReflection(value, mmd.getName());
}
else
{
memberValue = ClassUtils.getValueOfMethodByReflection(value,
ClassUtils.getJavaBeanGetterName(mmd.getName(), false), null);
}
if (nucleusCtx.getApiAdapter().isPersistable(mmd.getType()))
{
// Compound PK field, so recurse
// TODO Cater for cases without own table ("subclass-table")
AbstractClassMetaData subCmd = nucleusCtx.getMetaDataManager().getMetaDataForClass(mmd.getType(), clr);
RDBMSStoreManager storeMgr = (RDBMSStoreManager) nucleusCtx.getStoreManager();
DatastoreClass subTable = storeMgr.getDatastoreClass(mmd.getTypeName(), clr);
JavaTypeMapping subMapping = subTable.getIdMapping();
Object subValue = getValueForPrimaryKeyIndexOfObjectUsingReflection(memberValue, index-position,
subCmd, nucleusCtx, clr);
if (index < position + subMapping.getNumberOfDatastoreMappings())
{
return subValue;
}
position = position + subMapping.getNumberOfDatastoreMappings();
}
else
{
// Normal PK field
if (position == index)
{
if (mmd instanceof FieldMetaData)
{
return ClassUtils.getValueOfFieldByReflection(value, mmd.getName());
}
else
{
return ClassUtils.getValueOfMethodByReflection(value,
ClassUtils.getJavaBeanGetterName(mmd.getName(), false), null);
}
}
position++;
}
}