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)

Reply via email to