package uk.ac.imperial.lsds.seep.contribs.esper; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jetty.util.MultiMap; import uk.ac.imperial.lsds.seep.comm.serialization.DataTuple; import uk.ac.imperial.lsds.seep.infrastructure.api.RestAPIRegistryEntry; public class RestAPIEsperGetMatches implements RestAPIRegistryEntry { private EsperSingleQueryOperator operator; public RestAPIEsperGetMatches(EsperSingleQueryOperator operator) { this.operator = operator; } @Override public Object getAnswer(MultiMap<String> reqParameters) { List<DataTuple> result = new ArrayList<DataTuple>(); List<DataTuple> cache = this.operator.getMatchCache(); /* * Should we keep all matches? */ boolean keep = false; if (reqParameters.containsKey("keep")) keep = Boolean.valueOf(reqParameters.getValue("keep",0)); /* * Do we have a time window? */ if (reqParameters.containsKey("start") && reqParameters.containsKey("stop")) { long start = Long.valueOf(reqParameters.getValue("start",0)); long stop = Long.valueOf(reqParameters.getValue("stop",0)); List<DataTuple> tmpResult = new ArrayList<DataTuple>(); synchronized(cache) { Iterator<DataTuple> iter = cache.iterator(); while (iter.hasNext()) { DataTuple t = iter.next(); if (start <= t.getPayload().timestamp && t.getPayload().timestamp <= stop) { tmpResult.add(t); if (!keep) iter.remove(); } } } /* * Is there a step to consider? */ long step = -1; if (reqParameters.containsKey("step")) step = Long.valueOf(reqParameters.getValue("step",0)); if (step != -1) { long stepEnd = start + step; int i = 0; do { if (i < tmpResult.size()) { DataTuple t = tmpResult.get(i); if (t.getPayload().timestamp < stepEnd) { result.add(t); while ((t.getPayload().timestamp < stepEnd) && i < tmpResult.size()) t = tmpResult.get(i++); } else { result.add(null); } } else result.add(null); stepEnd += step; } while (stepEnd <= stop); } else { result = tmpResult; } } else { /* * No time window */ synchronized(cache) { result.addAll(cache); if (!keep) cache.clear(); } } return result; } }