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.struts;
016    
017    import com.liferay.portal.kernel.exception.SystemException;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.portlet.PortletResponseUtil;
021    import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
022    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
023    import com.liferay.portal.kernel.servlet.SessionErrors;
024    import com.liferay.portal.kernel.servlet.SessionMessages;
025    import com.liferay.portal.kernel.util.ContentTypes;
026    import com.liferay.portal.kernel.util.GetterUtil;
027    import com.liferay.portal.kernel.util.JavaConstants;
028    import com.liferay.portal.kernel.util.ParamUtil;
029    import com.liferay.portal.kernel.util.StringPool;
030    import com.liferay.portal.kernel.util.StringUtil;
031    import com.liferay.portal.kernel.util.Validator;
032    import com.liferay.portal.model.LayoutTypePortlet;
033    import com.liferay.portal.model.Portlet;
034    import com.liferay.portal.security.auth.PrincipalException;
035    import com.liferay.portal.service.PortletLocalServiceUtil;
036    import com.liferay.portal.theme.ThemeDisplay;
037    import com.liferay.portal.util.PortalUtil;
038    import com.liferay.portal.util.WebKeys;
039    
040    import java.io.IOException;
041    
042    import javax.portlet.ActionRequest;
043    import javax.portlet.ActionResponse;
044    import javax.portlet.MimeResponse;
045    import javax.portlet.PortletConfig;
046    import javax.portlet.PortletContext;
047    import javax.portlet.PortletRequest;
048    import javax.portlet.PortletRequestDispatcher;
049    import javax.portlet.PortletResponse;
050    import javax.portlet.RenderRequest;
051    import javax.portlet.RenderResponse;
052    import javax.portlet.ResourceRequest;
053    import javax.portlet.ResourceResponse;
054    
055    import javax.servlet.ServletContext;
056    import javax.servlet.http.HttpServletRequest;
057    import javax.servlet.http.HttpServletResponse;
058    
059    import org.apache.struts.Globals;
060    import org.apache.struts.action.Action;
061    import org.apache.struts.action.ActionForm;
062    import org.apache.struts.action.ActionForward;
063    import org.apache.struts.action.ActionMapping;
064    import org.apache.struts.config.ModuleConfig;
065    import org.apache.struts.util.MessageResources;
066    
067    /**
068     * @author Brian Wing Shun Chan
069     */
070    public class PortletAction extends Action {
071    
072            public static String getForwardKey(HttpServletRequest request) {
073                    String portletId = (String)request.getAttribute(WebKeys.PORTLET_ID);
074    
075                    String portletNamespace = PortalUtil.getPortletNamespace(portletId);
076    
077                    return portletNamespace.concat(WebKeys.PORTLET_STRUTS_FORWARD);
078            }
079    
080            public static String getForwardKey(PortletRequest portletRequest) {
081                    String portletId = (String)portletRequest.getAttribute(
082                            WebKeys.PORTLET_ID);
083    
084                    String portletNamespace = PortalUtil.getPortletNamespace(portletId);
085    
086                    return portletNamespace.concat(WebKeys.PORTLET_STRUTS_FORWARD);
087            }
088    
089            @Override
090            public ActionForward execute(
091                            ActionMapping mapping, ActionForm form, HttpServletRequest request,
092                            HttpServletResponse response)
093                    throws Exception {
094    
095                    PortletConfig portletConfig = (PortletConfig)request.getAttribute(
096                            JavaConstants.JAVAX_PORTLET_CONFIG);
097    
098                    PortletRequest portletRequest = (PortletRequest)request.getAttribute(
099                            JavaConstants.JAVAX_PORTLET_REQUEST);
100    
101                    PortletResponse portletResponse = (PortletResponse)request.getAttribute(
102                            JavaConstants.JAVAX_PORTLET_RESPONSE);
103    
104                    Boolean strutsExecute = (Boolean)request.getAttribute(
105                            WebKeys.PORTLET_STRUTS_EXECUTE);
106    
107                    if ((strutsExecute != null) && strutsExecute.booleanValue()) {
108                            return strutsExecute(mapping, form, request, response);
109                    }
110                    else if (portletRequest instanceof RenderRequest) {
111                            return render(
112                                    mapping, form, portletConfig, (RenderRequest)portletRequest,
113                                    (RenderResponse)portletResponse);
114                    }
115                    else {
116                            serveResource(
117                                    mapping, form, portletConfig, (ResourceRequest)portletRequest,
118                                    (ResourceResponse)portletResponse);
119    
120                            return mapping.findForward(ActionConstants.COMMON_NULL);
121                    }
122            }
123    
124            public void processAction(
125                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
126                            ActionRequest actionRequest, ActionResponse actionResponse)
127                    throws Exception {
128            }
129    
130            public ActionForward render(
131                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
132                            RenderRequest renderRequest, RenderResponse renderResponse)
133                    throws Exception {
134    
135                    if (_log.isDebugEnabled()) {
136                            _log.debug("Forward to " + getForward(renderRequest));
137                    }
138    
139                    return mapping.findForward(getForward(renderRequest));
140            }
141    
142            public void serveResource(
143                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
144                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
145                    throws Exception {
146    
147                    String resourceId = resourceRequest.getResourceID();
148    
149                    if (Validator.isNull(resourceId)) {
150                            return;
151                    }
152    
153                    PortletContext portletContext = portletConfig.getPortletContext();
154    
155                    PortletRequestDispatcher portletRequestDispatcher =
156                            portletContext.getRequestDispatcher(resourceId);
157    
158                    if (portletRequestDispatcher == null) {
159                            return;
160                    }
161    
162                    portletRequestDispatcher.forward(resourceRequest, resourceResponse);
163            }
164    
165            public ActionForward strutsExecute(
166                            ActionMapping mapping, ActionForm form, HttpServletRequest request,
167                            HttpServletResponse response)
168                    throws Exception {
169    
170                    return super.execute(mapping, form, request, response);
171            }
172    
173            protected void addSuccessMessage(
174                    ActionRequest actionRequest, ActionResponse actionResponse) {
175    
176                    PortletConfig portletConfig = (PortletConfig)actionRequest.getAttribute(
177                            JavaConstants.JAVAX_PORTLET_CONFIG);
178    
179                    boolean addProcessActionSuccessMessage = GetterUtil.getBoolean(
180                            portletConfig.getInitParameter("add-process-action-success-action"),
181                            true);
182    
183                    if (!addProcessActionSuccessMessage) {
184                            return;
185                    }
186    
187                    String successMessage = ParamUtil.getString(
188                            actionRequest, "successMessage");
189    
190                    SessionMessages.add(actionRequest, "request_processed", successMessage);
191            }
192    
193            protected String getForward(PortletRequest portletRequest) {
194                    return getForward(portletRequest, null);
195            }
196    
197            protected String getForward(
198                    PortletRequest portletRequest, String defaultValue) {
199    
200                    String forward = (String)portletRequest.getAttribute(
201                            getForwardKey(portletRequest));
202    
203                    if (forward == null) {
204                            return defaultValue;
205                    }
206                    else {
207                            return forward;
208                    }
209            }
210    
211            protected ModuleConfig getModuleConfig(PortletRequest portletRequest) {
212                    return (ModuleConfig)portletRequest.getAttribute(Globals.MODULE_KEY);
213            }
214    
215            protected MessageResources getResources() {
216                    ServletContext servletContext = getServlet().getServletContext();
217    
218                    return (MessageResources)servletContext.getAttribute(
219                            Globals.MESSAGES_KEY);
220            }
221    
222            @Override
223            protected MessageResources getResources(HttpServletRequest request) {
224                    return getResources();
225            }
226    
227            protected MessageResources getResources(PortletRequest portletRequest) {
228                    return getResources();
229            }
230    
231            protected boolean isCheckMethodOnProcessAction() {
232                    return _CHECK_METHOD_ON_PROCESS_ACTION;
233            }
234    
235            protected boolean redirectToLogin(
236                            ActionRequest actionRequest, ActionResponse actionResponse)
237                    throws IOException {
238    
239                    if (actionRequest.getRemoteUser() == null) {
240                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
241                                    actionRequest);
242    
243                            SessionErrors.add(request, PrincipalException.class.getName());
244    
245                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
246                                    WebKeys.THEME_DISPLAY);
247    
248                            actionResponse.sendRedirect(themeDisplay.getURLSignIn());
249    
250                            return true;
251                    }
252                    else {
253                            return false;
254                    }
255            }
256    
257            protected void sendRedirect(
258                            ActionRequest actionRequest, ActionResponse actionResponse)
259                    throws IOException, SystemException {
260    
261                    sendRedirect(actionRequest, actionResponse, null);
262            }
263    
264            protected void sendRedirect(
265                            ActionRequest actionRequest, ActionResponse actionResponse,
266                            String redirect)
267                    throws IOException, SystemException {
268    
269                    if (SessionErrors.isEmpty(actionRequest)) {
270                            ThemeDisplay themeDisplay =
271                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
272    
273                            LayoutTypePortlet layoutTypePortlet =
274                                    themeDisplay.getLayoutTypePortlet();
275    
276                            boolean hasPortletId = false;
277    
278                            String portletId = (String)actionRequest.getAttribute(
279                                    WebKeys.PORTLET_ID);
280    
281                            try {
282                                    hasPortletId = layoutTypePortlet.hasPortletId(portletId);
283                            }
284                            catch (Exception e) {
285                            }
286    
287                            Portlet portlet = PortletLocalServiceUtil.getPortletById(
288                                    themeDisplay.getCompanyId(), portletId);
289    
290                            if (hasPortletId || portlet.isAddDefaultResource()) {
291                                    addSuccessMessage(actionRequest, actionResponse);
292                            }
293                    }
294    
295                    if (Validator.isNull(redirect)) {
296                            redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
297                    }
298    
299                    if (Validator.isNull(redirect)) {
300                            redirect = ParamUtil.getString(actionRequest, "redirect");
301                    }
302    
303                    if (Validator.isNotNull(redirect)) {
304    
305                            // LPS-1928
306    
307                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
308                                    actionRequest);
309    
310                            if ((BrowserSnifferUtil.isIe(request)) &&
311                                    (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
312                                    (redirect.contains(StringPool.POUND))) {
313    
314                                    String redirectToken = "&#";
315    
316                                    if (!redirect.contains(StringPool.QUESTION)) {
317                                            redirectToken = StringPool.QUESTION + redirectToken;
318                                    }
319    
320                                    redirect = StringUtil.replace(
321                                            redirect, StringPool.POUND, redirectToken);
322                            }
323    
324                            redirect = PortalUtil.escapeRedirect(redirect);
325    
326                            if (Validator.isNotNull(redirect)) {
327                                    actionResponse.sendRedirect(redirect);
328                            }
329                    }
330            }
331    
332            protected void setForward(PortletRequest portletRequest, String forward) {
333                    portletRequest.setAttribute(getForwardKey(portletRequest), forward);
334            }
335    
336            protected void writeJSON(
337                            PortletRequest portletRequest, ActionResponse actionResponse,
338                            Object json)
339                    throws IOException {
340    
341                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
342                            actionResponse);
343    
344                    response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
345    
346                    ServletResponseUtil.write(response, json.toString());
347    
348                    setForward(portletRequest, ActionConstants.COMMON_NULL);
349            }
350    
351            protected void writeJSON(
352                            PortletRequest portletRequest, MimeResponse mimeResponse,
353                            Object json)
354                    throws IOException {
355    
356                    mimeResponse.setContentType(ContentTypes.TEXT_JAVASCRIPT);
357    
358                    PortletResponseUtil.write(mimeResponse, json.toString());
359            }
360    
361            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
362    
363            private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
364    
365    }