1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.kernel.portlet;
24  
25  import com.liferay.portal.kernel.servlet.SessionErrors;
26  import com.liferay.portal.kernel.servlet.SessionMessages;
27  import com.liferay.portal.kernel.util.MethodCache;
28  import com.liferay.portal.kernel.util.MethodKey;
29  import com.liferay.portal.kernel.util.ParamUtil;
30  import com.liferay.portal.kernel.util.Validator;
31  import com.liferay.portal.kernel.util.WebKeys;
32  
33  import java.io.IOException;
34  
35  import java.lang.reflect.InvocationTargetException;
36  import java.lang.reflect.Method;
37  
38  import java.util.HashMap;
39  import java.util.Map;
40  
41  import javax.portlet.ActionRequest;
42  import javax.portlet.ActionResponse;
43  import javax.portlet.GenericPortlet;
44  import javax.portlet.PortletException;
45  import javax.portlet.PortletMode;
46  import javax.portlet.PortletRequest;
47  import javax.portlet.RenderRequest;
48  import javax.portlet.RenderResponse;
49  import javax.portlet.ResourceRequest;
50  import javax.portlet.ResourceResponse;
51  import javax.portlet.WindowState;
52  
53  /**
54   * <a href="LiferayPortlet.java.html"><b><i>View Source</i></b></a>
55   *
56   * @author Brian Wing Shun Chan
57   *
58   */
59  public class LiferayPortlet extends GenericPortlet {
60  
61      public void processAction(
62              ActionRequest actionRequest, ActionResponse actionResponse)
63          throws IOException, PortletException {
64  
65          if (!isProcessActionRequest(actionRequest)) {
66              return;
67          }
68  
69          if (!callActionMethod(actionRequest, actionResponse)) {
70              return;
71          }
72  
73          if (SessionErrors.isEmpty(actionRequest)) {
74              SessionMessages.add(actionRequest, "request_processed");
75          }
76  
77          String redirect = ParamUtil.getString(actionRequest, "redirect");
78  
79          if (Validator.isNotNull(redirect)) {
80              actionResponse.sendRedirect(redirect);
81          }
82      }
83  
84      public void serveResource(
85              ResourceRequest resourceRequest, ResourceResponse resourceResponse)
86          throws IOException, PortletException {
87  
88          if (!isProcessResourceRequest(resourceRequest)) {
89              return;
90          }
91  
92          super.serveResource(resourceRequest, resourceResponse);
93      }
94  
95      protected boolean callActionMethod(
96              ActionRequest actionRequest, ActionResponse actionResponse)
97          throws IOException, PortletException {
98  
99          String actionName = ParamUtil.getString(
100             actionRequest, ActionRequest.ACTION_NAME);
101 
102         if (Validator.isNull(actionName)) {
103             return false;
104         }
105 
106         try {
107             Method method = MethodCache.get(
108                 _classesMap, _methodsMap, getClass().getName(), actionName,
109                 new Class[] {ActionRequest.class, ActionResponse.class});
110 
111             method.invoke(this, actionRequest, actionResponse);
112 
113             return true;
114         }
115         catch (InvocationTargetException ite) {
116             Throwable cause = ite.getCause();
117 
118             if (cause != null) {
119                 throw new PortletException(cause);
120             }
121             else {
122                 throw new PortletException(ite);
123             }
124         }
125         catch (Exception e) {
126             throw new PortletException(e);
127         }
128     }
129 
130     protected void doDispatch(
131             RenderRequest renderRequest, RenderResponse renderResponse)
132         throws IOException, PortletException {
133 
134         if (!isProcessRenderRequest(renderRequest)) {
135             renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
136 
137             return;
138         }
139 
140         WindowState state = renderRequest.getWindowState();
141 
142         if (state.equals(WindowState.MINIMIZED)) {
143             return;
144         }
145 
146         PortletMode mode = renderRequest.getPortletMode();
147 
148         if (mode.equals(PortletMode.VIEW)) {
149             doView(renderRequest, renderResponse);
150         }
151         else if (mode.equals(LiferayPortletMode.ABOUT)) {
152             doAbout(renderRequest, renderResponse);
153         }
154         else if (mode.equals(LiferayPortletMode.CONFIG)) {
155             doConfig(renderRequest, renderResponse);
156         }
157         else if (mode.equals(PortletMode.EDIT)) {
158             doEdit(renderRequest, renderResponse);
159         }
160         else if (mode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
161             doEditDefaults(renderRequest, renderResponse);
162         }
163         else if (mode.equals(LiferayPortletMode.EDIT_GUEST)) {
164             doEditGuest(renderRequest, renderResponse);
165         }
166         else if (mode.equals(PortletMode.HELP)) {
167             doHelp(renderRequest, renderResponse);
168         }
169         else if (mode.equals(LiferayPortletMode.PREVIEW)) {
170             doPreview(renderRequest, renderResponse);
171         }
172         else if (mode.equals(LiferayPortletMode.PRINT)) {
173             doPrint(renderRequest, renderResponse);
174         }
175         else {
176             throw new PortletException(mode.toString());
177         }
178     }
179 
180     protected void doAbout(
181             RenderRequest renderRequest, RenderResponse renderResponse)
182         throws IOException, PortletException {
183 
184         throw new PortletException("doAbout method not implemented");
185     }
186 
187     protected void doConfig(
188             RenderRequest renderRequest, RenderResponse renderResponse)
189         throws IOException, PortletException {
190 
191         throw new PortletException("doConfig method not implemented");
192     }
193 
194     protected void doEditDefaults(
195             RenderRequest renderRequest, RenderResponse renderResponse)
196         throws IOException, PortletException {
197 
198         throw new PortletException("doEditDefaults method not implemented");
199     }
200 
201     protected void doEditGuest(
202             RenderRequest renderRequest, RenderResponse renderResponse)
203         throws IOException, PortletException {
204 
205         throw new PortletException("doEditGuest method not implemented");
206     }
207 
208     protected void doPreview(
209             RenderRequest renderRequest, RenderResponse renderResponse)
210         throws IOException, PortletException {
211 
212         throw new PortletException("doPreview method not implemented");
213     }
214 
215     protected void doPrint(
216             RenderRequest renderRequest, RenderResponse renderResponse)
217         throws IOException, PortletException {
218 
219         throw new PortletException("doPrint method not implemented");
220     }
221 
222     protected boolean isProcessActionRequest(ActionRequest actionRequest) {
223         return isProcessPortletRequest(actionRequest);
224     }
225 
226     protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
227         return _PROCESS_PORTLET_REQUEST;
228     }
229 
230     protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
231         return isProcessPortletRequest(renderRequest);
232     }
233 
234     protected boolean isProcessResourceRequest(
235         ResourceRequest resourceRequest) {
236 
237         return isProcessPortletRequest(resourceRequest);
238     }
239 
240     private static final boolean _PROCESS_PORTLET_REQUEST = true;
241 
242     private Map<String, Class<?>> _classesMap = new HashMap<String, Class<?>>();
243     private Map<MethodKey, Method> _methodsMap =
244         new HashMap<MethodKey, Method>();
245 
246 }