package com.openedit.hittracker;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.map.ListOrderedMap;
import org.openedit.Data;
import com.openedit.WebPageRequest;
public class CompositeHitTracker extends HitTracker
{
protected Map fieldHitTrackers;
protected HitTracker fieldValues;
public HitTracker getSubTracker(String inKey)
{
return (HitTracker) getHitTrackers().get(inKey);
}
public void addSubTracker(String inKey, HitTracker inTracker)
{
getHitTrackers().put(inKey, inTracker);
fieldValues = null;
}
public List getPageOfHits()
{
List result = new ArrayList();
for (Iterator iterator = getHitTrackers().values().iterator(); iterator.hasNext();)
{
HitTracker tracker = (HitTracker) iterator.next();
result.addAll(tracker.getPageOfHits());
}
return result;
}
protected HitTracker getValues()
{
if( fieldValues == null)
{
fieldValues = new ListHitTracker();
for (Iterator iterator = getHitTrackers().values().iterator(); iterator.hasNext();)
{
HitTracker tracker = (HitTracker) iterator.next();
fieldValues.addAll(tracker);
}
}
return fieldValues;
}
public Map getHitTrackers()
{
if (fieldHitTrackers == null)
{
fieldHitTrackers = ListOrderedMap.decorate(new HashMap());
}
return fieldHitTrackers;
}
public boolean contains(Object inHit)
{
return getValues().contains(inHit);
}
private HitTracker getFirstTracker()
{
if(getHitTrackers().size() > 0)
{
HitTracker tracker = (HitTracker)getHitTrackers().values().iterator().next();
return tracker;
}
return null;
}
public Data get(int inCount)
{
if(inCount == 0)
{
//Avoid calling getValues for performance reasons
HitTracker tracker = getFirstTracker();
if(tracker!= null && tracker.size()>0)
{
return tracker.get(0);
}
}
return (Data)getValues().get(inCount);
}
public Iterator iterator()
{
return getValues().iterator();
}
public int size()
{
int count = 0;
for (Iterator iterator = getHitTrackers().values().iterator(); iterator.hasNext();)
{
HitTracker tracker = (HitTracker) iterator.next();
count += tracker.size();
}
return count;
}
public String getValue(Object inHit, String inKey)
{
for (Iterator iterator = getHitTrackers().values().iterator(); iterator.hasNext();)
{
HitTracker tracker = (HitTracker) iterator.next();
String value = tracker.getValue(inHit, inKey);
if(value!=null)
return value;
}
return null;
}
public void addToSubTracker(String inKey, Object inHit)
{
HitTracker sub = getSubTracker(inKey);
if (sub != null)
{
sub.add(inHit);
}
}
public void ensureHasSubTracker(WebPageRequest inReq, String inKey)
{
if (getSubTracker(inKey) == null)
{
HitTracker sub = new ListHitTracker();
SearchQuery subQuery = getSearchQuery().copy();
subQuery.setHitsName("subhits");
subQuery.setCatalogId(inKey);
sub.setSearchQuery(subQuery);
inReq.putSessionValue(sub.getSessionId(), sub);
addSubTracker(inKey, sub);
}
}
public void setDataSource(String inDataSource) {
super.setDataSource(inDataSource);
for (Iterator iterator = getHitTrackers().values().iterator(); iterator.hasNext();) {
HitTracker tracker = (HitTracker) iterator.next();
tracker.setDataSource(inDataSource);
}
}
public void clear()
{
getHitTrackers().clear();
fieldValues = null;
}
public List getCatalogIds()
{
ArrayList<String> catalogids = new ArrayList<String>();
for (Iterator iterator = getHitTrackers().values().iterator(); iterator.hasNext();)
{
HitTracker sub = (HitTracker) iterator.next();
catalogids.add(sub.getCatalogId());
}
return catalogids;
}
}