Updated Branches: refs/heads/javelin c1ed9a901 -> e6ac3fd19
Add chain support to AsyncCallDispatcher Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/e6ac3fd1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/e6ac3fd1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/e6ac3fd1 Branch: refs/heads/javelin Commit: e6ac3fd1992513bd999566e71a76df635abb1490 Parents: c1ed9a9 Author: Kelven Yang <[email protected]> Authored: Tue Dec 18 14:15:38 2012 -0800 Committer: Kelven Yang <[email protected]> Committed: Tue Dec 18 14:15:38 2012 -0800 ---------------------------------------------------------------------- .../framework/async/AsyncCallbackDispatcher.java | 42 ++++++++++++--- .../AsyncSampleEventDrivenStyleCaller.java | 2 +- 2 files changed, 35 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e6ac3fd1/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java ---------------------------------------------------------------------- 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 7cb44df..c31e0ed 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<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; + } + + private AsyncCallbackDispatcher(T target, AsyncCallbackDispatcher parent) { assert(target != null); _targetObject = target; + _parent = parent; } - public AsyncCallbackDispatcher attachDriver(AsyncCallbackDriver driver) { + 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); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/e6ac3fd1/framework/ipc/test/org/apache/cloudstack/framework/codestyle/AsyncSampleEventDrivenStyleCaller.java ---------------------------------------------------------------------- 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 852e352..df66f10 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<AsyncSampleEventDrivenStyleCaller> caller = new AsyncCallbackDispatcher<AsyncSampleEventDrivenStyleCaller>(this); + AsyncCallbackDispatcher<AsyncSampleEventDrivenStyleCaller> caller = AsyncCallbackDispatcher.create(this); _ds.createVolume(vol, caller .setCallback(caller.getTarget().HandleVolumeCreateAsyncCallback(null, null)) .setContext(vol)
