001    /**
002     * Copyright (c) 2000-2010 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.servlet.BrowserSnifferUtil;
020    import com.liferay.portal.kernel.servlet.SessionErrors;
021    import com.liferay.portal.kernel.servlet.SessionMessages;
022    import com.liferay.portal.kernel.util.JavaConstants;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.util.StringUtil;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.security.auth.PrincipalException;
028    import com.liferay.portal.theme.ThemeDisplay;
029    import com.liferay.portal.util.PortalUtil;
030    import com.liferay.portal.util.WebKeys;
031    import com.liferay.portlet.PortletConfigImpl;
032    
033    import java.io.IOException;
034    
035    import javax.portlet.ActionRequest;
036    import javax.portlet.ActionResponse;
037    import javax.portlet.PortletConfig;
038    import javax.portlet.PortletContext;
039    import javax.portlet.PortletRequest;
040    import javax.portlet.PortletRequestDispatcher;
041    import javax.portlet.PortletResponse;
042    import javax.portlet.RenderRequest;
043    import javax.portlet.RenderResponse;
044    import javax.portlet.ResourceRequest;
045    import javax.portlet.ResourceResponse;
046    
047    import javax.servlet.ServletContext;
048    import javax.servlet.http.HttpServletRequest;
049    import javax.servlet.http.HttpServletResponse;
050    
051    import org.apache.struts.Globals;
052    import org.apache.struts.action.Action;
053    import org.apache.struts.action.ActionForm;
054    import org.apache.struts.action.ActionForward;
055    import org.apache.struts.action.ActionMapping;
056    import org.apache.struts.config.ModuleConfig;
057    import org.apache.struts.util.MessageResources;
058    
059    /**
060     * @author Brian Wing Shun Chan
061     */
062    public class PortletAction extends Action {
063    
064            public static String getForwardKey(HttpServletRequest request) {
065                    PortletConfigImpl portletConfig =
066                            (PortletConfigImpl)request.getAttribute(
067                                    JavaConstants.JAVAX_PORTLET_CONFIG);
068    
069                    return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
070                            WebKeys.PORTLET_STRUTS_FORWARD;
071            }
072    
073            public static String getForwardKey(PortletRequest portletRequest) {
074                    PortletConfigImpl portletConfig =
075                            (PortletConfigImpl)portletRequest.getAttribute(
076                                    JavaConstants.JAVAX_PORTLET_CONFIG);
077    
078                    return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
079                            WebKeys.PORTLET_STRUTS_FORWARD;
080            }
081    
082            public ActionForward execute(
083                            ActionMapping mapping, ActionForm form, HttpServletRequest request,
084                            HttpServletResponse response)
085                    throws Exception {
086    
087                    PortletConfig portletConfig = (PortletConfig)request.getAttribute(
088                            JavaConstants.JAVAX_PORTLET_CONFIG);
089    
090                    PortletRequest portletRequest = (PortletRequest)request.getAttribute(
091                            JavaConstants.JAVAX_PORTLET_REQUEST);
092    
093                    PortletResponse portletResponse = (PortletResponse)request.getAttribute(
094                            JavaConstants.JAVAX_PORTLET_RESPONSE);
095    
096                    Boolean strutsExecute = (Boolean)request.getAttribute(
097                            WebKeys.PORTLET_STRUTS_EXECUTE);
098    
099                    if ((strutsExecute != null) && strutsExecute.booleanValue()) {
100                            return strutsExecute(mapping, form, request, response);
101                    }
102                    else if (portletRequest instanceof RenderRequest) {
103                            return render(
104                                    mapping, form, portletConfig, (RenderRequest)portletRequest,
105                                    (RenderResponse)portletResponse);
106                    }
107                    else {
108                            serveResource(
109                                    mapping, form, portletConfig, (ResourceRequest)portletRequest,
110                                    (ResourceResponse)portletResponse);
111    
112                            return mapping.findForward(ActionConstants.COMMON_NULL);
113                    }
114            }
115    
116            public ActionForward strutsExecute(
117                            ActionMapping mapping, ActionForm form, HttpServletRequest request,
118                            HttpServletResponse response)
119                    throws Exception {
120    
121                    return super.execute(mapping, form, request, response);
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.isNotNull(resourceId)) {
150                            if (!PortalUtil.isValidResourceId(resourceId)) {
151                                    return;
152                            }
153    
154                            PortletContext portletContext = portletConfig.getPortletContext();
155    
156                            PortletRequestDispatcher portletRequestDispatcher =
157                                    portletContext.getRequestDispatcher(resourceId);
158    
159                            if (portletRequestDispatcher != null) {
160                                    portletRequestDispatcher.forward(
161                                            resourceRequest, resourceResponse);
162                            }
163                    }
164            }
165    
166            protected void addSuccessMessage(
167                    ActionRequest actionRequest, ActionResponse actionResponse) {
168    
169                    String successMessage = ParamUtil.getString(
170                            actionRequest, "successMessage");
171    
172                    SessionMessages.add(actionRequest, "request_processed", successMessage);
173            }
174    
175            protected String getForward(PortletRequest portletRequest) {
176                    return getForward(portletRequest, null);
177            }
178    
179            protected String getForward(
180                    PortletRequest portletRequest, String defaultValue) {
181    
182                    String forward = (String)portletRequest.getAttribute(
183                            getForwardKey(portletRequest));
184    
185                    if (forward == null) {
186                            return defaultValue;
187                    }
188                    else {
189                            return forward;
190                    }
191            }
192    
193            protected void setForward(PortletRequest portletRequest, String forward) {
194                    portletRequest.setAttribute(getForwardKey(portletRequest), forward);
195            }
196    
197            protected ModuleConfig getModuleConfig(PortletRequest portletRequest) {
198                    return (ModuleConfig)portletRequest.getAttribute(Globals.MODULE_KEY);
199            }
200    
201            protected MessageResources getResources() {
202                    ServletContext servletContext = getServlet().getServletContext();
203    
204                    return (MessageResources)servletContext.getAttribute(
205                            Globals.MESSAGES_KEY);
206            }
207    
208            protected MessageResources getResources(HttpServletRequest request) {
209                    return getResources();
210            }
211    
212            protected MessageResources getResources(PortletRequest portletRequest) {
213                    return getResources();
214            }
215    
216            protected boolean isCheckMethodOnProcessAction() {
217                    return _CHECK_METHOD_ON_PROCESS_ACTION;
218            }
219    
220            protected void sendRedirect(
221                            ActionRequest actionRequest, ActionResponse actionResponse)
222                    throws IOException {
223    
224                    sendRedirect(actionRequest, actionResponse, null);
225            }
226    
227            protected void sendRedirect(
228                            ActionRequest actionRequest, ActionResponse actionResponse,
229                            String redirect)
230                    throws IOException {
231    
232                    if (SessionErrors.isEmpty(actionRequest)) {
233                            addSuccessMessage(actionRequest, actionResponse);
234                    }
235    
236                    if (Validator.isNull(redirect)) {
237                            redirect = ParamUtil.getString(actionRequest, "redirect");
238                    }
239    
240                    if (Validator.isNotNull(redirect)) {
241    
242                            // LPS-1928
243    
244                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
245                                    actionRequest);
246    
247                            if ((BrowserSnifferUtil.isIe(request)) &&
248                                    (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
249                                    (redirect.contains(StringPool.POUND))) {
250    
251                                    String redirectToken = "&#";
252    
253                                    if (!redirect.contains(StringPool.QUESTION)) {
254                                            redirectToken = StringPool.QUESTION + redirectToken;
255                                    }
256    
257                                    redirect = StringUtil.replace(
258                                            redirect, StringPool.POUND, redirectToken);
259                            }
260    
261                            actionResponse.sendRedirect(redirect);
262                    }
263            }
264    
265            protected boolean redirectToLogin(
266                            ActionRequest actionRequest, ActionResponse actionResponse)
267                    throws IOException {
268    
269                    if (actionRequest.getRemoteUser() == null) {
270                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
271                                    actionRequest);
272    
273                            SessionErrors.add(request, PrincipalException.class.getName());
274    
275                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
276                                    WebKeys.THEME_DISPLAY);
277    
278                            actionResponse.sendRedirect(themeDisplay.getURLSignIn());
279    
280                            return true;
281                    }
282                    else {
283                            return false;
284                    }
285            }
286    
287            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
288    
289            private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
290    
291    }