package edu.usc.enl.dynamicmeasurement.model.event; import edu.usc.enl.dynamicmeasurement.algorithms.transform.PacketPipe; import edu.usc.enl.dynamicmeasurement.data.DataPacket; import edu.usc.enl.dynamicmeasurement.process.EpochPacket; import edu.usc.enl.dynamicmeasurement.process.PacketUser; import java.util.Collections; import java.util.LinkedList; /** * Created with IntelliJ IDEA. * User: masoud * Date: 9/1/13 * Time: 10:42 PM <br/> * This is the kind of packet pipe that upon receiving epochs it runs an event. * It should be possible to have an implementation that does not need to be pipe. */ public class EventRunner extends PacketPipe { private LinkedList<Event> events; public EventRunner(PacketUser nextUser, LinkedList<Event> events) { super(nextUser); this.events = events; Collections.sort(events, new Event.EventTimeComparator()); runEvents(-1); //for 0 events } @Override protected void process2(DataPacket p) { passPacket(p); } @Override protected void step(EpochPacket p) { passPacket(p);//want all middle things do their step (especially transforms), then add or remove runEvents(p.getStep()); } private void runEvents(int step) { try { while (events.size() > 0) { Event event = events.peek(); if (event.getEpoch() > step + 1) {//want to run events at the beginning of each epoch break; } else { events.pop(); System.out.println("run " + event); event.run(); } } } catch (Exception e) { e.printStackTrace(); } } public boolean isEmpty() { return events.size() == 0; } }