1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.struts;
24  
25  import com.liferay.portal.kernel.log.Log;
26  import com.liferay.portal.kernel.log.LogFactoryUtil;
27  import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
28  import com.liferay.portal.kernel.servlet.SessionErrors;
29  import com.liferay.portal.kernel.servlet.SessionMessages;
30  import com.liferay.portal.kernel.util.JavaConstants;
31  import com.liferay.portal.kernel.util.ParamUtil;
32  import com.liferay.portal.kernel.util.StringPool;
33  import com.liferay.portal.kernel.util.StringUtil;
34  import com.liferay.portal.kernel.util.Validator;
35  import com.liferay.portal.security.auth.PrincipalException;
36  import com.liferay.portal.theme.ThemeDisplay;
37  import com.liferay.portal.util.PortalUtil;
38  import com.liferay.portal.util.WebKeys;
39  import com.liferay.portlet.PortletConfigImpl;
40  
41  import java.io.IOException;
42  
43  import javax.portlet.ActionRequest;
44  import javax.portlet.ActionResponse;
45  import javax.portlet.PortletConfig;
46  import javax.portlet.PortletContext;
47  import javax.portlet.PortletRequest;
48  import javax.portlet.PortletRequestDispatcher;
49  import javax.portlet.PortletResponse;
50  import javax.portlet.RenderRequest;
51  import javax.portlet.RenderResponse;
52  import javax.portlet.ResourceRequest;
53  import javax.portlet.ResourceResponse;
54  
55  import javax.servlet.ServletContext;
56  import javax.servlet.http.HttpServletRequest;
57  import javax.servlet.http.HttpServletResponse;
58  
59  import org.apache.struts.Globals;
60  import org.apache.struts.action.Action;
61  import org.apache.struts.action.ActionForm;
62  import org.apache.struts.action.ActionForward;
63  import org.apache.struts.action.ActionMapping;
64  import org.apache.struts.config.ModuleConfig;
65  import org.apache.struts.util.MessageResources;
66  
67  /**
68   * <a href="PortletAction.java.html"><b><i>View Source</i></b></a>
69   *
70   * @author Brian Wing Shun Chan
71   */
72  public class PortletAction extends Action {
73  
74      public static String getForwardKey(HttpServletRequest request) {
75          PortletConfigImpl portletConfig =
76              (PortletConfigImpl)request.getAttribute(
77                  JavaConstants.JAVAX_PORTLET_CONFIG);
78  
79          return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
80              WebKeys.PORTLET_STRUTS_FORWARD;
81      }
82  
83      public static String getForwardKey(PortletRequest portletRequest) {
84          PortletConfigImpl portletConfig =
85              (PortletConfigImpl)portletRequest.getAttribute(
86                  JavaConstants.JAVAX_PORTLET_CONFIG);
87  
88          return PortalUtil.getPortletNamespace(portletConfig.getPortletId()) +
89              WebKeys.PORTLET_STRUTS_FORWARD;
90      }
91  
92      public ActionForward execute(
93              ActionMapping mapping, ActionForm form, HttpServletRequest request,
94              HttpServletResponse response)
95          throws Exception {
96  
97          PortletConfig portletConfig = (PortletConfig)request.getAttribute(
98              JavaConstants.JAVAX_PORTLET_CONFIG);
99  
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             serveResource(
119                 mapping, form, portletConfig, (ResourceRequest)portletRequest,
120                 (ResourceResponse)portletResponse);
121 
122             return mapping.findForward(ActionConstants.COMMON_NULL);
123         }
124     }
125 
126     public ActionForward strutsExecute(
127             ActionMapping mapping, ActionForm form, HttpServletRequest request,
128             HttpServletResponse response)
129         throws Exception {
130 
131         return super.execute(mapping, form, request, response);
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 ActionForward render(
141             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
142             RenderRequest renderRequest, RenderResponse renderResponse)
143         throws Exception {
144 
145         if (_log.isDebugEnabled()) {
146             _log.debug("Forward to " + getForward(renderRequest));
147         }
148 
149         return mapping.findForward(getForward(renderRequest));
150     }
151 
152     public void serveResource(
153             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
154             ResourceRequest resourceRequest, ResourceResponse resourceResponse)
155         throws Exception {
156 
157         String resourceId = resourceRequest.getResourceID();
158 
159         if (Validator.isNotNull(resourceId)) {
160             PortletContext portletContext = portletConfig.getPortletContext();
161 
162             PortletRequestDispatcher portletRequestDispatcher =
163                 portletContext.getRequestDispatcher(resourceId);
164 
165             if (portletRequestDispatcher != null) {
166                 portletRequestDispatcher.forward(
167                     resourceRequest, resourceResponse);
168             }
169         }
170     }
171 
172     protected String getForward(PortletRequest portletRequest) {
173         return getForward(portletRequest, null);
174     }
175 
176     protected String getForward(
177         PortletRequest portletRequest, String defaultValue) {
178 
179         String forward = (String)portletRequest.getAttribute(
180             getForwardKey(portletRequest));
181 
182         if (forward == null) {
183             return defaultValue;
184         }
185         else {
186             return forward;
187         }
188     }
189 
190     protected void setForward(PortletRequest portletRequest, String forward) {
191         portletRequest.setAttribute(getForwardKey(portletRequest), forward);
192     }
193 
194     protected ModuleConfig getModuleConfig(PortletRequest portletRequest) {
195         return (ModuleConfig)portletRequest.getAttribute(Globals.MODULE_KEY);
196     }
197 
198     protected MessageResources getResources() {
199         ServletContext servletContext = getServlet().getServletContext();
200 
201         return (MessageResources)servletContext.getAttribute(
202             Globals.MESSAGES_KEY);
203     }
204 
205     protected MessageResources getResources(HttpServletRequest request) {
206         return getResources();
207     }
208 
209     protected MessageResources getResources(PortletRequest portletRequest) {
210         return getResources();
211     }
212 
213     protected boolean isCheckMethodOnProcessAction() {
214         return _CHECK_METHOD_ON_PROCESS_ACTION;
215     }
216 
217     protected void sendRedirect(
218             ActionRequest actionRequest, ActionResponse actionResponse)
219         throws IOException {
220 
221         sendRedirect(actionRequest, actionResponse, null);
222     }
223 
224     protected void sendRedirect(
225             ActionRequest actionRequest, ActionResponse actionResponse,
226             String redirect)
227         throws IOException {
228 
229         if (SessionErrors.isEmpty(actionRequest)) {
230             String successMessage = ParamUtil.getString(
231                 actionRequest, "successMessage");
232 
233             SessionMessages.add(
234                 actionRequest, "request_processed", successMessage);
235         }
236 
237         if (Validator.isNull(redirect)) {
238             redirect = ParamUtil.getString(actionRequest, "redirect");
239         }
240 
241         if (Validator.isNotNull(redirect)) {
242 
243             // LPS-1928
244 
245             HttpServletRequest request = PortalUtil.getHttpServletRequest(
246                 actionRequest);
247 
248             if ((BrowserSnifferUtil.isIe(request)) &&
249                 (BrowserSnifferUtil.getMajorVersion(request) == 6.0) &&
250                 (redirect.contains(StringPool.POUND))) {
251 
252                 String redirectToken = "&#";
253 
254                 if (!redirect.contains(StringPool.QUESTION)) {
255                     redirectToken = StringPool.QUESTION + redirectToken;
256                 }
257 
258                 redirect = StringUtil.replace(
259                     redirect, StringPool.POUND, redirectToken);
260             }
261 
262             actionResponse.sendRedirect(redirect);
263         }
264     }
265 
266     protected boolean redirectToLogin(
267             ActionRequest actionRequest, ActionResponse actionResponse)
268         throws IOException {
269 
270         if (actionRequest.getRemoteUser() == null) {
271             HttpServletRequest request = PortalUtil.getHttpServletRequest(
272                 actionRequest);
273 
274             SessionErrors.add(request, PrincipalException.class.getName());
275 
276             ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
277                 WebKeys.THEME_DISPLAY);
278 
279             actionResponse.sendRedirect(themeDisplay.getURLSignIn());
280 
281             return true;
282         }
283         else {
284             return false;
285         }
286     }
287 
288     private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = true;
289 
290     private static Log _log = LogFactoryUtil.getLog(PortletAction.class);
291 
292 }