001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
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.ServletResponseUtil;
019    import com.liferay.portal.kernel.servlet.SessionErrors;
020    import com.liferay.portal.kernel.servlet.SessionMessages;
021    import com.liferay.portal.kernel.util.ContentTypes;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.MethodCache;
024    import com.liferay.portal.kernel.util.MethodKey;
025    import com.liferay.portal.kernel.util.ParamUtil;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.kernel.util.WebKeys;
028    import com.liferay.portal.util.PortalUtil;
029    
030    import java.io.IOException;
031    
032    import java.lang.reflect.InvocationTargetException;
033    import java.lang.reflect.Method;
034    
035    import java.util.HashMap;
036    import java.util.Map;
037    
038    import javax.portlet.ActionRequest;
039    import javax.portlet.ActionResponse;
040    import javax.portlet.GenericPortlet;
041    import javax.portlet.MimeResponse;
042    import javax.portlet.PortletException;
043    import javax.portlet.PortletMode;
044    import javax.portlet.PortletRequest;
045    import javax.portlet.RenderRequest;
046    import javax.portlet.RenderResponse;
047    import javax.portlet.ResourceRequest;
048    import javax.portlet.ResourceResponse;
049    import javax.portlet.WindowState;
050    
051    import javax.servlet.http.HttpServletResponse;
052    
053    /**
054     * @author Brian Wing Shun Chan
055     */
056    public class LiferayPortlet extends GenericPortlet {
057    
058            @Override
059            public void init() throws PortletException {
060                    super.init();
061    
062                    addProcessActionSuccessMessage = GetterUtil.getBoolean(
063                            getInitParameter("add-process-action-success-action"), true);
064            }
065    
066            @Override
067            public void processAction(
068                            ActionRequest actionRequest, ActionResponse actionResponse)
069                    throws IOException, PortletException {
070    
071                    try {
072                            if (!isProcessActionRequest(actionRequest)) {
073                                    return;
074                            }
075    
076                            if (!callActionMethod(actionRequest, actionResponse)) {
077                                    return;
078                            }
079    
080                            if (!SessionErrors.isEmpty(actionRequest)) {
081                                    return;
082                            }
083    
084                            if (!SessionMessages.isEmpty(actionRequest)) {
085                                    return;
086                            }
087    
088                            addSuccessMessage(actionRequest, actionResponse);
089    
090                            sendRedirect(actionRequest, actionResponse);
091                    }
092                    catch (PortletException pe) {
093                            Throwable cause = pe.getCause();
094    
095                            if (isSessionErrorException(cause)) {
096                                    SessionErrors.add(
097                                            actionRequest, cause.getClass().getName(), cause);
098                            }
099                            else {
100                                    throw pe;
101                            }
102                    }
103            }
104    
105            @Override
106            public void serveResource(
107                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
108                    throws IOException, PortletException {
109    
110                    if (!isProcessResourceRequest(resourceRequest)) {
111                            return;
112                    }
113    
114                    super.serveResource(resourceRequest, resourceResponse);
115            }
116    
117            protected void addSuccessMessage(
118                    ActionRequest actionRequest, ActionResponse actionResponse) {
119    
120                    if (!addProcessActionSuccessMessage) {
121                            return;
122                    }
123    
124                    String successMessage = ParamUtil.getString(
125                            actionRequest, "successMessage");
126    
127                    SessionMessages.add(actionRequest, "request_processed", successMessage);
128            }
129    
130            protected boolean callActionMethod(
131                            ActionRequest actionRequest, ActionResponse actionResponse)
132                    throws PortletException {
133    
134                    String actionName = ParamUtil.getString(
135                            actionRequest, ActionRequest.ACTION_NAME);
136    
137                    if (Validator.isNull(actionName)) {
138                            return false;
139                    }
140    
141                    try {
142                            Method method = MethodCache.get(
143                                    _classesMap, _methodsMap, getClass().getName(), actionName,
144                                    new Class[] {ActionRequest.class, ActionResponse.class});
145    
146                            method.invoke(this, actionRequest, actionResponse);
147    
148                            return true;
149                    }
150                    catch (NoSuchMethodException nsme) {
151                            try {
152                                    super.processAction(actionRequest, actionResponse);
153    
154                                    return true;
155                            }
156                            catch (Exception e) {
157                                    throw new PortletException(nsme);
158                            }
159                    }
160                    catch (InvocationTargetException ite) {
161                            Throwable cause = ite.getCause();
162    
163                            if (cause != null) {
164                                    throw new PortletException(cause);
165                            }
166                            else {
167                                    throw new PortletException(ite);
168                            }
169                    }
170                    catch (Exception e) {
171                            throw new PortletException(e);
172                    }
173            }
174    
175            @SuppressWarnings("unused")
176            protected void doAbout(
177                            RenderRequest renderRequest, RenderResponse renderResponse)
178                    throws IOException, PortletException {
179    
180                    throw new PortletException("doAbout method not implemented");
181            }
182    
183            @SuppressWarnings("unused")
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            @Override
192            protected void doDispatch(
193                            RenderRequest renderRequest, RenderResponse renderResponse)
194                    throws IOException, PortletException {
195    
196                    if (!isProcessRenderRequest(renderRequest)) {
197                            renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
198    
199                            return;
200                    }
201    
202                    WindowState windowState = renderRequest.getWindowState();
203    
204                    if (windowState.equals(WindowState.MINIMIZED)) {
205                            return;
206                    }
207    
208                    PortletMode portletMode = renderRequest.getPortletMode();
209    
210                    if (portletMode.equals(PortletMode.VIEW)) {
211                            doView(renderRequest, renderResponse);
212                    }
213                    else if (portletMode.equals(LiferayPortletMode.ABOUT)) {
214                            doAbout(renderRequest, renderResponse);
215                    }
216                    else if (portletMode.equals(LiferayPortletMode.CONFIG)) {
217                            doConfig(renderRequest, renderResponse);
218                    }
219                    else if (portletMode.equals(PortletMode.EDIT)) {
220                            doEdit(renderRequest, renderResponse);
221                    }
222                    else if (portletMode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
223                            doEditDefaults(renderRequest, renderResponse);
224                    }
225                    else if (portletMode.equals(LiferayPortletMode.EDIT_GUEST)) {
226                            doEditGuest(renderRequest, renderResponse);
227                    }
228                    else if (portletMode.equals(PortletMode.HELP)) {
229                            doHelp(renderRequest, renderResponse);
230                    }
231                    else if (portletMode.equals(LiferayPortletMode.PREVIEW)) {
232                            doPreview(renderRequest, renderResponse);
233                    }
234                    else if (portletMode.equals(LiferayPortletMode.PRINT)) {
235                            doPrint(renderRequest, renderResponse);
236                    }
237                    else {
238                            throw new PortletException(portletMode.toString());
239                    }
240            }
241    
242            @SuppressWarnings("unused")
243            protected void doEditDefaults(
244                            RenderRequest renderRequest, RenderResponse renderResponse)
245                    throws IOException, PortletException {
246    
247                    throw new PortletException("doEditDefaults method not implemented");
248            }
249    
250            @SuppressWarnings("unused")
251            protected void doEditGuest(
252                            RenderRequest renderRequest, RenderResponse renderResponse)
253                    throws IOException, PortletException {
254    
255                    throw new PortletException("doEditGuest method not implemented");
256            }
257    
258            @SuppressWarnings("unused")
259            protected void doPreview(
260                            RenderRequest renderRequest, RenderResponse renderResponse)
261                    throws IOException, PortletException {
262    
263                    throw new PortletException("doPreview method not implemented");
264            }
265    
266            @SuppressWarnings("unused")
267            protected void doPrint(
268                            RenderRequest renderRequest, RenderResponse renderResponse)
269                    throws IOException, PortletException {
270    
271                    throw new PortletException("doPrint method not implemented");
272            }
273    
274            protected String getRedirect(
275                    ActionRequest actionRequest, ActionResponse actionResponse) {
276    
277                    String redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
278    
279                    if (Validator.isNull(redirect)) {
280                            redirect = ParamUtil.getString(actionRequest, "redirect");
281                    }
282    
283                    return redirect;
284            }
285    
286            protected boolean isProcessActionRequest(ActionRequest actionRequest) {
287                    return isProcessPortletRequest(actionRequest);
288            }
289    
290            protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
291                    return _PROCESS_PORTLET_REQUEST;
292            }
293    
294            protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
295                    return isProcessPortletRequest(renderRequest);
296            }
297    
298            protected boolean isProcessResourceRequest(
299                    ResourceRequest resourceRequest) {
300    
301                    return isProcessPortletRequest(resourceRequest);
302            }
303    
304            protected boolean isSessionErrorException(Throwable cause) {
305                    if (cause instanceof PortalException) {
306                            return true;
307                    }
308                    else {
309                            return false;
310                    }
311            }
312    
313            protected void sendRedirect(
314                            ActionRequest actionRequest, ActionResponse actionResponse)
315                    throws IOException {
316    
317                    String redirect = getRedirect(actionRequest, actionResponse);
318    
319                    if (Validator.isNotNull(redirect)) {
320                            actionResponse.sendRedirect(redirect);
321                    }
322            }
323    
324            protected void writeJSON(
325                            PortletRequest portletRequest, ActionResponse actionResponse,
326                            Object json)
327                    throws IOException {
328    
329                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
330                            actionResponse);
331    
332                    response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
333    
334                    ServletResponseUtil.write(response, json.toString());
335            }
336    
337            protected void writeJSON(
338                            PortletRequest portletRequest, MimeResponse mimeResponse,
339                            Object json)
340                    throws IOException {
341    
342                    mimeResponse.setContentType(ContentTypes.TEXT_JAVASCRIPT);
343    
344                    PortletResponseUtil.write(mimeResponse, json.toString());
345            }
346    
347            protected boolean addProcessActionSuccessMessage;
348    
349            private static final boolean _PROCESS_PORTLET_REQUEST = true;
350    
351            private Map<String, Class<?>> _classesMap = new HashMap<String, Class<?>>();
352            private Map<MethodKey, Method> _methodsMap =
353                    new HashMap<MethodKey, Method>();
354    
355    }