package org.openedit.data; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.openedit.Data; import com.openedit.OpenEditException; import com.openedit.hittracker.HitTracker; import com.openedit.hittracker.SearchQuery; import com.openedit.users.User; public class FilteredTracker extends HitTracker { protected Searcher fieldSearcher; protected String fieldExternalId; protected String fieldExternalValue; protected String fieldListId; protected String fieldSourcePath; public String getSourcePath() { return fieldSourcePath; } public void setSourcePath(String inSourcePath) { fieldSourcePath = inSourcePath; } public void filter(String inExternalId, String inExternalValue) { setExternalId(inExternalId); setExternalValue(inExternalValue); } public HitTracker filtered() { SearchQuery query = getSearcher().createSearchQuery(); query.addMatches(getExternalId(), getExternalValue()); HitTracker results = getSearcher().search(query); return results; } public List filteredValues() { HitTracker tracker = filtered(); List values = new ArrayList(); for (Iterator iterator = tracker.iterator(); iterator.hasNext();) { Object data = iterator.next(); String val = tracker.getValue(data, getListId()); if( val != null) { values.add(val); } } return values; } public Iterator iterator() { return filtered().iterator(); } public void clear() { for (Iterator iterator = iterator(); iterator.hasNext();) { Object data = iterator.next(); if( data instanceof Data) { getSearcher().delete((Data)data, null); } else { throw new OpenEditException("Need API to delete documents"); } } } public String getExternalId() { return fieldExternalId; } public void setExternalId(String inExternalId) { fieldExternalId = inExternalId; } public String getExternalValue() { return fieldExternalValue; } public void setExternalValue(String inExternalValue) { fieldExternalValue = inExternalValue; } public String getListId() { return fieldListId; } public void setListId(String inListId) { fieldListId = inListId; } public Searcher getSearcher() { return fieldSearcher; } public void setSearcher(Searcher inSearcher) { fieldSearcher = inSearcher; } public Data findValue(String inListValue) { SearchQuery query = getSearcher().createSearchQuery(); query.setAndTogether(true); query.addMatches(getExternalId(), getExternalValue()); query.addMatches(getListId(), inListValue); HitTracker results = getSearcher().search(query); if (results.size() > 0) { Data data = (Data)results.get(0); return data; } return null; } public Data createData() { Data data = getSearcher().createNewData(); data.setProperty(getExternalId(), getExternalValue()); data.setSourcePath(getSourcePath()); return data; } public void addRow(String inListValue, User inUser) { if (findValue(inListValue) == null) { Data data = createData(); data.setProperty(getListId(), inListValue); getSearcher().saveData(data, inUser); } } public void saveRows(List inNewValues, User inUser) { removeExtraRows(inNewValues, inUser); List toAdd = filterToAdd(inNewValues, inUser); getSearcher().saveAllData(toAdd, inUser); } public List filterToAdd(List inNewValues, User inUser) { List currentValues = filteredValues(); List toAdd = new ArrayList(); for (Iterator iterator = inNewValues.iterator(); iterator.hasNext();) { String value = (String) iterator.next(); if (!currentValues.contains(value)) { Data data = createData(); data.setProperty(getListId(), value); toAdd.add(data); } } return toAdd; } private void removeExtraRows(List inNewValues, User inUser) { for (Iterator iterator = filtered().iterator(); iterator.hasNext();) { Data data = (Data) iterator.next(); if (!inNewValues.contains(data.get(getListId()))) { getSearcher().delete(data, inUser); } } } public void deleteValues(List inListValues, User inUser) { for (Iterator iterator = filtered().iterator(); iterator.hasNext();) { Data data = (Data) iterator.next(); if (inListValues.contains(data.get(getListId()))) { getSearcher().delete(data, inUser); } } } public int size() { return filtered().size(); } public boolean contains(Object inHit) { // TODO Auto-generated method stub return false; } public Data get(int inCount) { // TODO Auto-generated method stub return null; } public Data toData(Object inHit) { // TODO Auto-generated method stub return null; } }