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