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; } }