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.common;
 
 import java.util.List;
 
 
 
 public class WeekdayHelper extends CommonHelper {
 	protected List<WeekdayEntryweekdays = new ArrayList<WeekdayEntry>();
 	
 	// first time this code was run since the module/server was started
 	// requires special check for any missed runs
 	protected boolean firstCall = true;
 	
 	public void init(CommonSchedule scheduleXElement config) {
 		if (config != null) {
 			for (XElement el : config.selectAll("Weekdays")) {
 				WeekdayEntry entry = new WeekdayEntry();
 				entry.init(el);
 				this..add(entry);
 			}
 		}
 		
 		if (this..size() == 0) {
 			WeekdayEntry entry = new WeekdayEntry();
 			entry.init(null);
 			this..add(entry);
 		}
 	}
 	
 	// return null to indicate this can never run again
 	public DateTime next() {
 		this..setHint("_ScheduleTimeHint""");
 		
 		if (this.) {
 			this. = false;
 			
 			if (this..isEnded())
 				return null;
 			
 			// if the valid range for schedule has not started yet, then 
 			// schedule way out
 			if (!this..isStarted()) {
 				this. = false;
 				this. = new DateTime(this..getFirstDate());
 			}
 			// if there was no past runs, do not try to find them
 			// or if there are not any required
 			//else if (this.last == null) {
 			//	this.last = new DateTime();		// start with today (now)
 			//}
 			// see if we need to run because of a missed past schedule
 			else {
 				if (this. == null
 						this. = new DateTime(1970, 1, 1, 0, 0, 0, 0);		// start with today (now)
 						
 				for (WeekdayEntry we : this.) {
 					if (this.checkStartupNeedsRun(we.dailySchedulewe)) {		
 						//System.out.println("run asap!!!!");
 						this. = this..nextAllowedRun();
 						return this.;
 					}
 				}
 
 				if (this. == null)
 					this. = new DateTime();		// start with today (now)
 			}
 		}
 		
 		// we should never get here with a really out of date "last", today is fine
 		CheckInfo ci = new CheckInfo();
 		ci.setWhen(this.);
 
 		while (true) {
 			for (WeekdayEntry we : this.) {
 				if (we.checkDate(ci)) {
					ScheduleEntry se = we.dailySchedule.next(ci.getWhen());
					while (se != null) {
						// add the scheduled entry to the time
						// (first time with a given date, this is the time past midnight)
						DateTime tlast = TimeUtil.withTime(ci.getWhen(), se.getTime());
						// we cannot schedule again, the schedule is expired
						if (this..isEnded(tlast)) {
							this. = null;
							return null;
						}
						// can we run at the suggested time?
						if (this..checkForRun(tlast)) {
							this. = tlast;
							return this.;
						}
						// if not, should we run asap after the suggested time
						if (se.isRunIfMissed()) {
							this. = this..nextAllowedRunAfter(tlast);
							return this.;
						}
						// go on and check the next time
						se = we.dailySchedule.next(tlast);
					}
					break;
				}
			}
		}
	}
	class WeekdayEntry implements IDateChecker {
		// (0 = monday, 6 = sunday)
		BitSet dayOfWeek = new BitSet(7);
		public void init(XElement config) {
			if (config != null) {
				if ("True".equals(config.getAttribute("All")))
					this..set(0, 6);
				if ("True".equals(config.getAttribute("Monday")))
					this..set(0);
				if ("True".equals(config.getAttribute("Tuesday")))
					this..set(1);
				if ("True".equals(config.getAttribute("Wednesday")))
					this..set(2);
				if ("True".equals(config.getAttribute("Thursday")))
					this..set(3);
				if ("True".equals(config.getAttribute("Friday")))
					this..set(4);
				if ("True".equals(config.getAttribute("Saturday")))
					this..set(5);
				if ("True".equals(config.getAttribute("Sunday")))
					this..set(6);
			}
			// if none set then default to all
			if (this..cardinality() == 0)
				this..set(0, 6);
			this..init(config);
		}
		public boolean checkDate(CheckInfo ci) {
			if (this..get(ci.getDayOfWeek() - 1)) 
				return true;
			return false;
		}
	}
New to GrepCode? Check out our FAQ X