001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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(
253                                            WebKeys.THEME_DISPLAY);
254    
255                            LayoutTypePortlet layoutTypePortlet =
256                                    themeDisplay.getLayoutTypePortlet();
257    
258                            boolean hasPortletId = false;
259    
260                            String portletId = (String)actionRequest.getAttribute(
261                                    WebKeys.PORTLET_ID);
262    
263                            try {
264                                    hasPortletId = layoutTypePortlet.hasPortletId(portletId);
265                            }
266                            catch (Exception e) {
267                            }
268    
269                            Portlet portlet = PortletLocalServiceUtil.getPortletById(portletId);
270    
271                            if (hasPortletId || portlet.isAddDefaultResource()) {
272                                    addSuccessMessage(actionRequest, actionResponse);
273                            }
274                    }
275    
276                    if (Validator.isNull(redirect)) {
277                            redirect = (String)actionRequest.getAttribute(WebKeys.REDIRECT);
278                    }
279    
280                    if (Validator.isNull(redirect)) {
281                            redirect = ParamUtil.getString(actionRequest, "redirect");
282                    }
283    
284                    if (Validator.isNotNull(redirect)) {
285    
286                            // LPS-1928
287    
288                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
289                                    actionRequest);
290    
291                            if ((BrowserSnifferUtil.isIe(request)) &&
292                                    (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
293                                    (redirect.contains(StringPool.POUND))) {
294    
295                                    String redirectToken = "&#";
296    
297                                    if (!redirect.contains(StringPool.QUESTION)) {
298                                            redirectToken = StringPool.QUESTION + redirectToken;
299                                    }
300    
301                                    redirect = StringUtil.replace(
302                                            redirect, StringPool.POUND, redirectToken);
303                            }
304    
305                            redirect = PortalUtil.escapeRedirect(redirect);
306    
307                            if (Validator.isNotNull(redirect)) {
308                                    actionResponse.sendRedirect(redirect);
309                            }
310                    }
311            }
312    
313            protected boolean redirectToLogin(
314                            ActionRequest actionRequest, ActionResponse actionResponse)
315                    throws IOException {
316    
317                    if (actionRequest.getRemoteUser() == null) {
318                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
319                                    actionRequest);
320    
321                            SessionErrors.add(request, PrincipalException.class.getName());
322    
323                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
324                                    WebKeys.THEME_DISPLAY);
325    
326                            actionResponse.sendRedirect(themeDisplay.getURLSignIn());
327    
328                            return true;
329                    }
330                    else {
331                            return false;
332                    }
333            }
334    
335            protected void writeJSON(
336                            PortletRequest portletRequest, ActionResponse actionResponse,
337                            Object json)
338                    throws IOException {
339    
340                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
341                            actionResponse);
342    
343                    response.setContentType(ContentTypes.TEXT_JAVASCRIPT);
344    
345                    ServletResponseUtil.write(response, json.toString());
346    
347                    setForward(portletRequest, ActionConstants.COMMON_NULL);
348            }
349    
350            protected void writeJSON(
351                            PortletRequest portletRequest, MimeResponse mimeResponse,
352                            Object json)
353                    throws IOException {
354    
355                    mimeResponse.setContentType(ContentTypes.TEXT_JAVASCRIPT);
356    
357                    PortletResponseUtil.write(mimeResponse, json.toString());
358            }
359    
360            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
361    
362            private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
363    
364    }