public Object valueFromRow(AbstractRecord row, JoinedAttributeManager joinManager, ObjectBuildingQuery sourceQuery, AbstractSession executionSession) throws DatabaseException {
Object fieldValue = row.get(this.getField());
if ((fieldValue == null) || (fieldValue instanceof String)) {
return null;
}
AbstractRecord nestedRow = this.getReferenceDescriptor().buildNestedRowFromFieldValue(fieldValue);
ClassDescriptor descriptor = this.getReferenceDescriptor();
if (descriptor.hasInheritance()) {
Class nestedElementClass = descriptor.getInheritancePolicy().classFromRow(nestedRow, executionSession);
descriptor = this.getReferenceDescriptor(nestedElementClass, executionSession);
}
ObjectBuilder objectBuilder = descriptor.getObjectBuilder();
Object toReturn = buildCompositeObject(objectBuilder, nestedRow, sourceQuery, joinManager);
if(getConverter() != null) {
toReturn = getConverter().convertDataValueToObjectValue(toReturn, executionSession);
}
return buildCompositeObject(objectBuilder, nestedRow, sourceQuery, joinManager);
}