@Override public void scheduleEvent(ArdenEvent event) { starting.scheduleEvent(event); if (starting.runOnEvent(event)) { ArdenEvent startEvent = starting.getTriggeringEvent(); ArdenTime startTime = new ArdenTime(startEvent.eventTime); ArdenTime end = new ArdenTime(startTime.add(length)); ScheduledCycle cycle = new ScheduledCycle(startTime, end); scheduledCycles.add(cycle); } }
@Override public ArdenTime getNextRunTime() { // Check if the starting trigger has happened ArdenTime startTime = starting.getNextRunTime(); if (startTime != null) { ArdenTime end = new ArdenTime(startTime.add(length)); ScheduledCycle cycle = new ScheduledCycle(startTime, end); scheduledCycles.add(cycle); } ScheduledCycle oldestCycle = null; Iterator<ScheduledCycle> iterator = scheduledCycles.iterator(); while (iterator.hasNext()) { ScheduledCycle cycle = iterator.next(); if (cycle.next.compareTo(cycle.end) > 0) { // Cycle is already finished. iterator.remove(); continue; } // Calculate cycle, which should be returned if (oldestCycle == null) { oldestCycle = cycle; } else if (cycle.next.compareTo(oldestCycle.next) < 0) { oldestCycle = cycle; } } if (oldestCycle == null) { return null; } currentDelay = oldestCycle.next.value - oldestCycle.start.value; ArdenTime nextRunTime = oldestCycle.next; oldestCycle.next = new ArdenTime(oldestCycle.next.add(interval)); return nextRunTime; }