package ibis.ipl.registry.central; import java.util.ArrayList; import java.util.SortedSet; import java.util.TreeSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class EventList { private static final Logger logger = LoggerFactory.getLogger(EventList.class); private final SortedSet<Event> events; private int minimum; public EventList() { events = new TreeSet<Event>(); minimum = 0; } /** * Returns the specified event. * * @param time Time of the requested event. * * @return the specified event, or null if it is not found. */ public Event get(int time) { logger.debug("getting event " + time); for(Event event: events) { if (event.getTime() == time) { logger.debug("getting event " + time + ", returning " + event); return event; } if (event.getTime() > time) { logger.debug("getting event " + time + ", returning <null>"); return null; } } logger.debug("getting event " + time + ", returning <null>"); return null; } public Event[] getList(int start) { logger.debug("getting events from " + start); ArrayList<Event> result = new ArrayList<Event>(); for(Event event: events) { logger.debug("considering " + event); int time = event.getTime(); if (time >= start) { if (result.isEmpty()) { logger.debug("adding " + event); result.add(event); } else { Event previous = result.get(result.size() - 1); if (time != (previous.getTime() + 1)) { logger.debug("NOT adding " + event + " time should be " + (previous.getTime() + 1)); return result.toArray(new Event[0]); } logger.debug("adding " + event); result.add(event); } } } return result.toArray(new Event[0]); } public Event[] getSignalEvents(int from, int to) { ArrayList<Event> result = new ArrayList<Event>(); for (Event event: events) { if (event.getTime() > to) { //no more events will have a time >= from and <= to return result.toArray(new Event[0]); } if (event.getType() == Event.SIGNAL && event.getTime() >= from) { result.add(event); } } return result.toArray(new Event[0]); } public void add(Event... newEvents) { for(Event event: newEvents) { events.add(event); if (logger.isDebugEnabled()) { logger.debug("adding event to list: " + event + ", list now " + toString()); } } } public void setMinimum(int time) { minimum = time; logger.debug("purging upto " + time); while(!events.isEmpty() && events.first().getTime() < time) { Event first = events.first(); logger.debug("removing " + first); events.remove(first); } } public int getNextRequiredEvent() { int result = minimum; for (Event event: events) { if (event.getTime() == result + 1) { result = result + 1; } } logger.debug("next required event: " + result); return result; } public String toString() { String message = "eventList: "; for(Event event: events) { message += event + " "; } return message; } }