{
AbstractMemberMetaData fmd = sm.getClassMetaData().getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
if (value != null)
{
boolean persistCascade = fmd.isCascadePersist();
ApiAdapter api = sm.getObjectManager().getApiAdapter();
if (persistCascade)
{
if (api.isPersistable(value))
{
// Process PC fields
if (JPOXLogger.REACHABILITY.isDebugEnabled())
{
JPOXLogger.REACHABILITY.debug(LOCALISER.msg("007004",
fmd.getFullFieldName()));
}
processPersistable(value, fmd);
}
else if (value instanceof Collection)
{
// Process all elements of the Collection that are PC
if (JPOXLogger.REACHABILITY.isDebugEnabled())
{
JPOXLogger.REACHABILITY.debug(LOCALISER.msg("007002",
fmd.getFullFieldName()));
}
Collection coll = (Collection)value;
Iterator iter = coll.iterator();
while (iter.hasNext())
{
Object element = iter.next();
if (api.isPersistable(element))
{
processPersistable(element, fmd);
}
}
}
else if (value instanceof Map)
{
// Process all keys, values of the Map that are PC
Map map = (Map)value;
// Process any keys that are PersistenceCapable
if (JPOXLogger.REACHABILITY.isDebugEnabled())
{
JPOXLogger.REACHABILITY.debug(LOCALISER.msg("007002",
fmd.getFullFieldName()));
}
Set keys = map.keySet();
Iterator iter = keys.iterator();
while (iter.hasNext())
{
Object mapKey = iter.next();
if (api.isPersistable(mapKey))
{
processPersistable(mapKey, fmd);
}
}
// Process any values that are PersistenceCapable
Collection values = map.values();
iter = values.iterator();
while (iter.hasNext())
{
Object mapValue = iter.next();
if (api.isPersistable(mapValue))
{
processPersistable(mapValue, fmd);
}
}
}
else if (value instanceof Object[])
{
// Process all array elements that are PC
if (JPOXLogger.REACHABILITY.isDebugEnabled())
{
JPOXLogger.REACHABILITY.debug(LOCALISER.msg("007003",
fmd.getFullFieldName()));
}
Object[] array = (Object[]) value;
for (int i=0;i<array.length;i++)
{
Object element = array[i];
if (api.isPersistable(element))
{
processPersistable(element, fmd);
}
}
}