1
22
23 package com.liferay.portal.kernel.messaging.proxy;
24
25 import com.liferay.portal.kernel.util.AggregateClassLoader;
26
27 import java.lang.annotation.Annotation;
28 import java.lang.reflect.InvocationTargetException;
29 import java.lang.reflect.Method;
30
31
37 public class MultiClassLoaderProxyRequest extends ProxyRequest {
38
39 public MultiClassLoaderProxyRequest(
40 Method method, Object[] arguments)
41 throws Exception {
42
43 super(method, arguments);
44
45 ClassLoader[] classLoaders = inspectForClassLoaders(method);
46
47 _clientClassLoaders = AggregateClassLoader.getAggregateClassLoader(
48 classLoaders);
49 }
50
51 public Object execute(Object object) throws Exception {
52 ClassLoader contextClassLoader = null;
53
54 if (_clientClassLoaders != null) {
55 Thread currentThread = Thread.currentThread();
56
57 contextClassLoader = currentThread.getContextClassLoader();
58
59 ClassLoader invocationClassLoader =
60 AggregateClassLoader.getAggregateClassLoader(
61 new ClassLoader[] {
62 contextClassLoader, _clientClassLoaders
63 });
64
65 currentThread.setContextClassLoader(invocationClassLoader);
66 }
67
68 try {
69 return super.execute(object);
70 }
71 catch (InvocationTargetException ite) {
72 throw new Exception(ite.getTargetException());
73 }
74 finally {
75 if (contextClassLoader != null) {
76 Thread currentThread = Thread.currentThread();
77
78 currentThread.setContextClassLoader(contextClassLoader);
79 }
80 }
81 }
82
83 protected ClassLoader[] inspectForClassLoaders(Method method)
84 throws Exception {
85
86 Annotation[][] annotationsArray = method.getParameterAnnotations();
87
88 if ((annotationsArray == null) || (annotationsArray.length == 0)) {
89 return null;
90 }
91
92 for (int i = 0; i < annotationsArray.length; i++) {
93 Annotation[] annotations = annotationsArray[i];
94
95 if ((annotations == null) || (annotations.length == 0)) {
96 continue;
97 }
98
99 for (Annotation annotation : annotations) {
100 if (ExecutingClassLoaders.class.isAssignableFrom(
101 annotation.annotationType())) {
102
103 return (ClassLoader[])getMethodWrapper().getArguments()[i];
104 }
105 }
106 }
107
108 return null;
109 }
110
111 private ClassLoader _clientClassLoaders;
112
113 }