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.lang;
 
 
Provides the same function support as

Author(s):
Andy
See also:
OperationResult, however used with callbacks when the method called is asynchronous.
 
 abstract public class OperationCallback extends OperationResult {
 	protected boolean called = false;
 	protected ISchedule timeout = null;
 	protected ReentrantLock oplock = new ReentrantLock();
 	protected TaskRun run = null;
 	
 	public OperationCallback() {
 		super();
 	}
 	
 	public OperationCallback(DebugLevel loglevel) {
 		super(loglevel);
 	}
 	
 		super(ctx);
 	}
 	
 	public OperationCallback(TimeoutPlan plan) {
 		super();
 		
 		Task timeouttask = new Task()
 			.withWork(new IWork() {
 			public void run(TaskRun task) {
 				task.complete();
 			}
 		});
 		
 		this. = ..getScheduler().runIn(timeouttaskplan.getSeconds());
 	}
 	
 	// do not timeout - but if at ServiceResult subclass we do 
 	public OperationCallback(TaskRun run) {
 		this. = run;
 	}
 	
 	public OperationCallback(TaskRun runTimeoutPlan plan) {
 		this(plan);
 		this. = run;
 	}
 	
 	public void resetCalledFlag() {
 		this. = false;
 	}
 	
 	// override if need to do something on timeout/giveup on operation
 	// return true if timeout occurred, false if already completed
 	public boolean abandon() {
 		// courtesy only, no need to look if we do know called is true, real called check below
 		if (this.)
 			return false;
 		
 		this..lock();
 		
 		try {
 			if (this.)
 				return false;
 			
 			this.errorTr(218, this..freezeToSafeRecord());
 		}
 		finally {
 			this..unlock();
 		}
		this.complete();
		return true;
	}
	public void complete() {
		// courtesy only, no need to look if we do know called is true, real called check below
		if (this.)
			return;
		this..lock();
		try {
			// check for race condition
			if (this.)
				return;
			this. = true;
		}
		finally {
			this..unlock();
		}
		if (this. != null)
		// if we are related to a task in the workpool, this is all we need to get the task working correctly again 
		// see TaskRun.resume - must keep this idea and that idea in sync
		if (this. != null
			this..thawContext();			// do not use local context if have run, run's context may be fresher than ours do due to multiple callbacks after a bus call
		else if (this. != null)
			OperationContext.set(this.);
		this.callback();
		for (IOperationObserver ob : this.) {
			try {
				if (ob instanceof ICallbackObserver)
			catch (Exception x) {
				this.error("Error notifying completing task: " + x);
			}
			// they might change context on us, return context
			if (this. != null
				this..thawContext();			// do not use local context if have run, run's context may be fresher than ours do due to multiple callbacks after a bus call
			else if (this. != null)
				OperationContext.set(this.);
		}
	}
	abstract public void callback();
New to GrepCode? Check out our FAQ X