001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.kernel.portlet;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.servlet.SessionErrors;
019    import com.liferay.portal.kernel.servlet.SessionMessages;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.kernel.util.MethodCache;
022    import com.liferay.portal.kernel.util.MethodKey;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.kernel.util.WebKeys;
026    
027    import java.io.IOException;
028    
029    import java.lang.reflect.InvocationTargetException;
030    import java.lang.reflect.Method;
031    
032    import java.util.HashMap;
033    import java.util.Map;
034    
035    import javax.portlet.ActionRequest;
036    import javax.portlet.ActionResponse;
037    import javax.portlet.GenericPortlet;
038    import javax.portlet.PortletException;
039    import javax.portlet.PortletMode;
040    import javax.portlet.PortletRequest;
041    import javax.portlet.RenderRequest;
042    import javax.portlet.RenderResponse;
043    import javax.portlet.ResourceRequest;
044    import javax.portlet.ResourceResponse;
045    import javax.portlet.WindowState;
046    
047    /**
048     * @author Brian Wing Shun Chan
049     */
050    public class LiferayPortlet extends GenericPortlet {
051    
052            @Override
053            public void init() throws PortletException {
054                    super.init();
055    
056                    addProcessActionSuccessMessage = GetterUtil.getBoolean(
057                            getInitParameter("add-process-action-success-action"), true);
058            }
059    
060            @Override
061            public void processAction(
062                            ActionRequest actionRequest, ActionResponse actionResponse)
063                    throws IOException, PortletException {
064    
065                    try {
066                            if (!isProcessActionRequest(actionRequest)) {
067                                    return;
068                            }
069    
070                            if (!callActionMethod(actionRequest, actionResponse)) {
071                                    return;
072                            }
073    
074                            if (!SessionErrors.isEmpty(actionRequest)) {
075                                    return;
076                            }
077    
078                            if (!SessionMessages.isEmpty(actionRequest)) {
079                                    return;
080                            }
081    
082                            addSuccessMessage(actionRequest, actionResponse);
083    
084                            sendRedirect(actionRequest, actionResponse);
085                    }
086                    catch (PortletException pe) {
087                            Throwable cause = pe.getCause();
088    
089                            if (isSessionErrorException(cause)) {
090                                    SessionErrors.add(
091                                            actionRequest, cause.getClass().getName(), cause);
092                            }
093                            else {
094                                    throw pe;
095                            }
096                    }
097            }
098    
099            @Override
100            public void serveResource(
101                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
102                    throws IOException, PortletException {
103    
104                    if (!isProcessResourceRequest(resourceRequest)) {
105                            return;
106                    }
107    
108                    super.serveResource(resourceRequest, resourceResponse);
109            }
110    
111            protected void addSuccessMessage(
112                    ActionRequest actionRequest, ActionResponse actionResponse) {
113    
114                    if (!addProcessActionSuccessMessage) {
115                            return;
116                    }
117    
118                    String successMessage = ParamUtil.getString(
119                            actionRequest, "successMessage");
120    
121                    SessionMessages.add(actionRequest, "request_processed", successMessage);
122            }
123    
124            protected boolean callActionMethod(
125                            ActionRequest actionRequest, ActionResponse actionResponse)
126                    throws PortletException {
127    
128                    String actionName = ParamUtil.getString(
129                            actionRequest, ActionRequest.ACTION_NAME);
130    
131                    if (Validator.isNull(actionName)) {
132                            return false;
133                    }
134    
135                    try {
136                            Method method = MethodCache.get(
137                                    _classesMap, _methodsMap, getClass().getName(), actionName,
138                                    new Class[] {ActionRequest.class, ActionResponse.class});
139    
140                            method.invoke(this, actionRequest, actionResponse);
141    
142                            return true;
143                    }
144                    catch (NoSuchMethodException nsme) {
145                            try {
146                                    super.processAction(actionRequest, actionResponse);
147    
148                                    return true;
149                            }
150                            catch (Exception e) {
151                                    throw new PortletException(nsme);
152                            }
153                    }
154                    catch (InvocationTargetException ite) {
155                            Throwable cause = ite.getCause();
156    
157                            if (cause != null) {
158                                    throw new PortletException(cause);
159                            }
160                            else {
161                                    throw new PortletException(ite);
162                            }
163                    }
164                    catch (Exception e) {
165                            throw new PortletException(e);
166                    }
167            }
168    
169            @SuppressWarnings("unused")
170            protected void doAbout(
171                            RenderRequest renderRequest, RenderResponse renderResponse)
172                    throws IOException, PortletException {
173    
174                    throw new PortletException("doAbout method not implemented");
175            }
176    
177            @SuppressWarnings("unused")
178            protected void doConfig(
179                            RenderRequest renderRequest, RenderResponse renderResponse)
180                    throws IOException, PortletException {
181    
182                    throw new PortletException("doConfig method not implemented");
183            }
184    
185            @Override
186            protected void doDispatch(
187                            RenderRequest renderRequest, RenderResponse renderResponse)
188                    throws IOException, PortletException {
189    
190                    if (!isProcessRenderRequest(renderRequest)) {
191                            renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
192    
193                            return;
194                    }
195    
196                    WindowState windowState = renderRequest.getWindowState();
197    
198                    if (windowState.equals(WindowState.MINIMIZED)) {
199                            return;
200                    }
201    
202                    PortletMode portletMode = renderRequest.getPortletMode();
203    
204                    if (portletMode.equals(PortletMode.VIEW)) {
205                            doView(renderRequest, renderResponse);
206                    }
207                    else if (portletMode.equals(LiferayPortletMode.ABOUT)) {
208                            doAbout(renderRequest, renderResponse);
209                    }
210                    else if (portletMode.equals(LiferayPortletMode.CONFIG)) {
211                            doConfig(renderRequest, renderResponse);
212                    }
213                    else if (portletMode.equals(PortletMode.EDIT)) {
214                            doEdit(renderRequest, renderResponse);
215                    }
216                    else if (portletMode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
217                            doEditDefaults(renderRequest, renderResponse);
218                    }
219                    else if (portletMode.equals(LiferayPortletMode.EDIT_GUEST)) {
220                            doEditGuest(renderRequest, renderResponse);
221                    }
222                    else if (portletMode.equals(PortletMode.HELP)) {
223                            doHelp(renderRequest, renderResponse);
224                    }
225                    else if (portletMode.equals(LiferayPortletMode.PREVIEW)) {
226                            doPreview(renderRequest, renderResponse);
227                    }
228                    else if (portletMode.equals(LiferayPortletMode.PRINT)) {
229                            doPrint(renderRequest, renderResponse);
230                    }
231                    else {
232                            throw new PortletException(portletMode.toString());
233                    }
234            }
235    
236            @SuppressWarnings("unused")
237            protected void doEditDefaults(
238                            RenderRequest renderRequest, RenderResponse renderResponse)
239                    throws IOException, PortletException {
240    
241                    throw new PortletException("doEditDefaults method not implemented");
242            }
243    
244            @SuppressWarnings("unused")
245            protected void doEditGuest(
246                            RenderRequest renderRequest, RenderResponse renderResponse)
247                    throws IOException, PortletException {
248    
249                    throw new PortletException("doEditGuest method not implemented");
250            }
251    
252            @SuppressWarnings("unused")
253            protected void doPreview(
254                            RenderRequest renderRequest, RenderResponse renderResponse)
255                    throws IOException, PortletException {
256    
257                    throw new PortletException("doPreview method not implemented");
258            }
259    
260            @SuppressWarnings("unused")
261            protected void doPrint(
262                            RenderRequest renderRequest, RenderResponse renderResponse)
263                    throws IOException, PortletException {
264    
265                    throw new PortletException("doPrint method not implemented");
266            }
267    
268            protected String getRedirect(
269                    ActionRequest actionRequest, ActionResponse actionResponse) {
270    
271                    String redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
272    
273                    if (Validator.isNull(redirect)) {
274                            redirect = ParamUtil.getString(actionRequest, "redirect");
275                    }
276    
277                    return redirect;
278            }
279    
280            protected boolean isProcessActionRequest(ActionRequest actionRequest) {
281                    return isProcessPortletRequest(actionRequest);
282            }
283    
284            protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
285                    return _PROCESS_PORTLET_REQUEST;
286            }
287    
288            protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
289                    return isProcessPortletRequest(renderRequest);
290            }
291    
292            protected boolean isProcessResourceRequest(
293                    ResourceRequest resourceRequest) {
294    
295                    return isProcessPortletRequest(resourceRequest);
296            }
297    
298            protected boolean isSessionErrorException(Throwable cause) {
299                    if (cause instanceof PortalException) {
300                            return true;
301                    }
302                    else {
303                            return false;
304                    }
305            }
306    
307            protected void sendRedirect(
308                            ActionRequest actionRequest, ActionResponse actionResponse)
309                    throws IOException {
310    
311                    String redirect = getRedirect(actionRequest, actionResponse);
312    
313                    if (Validator.isNotNull(redirect)) {
314                            actionResponse.sendRedirect(redirect);
315                    }
316            }
317    
318            protected boolean addProcessActionSuccessMessage;
319    
320            private static final boolean _PROCESS_PORTLET_REQUEST = true;
321    
322            private Map<String, Class<?>> _classesMap = new HashMap<String, Class<?>>();
323            private Map<MethodKey, Method> _methodsMap =
324                    new HashMap<MethodKey, Method>();
325    
326    }