diff --git a/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java index 7cb44df5504..c31e0ed3b75 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java @@ -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 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 attachDriver(AsyncCallbackDriver driver) { assert(driver != null); _driver = driver; @@ -64,11 +70,11 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback { }); } - public AsyncCallbackDispatcher setCallback(Object useless) { + public AsyncCallbackDispatcher setCallback(Object useless) { return this; } - public AsyncCallbackDispatcher setContext(Object context) { + public AsyncCallbackDispatcher setContext(Object context) { _contextObject = context; return this; } @@ -82,16 +88,36 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback { _resultObject = resultObject; _driver.performCompletionCallback(this); } + + public void deepComplete(Object resultObject) { + complete(resultObject); + if(_parent != null) + _parent.deepComplete(resultObject); + } @SuppressWarnings("unchecked") public R getResult() { return (R)_resultObject; } - - public Object getTargetObject() { + + // for internal use + Object getTargetObject() { return _targetObject; } + public static

AsyncCallbackDispatcher

create(P target) { + return new AsyncCallbackDispatcher

(target); + } + + public

AsyncCallbackDispatcher

chainToCreate(P target) { + return new AsyncCallbackDispatcher

(target, this); + } + + @SuppressWarnings("unchecked") + public

AsyncCallbackDispatcher

getParent() { + return (AsyncCallbackDispatcher

)_parent; + } + public static boolean dispatch(Object target, AsyncCallbackDispatcher callback) { assert(callback != null); assert(target != null); diff --git a/framework/ipc/test/org/apache/cloudstack/framework/codestyle/AsyncSampleEventDrivenStyleCaller.java b/framework/ipc/test/org/apache/cloudstack/framework/codestyle/AsyncSampleEventDrivenStyleCaller.java index 852e35235bc..df66f10db23 100644 --- a/framework/ipc/test/org/apache/cloudstack/framework/codestyle/AsyncSampleEventDrivenStyleCaller.java +++ b/framework/ipc/test/org/apache/cloudstack/framework/codestyle/AsyncSampleEventDrivenStyleCaller.java @@ -28,7 +28,7 @@ public class AsyncSampleEventDrivenStyleCaller { @SuppressWarnings("unchecked") public void MethodThatWillCallAsyncMethod() { String vol = new String("Hello"); - AsyncCallbackDispatcher caller = new AsyncCallbackDispatcher(this); + AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); _ds.createVolume(vol, caller .setCallback(caller.getTarget().HandleVolumeCreateAsyncCallback(null, null)) .setContext(vol)