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;
 
 
 
 // TODO respect Hub idled
 public class CommonSchedule implements ISchedule {
 	static public final int METHOD_NONE = 0;
 	static public final int METHOD_STANDARD = 1;
 	static public final int METHOD_SCRIPT = 2;
 	static public final int METHOD_CLASS = 3;
 	
 	// what method is used to calculate the run times
 	protected int method = .;
 
 	protected IScheduleHelper helper = null;
 	
 	// limits handler
 	protected LimitHelper limits = new LimitHelper();
 	
 	// when was this last run, leave null if not important
 	protected DateTime last = null;
 	
 	// the code to run on schedule
 	protected Task task = null;
 	
 	protected IInlineScript iscript = null;
 	
 	protected Object userData = null;
 	protected RecordStruct hints = new RecordStruct();
 	
 	protected boolean canceled = false;
 	
 	public void setLastRun(DateTime v) {
 		this. = v;
 	}
 	
 	public DateTime getLastRun() {
 		return this.;
 	}
 	
 	public void setInlineScript(IInlineScript v) {
 		this. = v;
 	}
 	
 		return this.;
 	}
 	
 	public void setTask(Task v) {
 		this. = v;
 	}
 
 	public Task task() {
 		return this.;
 	}
 	
 	public void setUserData(Object v) {
 		this. = v;
 	}
 	
 	public Object getUserData() {
 		return this.;
 	}
 
 	public RecordStruct getHints() {
 		return this.;
 	}
 	
 	public void setHint(String nameString value) {
 		this..setField(namevalue);
 	}
	/*
	 *  	<CommonSchedule 
	 *  		Method="None,Standard,Script,Class"
	 *  		View="Period,Daily,Weekly,Monthly,Script,Custom"    - for the UI to determine which pane to show 
	 *  		ClassName="n"		- use the bundle provided, if any, to load the class
	 *  							- must implement IScheduleHelper
	 *  	>
	 *			<Limits ... />		- see LimitHelper
	 *  
	 *  		// use ISO periods, e.g. PT2H30M10S
	 *  		// used for intra-daily mostly, but can be any
	 *  		<Period Value="n" />   
	 *  
	 *  		// if method = Daily, these are the times to run, ignore frequency
	 *  		<Daily>
	 *  			<Schedule At="" RunIfMissed="True/False" />
	 *  			<Schedule At="" RunIfMissed="True/False" />
	 *  			<Schedule At="" RunIfMissed="True/False" />
	 *  		</Daily>
	 *  
	 *  		// if method = Weekly, these are the days to run.  may be more than one WeekDays, use first match
	 *  		<Weekly>
	 *  			<Weekdays Monday="T/F" Tuesday="n" ... All="T/F" >
	 *  				<Schedule At="" RunIfMissed="True/False" />
	 *  			</Weekdays>
	 *  		</Weekly>
	 *  
	 *  		// if method = "Monthly" (may be more than Months, etc)
	 *  		// excludes for monthly don't make sense, but are there 
	 *  		<Monthly>
	 *  			<Months January="T/F" ... All="T/F" >
	 *  				<First Monday="T/F" Tuesday="n" ... All="T/F" >
	 *  					<Schedule At="" RunIfMissed="True/False" />
	 *  				</First>
	 *  				<Second Monday="T/F" Tuesday="n" ... All="T/F" >
	 *  					<Schedule At="" RunIfMissed="True/False" />
	 *  				</Second>
	 *  				... etc, or ...
	 *  				<Monthday List="N,N,N,Last">
	 *  					<Schedule At="" RunIfMissed="True/False" />
	 *  				</Monthday> 
	 *  			</Months>
	 *  		</Monthly>
	 *  
	 *  		// _last is available, but = null if first run
	 *  		// _now is available 
	 *  		// if method != Script then there is an obj _suggested
	 *  		// to call "suggest.next()" that will provide next based
	 *  		// on the method settings (so script is more a filter)
	 *  		// when method is script then no hints are provided  
	 *  		<Script> run when scheduling next </Script>
	 *  	</CommonSchedule>
	 */
	public void init(XElement config) {
		// TODO load config, if classes are involved then use custom loader if available
		if (config != null) {
			this..init(config.find("Limits"));
			// what method is used to calculate the run times
			String meth = config.getAttribute("Method""Standard");
			XElement helpel = null;
			if ("Standard".equals(meth)) {
				helpel = config.find("Period");
				if (helpel != null) {
					this. = new PeriodHelper();
				}
				else {					
					helpel = config.find("Daily");
					if (helpel != null) {
						this. = new DailyHelper();
					}
					else {
						helpel = config.find("Weekly");
						if (helpel != null) {
							this. = new WeekdayHelper();
						}
						else {
							helpel = config.find("Monthly");
							if (helpel != null) {
								this. = new MonthHelper();
							}
							else {
								// TODO log
								..println("schedule does not appear to have a helper");
							}
						}
					}					
				}
			}
			else if ("Script".equals(meth)) {
				XElement sel = config.find("Script");
				if (sel != null) {
					/*  TODO
					String code = sel.getText();
					if (!StringUtil.isBlank(code)) {
						this.script = new Script();
						try {
							this.script.setScript(code);
						catch (Exception e) {
							// TODO log
						}
					}
					// TODO
					 * 
					 */
				}
			}
			else if ("Class".equals(meth)) {
				String className = config.getAttribute("ClassName");
				try {
					// TODO
					//this.helper = (IScheduleHelper) ((this.customLoader != null) 
					//	? this.customLoader.getInstance(className) 
					//	: Class.forName(className).newInstance());
					helpel = config;
				catch (Exception e) {
					// TODO log
					..println("unable to load schedule helper class: " + className);
				}	
			}
			if (this. != null) {
				this..setLast(this.);
				this..init(thishelpel);
			}
		}
		// setup the first run
		this.reschedule();
	}
	public void init(IScheduleHelper helperXElement limitsXElement hconfig) {
		// TODO load config, if classes are involved then use custom loader if available
		this..init(limits);
		this. = helper;
		this..setLast(this.);
		this..init(thishconfig);
		// setup the first run
		this.reschedule();
	}
	// same as reschedule, except we must move forward at least one day
	public boolean rescheduleOnNextDate() {
		this. = TimeUtil.nextDayAtMidnight(this.);		
		return this.reschedule();
	}
	public boolean reschedule() {
		if (this. != null) {
			// TODO if script then use that to help with finding next
			this. = this..next();
			//System.out.println("rescheduled: " + ((this.last == null) ? "null" : this.last.toString()));
			return (this. != null);
		}
		/* TODO
		else if (this.script != null) {
			this.script.addVariable("_now", new DateTime());
			this.script.addVariable("_last", this.last);
			this.script.addVariable("_sched", this);
			this.script.addVariable("_data", this.userData);
			try {
				Object o = this.script.call("schedule");	// TODO consider passing params rather than set vars above	
				if (o instanceof DateTime)
					this.last = (DateTime)o;
				else
					System.out.println("bad return value: " + o);		// TODO log
			}
			catch (Exception x) {
				System.out.println("bad return value: " + x);		// TODO log
			}
			System.out.println("rescheduled script: " + ((this.last == null) ? "null" : this.last.toString()));
			return (this.last != null);
		}
		*/
		else if (this. != null) {
			try {
				this. = this..schedule(this);	// TODO consider passing params rather than set vars above	
			}
			catch (Exception x) {
				..println("bad return value: " + x);		// TODO log
			}
			..println("rescheduled script: " + ((this. == null) ? "null" : this..toString()));
			return (this. != null);
		}
		return false;
	}
	public long when() {
		if ((this. != null) && (this. != null))
			return this..getMillis();
		return -1;
	}
	public void cancel() {
		this. = true;
		// TODO someday optimize by removing from scheduler node list
	}
	public boolean isCanceled() {
		return this.;
	}
	public void completed(TaskRun or) {
		// remember - we can look at the task for further info when rescheduling
		// run.getResult();
		if (this.reschedule()) {
			//this.task.reset();
		}
	}
	public void log(OperationResult runRecordStruct entry) {
	}
	public void boundary(OperationResult runString... tags) {
	}
	public void step(OperationResult runint numint ofString name) {
	}
	public void progress(OperationResult runString msg) {
	}
	public void amount(OperationResult runint v) {
	}
	public void prep(TaskRun or) {
	}
	public void start(TaskRun or) {
	}
	public void stop(TaskRun or) {
	}
New to GrepCode? Check out our FAQ X