1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights 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  public class LiferayPortlet extends GenericPortlet {
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              SessionMessages.add(actionRequest, "request_processed");
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 boolean callActionMethod(
98              ActionRequest actionRequest, ActionResponse actionResponse)
99          throws PortletException {
100 
101         String actionName = ParamUtil.getString(
102             actionRequest, ActionRequest.ACTION_NAME);
103 
104         if (Validator.isNull(actionName)) {
105             return false;
106         }
107 
108         try {
109             Method method = MethodCache.get(
110                 _classesMap, _methodsMap, getClass().getName(), actionName,
111                 new Class[] {ActionRequest.class, ActionResponse.class});
112 
113             method.invoke(this, actionRequest, actionResponse);
114 
115             return true;
116         }
117         catch (InvocationTargetException ite) {
118             Throwable cause = ite.getCause();
119 
120             if (cause != null) {
121                 throw new PortletException(cause);
122             }
123             else {
124                 throw new PortletException(ite);
125             }
126         }
127         catch (Exception e) {
128             throw new PortletException(e);
129         }
130     }
131 
132     protected void doDispatch(
133             RenderRequest renderRequest, RenderResponse renderResponse)
134         throws IOException, PortletException {
135 
136         if (!isProcessRenderRequest(renderRequest)) {
137             renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
138 
139             return;
140         }
141 
142         WindowState state = renderRequest.getWindowState();
143 
144         if (state.equals(WindowState.MINIMIZED)) {
145             return;
146         }
147 
148         PortletMode mode = renderRequest.getPortletMode();
149 
150         if (mode.equals(PortletMode.VIEW)) {
151             doView(renderRequest, renderResponse);
152         }
153         else if (mode.equals(LiferayPortletMode.ABOUT)) {
154             doAbout(renderRequest, renderResponse);
155         }
156         else if (mode.equals(LiferayPortletMode.CONFIG)) {
157             doConfig(renderRequest, renderResponse);
158         }
159         else if (mode.equals(PortletMode.EDIT)) {
160             doEdit(renderRequest, renderResponse);
161         }
162         else if (mode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
163             doEditDefaults(renderRequest, renderResponse);
164         }
165         else if (mode.equals(LiferayPortletMode.EDIT_GUEST)) {
166             doEditGuest(renderRequest, renderResponse);
167         }
168         else if (mode.equals(PortletMode.HELP)) {
169             doHelp(renderRequest, renderResponse);
170         }
171         else if (mode.equals(LiferayPortletMode.PREVIEW)) {
172             doPreview(renderRequest, renderResponse);
173         }
174         else if (mode.equals(LiferayPortletMode.PRINT)) {
175             doPrint(renderRequest, renderResponse);
176         }
177         else {
178             throw new PortletException(mode.toString());
179         }
180     }
181 
182     @SuppressWarnings("unused")
183     protected void doAbout(
184             RenderRequest renderRequest, RenderResponse renderResponse)
185         throws IOException, PortletException {
186 
187         throw new PortletException("doAbout method not implemented");
188     }
189 
190     @SuppressWarnings("unused")
191     protected void doConfig(
192             RenderRequest renderRequest, RenderResponse renderResponse)
193         throws IOException, PortletException {
194 
195         throw new PortletException("doConfig method not implemented");
196     }
197 
198     @SuppressWarnings("unused")
199     protected void doEditDefaults(
200             RenderRequest renderRequest, RenderResponse renderResponse)
201         throws IOException, PortletException {
202 
203         throw new PortletException("doEditDefaults method not implemented");
204     }
205 
206     @SuppressWarnings("unused")
207     protected void doEditGuest(
208             RenderRequest renderRequest, RenderResponse renderResponse)
209         throws IOException, PortletException {
210 
211         throw new PortletException("doEditGuest method not implemented");
212     }
213 
214     @SuppressWarnings("unused")
215     protected void doPreview(
216             RenderRequest renderRequest, RenderResponse renderResponse)
217         throws IOException, PortletException {
218 
219         throw new PortletException("doPreview method not implemented");
220     }
221 
222     @SuppressWarnings("unused")
223     protected void doPrint(
224             RenderRequest renderRequest, RenderResponse renderResponse)
225         throws IOException, PortletException {
226 
227         throw new PortletException("doPrint method not implemented");
228     }
229 
230     protected boolean isProcessActionRequest(ActionRequest actionRequest) {
231         return isProcessPortletRequest(actionRequest);
232     }
233 
234     protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
235         return _PROCESS_PORTLET_REQUEST;
236     }
237 
238     protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
239         return isProcessPortletRequest(renderRequest);
240     }
241 
242     protected boolean isProcessResourceRequest(
243         ResourceRequest resourceRequest) {
244 
245         return isProcessPortletRequest(resourceRequest);
246     }
247 
248     private static final boolean _PROCESS_PORTLET_REQUEST = true;
249 
250     private Map<String, Class<?>> _classesMap = new HashMap<String, Class<?>>();
251     private Map<MethodKey, Method> _methodsMap =
252         new HashMap<MethodKey, Method>();
253 
254 }