Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  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.limit;
 
 
 import java.util.List;
 
 
 
 // artificially limit expiration at 10 years, if none present
 // server should be restarted at least once every 10 years :)
 public class LimitHelper {
 	protected DayWindow dailyWindow = new DayWindow();
 	protected DateTime validFrom = null;
 	protected DateTime validTo = null;
 	protected DateTimeZone zone = null;
 	
 	// use only for next/check/blocked/open - do not inherit init/start/end
 	protected LimitHelper parent = null
 	
 	protected List<MonthWindowmonthly = new ArrayList<MonthWindow>();
 	
 	protected List<WeekdayWindowweekly = new ArrayList<WeekdayWindow>();
 	
 	public DayWindow getDailyWindow() {
 		return this.;
 	}
 	
 	/*
 	 *			<Limits 
 	 *				LinkBatch="None,Small,Medium,Large"   - include limits defined at server level (batch processing)
 	 *				DefaultWindow="T/F"			- by default you have 24 hours enabled
 					ValidFrom="iso-date-time"   - schedule only before/after these time 
 					ValidTo="iso-date-time"
 					TimeZone="name"				- zone to apply to the limits
 	 *			>  			
 	 *  	
 	 *  			// one or more windows during which it is ok to run the scheduled work
 	 *  			// defaults to beginning of day to end of day, no matter 
 	 *  			<IncludeWindow From="00:00" To="24:00" />
 	 *  
 	 *  			<ExcludeWindow From="04:15" To="04:17" />
 	 *  
 	 *				<Weekdays Monday="T/F" Tuesday="n" ... All="T/F" >
 	 *					// if exclude is not present, then assume entire day
 	 *					<ExcludeWindow From="" To="" />
 	 *				</Weekdays>
 	 *
 	 *  			<Months January="T/F" ... >
 	 *  				<First Monday="T/F" Tuesday="n" ... All="T/F" >
 	 *						<ExcludeWindow From="" To="" />
 	 *  				</First>
 	 *  				<Second Monday="T/F" Tuesday="n" ... All="T/F" >
 	 *						<ExcludeWindow From="" To="" />
 	 *  				</Second>
 	 *  				... etc, or ...
 	 *  				<Monthday List="N,N,N,Last"> 
 	 *						<ExcludeWindow From="" To="" />
 	 *  				</Monthday> 
 	 *  			</Months>
 	 *			</Limits>
 	 * 
 	 * @param config
 	 */
 	public void init(XElement config) {
 		if (config != null) {
 			String zone = config.getAttribute("TimeZone");
 			
 			if (StringUtil.isNotEmpty(zone))
 				this. = DateTimeZone.forID(zone);
 			
 			String from = config.getAttribute("ValidFrom");
 			
 			if (!StringUtil.isEmpty(from)) {
 				this. = TimeUtil.parseDateTime(from);
 				
 				// TODO not sure about this - parsing of ISO string should not be circumvented?
				if (this. != null)
					this. = new DateTime(this.this.);
			}
			String to = config.getAttribute("ValidTo");
			if (!StringUtil.isEmpty(to)) {
				this. = TimeUtil.parseDateTime(to);
				// TODO not sure about this - parsing of ISO string should not be circumvented?
				if (this. != null)
					this. = new DateTime(this.this.);
			}
			// default to 10 years from now
			if (this. == null)
				this. = new DateTime().plusYears(10);
			for (XElement el : config.selectAll("Months")) {
				MonthWindow ww = new MonthWindow();
				ww.init(thisel);
				this..add(ww);
			}
			for (XElement el : config.selectAll("Weekdays")) {
				ww.init(thisel);
				this..add(ww);
			}
			this..init(config);
			String batch = config.getAttribute("LinkBatch");
			if (StringUtil.isNotEmpty(batch)) 
		}
		else {
			this..init(null);
		}
		if (this. != null) {
			// if parent (batch) then we only use our daily overrides, 
			// not our month or weekly  
		}
	}
	// return true if instant can run within a window
	// return false if instant is in the past
	public boolean checkForRun(DateTime v) {
		if (this. != null)
			v = new DateTime(vthis.);
		// if this time was ended at mid or before midnight then entire day is blocked
		if (this.isEnded(v))
			return false;
		// if this time was not started by the end of the then entire day is blocked
		if (!this.isStarted(v))
			return false;
		// runs must also be now (recent) or future
			return false;
		if (this. != null
			return this..checkForRun(v);
		CheckInfo ci = new CheckInfo();
		ci.setWhen(v);
		// if there are any months, those take precedence over other
		if (this..size() > 0) {
			for (MonthWindow ww : this.)
				if (ww.appliesTo(ci)) 
					return (ww.check(ci) == .);
			return false;
		}		
		// if there are any weeks, those take precedence over daily
		else if (this..size() > 0) {
			for (WeekdayWindow ww : this.)
				if (ww.appliesTo(ci)) 
					return (ww.check(ci) == .);
			return false;
		}
		return (this..check(v) == .);
	}
	// return the start of the next available window for running
	// from "now"
		return this.nextAllowedRunAfter(new DateTime().minusMinutes(1));
	}
	// return the start of the next available window for running (must always be after or equal to now)
		if (this. != null)
			lin = new DateTime(linthis.);
		// cannot run before now - 2 minutes
		if (lin.plusMinutes(5).isBeforeNow())
			lin = new DateTime().minusMinutes(1);  // start back one minute so we can start on time
		// cannot run again
		if (this.isEnded(lin))
			return null;
		// must start at least at "from"
		if (!this.isStarted(lin))
			lin = this.;
		if (this. != null
			return this..nextAllowedRunAfter(lin);
		CheckInfo ci = new CheckInfo();
		ci.setWhen(lin);
		LocalTime nt = null;
		// move forward 1 day at a time till we find a date that has an opening
		while (true) {
			// if there are any months, those take precedence over other
			if (this..size() > 0) {
				for (MonthWindow ww : this.)
					if (ww.appliesTo(ci)) {
						nt = ww.nextTimeOn(ci);
						break;
					}
			}
			// if there are any weeks, those take precedence over daily
			else if (this..size() > 0) {
				for (WeekdayWindow ww : this.
					if (ww.appliesTo(ci)) {
						nt = ww.nextTimeOn(ci);
						break;
					}
			}
			else
				nt = this..nextTimeOn(ci.getWhen());
			if (nt != null)
				break;
			// there is no next allowed
			if (this.isEnded(ci.getWhen()))
				return null;
		}
		lin = TimeUtil.withTime(ci.getWhen(), nt);
		// there is no next allowed
		if (this.isEnded(lin))
			return null;
		return lin;
	}
	public boolean isDateBlocked(DateTime tlast) {
		if (this. != null)
			tlast = new DateTime(tlastthis.);
		// if this time was ended at mid or before midnight then entire day is blocked
		if (this.isEnded(tlast.withTime(0, 0, 0, 0)))
			return true;
		// if this time was not started by the end of the then entire day is blocked
		if (!this.isStarted(tlast.withTime(23, 59, 59, 0)))
			return true;
		if (this. != null
			return this..isDateBlocked(tlast);
		CheckInfo ci = new CheckInfo();
		ci.setWhen(tlast);
		// if there are any months, those take precedence over other
		if (this..size() > 0) {
			for (MonthWindow ww : this.)
				if (ww.appliesTo(ci))
					return false;
			return true;
		}
		// if there are any weeks, those take precedence over daily		
		else if (this..size() > 0) {
			// only need to find one window to return false
			for (WeekdayWindow ww : this.)
				if (ww.appliesTo(ci))
					return false;
			return true;
		}
		return this..excludeAll();
	}
	// return true if "now" is after valid start date 
	public boolean isStarted() {
		if (this. != null)
			return !this..isAfterNow();		// now is equal or greater than from
		return true;
	}
	// return true if param is after valid start date 
	public boolean isStarted(DateTime scheduleDate) {
		if (this. != null)
			return !this..isAfter(scheduleDate);		// now is equal or greater than from
		return true;
	}
	// return true if "now" is after valid end date 
	public boolean isEnded() {
		if (this. != null)
			return !this..isAfterNow();			// must be before now (not equal)
		return false;
	}
	// return true if param is after valid end date
	public boolean isEnded(DateTime scheduleDate) {
		if (this. != null)
			return !this..isAfter(scheduleDate);
		return false;
	}
	// return the first valid date for this schedule
	public DateTime getFirstDate() {
		return this.;
	}
	// return the last valid date for this schedule
	public DateTime getLastDate() {
		return this.;
	}
New to GrepCode? Check out our FAQ X