package edu.sc.seis.sod.source.event;
import org.w3c.dom.Element;
import edu.iris.Fissures.model.MicroSecondDate;
import edu.iris.Fissures.model.TimeInterval;
import edu.iris.Fissures.model.UnitImpl;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.fissuresUtil.time.MicroSecondTimeRange;
import edu.sc.seis.sod.source.AbstractSource;
public abstract class SimpleEventSource extends AbstractSource implements EventSource {
public SimpleEventSource(Element config, String defaultName, int defaultRetries) {
super(config, defaultName, defaultRetries);
}
public SimpleEventSource(Element config, String defaultName) {
super(config, defaultName);
}
public SimpleEventSource(String name, int retries) {
super(name, retries);
}
public SimpleEventSource(String name) {
super(name);
}
public abstract CacheEvent[] getEvents();
public boolean hasNext() {
return ! hasNextBeenCalled;
}
public CacheEvent[] next() {
hasNextBeenCalled = true;
CacheEvent[] out = getEvents();
logger.debug("returning "+out.length+" events");
return out;
}
public TimeInterval getWaitBeforeNext() {
if (hasNextBeenCalled) {
throw new RuntimeException("SHouldn't happen");
}
return new TimeInterval(0, UnitImpl.SECOND);
}
public MicroSecondTimeRange getEventTimeRange() {
CacheEvent[] events = getEvents();
MicroSecondDate earliest = extractBeginTime(events[0]);
MicroSecondDate latest = earliest;
for(int i = 0; i < events.length; i++) {
MicroSecondDate eventTime = extractBeginTime(events[i]);
if(eventTime.before(earliest)) {
earliest = eventTime;
} else if(eventTime.after(latest)) {
latest = eventTime;
}
}
return new MicroSecondTimeRange(earliest, latest);
}
public MicroSecondDate extractBeginTime(CacheEvent ev) {
return new MicroSecondDate(ev.getOrigin().getOriginTime());
}
public boolean hasNextBeenCalled = false;
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SimpleEventSource.class);
}