1
14
15 package com.liferay.portal.kernel.portlet;
16
17 import com.liferay.portal.kernel.exception.PortalException;
18 import com.liferay.portal.kernel.servlet.SessionErrors;
19 import com.liferay.portal.kernel.servlet.SessionMessages;
20 import com.liferay.portal.kernel.util.GetterUtil;
21 import com.liferay.portal.kernel.util.MethodCache;
22 import com.liferay.portal.kernel.util.MethodKey;
23 import com.liferay.portal.kernel.util.ParamUtil;
24 import com.liferay.portal.kernel.util.Validator;
25 import com.liferay.portal.kernel.util.WebKeys;
26
27 import java.io.IOException;
28
29 import java.lang.reflect.InvocationTargetException;
30 import java.lang.reflect.Method;
31
32 import java.util.HashMap;
33 import java.util.Map;
34
35 import javax.portlet.ActionRequest;
36 import javax.portlet.ActionResponse;
37 import javax.portlet.GenericPortlet;
38 import javax.portlet.PortletException;
39 import javax.portlet.PortletMode;
40 import javax.portlet.PortletRequest;
41 import javax.portlet.RenderRequest;
42 import javax.portlet.RenderResponse;
43 import javax.portlet.ResourceRequest;
44 import javax.portlet.ResourceResponse;
45 import javax.portlet.WindowState;
46
47
52 public class LiferayPortlet extends GenericPortlet {
53
54 public void init() throws PortletException {
55 super.init();
56
57 addProcessActionSuccessMessage = GetterUtil.getBoolean(
58 getInitParameter("add-process-action-success-action"), true);
59 }
60
61 public void processAction(
62 ActionRequest actionRequest, ActionResponse actionResponse)
63 throws IOException, PortletException {
64
65 try {
66 if (!isProcessActionRequest(actionRequest)) {
67 return;
68 }
69
70 if (!callActionMethod(actionRequest, actionResponse)) {
71 return;
72 }
73
74 if (!SessionErrors.isEmpty(actionRequest)) {
75 return;
76 }
77
78 if (!SessionMessages.isEmpty(actionRequest)) {
79 return;
80 }
81
82 addSuccessMessage(actionRequest, actionResponse);
83
84 sendRedirect(actionRequest, actionResponse);
85 }
86 catch (PortletException pe) {
87 Throwable cause = pe.getCause();
88
89 if (isSessionErrorException(cause)) {
90 SessionErrors.add(
91 actionRequest, cause.getClass().getName(), cause);
92 }
93 else {
94 throw pe;
95 }
96 }
97 }
98
99 public void serveResource(
100 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
101 throws IOException, PortletException {
102
103 if (!isProcessResourceRequest(resourceRequest)) {
104 return;
105 }
106
107 super.serveResource(resourceRequest, resourceResponse);
108 }
109
110 protected void addSuccessMessage(
111 ActionRequest actionRequest, ActionResponse actionResponse) {
112
113 if (!addProcessActionSuccessMessage) {
114 return;
115 }
116
117 String successMessage = ParamUtil.getString(
118 actionRequest, "successMessage");
119
120 SessionMessages.add(actionRequest, "request_processed", successMessage);
121 }
122
123 protected boolean callActionMethod(
124 ActionRequest actionRequest, ActionResponse actionResponse)
125 throws PortletException {
126
127 String actionName = ParamUtil.getString(
128 actionRequest, ActionRequest.ACTION_NAME);
129
130 if (Validator.isNull(actionName)) {
131 return false;
132 }
133
134 try {
135 Method method = MethodCache.get(
136 _classesMap, _methodsMap, getClass().getName(), actionName,
137 new Class[] {ActionRequest.class, ActionResponse.class});
138
139 method.invoke(this, actionRequest, actionResponse);
140
141 return true;
142 }
143 catch (NoSuchMethodException nsme) {
144 try {
145 super.processAction(actionRequest, actionResponse);
146
147 return true;
148 }
149 catch (Exception e) {
150 throw new PortletException(nsme);
151 }
152 }
153 catch (InvocationTargetException ite) {
154 Throwable cause = ite.getCause();
155
156 if (cause != null) {
157 throw new PortletException(cause);
158 }
159 else {
160 throw new PortletException(ite);
161 }
162 }
163 catch (Exception e) {
164 throw new PortletException(e);
165 }
166 }
167
168 @SuppressWarnings("unused")
169 protected void doAbout(
170 RenderRequest renderRequest, RenderResponse renderResponse)
171 throws IOException, PortletException {
172
173 throw new PortletException("doAbout method not implemented");
174 }
175
176 @SuppressWarnings("unused")
177 protected void doConfig(
178 RenderRequest renderRequest, RenderResponse renderResponse)
179 throws IOException, PortletException {
180
181 throw new PortletException("doConfig method not implemented");
182 }
183
184 protected void doDispatch(
185 RenderRequest renderRequest, RenderResponse renderResponse)
186 throws IOException, PortletException {
187
188 if (!isProcessRenderRequest(renderRequest)) {
189 renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
190
191 return;
192 }
193
194 WindowState windowState = renderRequest.getWindowState();
195
196 if (windowState.equals(WindowState.MINIMIZED)) {
197 return;
198 }
199
200 PortletMode portletMode = renderRequest.getPortletMode();
201
202 if (portletMode.equals(PortletMode.VIEW)) {
203 doView(renderRequest, renderResponse);
204 }
205 else if (portletMode.equals(LiferayPortletMode.ABOUT)) {
206 doAbout(renderRequest, renderResponse);
207 }
208 else if (portletMode.equals(LiferayPortletMode.CONFIG)) {
209 doConfig(renderRequest, renderResponse);
210 }
211 else if (portletMode.equals(PortletMode.EDIT)) {
212 doEdit(renderRequest, renderResponse);
213 }
214 else if (portletMode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
215 doEditDefaults(renderRequest, renderResponse);
216 }
217 else if (portletMode.equals(LiferayPortletMode.EDIT_GUEST)) {
218 doEditGuest(renderRequest, renderResponse);
219 }
220 else if (portletMode.equals(PortletMode.HELP)) {
221 doHelp(renderRequest, renderResponse);
222 }
223 else if (portletMode.equals(LiferayPortletMode.PREVIEW)) {
224 doPreview(renderRequest, renderResponse);
225 }
226 else if (portletMode.equals(LiferayPortletMode.PRINT)) {
227 doPrint(renderRequest, renderResponse);
228 }
229 else {
230 throw new PortletException(portletMode.toString());
231 }
232 }
233
234 @SuppressWarnings("unused")
235 protected void doEditDefaults(
236 RenderRequest renderRequest, RenderResponse renderResponse)
237 throws IOException, PortletException {
238
239 throw new PortletException("doEditDefaults method not implemented");
240 }
241
242 @SuppressWarnings("unused")
243 protected void doEditGuest(
244 RenderRequest renderRequest, RenderResponse renderResponse)
245 throws IOException, PortletException {
246
247 throw new PortletException("doEditGuest method not implemented");
248 }
249
250 @SuppressWarnings("unused")
251 protected void doPreview(
252 RenderRequest renderRequest, RenderResponse renderResponse)
253 throws IOException, PortletException {
254
255 throw new PortletException("doPreview method not implemented");
256 }
257
258 @SuppressWarnings("unused")
259 protected void doPrint(
260 RenderRequest renderRequest, RenderResponse renderResponse)
261 throws IOException, PortletException {
262
263 throw new PortletException("doPrint method not implemented");
264 }
265
266 protected String getRedirect(
267 ActionRequest actionRequest, ActionResponse actionResponse) {
268
269 String redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
270
271 if (Validator.isNull(redirect)) {
272 redirect = ParamUtil.getString(actionRequest, "redirect");
273 }
274
275 return redirect;
276 }
277
278 protected boolean isProcessActionRequest(ActionRequest actionRequest) {
279 return isProcessPortletRequest(actionRequest);
280 }
281
282 protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
283 return _PROCESS_PORTLET_REQUEST;
284 }
285
286 protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
287 return isProcessPortletRequest(renderRequest);
288 }
289
290 protected boolean isProcessResourceRequest(
291 ResourceRequest resourceRequest) {
292
293 return isProcessPortletRequest(resourceRequest);
294 }
295
296 protected boolean isSessionErrorException(Throwable cause) {
297 if (cause instanceof PortalException) {
298 return true;
299 }
300 else {
301 return false;
302 }
303 }
304
305 protected void sendRedirect(
306 ActionRequest actionRequest, ActionResponse actionResponse)
307 throws IOException {
308
309 String redirect = getRedirect(actionRequest, actionResponse);
310
311 if (Validator.isNotNull(redirect)) {
312 actionResponse.sendRedirect(redirect);
313 }
314 }
315
316 protected boolean addProcessActionSuccessMessage;
317
318 private static final boolean _PROCESS_PORTLET_REQUEST = true;
319
320 private Map<String, Class<?>> _classesMap = new HashMap<String, Class<?>>();
321 private Map<MethodKey, Method> _methodsMap =
322 new HashMap<MethodKey, Method>();
323
324 }