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 MonthHelper extends CommonHelper {
 	protected List<MonthEntrymonths = new ArrayList<MonthEntry>();
 	
 	// 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("Months")) {
 				MonthEntry entry = new MonthEntry();
 				entry.init(el);
 				this..add(entry);
 			}
 		}
 		
 		if (this..size() == 0) {
 			MonthEntry entry = new MonthEntry();
 			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 deep past
 					
 				for (MonthEntry we : this.) {
 					if (we.checkStartupNeedsRun()) {		
 						//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 (MonthEntry we : this.) {
				if (me != null) {
					ScheduleEntry se = me.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 = me.dailySchedule.next(tlast);
					}
					break;
				}
			}
		}
	}
	class MonthEntry implements IDateChecker {
		// (0 = jan, 11 = dec)
		protected BitSet monthOfYear = new BitSet(12);
		public void init(XElement config) {
			if (config != null) {
				if ("True".equals(config.getAttribute("All")))
					this..set(0, 11);
				if ("True".equals(config.getAttribute("January")))
				if ("True".equals(config.getAttribute("February")))
				if ("True".equals(config.getAttribute("March")))
				if ("True".equals(config.getAttribute("April")))
				if ("True".equals(config.getAttribute("May")))
				if ("True".equals(config.getAttribute("June")))
				if ("True".equals(config.getAttribute("July")))
				if ("True".equals(config.getAttribute("August")))
				if ("True".equals(config.getAttribute("September")))
				if ("True".equals(config.getAttribute("October")))
				if ("True".equals(config.getAttribute("November")))
					this..set(10);
				if ("True".equals(config.getAttribute("December")))
					this..set(11);
				String[] slots = { "Monthday""First""Second""Third""Fourth""Last" };
				for (String slot : slots)			
					for (XElement el : config.selectAll(slot)) {
						ww.init(el);
						this..add(ww);
					}
			}
			// if none set, then default to all
			if (.cardinality() == 0)
				this..set(0, 11);
			if (this..size() == 0) { 
				ww.init(null);
				this..add(ww);
			}
		}		
		// the meaning of this method is off a little from expected
		// normally this should only check monthOfYear and ignore the monthdays
		// but for the checkStartupNeedsRun this needs to check the monthdays
		// lets see if any problem come up
		public boolean checkDate(CheckInfo ci) {
			if (this..get(ci.getMonthOfYear() - 1)) 
				for (MonthdayEntry w : this.
					if (w.checkDate(ci))
						return true;
			return false;
		}
			if (this..get(ci.getMonthOfYear() - 1)) 
				for (MonthdayEntry w : this.
					if (w.checkDate(ci))
						return w;
			return null;
		}
		public boolean checkStartupNeedsRun() {
			for (MonthdayEntry w : this.
				if (MonthHelper.this.checkStartupNeedsRun(w.dailySchedulethis)) 
					return true;
			return false;
		}
	}
	class MonthdayEntry implements IDateChecker {
		// (0 = monday, 6 = sunday)
		BitSet dayOfWeek = new BitSet(7);
		// if type SET then look here for the listed days 
		protected BitSet dayOfMonth = new BitSet(31);
		// does the set include "Last"
		protected boolean isLastDayOfMonth = false;		
		public void init(XElement config) {
			if (config != null) {
				String kind = config.getName();
				if ("First".equals(kind))
				else if ("Second".equals(kind))
				else if ("Third".equals(kind))
				else if ("Fourth".equals(kind))
				else if ("Last".equals(kind))
				if (this. != .) {
					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);
				}
				else {
					String list = config.getAttribute("List");
					if (StringUtil.isEmpty(list) || "All".equals(list)) {
						this. = true;
						this..set(0, 30);
					}
					else {
						String[] parts = list.split(",");
						for (String p : parts) {
							if (p.equals("Last")) {
								this. = true;
								break;
							}
							int idx = (int)StringUtil.parseInt(p, 0) - 1;
							if (idx > -1)
								this..set(idx);
						}
					}
				}
			}
			if ((this. == .) && (this..cardinality() == 0)) {
				this. = true;
				this..set(0, 30);
			}
			this..init(config);
		}
		public boolean checkDate(CheckInfo si) {
			if (this. == .) {
				if (si.isLastDay() && this.)
					return true;
				else if (this..get(si.getDayOfMonth() - 1))
					return true;
			}
			else if (this..get(si.getDayOfWeek() - 1)) { 
				if ((this. == .) && (si.getMonthPlacement() == 1))  
					return true;
				else if ((this. == .) && (si.getMonthPlacement() == 2))  
					return true;
				else if ((this. == .) && (si.getMonthPlacement() == 3))  
					return true;
				else if ((this. == .) && (si.getMonthPlacement() == 4))  
					return true;
				else if ((this. == .) && (si.isLastPlacement())) 
					return true;
			}
			return false;
		}
	}
New to GrepCode? Check out our FAQ X