package edu.sc.seis.sod.source.event; import org.w3c.dom.Element; import edu.iris.Fissures.IfEvent.Magnitude; 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.chooser.ClockUtil; import edu.sc.seis.fissuresUtil.mockFissures.IfEvent.MockEventAttr; import edu.sc.seis.fissuresUtil.mockFissures.IfEvent.MockOrigin; import edu.sc.seis.fissuresUtil.time.MicroSecondTimeRange; import edu.sc.seis.sod.ConfigurationException; import edu.sc.seis.sod.SodUtil; import edu.sc.seis.sod.source.AbstractSource; public class PeriodicFakeEventSource extends AbstractSource implements EventSource { protected PeriodicFakeEventSource(MicroSecondDate startTime, TimeInterval interval, int numEvents) { super("PeriodicFakeEventSource"); this.startTime = startTime; this.interval = interval; this.numEvents = numEvents; nextEventTime = startTime; } public PeriodicFakeEventSource(Element config) throws ConfigurationException { super(config, "PeriodicFakeEventSource "); startTime = SodUtil.loadTime(SodUtil.getElement(config, "startTime")).load(); interval = SodUtil.loadTimeInterval(SodUtil.getElement(config, "interval")); numEvents = SodUtil.loadInt(config, "numEvents", -1); nextEventTime = startTime; } public String getDescription() { return "Periodic Fake Events "+numEvents+" events from "+startTime+" in steps of "+interval; } public MicroSecondTimeRange getEventTimeRange() { if (numEvents != -1) { return new MicroSecondTimeRange(startTime, (TimeInterval)interval.multiplyBy(numEvents-1)); } return new MicroSecondTimeRange(startTime, ClockUtil.wayFuture()); } public TimeInterval getWaitBeforeNext() { if (nextEventTime.before(ClockUtil.now())) { return new TimeInterval(0, UnitImpl.SECOND); } return nextEventTime.subtract(ClockUtil.now()); } public boolean hasNext() { return numEvents == -1 || eventCounter < numEvents; } public CacheEvent[] next() { if (nextEventTime.before(ClockUtil.now())) { eventCounter++; prevEventTime = nextEventTime; nextEventTime = startTime.add((TimeInterval)interval.multiplyBy(eventCounter)); return new CacheEvent[] { new CacheEvent(MockEventAttr.create(-1), MockOrigin.create(prevEventTime, mags)) }; } return new CacheEvent[0]; } MicroSecondDate startTime; TimeInterval interval; MicroSecondDate nextEventTime; MicroSecondDate prevEventTime = null; int numEvents = -1; int eventCounter = 0; static Magnitude[] mags = new Magnitude[] {new Magnitude("FAKE", -10, "nobody")}; }