ClassLoaderResolver clr)
{
if (!fmd.hasCollection() && !fmd.hasArray())
{
// TODO Localise this message
throw new JPOXException("Attempt to get element mapping for field " + fmd.getFullFieldName() +
" that has no collection/array!").setFatal();
}
if (fmd.getJoinMetaData() == null)
{
throw new JPOXException("Attempt to get element mapping for field " + fmd.getFullFieldName() +
" that has no join table defined for the collection/array").setFatal();
}
String userMappingClassName = null;
if (fmd.getElementMetaData() != null)
{
userMappingClassName = fmd.getElementMetaData().getValueForExtension("mapping-class");
}
if (userMappingClassName != null)
{
// User has defined their own mapping class for this element so use that
try
{
return clr.classForName(userMappingClassName);
}
catch (JPOXException jpe)
{
throw new JPOXUserException(LOCALISER.msg("041014", userMappingClassName)).setFatal();
}
}
boolean serialised = ((fmd.hasCollection() && fmd.getCollection().isSerializedElement()) ||
(fmd.hasArray() && fmd.getArray().isSerializedElement()));
boolean embeddedPC = (fmd.getElementMetaData() != null && fmd.getElementMetaData().getEmbeddedMetaData() != null);
boolean elementPC = ((fmd.hasCollection() && fmd.getCollection().getElementClassMetaData() != null) ||
(fmd.hasArray() && fmd.getArray().getElementClassMetaData() != null));
boolean embedded = true;
if (fmd.hasCollection())
{
embedded = fmd.getCollection().isEmbeddedElement();
}
else if (fmd.hasArray())
{
embedded = fmd.getArray().isEmbeddedElement();
}
TypeManager typeMgr = fmd.getMetaDataManager().getOMFContext().getTypeManager();
Class elementCls = null;
if (fmd.hasCollection())
{
elementCls = clr.classForName(fmd.getCollection().getElementType());
}
else if (fmd.hasArray())
{
elementCls = clr.classForName(fmd.getArray().getElementType());
}
boolean elementReference = typeMgr.isReferenceType(elementCls);
Class mc = null;
if (serialised)
{
if (elementPC)
{
// Serialised PC element
mc = SerialisedElementPCMapping.class;
}
else if (elementReference)
{
// Serialised Reference element
mc = SerialisedReferenceMapping.class;
}
else
{
// Serialised Non-PC element
mc = SerialisedMapping.class;
}
}
else if (embedded)
{
if (embeddedPC)
{
// Embedded PC type
mc = EmbeddedElementPCMapping.class;
}
else if (elementPC)
{
// "Embedded" PC type but no <embedded> so dont embed for now. Is this correct?
mc = PersistenceCapableMapping.class;
}
else
{
// Embedded Non-PC type
mc = getMappingClass(elementCls, serialised, embedded, fmd.getFullFieldName(),
typeMgr, container.getStoreManager().getApiAdapter());
}
}
else
{
// TODO Allow for other element mappings
throw new JPOXException("Attempt to get element mapping for field " + fmd.getFullFieldName() +
" when not embedded or serialised - please report this to JPOX developers").setFatal();
}
return mc;
}