001: package net.sourceforge.jaxor;
002:
003: import net.sourceforge.jaxor.api.FinderAdapter;
004:
005: import java.io.Serializable;
006: import java.util.ArrayList;
007: import java.util.Iterator;
008: import java.util.List;
009:
010: /*
011: * User: Mike
012: * Date: Sep 2, 2003
013: * Time: 9:12:55 PM
014: */
015:
016: public class ReferenceResolver implements Serializable {
017:
018: private final Class _finderClass;
019: private final List _metaRowList = new ArrayList();
020: private final boolean _unique;
021: private final String _querySql;
022: private final String _findSql;
023: private final EntityRow _parent;
024:
025: public ReferenceResolver(Class finderClass, EntityRow source,
026: boolean unique) {
027: _finderClass = finderClass;
028: _unique = unique;
029: _parent = source;
030: _querySql = null;
031: _findSql = null;
032: }
033:
034: public ReferenceResolver(Class finderClass, EntityRow source,
035: boolean unique, String querySql, String findSql) {
036: _finderClass = finderClass;
037: _unique = unique;
038: _parent = source;
039: _querySql = querySql;
040: _findSql = findSql;
041: }
042:
043: public void add(MetaField sourceMeta, MetaField targetMeta) {
044: MetaPair pair = new MetaPair();
045: pair.Source = sourceMeta;
046: pair.Target = targetMeta;
047: _metaRowList.add(pair);
048: }
049:
050: public List getKeys() {
051: return _metaRowList;
052: }
053:
054: public static class MetaPair implements Serializable {
055: public MetaField Source;
056: public MetaField Target;
057: }
058:
059: public Object getObject() {
060: if (_parent == null || _parent.getJaxorContext() == null)
061: return null;
062: FinderAdapter finder = createFinder();
063: QueryParams params = new QueryParams();
064:
065: for (Iterator iterator = _metaRowList.iterator(); iterator
066: .hasNext();) {
067: MetaPair pair = (MetaPair) iterator.next();
068: MetaField source = pair.Source;
069: Object value = getValue(source.getProperty());
070: params.add(source.getMapperInstance(), value);
071: }
072: if (_unique) {
073: try {
074: if (_querySql != null)
075: return finder.getFinder().query(_querySql, params)
076: .entity();
077: else
078: return finder.getFinder().find(createFindSql(),
079: params).entity();
080: } catch (EntityNotFoundException e) {
081: return null;
082: }
083: } else {
084: List list = resolveList(finder, params);
085: return _parent.getJaxorContext().createListImpl(list,
086: finder.getFinder().getMetaRow().getListImplClass());
087: }
088: }
089:
090: private List resolveList(FinderAdapter finder, QueryParams params) {
091: if (_querySql != null)
092: return finder.getFinder().query(_querySql, params).list();
093: else
094: return finder.getFinder().find(createFindSql(), params)
095: .list();
096: }
097:
098: public Object getValue(String propertyName) {
099: return _parent.getPropertyValue(propertyName);
100: }
101:
102: private FinderAdapter createFinder() {
103: return _parent.getJaxorContext().getFinder(_finderClass);
104: }
105:
106: public String createFindSql() {
107: if (_findSql != null)
108: return _findSql;
109: String sql = "where ";
110: for (Iterator iterator = _metaRowList.iterator(); iterator
111: .hasNext();) {
112: MetaPair pair = (MetaPair) iterator.next();
113: sql += pair.Target.getColumn() + "=?";
114: if (iterator.hasNext())
115: sql += " AND ";
116: }
117: return sql;
118: }
119:
120: public EntityRow getSourceEntity() {
121: return _parent;
122: }
123:
124: public boolean isUnique() {
125: return _unique;
126: }
127: }
|