Add chain support to AsyncCallDispatcher

This commit is contained in:
Kelven Yang 2012-12-18 14:15:38 -08:00
parent c1ed9a9010
commit e6ac3fd199
2 changed files with 35 additions and 9 deletions

View File

@ -21,8 +21,6 @@ package org.apache.cloudstack.framework.async;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
@ -30,18 +28,26 @@ import net.sf.cglib.proxy.MethodProxy;
@SuppressWarnings("rawtypes")
public class AsyncCallbackDispatcher<T> implements AsyncCompletionCallback {
private AsyncCallbackDispatcher _parent;
private Method _callbackMethod;
private T _targetObject;
private Object _contextObject;
private Object _resultObject;
private AsyncCallbackDriver _driver = new InplaceAsyncCallbackDriver();
public AsyncCallbackDispatcher(T target) {
private AsyncCallbackDispatcher(T target) {
assert(target != null);
_targetObject = target;
}
public AsyncCallbackDispatcher attachDriver(AsyncCallbackDriver driver) {
private AsyncCallbackDispatcher(T target, AsyncCallbackDispatcher parent) {
assert(target != null);
_targetObject = target;
_parent = parent;
}
public AsyncCallbackDispatcher<T> attachDriver(AsyncCallbackDriver driver) {
assert(driver != null);
_driver = driver;
@ -64,11 +70,11 @@ public class AsyncCallbackDispatcher<T> implements AsyncCompletionCallback {
});
}
public AsyncCallbackDispatcher setCallback(Object useless) {
public AsyncCallbackDispatcher<T> setCallback(Object useless) {
return this;
}
public AsyncCallbackDispatcher setContext(Object context) {
public AsyncCallbackDispatcher<T> setContext(Object context) {
_contextObject = context;
return this;
}
@ -82,16 +88,36 @@ public class AsyncCallbackDispatcher<T> implements AsyncCompletionCallback {
_resultObject = resultObject;
_driver.performCompletionCallback(this);
}
public void deepComplete(Object resultObject) {
complete(resultObject);
if(_parent != null)
_parent.deepComplete(resultObject);
}
@SuppressWarnings("unchecked")
public <R> R getResult() {
return (R)_resultObject;
}
public Object getTargetObject() {
// for internal use
Object getTargetObject() {
return _targetObject;
}
public static <P> AsyncCallbackDispatcher<P> create(P target) {
return new AsyncCallbackDispatcher<P>(target);
}
public <P> AsyncCallbackDispatcher<P> chainToCreate(P target) {
return new AsyncCallbackDispatcher<P>(target, this);
}
@SuppressWarnings("unchecked")
public <P> AsyncCallbackDispatcher<P> getParent() {
return (AsyncCallbackDispatcher<P>)_parent;
}
public static boolean dispatch(Object target, AsyncCallbackDispatcher callback) {
assert(callback != null);
assert(target != null);

View File

@ -28,7 +28,7 @@ public class AsyncSampleEventDrivenStyleCaller {
@SuppressWarnings("unchecked")
public void MethodThatWillCallAsyncMethod() {
String vol = new String("Hello");
AsyncCallbackDispatcher<AsyncSampleEventDrivenStyleCaller> caller = new AsyncCallbackDispatcher<AsyncSampleEventDrivenStyleCaller>(this);
AsyncCallbackDispatcher<AsyncSampleEventDrivenStyleCaller> caller = AsyncCallbackDispatcher.create(this);
_ds.createVolume(vol, caller
.setCallback(caller.getTarget().HandleVolumeCreateAsyncCallback(null, null))
.setContext(vol)