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