*/
public Object getValue(PropertyMap instance, Source source)
{
if (instance instanceof OIDHolder)
{
OID oid = ((OIDHolder)instance).getOID();
if (oid == null)
{
return Undefined.VALUE;
}
Object value = getValue(oid, source);
if (value != Undefined.VALUE)
{
return value;
}
}
Attribute attribute = source.getAttribute();
if (attribute != null && !source.isInverse())
{
Object value = instance.findValue(attribute.getName(), Undefined.VALUE);
if (value != Undefined.VALUE)
{
return value;
}
}
if (source instanceof Field)
{
Column column = null;
RelationalPrimitiveMapping primitiveMapping = (RelationalPrimitiveMapping)source.getAttributeMapping();
if (primitiveMapping != null)
{
column = primitiveMapping.getColumn();
}
else
{
Object item = source.getItem();
if (item instanceof Column)
{
column = (Column)item;
}
else if (item instanceof Field[])
{
Object[] valueArray = null;
Field[] fieldArray = (Field[])item;
for (int i = 0; i < fieldArray.length; ++i)
{
Object value = getValue(instance, fieldArray[i]);
if (value == Undefined.VALUE)
{
valueArray = null;
break;
}
if (valueArray == null)
{
valueArray = new Object[fieldArray.length];
}
valueArray[i] = value;
}
if (valueArray != null)
{
return new OID(valueArray);
}
}
}
if (column != null)
{
PersistenceMapping persistenceMapping = ((SQLJoin)source.getMapping()).query.getPersistenceMapping();
if (persistenceMapping != null)
{
Metaclass metaclass = persistenceMapping.getMetaclass();
assert metaclass.isUpcast(m_context.getMetadata().getMetaclass(instance.getClassName()));
// TODO: Optimize with precomputed metadata
for (int nAttrOrdinal = 0, nAttrCount = metaclass.getInstanceAttributeCount();
nAttrOrdinal < nAttrCount; ++nAttrOrdinal)
{
attribute = metaclass.getInstanceAttribute(nAttrOrdinal);
AttributeMapping mapping = persistenceMapping.getAttributeMapping(attribute);
if (mapping instanceof RelationalPrimitiveMapping)
{
if (column == ((RelationalPrimitiveMapping)mapping).getColumn())
{
Object value = instance.findValue(attribute.getName(), Undefined.VALUE);
if (value != Undefined.VALUE)
{
return column.getValueType().convert(value);
}
}
}
else if (mapping instanceof RelationalClassMapping)
{
RelationalClassMapping classMapping = (RelationalClassMapping)mapping;
if (classMapping.isInner())
{
IndexColumn indexColumn = classMapping.getSourceKey().findIndexColumn(column);
if (indexColumn != null)
{
Object value = instance.findValue(attribute.getName(), Undefined.VALUE);
if (value == null)
{
return null;
}
if (value instanceof OIDHolder)
{
OID oid = ((OIDHolder)value).getOID();
if (oid != null && indexColumn.getOrdinal() < oid.getCount())
{
return oid.getValue(indexColumn.getOrdinal());
}
}
}
}
}