From db65dfbb12cf9f821cdba2aa6308011c1f52e385 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Mon, 6 May 2013 15:10:31 -0700 Subject: [PATCH] Work around an issue in using IPC callback for HypervisorTemplateAdapter. --- .../async/AsyncCallbackDispatcher.java | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) 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 26f46da37ba..acbc5b60541 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 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 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 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 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 setCallback(Object useless) { return this; } - + public AsyncCallbackDispatcher setContext(Object context) { _contextObject = context; return this; } - + @SuppressWarnings("unchecked") public

P getContext() { return (P)_contextObject; } - + public void complete(Object resultObject) { _resultObject = resultObject; _driver.performCompletionCallback(this); @@ -112,15 +129,15 @@ public class AsyncCallbackDispatcher implements AsyncCompletionCallback { Object getTargetObject() { return _targetObject; } - + public static AsyncCallbackDispatcher create(P target) { return new AsyncCallbackDispatcher(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 implements AsyncCompletionCallback { } catch (InvocationTargetException e) { throw new RuntimeException("InvocationTargetException when invoking RPC callback for command: " + callback.getCallbackMethod().getName(), e); } - + return true; } }