1
22
23 package com.liferay.portal.kernel.util;
24
25 import com.liferay.portal.kernel.portlet.PortletBag;
26 import com.liferay.portal.kernel.portlet.PortletBagPool;
27 import com.liferay.portal.kernel.servlet.PortletServlet;
28
29 import javax.servlet.ServletContext;
30
31
37 public class PortletClassInvoker {
38
39 public static Object invoke(
40 String portletId, String className, String methodName)
41 throws Exception {
42
43 return invoke(portletId, className, methodName, new Object[] {});
44 }
45
46 public static Object invoke(
47 String portletId, String className, String methodName, Object arg)
48 throws Exception {
49
50 return invoke(portletId, className, methodName, new Object[] {arg});
51 }
52
53 public static Object invoke(
54 String portletId, String className, String methodName, Object arg1,
55 Object arg2)
56 throws Exception {
57
58 return invoke(
59 portletId, className, methodName, new Object[] {arg1, arg2});
60 }
61
62 public static Object invoke(
63 String portletId, String className, String methodName, Object arg1,
64 Object arg2, Object arg3)
65 throws Exception {
66
67 return invoke(
68 portletId, className, methodName, new Object[] {arg1, arg2, arg3});
69 }
70
71 public static Object invoke(
72 String portletId, String className, String methodName, Object arg1,
73 Object arg2, Object arg3, Object arg4)
74 throws Exception {
75
76 return invoke(
77 portletId, className, methodName,
78 new Object[] {arg1, arg2, arg3, arg4});
79 }
80
81 public static Object invoke(
82 String portletId, String className, String methodName,
83 Object[] args)
84 throws Exception {
85
86 return invoke(portletId, className, methodName, args, true);
87 }
88
89 public static Object invoke(
90 String portletId,String className, String methodName,
91 boolean newInstance)
92 throws Exception {
93
94 return invoke(
95 portletId, className, methodName, new Object[] {}, newInstance);
96 }
97
98 public static Object invoke(
99 String portletId, String className, String methodName, Object arg,
100 boolean newInstance)
101 throws Exception {
102
103 return invoke(
104 portletId, className, methodName, new Object[] {arg}, newInstance);
105 }
106
107 public static Object invoke(
108 String portletId, String className, String methodName, Object arg1,
109 Object arg2, boolean newInstance)
110 throws Exception {
111
112 return invoke(
113 portletId, className, methodName, new Object[] {arg1, arg2},
114 newInstance);
115 }
116
117 public static Object invoke(
118 String portletId, String className, String methodName, Object arg1,
119 Object arg2, Object arg3, boolean newInstance)
120 throws Exception {
121
122 return invoke(
123 portletId, className, methodName, new Object[] {arg1, arg2, arg3},
124 newInstance);
125 }
126
127 public static Object invoke(
128 String portletId, String className, String methodName, Object arg1,
129 Object arg2, Object arg3, Object arg4, boolean newInstance)
130 throws Exception {
131
132 return invoke(
133 portletId, className, methodName,
134 new Object[] {arg1, arg2, arg3, arg4}, newInstance);
135 }
136
137 public static Object invoke(
138 String portletId, String className, String methodName,
139 Object[] args, boolean newInstance)
140 throws Exception {
141
142 portletId = _getRootPortletId(portletId);
143
144 ClassLoader portletClassLoader = PortalClassLoaderUtil.getClassLoader();
145
146 PortletBag portletBag = PortletBagPool.get(portletId);
147
148 if (portletBag != null) {
149 ServletContext servletContext = portletBag.getServletContext();
150
151 portletClassLoader = (ClassLoader)servletContext.getAttribute(
152 PortletServlet.PORTLET_CLASS_LOADER);
153 }
154
155 Thread currentThread = Thread.currentThread();
156
157 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
158
159 try {
160 currentThread.setContextClassLoader(portletClassLoader);
161
162 MethodWrapper methodWrapper = new MethodWrapper(
163 className, methodName, args);
164
165 return MethodInvoker.invoke(methodWrapper, newInstance);
166 }
167 finally {
168 currentThread.setContextClassLoader(contextClassLoader);
169 }
170 }
171
172
175 private static String _getRootPortletId(String portletId) {
176 int pos = portletId.indexOf(_INSTANCE_SEPARATOR);
177
178 if (pos == -1) {
179 return portletId;
180 }
181 else {
182 return portletId.substring(0, pos);
183 }
184 }
185
186 private static final String _INSTANCE_SEPARATOR = "_INSTANCE_";
187
188 }