1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
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  /**
48   * <a href="LiferayPortlet.java.html"><b><i>View Source</i></b></a>
49   *
50   * @author Brian Wing Shun Chan
51   */
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 }