1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.apache.bridges.struts;
16  
17  import com.liferay.portal.kernel.util.JavaConstants;
18  import com.liferay.portal.kernel.util.StringPool;
19  import com.liferay.portal.model.Portlet;
20  import com.liferay.portal.model.PortletApp;
21  import com.liferay.portlet.PortletRequestImpl;
22  import com.liferay.portlet.PortletResponseImpl;
23  import com.liferay.portlet.PortletServletRequest;
24  import com.liferay.portlet.PortletServletResponse;
25  
26  import java.io.IOException;
27  
28  import java.util.Set;
29  
30  import javax.portlet.PortletRequest;
31  import javax.portlet.PortletResponse;
32  
33  import javax.servlet.RequestDispatcher;
34  import javax.servlet.ServletException;
35  import javax.servlet.ServletRequest;
36  import javax.servlet.ServletResponse;
37  import javax.servlet.http.HttpServletRequest;
38  import javax.servlet.http.HttpServletResponse;
39  
40  /**
41   * <a href="LiferayRequestDispatcher.java.html"><b><i>View Source</i></b></a>
42   *
43   * @author Michael Young
44   * @author Brian Myunghun Kim
45   * @author Brian Wing Shun Chan
46   * @author Deepak Gothe
47   */
48  public class LiferayRequestDispatcher implements RequestDispatcher {
49  
50      public LiferayRequestDispatcher(
51          RequestDispatcher requestDispatcher, String path) {
52  
53          _requestDispatcher = requestDispatcher;
54          _path = path;
55      }
56  
57      public void forward(
58              ServletRequest servletRequest, ServletResponse servletResponse)
59          throws IOException, ServletException {
60  
61          PortletRequest portletRequest =
62              (PortletRequest)servletRequest.getAttribute(
63                  JavaConstants.JAVAX_PORTLET_REQUEST);
64  
65          if (portletRequest != null) {
66              invoke(servletRequest, servletResponse, false);
67          }
68          else {
69              _requestDispatcher.forward(servletRequest, servletResponse);
70          }
71      }
72  
73      public void include(
74              ServletRequest servletRequest, ServletResponse servletResponse)
75          throws IOException, ServletException {
76  
77          PortletRequest portletRequest =
78              (PortletRequest)servletRequest.getAttribute(
79                  JavaConstants.JAVAX_PORTLET_REQUEST);
80  
81          if (portletRequest != null) {
82              invoke(servletRequest, servletResponse, true);
83          }
84          else {
85              _requestDispatcher.include(servletRequest, servletResponse);
86          }
87      }
88  
89      public void invoke(
90              ServletRequest servletRequest, ServletResponse servletResponse,
91              boolean include)
92          throws IOException, ServletException {
93  
94          String pathInfo = null;
95          String queryString = null;
96          String requestURI = null;
97          String servletPath = null;
98  
99          PortletRequest portletRequest =
100             (PortletRequest)servletRequest.getAttribute(
101                 JavaConstants.JAVAX_PORTLET_REQUEST);
102 
103         PortletResponse portletResponse =
104             (PortletResponse)servletRequest.getAttribute(
105                 JavaConstants.JAVAX_PORTLET_RESPONSE);
106 
107         if (_path != null) {
108             String pathNoQueryString = _path;
109 
110             int pos = _path.indexOf(StringPool.QUESTION);
111 
112             if (pos != -1) {
113                 pathNoQueryString = _path.substring(0, pos);
114                 queryString = _path.substring(pos + 1, _path.length());
115             }
116 
117             Set<String> servletURLPatterns = getServletURLPatterns(
118                 servletRequest, portletRequest, portletResponse);
119 
120             for (String urlPattern : servletURLPatterns) {
121                 if (urlPattern.endsWith("/*")) {
122                     pos = urlPattern.indexOf("/*");
123 
124                     urlPattern = urlPattern.substring(0, pos);
125 
126                     if (pathNoQueryString.startsWith(urlPattern)) {
127                         pathInfo = pathNoQueryString.substring(
128                             urlPattern.length());
129                         servletPath = urlPattern;
130 
131                         break;
132                     }
133                 }
134             }
135 
136             if ((pathInfo == null) && (servletPath == null)) {
137                 pathInfo = StringPool.BLANK;
138                 servletPath = pathNoQueryString;
139             }
140 
141             requestURI = portletRequest.getContextPath() + pathNoQueryString;
142         }
143 
144         HttpServletRequest portletServletRequest = getPortletServletRequest(
145             servletRequest, portletRequest, pathInfo, queryString, requestURI,
146             servletPath, include);
147 
148         HttpServletResponse portletServletResponse =
149             getPortletServletResponse(
150                 servletResponse, portletRequest, portletResponse, include);
151 
152         if (include) {
153             _requestDispatcher.include(
154                 portletServletRequest, portletServletResponse);
155         }
156         else {
157             _requestDispatcher.forward(
158                 portletServletRequest, portletServletResponse);
159         }
160     }
161 
162     protected HttpServletRequest getPortletServletRequest(
163         ServletRequest servletRequest, PortletRequest portletRequest,
164         String pathInfo, String queryString, String requestURI,
165         String servletPath, boolean include) {
166 
167         HttpServletRequest request = (HttpServletRequest)servletRequest;
168         boolean named = false;
169 
170         PortletRequestImpl portletRequestImpl =
171             (PortletRequestImpl)portletRequest;
172 
173         return new PortletServletRequest(
174             request, portletRequestImpl, pathInfo, queryString, requestURI,
175             servletPath, named, include);
176     }
177 
178     protected HttpServletResponse getPortletServletResponse(
179         ServletResponse servletResponse, PortletRequest portletRequest,
180         PortletResponse portletResponse, boolean include) {
181 
182         HttpServletResponse response = (HttpServletResponse)servletResponse;
183 
184         PortletResponseImpl portletResponseImpl =
185             (PortletResponseImpl)portletResponse;
186 
187         return new PortletServletResponse(
188             response, portletResponseImpl, include);
189     }
190 
191     protected Set<String> getServletURLPatterns(
192         ServletRequest servletRequest, PortletRequest portletRequest,
193         PortletResponse portletResponse) {
194 
195         PortletRequestImpl portletRequestImpl =
196             (PortletRequestImpl)portletRequest;
197 
198         Portlet portlet = portletRequestImpl.getPortlet();
199 
200         PortletApp portletApp = portlet.getPortletApp();
201 
202         return portletApp.getServletURLPatterns();
203     }
204 
205     private RequestDispatcher _requestDispatcher;
206     private String _path;
207 
208 }