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