Updated Branches:
  refs/heads/object_store 2e2851562 -> 0d78209b7

Work around an issue in using IPC callback for
HypervisorTemplateAdapter.

Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/db65dfbb
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/db65dfbb
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/db65dfbb

Branch: refs/heads/object_store
Commit: db65dfbb12cf9f821cdba2aa6308011c1f52e385
Parents: 2e28515
Author: Min Chen <min.c...@citrix.com>
Authored: Mon May 6 15:10:31 2013 -0700
Committer: Min Chen <min.c...@citrix.com>
Committed: Mon May 6 15:10:31 2013 -0700

----------------------------------------------------------------------
 .../framework/async/AsyncCallbackDispatcher.java   |   51 ++++++++++-----
 1 files changed, 34 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/db65dfbb/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 26f46da..acbc5b6 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
@@ -22,6 +22,8 @@ package org.apache.cloudstack.framework.async;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
+import org.apache.log4j.Logger;
+
 import net.sf.cglib.proxy.CallbackFilter;
 import net.sf.cglib.proxy.Callback;
 import net.sf.cglib.proxy.Enhancer;
@@ -30,32 +32,40 @@ import net.sf.cglib.proxy.MethodProxy;
 
 @SuppressWarnings("rawtypes")
 public class AsyncCallbackDispatcher<T, R> implements AsyncCompletionCallback {
-       private Method _callbackMethod;
+    private static final Logger s_logger = 
Logger.getLogger(AsyncCallbackDispatcher.class);
+
+    private Method _callbackMethod;
        private T _targetObject;
        private Object _contextObject;
        private Object _resultObject;
-       private AsyncCallbackDriver _driver = new InplaceAsyncCallbackDriver(); 
-       
+       private AsyncCallbackDriver _driver = new InplaceAsyncCallbackDriver();
+
        private AsyncCallbackDispatcher(T target) {
                assert(target != null);
                _targetObject = target;
        }
-       
+
        public AsyncCallbackDispatcher<T, R> attachDriver(AsyncCallbackDriver 
driver) {
                assert(driver != null);
                _driver = driver;
-               
+
                return this;
        }
-       
+
        public Method getCallbackMethod() {
                return _callbackMethod;
        }
-       
+
        @SuppressWarnings("unchecked")
        public T getTarget() {
            Enhancer en = new Enhancer();
-           en.setSuperclass(_targetObject.getClass());
+
+           Class<?> clz = _targetObject.getClass();
+           String clzName = clz.getName();
+           if(clzName.contains("EnhancerByCloudStack"))
+               clz = clz.getSuperclass();
+
+           en.setSuperclass(clz);
            en.setCallbacks(new Callback[]{new MethodInterceptor() {
             @Override
             public Object intercept(Object arg0, Method arg1, Object[] arg2,
@@ -64,7 +74,7 @@ public class AsyncCallbackDispatcher<T, R> implements 
AsyncCompletionCallback {
                 _callbackMethod.setAccessible(true);
                 return null;
             }
-        }, 
+        },
         new MethodInterceptor() {
             @Override
             public Object intercept(Object arg0, Method arg1, Object[] arg2,
@@ -81,23 +91,30 @@ public class AsyncCallbackDispatcher<T, R> implements 
AsyncCompletionCallback {
                    return 0;
                }}
               );
-               return (T)en.create();
+
+           try {
+               return (T)en.create();
+           } catch(Throwable e) {
+               s_logger.error("Unexpected exception", e);
+           }
+
+           return null;
        }
 
        public AsyncCallbackDispatcher<T, R> setCallback(Object useless) {
                return this;
        }
-       
+
        public AsyncCallbackDispatcher<T, R> setContext(Object context) {
                _contextObject = context;
                return this;
        }
-       
+
        @SuppressWarnings("unchecked")
        public <P> P getContext() {
                return (P)_contextObject;
        }
-       
+
        public void complete(Object resultObject) {
                _resultObject = resultObject;
                _driver.performCompletionCallback(this);
@@ -112,15 +129,15 @@ public class AsyncCallbackDispatcher<T, R> implements 
AsyncCompletionCallback {
        Object getTargetObject() {
                return _targetObject;
        }
-       
+
        public static <P, R> AsyncCallbackDispatcher<P, R> create(P target)  {
                return new AsyncCallbackDispatcher<P, R>(target);
        }
-       
+
        public static boolean dispatch(Object target, AsyncCallbackDispatcher 
callback) {
                assert(callback != null);
                assert(target != null);
-               
+
                try {
                        callback.getCallbackMethod().invoke(target, callback, 
callback.getContext());
                } catch (IllegalArgumentException e) {
@@ -130,7 +147,7 @@ public class AsyncCallbackDispatcher<T, R> implements 
AsyncCompletionCallback {
                } catch (InvocationTargetException e) {
                        throw new RuntimeException("InvocationTargetException 
when invoking RPC callback for command: " + 
callback.getCallbackMethod().getName(), e);
                }
-               
+
                return true;
        }
 }

Reply via email to