package net.sourceforge.jaxor.util;
import net.sourceforge.jaxor.LazyLoader;
import net.sourceforge.jaxor.ReferenceResolver;
import net.sourceforge.jaxor.MetaField;
import net.sourceforge.jaxor.EntityRow;
import net.sourceforge.jaxor.api.EntityInterface;
import net.sourceforge.jaxor.api.EntityListAdapter;
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
/**
* Created By: Mike
* Date: Feb 14, 2004
* Time: 4:46:19 PM
*
* Last Checkin: $Author: mrettig $
* Date: $Date: 2004/03/03 04:42:10 $
* Revision: $Revision: 1.2 $
*/
public class ForeignFieldLazyLoader extends LazyLoader {
private final ReferenceResolver _resolver;
public ForeignFieldLazyLoader(Class finderClass, EntityRow parent, boolean unique) {
this(new ReferenceResolver(finderClass, parent, unique));
}
public ForeignFieldLazyLoader(ReferenceResolver keys) {
_resolver = keys;
}
public void addKey(MetaField sourceField, MetaField targetField) {
getResolver().add(sourceField, targetField);
}
public ReferenceResolver getResolver() {
return _resolver;
}
protected Object resolve() {
return _resolver.getObject();
}
public void setValue(Object result) {
super.setValue(result);
if(result == null)
return;
if(getResolver().isUnique())
syncSourceFieldsWithTarget(result);
}
/**
* Field may resolve to a single entity or an entity list. This will always
* return a list to make working with the entities easier;
* @return
*/
public List getFieldAsList(){
if(getResolver().isUnique()){
List result = new ArrayList();
Object value = getValue();
if(value != null)
result.add(value);
return result;
}
return ((EntityListAdapter)getValue()).toList();
}
private void syncSourceFieldsWithTarget(Object result) {
List keys = getResolver().getKeys();
EntityRow targetEntity = ((EntityInterface)result).getFields();
EntityRow sourceEntity = getResolver().getSourceEntity();
for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
ReferenceResolver.MetaPair metaPair = (ReferenceResolver.MetaPair) iterator.next();
String sourceProperty = metaPair.Source.getProperty();
String targetProperty = metaPair.Target.getProperty();
sourceEntity.setPropertyValue(sourceProperty, targetEntity.getPropertyValue(targetProperty));
}
}
}
|