package org.oddjob.schedules.schedules;
import java.io.Serializable;
import java.util.Date;
import org.apache.log4j.Logger;
import org.oddjob.schedules.AbstractSchedule;
import org.oddjob.schedules.Schedule;
import org.oddjob.schedules.ScheduleContext;
import org.oddjob.schedules.ScheduleResult;
/**
* @oddjob.description This schedule will return it's last due nested
* schedule within the given parent interval.
*
* @oddjob.example
*
* Last Tuesday or Wednesday of the month, whichever is last.
*
* {@oddjob.xml.resource org/oddjob/schedules/schedules/LastExample.xml}
*
*
* @author Rob Gordon
*/
final public class LastSchedule extends AbstractSchedule implements Serializable {
private static final long serialVersionUID = 20050226;
private static final Logger logger = Logger.getLogger(LastSchedule.class);
/**
* Calculate the next due interval within the given interval.
*/
public ScheduleResult nextDue(ScheduleContext context) {
Date now = context.getDate();
if (now == null) {
return null;
}
if (getRefinement() == null) {
throw new IllegalStateException("Last must have a child schedule.");
}
logger.debug(this + ": in date is " + now);
ScheduleResult last = null;
Date use = now;
Schedule child = getRefinement();
while(true) {
logger.debug(this + ": use date is " + use);
ScheduleResult candidate = child.nextDue(context.move(use));
if (candidate == null) {
break;
}
if (last == null || candidate.getFromDate().after(last.getFromDate())) {
last = candidate;
}
use = last.getUseNext();
if (use == null) {
break;
}
}
return last;
}
/**
* Override toString.
*/
public String toString() {
return "Last Schedule";
}
}