/* ************************************************************************
#
# DivConq
#
# http://divconq.com/
#
# Copyright:
# Copyright 2014 eTimeline, LLC. All rights reserved.
#
# License:
# See the license.txt file in the project's top-level directory for details.
#
# Authors:
# * Andy White
#
************************************************************************ */
package divconq.scheduler.common;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.ISOPeriodFormat;
import divconq.util.StringUtil;
import divconq.xml.XElement;
/*
* // use ISO periods, e.g. PT2H30M10S
* // used for intra-daily mostly, but can be any
* <Period Value="n" />
*/
public class PeriodHelper extends CommonHelper {
protected Period period = null;
// first time this code was run since the module/server was started
// requires special check for any missed runs
protected boolean firstCall = true;
@Override
public void init(CommonSchedule schedule, XElement config) {
super.init(schedule, config);
if (config == null)
return;
String period = config.getAttribute("Value");
if (!StringUtil.isEmpty(period))
try {
this.period = ISOPeriodFormat.standard().parsePeriod(period);
}
catch (Exception x) {
// TODO log
}
}
// return null to indicate this can never run again
@Override
public DateTime next() {
if (this.firstCall) {
this.firstCall = false;
if (this.limits.isEnded()) {
this.last = null;
return null;
}
// if there was no past runs, do not try to find them
// or if last run was more than one period old, then run asap
if ((this.last == null) || (this.last.plus(this.period.toStandardDuration()).isBeforeNow())) {
this.last = this.limits.nextAllowedRun();
return this.last;
}
}
if (this.last == null)
return null;
this.last = this.last.plus(this.period);
// we cannot schedule again, the schedule is expired
if (this.limits.isEnded(this.last))
return null;
// can we run at the suggested time?
if (this.limits.checkForRun(this.last))
return this.last;
this.last = this.limits.nextAllowedRunAfter(this.last);
return this.last;
}
}