/* ************************************************************************ # # 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 divconq.scheduler.limit.CheckInfo; import divconq.scheduler.limit.LimitHelper; import divconq.util.TimeUtil; import divconq.xml.XElement; abstract public class CommonHelper implements IScheduleHelper { protected XElement config = null; protected LimitHelper limits = null; protected DateTime last = null; protected CommonSchedule schedule = null; @Override public void init(CommonSchedule schedule, XElement config) { this.schedule = schedule; this.config = config; } @Override public void setLimits(LimitHelper limits) { this.limits = limits; } @Override public void setLast(DateTime last) { this.last = last; } /* // return true if passes the limits check public boolean checkLimits(Instant v) { if (this.limits != null) return this.limits.check(v); return true; } */ // used by daily, weekday and monthday helpers protected boolean checkStartupNeedsRun(ScheduleList list, IDateChecker checker) { // do not alter last. either we will use it in the scheduler normally // or, if we return true, we will set last to run asap CheckInfo ci = new CheckInfo(); ci.setWhen(this.last); // starting with last date, run through and check all dates until now // to see if any are open, if so it is valid to run for past while (true) { if (checker.checkDate(ci) && !this.limits.isDateBlocked(ci.getWhen())) { DateTime tlast = ci.getWhen(); ScheduleEntry se = list.next(tlast); // now check today to see if we should have run earlier today // note that if last started out as a past date that we would now // be pointing at midnight today. if last started out as today // then we would still be at the last run today value (e.g. last run 2 hours ago) while (se != null) { // add the scheduled entry to the time // (first time with a given date, this is the time past midnight) tlast = TimeUtil.withTime(tlast, se.getTime()); // if this schedule entry comes after now, then schedule normally if (!tlast.isBeforeNow()) return false; // we cannot schedule again, the schedule is expired // this will have to be figured out by the normal scheduler if (this.limits.isEnded(tlast)) return false; // did we miss a required run today? if so tell the normal scheduler // to run asap if (se.isRunIfMissed()) { this.schedule.setHint("_ScheduleTimeHint", se.getTime().toString()); return true; } // go on and check the next time today se = list.next(tlast); } } ci.incrementDay(); } } }