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