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.language.LanguageUtil;
019    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
020    import com.liferay.portal.kernel.servlet.SessionErrors;
021    import com.liferay.portal.kernel.servlet.SessionMessages;
022    import com.liferay.portal.kernel.util.ContentTypes;
023    import com.liferay.portal.kernel.util.GetterUtil;
024    import com.liferay.portal.kernel.util.JavaConstants;
025    import com.liferay.portal.kernel.util.MethodKey;
026    import com.liferay.portal.kernel.util.ParamUtil;
027    import com.liferay.portal.kernel.util.Validator;
028    import com.liferay.portal.kernel.util.WebKeys;
029    import com.liferay.portal.theme.ThemeDisplay;
030    import com.liferay.portal.util.PortalUtil;
031    
032    import java.io.IOException;
033    
034    import java.lang.reflect.InvocationTargetException;
035    import java.lang.reflect.Method;
036    
037    import javax.portlet.ActionRequest;
038    import javax.portlet.ActionResponse;
039    import javax.portlet.GenericPortlet;
040    import javax.portlet.MimeResponse;
041    import javax.portlet.PortletConfig;
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(actionRequest, cause.getClass(), cause);
097                            }
098                            else {
099                                    throw pe;
100                            }
101                    }
102            }
103    
104            @Override
105            public void serveResource(
106                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
107                    throws IOException, PortletException {
108    
109                    if (!isProcessResourceRequest(resourceRequest)) {
110                            return;
111                    }
112    
113                    super.serveResource(resourceRequest, resourceResponse);
114            }
115    
116            protected void addSuccessMessage(
117                    ActionRequest actionRequest, ActionResponse actionResponse) {
118    
119                    if (!addProcessActionSuccessMessage) {
120                            return;
121                    }
122    
123                    String successMessage = ParamUtil.getString(
124                            actionRequest, "successMessage");
125    
126                    SessionMessages.add(actionRequest, "requestProcessed", successMessage);
127            }
128    
129            protected boolean callActionMethod(
130                            ActionRequest actionRequest, ActionResponse actionResponse)
131                    throws PortletException {
132    
133                    String actionName = ParamUtil.getString(
134                            actionRequest, ActionRequest.ACTION_NAME);
135    
136                    if (Validator.isNull(actionName) ||
137                            actionName.equals("callActionMethod") ||
138                            actionName.equals("processAction")) {
139    
140                            return false;
141                    }
142    
143                    try {
144                            MethodKey methodKey = new MethodKey(
145                                    getClass(), actionName, ActionRequest.class,
146                                    ActionResponse.class);
147    
148                            Method method = methodKey.getMethod();
149    
150                            method.invoke(this, actionRequest, actionResponse);
151    
152                            return true;
153                    }
154                    catch (NoSuchMethodException nsme) {
155                            try {
156                                    super.processAction(actionRequest, actionResponse);
157    
158                                    return true;
159                            }
160                            catch (Exception e) {
161                                    throw new PortletException(nsme);
162                            }
163                    }
164                    catch (InvocationTargetException ite) {
165                            Throwable cause = ite.getCause();
166    
167                            if (cause != null) {
168                                    throw new PortletException(cause);
169                            }
170                            else {
171                                    throw new PortletException(ite);
172                            }
173                    }
174                    catch (Exception e) {
175                            throw new PortletException(e);
176                    }
177            }
178    
179            @SuppressWarnings("unused")
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            @SuppressWarnings("unused")
188            protected void doConfig(
189                            RenderRequest renderRequest, RenderResponse renderResponse)
190                    throws IOException, PortletException {
191    
192                    throw new PortletException("doConfig method not implemented");
193            }
194    
195            @Override
196            protected void doDispatch(
197                            RenderRequest renderRequest, RenderResponse renderResponse)
198                    throws IOException, PortletException {
199    
200                    if (!isProcessRenderRequest(renderRequest)) {
201                            renderRequest.setAttribute(WebKeys.PORTLET_DECORATE, Boolean.FALSE);
202    
203                            return;
204                    }
205    
206                    WindowState windowState = renderRequest.getWindowState();
207    
208                    if (windowState.equals(WindowState.MINIMIZED)) {
209                            return;
210                    }
211    
212                    PortletMode portletMode = renderRequest.getPortletMode();
213    
214                    if (portletMode.equals(PortletMode.VIEW)) {
215                            doView(renderRequest, renderResponse);
216                    }
217                    else if (portletMode.equals(LiferayPortletMode.ABOUT)) {
218                            doAbout(renderRequest, renderResponse);
219                    }
220                    else if (portletMode.equals(LiferayPortletMode.CONFIG)) {
221                            doConfig(renderRequest, renderResponse);
222                    }
223                    else if (portletMode.equals(PortletMode.EDIT)) {
224                            doEdit(renderRequest, renderResponse);
225                    }
226                    else if (portletMode.equals(LiferayPortletMode.EDIT_DEFAULTS)) {
227                            doEditDefaults(renderRequest, renderResponse);
228                    }
229                    else if (portletMode.equals(LiferayPortletMode.EDIT_GUEST)) {
230                            doEditGuest(renderRequest, renderResponse);
231                    }
232                    else if (portletMode.equals(PortletMode.HELP)) {
233                            doHelp(renderRequest, renderResponse);
234                    }
235                    else if (portletMode.equals(LiferayPortletMode.PREVIEW)) {
236                            doPreview(renderRequest, renderResponse);
237                    }
238                    else if (portletMode.equals(LiferayPortletMode.PRINT)) {
239                            doPrint(renderRequest, renderResponse);
240                    }
241                    else {
242                            throw new PortletException(portletMode.toString());
243                    }
244            }
245    
246            @SuppressWarnings("unused")
247            protected void doEditDefaults(
248                            RenderRequest renderRequest, RenderResponse renderResponse)
249                    throws IOException, PortletException {
250    
251                    throw new PortletException("doEditDefaults method not implemented");
252            }
253    
254            @SuppressWarnings("unused")
255            protected void doEditGuest(
256                            RenderRequest renderRequest, RenderResponse renderResponse)
257                    throws IOException, PortletException {
258    
259                    throw new PortletException("doEditGuest method not implemented");
260            }
261    
262            @SuppressWarnings("unused")
263            protected void doPreview(
264                            RenderRequest renderRequest, RenderResponse renderResponse)
265                    throws IOException, PortletException {
266    
267                    throw new PortletException("doPreview method not implemented");
268            }
269    
270            @SuppressWarnings("unused")
271            protected void doPrint(
272                            RenderRequest renderRequest, RenderResponse renderResponse)
273                    throws IOException, PortletException {
274    
275                    throw new PortletException("doPrint method not implemented");
276            }
277    
278            protected String getRedirect(
279                    ActionRequest actionRequest, ActionResponse actionResponse) {
280    
281                    String redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
282    
283                    if (Validator.isNull(redirect)) {
284                            redirect = ParamUtil.getString(actionRequest, "redirect");
285                    }
286    
287                    return redirect;
288            }
289    
290            @Override
291            protected String getTitle(RenderRequest renderRequest) {
292                    try {
293                            return PortalUtil.getPortletTitle(renderRequest);
294                    }
295                    catch (Exception e) {
296                            return super.getTitle(renderRequest);
297                    }
298            }
299    
300            protected boolean isProcessActionRequest(ActionRequest actionRequest) {
301                    return isProcessPortletRequest(actionRequest);
302            }
303    
304            protected boolean isProcessPortletRequest(PortletRequest portletRequest) {
305                    return _PROCESS_PORTLET_REQUEST;
306            }
307    
308            protected boolean isProcessRenderRequest(RenderRequest renderRequest) {
309                    return isProcessPortletRequest(renderRequest);
310            }
311    
312            protected boolean isProcessResourceRequest(
313                    ResourceRequest resourceRequest) {
314    
315                    return isProcessPortletRequest(resourceRequest);
316            }
317    
318            protected boolean isSessionErrorException(Throwable cause) {
319                    if (cause instanceof PortalException) {
320                            return true;
321                    }
322    
323                    return false;
324            }
325    
326            protected void sendRedirect(
327                            ActionRequest actionRequest, ActionResponse actionResponse)
328                    throws IOException {
329    
330                    String redirect = getRedirect(actionRequest, actionResponse);
331    
332                    if (Validator.isNotNull(redirect)) {
333                            actionResponse.sendRedirect(redirect);
334                    }
335            }
336    
337            protected String translate(PortletRequest portletRequest, String key) {
338                    PortletConfig portletConfig =
339                            (PortletConfig)portletRequest.getAttribute(
340                                    JavaConstants.JAVAX_PORTLET_CONFIG);
341    
342                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
343                            WebKeys.THEME_DISPLAY);
344    
345                    return LanguageUtil.get(portletConfig, themeDisplay.getLocale(), key);
346            }
347    
348            protected String translate(
349                    PortletRequest portletRequest, String key, Object argument) {
350    
351                    PortletConfig portletConfig =
352                            (PortletConfig)portletRequest.getAttribute(
353                                    JavaConstants.JAVAX_PORTLET_CONFIG);
354    
355                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
356                            WebKeys.THEME_DISPLAY);
357    
358                    return LanguageUtil.format(
359                            portletConfig, themeDisplay.getLocale(), key, argument);
360            }
361    
362            protected String translate(
363                    PortletRequest portletRequest, String key, Object[] arguments) {
364    
365                    PortletConfig portletConfig =
366                            (PortletConfig)portletRequest.getAttribute(
367                                    JavaConstants.JAVAX_PORTLET_CONFIG);
368    
369                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
370                            WebKeys.THEME_DISPLAY);
371    
372                    return LanguageUtil.format(
373                            portletConfig, themeDisplay.getLocale(), key, arguments);
374            }
375    
376            protected void writeJSON(
377                            PortletRequest portletRequest, ActionResponse actionResponse,
378                            Object json)
379                    throws IOException {
380    
381                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
382                            actionResponse);
383    
384                    response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
385    
386                    ServletResponseUtil.write(response, json.toString());
387            }
388    
389            protected void writeJSON(
390                            PortletRequest portletRequest, MimeResponse mimeResponse,
391                            Object json)
392                    throws IOException {
393    
394                    mimeResponse.setContentType(ContentTypes.TEXT_JAVASCRIPT);
395    
396                    PortletResponseUtil.write(mimeResponse, json.toString());
397            }
398    
399            protected boolean addProcessActionSuccessMessage;
400    
401            private static final boolean _PROCESS_PORTLET_REQUEST = true;
402    
403    }