package org.oddjob.schedules;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
/**
* @oddjob.description Provide a schedule based on a list of schedules. All schedules are
* evaluated and that schedule which is due to start first is used.
*
*
* @oddjob.example
*
* Schedule on Monday and a Friday.
*
* {@oddjob.xml.resource org/oddjob/schedules/ScheduleListExample.xml}
*
* @author Rob Gordon
*/
final public class ScheduleList implements Serializable, Schedule {
private static final long serialVersionUID = 20051125;
private static final Logger logger = Logger.getLogger(ScheduleList.class);
/**
* @oddjob.property
* @oddjob.description The list of schedules.
* @oddjob.required No, but pointless if missing.
*/
private final List<Schedule> schedules =
new ArrayList<Schedule>();
public void setSchedules(int index, Schedule schedule) {
if (schedule == null) {
schedules.remove(index);
}
else {
schedules.add(index, schedule);
}
}
public Schedule getSchedules(int index) {
return schedules.get(index);
}
public void setSchedules(Schedule[] schedules) {
this.schedules.clear();
this.schedules.addAll(Arrays.asList(schedules));
}
public Schedule[] getSchedules() {
return this.schedules.toArray(new Schedule[0]);
}
/**
* The number of subschedules this list contains.
*
* @return The number of subschedules.
*/
public int size() {
return schedules.size();
}
/*
* (non-Javadoc)
* @see org.treesched.Schedule#nextDue(java.util.Date)
*/
public ScheduleResult nextDue(ScheduleContext context) {
Date now = context.getDate();
logger.debug(this + ": in date " + now);
if (schedules == null || schedules.size() == 0) {
return null;
}
ScheduleResult candidate = null;
int i = 1;
for (Schedule schedule : schedules) {
logger.debug(this + ": evaluating schedule " + i++ + " (" + schedule + ")");
ScheduleResult nextDue = schedule.nextDue(context);
if (nextDue != null) {
if (candidate == null || new IntervalHelper(
nextDue).isBefore(candidate)) {
candidate = nextDue;
}
}
}
logger.debug(this + ": returning " + candidate);
return candidate;
}
/**
* Override toString to be more useful.
*
* @return A description of the schedule.
*/
public String toString() {
return "ScheduleList, size=" + size();
}
}