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.apache.bridges.struts;
24  
25  import com.liferay.portal.kernel.util.JavaConstants;
26  import com.liferay.portal.kernel.util.StringPool;
27  import com.liferay.portal.model.Portlet;
28  import com.liferay.portal.model.PortletApp;
29  import com.liferay.portlet.PortletRequestImpl;
30  import com.liferay.portlet.PortletResponseImpl;
31  import com.liferay.portlet.PortletServletRequest;
32  import com.liferay.portlet.PortletServletResponse;
33  
34  import java.io.IOException;
35  
36  import java.util.Set;
37  
38  import javax.portlet.PortletRequest;
39  import javax.portlet.PortletResponse;
40  
41  import javax.servlet.RequestDispatcher;
42  import javax.servlet.ServletException;
43  import javax.servlet.ServletRequest;
44  import javax.servlet.ServletResponse;
45  import javax.servlet.http.HttpServletRequest;
46  import javax.servlet.http.HttpServletResponse;
47  
48  /**
49   * <a href="LiferayRequestDispatcher.java.html"><b><i>View Source</i></b></a>
50   *
51   * @author Michael Young
52   * @author Brian Myunghun Kim
53   * @author Brian Wing Shun Chan
54   * @author Deepak Gothe
55   *
56   */
57  public class LiferayRequestDispatcher implements RequestDispatcher {
58  
59      public LiferayRequestDispatcher(
60          RequestDispatcher requestDispatcher, String path) {
61  
62          _requestDispatcher = requestDispatcher;
63          _path = path;
64      }
65  
66      public void forward(
67              ServletRequest servletRequest, ServletResponse servletResponse)
68          throws IOException, ServletException {
69  
70          PortletRequest portletRequest =
71              (PortletRequest)servletRequest.getAttribute(
72                  JavaConstants.JAVAX_PORTLET_REQUEST);
73  
74          if (portletRequest != null) {
75              invoke(servletRequest, servletResponse, false);
76          }
77          else {
78              _requestDispatcher.forward(servletRequest, servletResponse);
79          }
80      }
81  
82      public void include(
83              ServletRequest servletRequest, ServletResponse servletResponse)
84          throws IOException, ServletException {
85  
86          PortletRequest portletRequest =
87              (PortletRequest)servletRequest.getAttribute(
88                  JavaConstants.JAVAX_PORTLET_REQUEST);
89  
90          if (portletRequest != null) {
91              invoke(servletRequest, servletResponse, true);
92          }
93          else {
94              _requestDispatcher.include(servletRequest, servletResponse);
95          }
96      }
97  
98      public void invoke(
99              ServletRequest servletRequest, ServletResponse servletResponse,
100             boolean include)
101         throws IOException, ServletException {
102 
103         String pathInfo = null;
104         String queryString = null;
105         String requestURI = null;
106         String servletPath = null;
107 
108         PortletRequest portletRequest =
109             (PortletRequest)servletRequest.getAttribute(
110                 JavaConstants.JAVAX_PORTLET_REQUEST);
111 
112         PortletResponse portletResponse =
113             (PortletResponse)servletRequest.getAttribute(
114                 JavaConstants.JAVAX_PORTLET_RESPONSE);
115 
116         if (_path != null) {
117             String pathNoQueryString = _path;
118 
119             int pos = _path.indexOf(StringPool.QUESTION);
120 
121             if (pos != -1) {
122                 pathNoQueryString = _path.substring(0, pos);
123                 queryString = _path.substring(pos + 1, _path.length());
124             }
125 
126             Set<String> servletURLPatterns = getServletURLPatterns(
127                 servletRequest, portletRequest, portletResponse);
128 
129             for (String urlPattern : servletURLPatterns) {
130                 if (urlPattern.endsWith("/*")) {
131                     pos = urlPattern.indexOf("/*");
132 
133                     urlPattern = urlPattern.substring(0, pos);
134 
135                     if (pathNoQueryString.startsWith(urlPattern)) {
136                         pathInfo = pathNoQueryString.substring(
137                             urlPattern.length());
138                         servletPath = urlPattern;
139 
140                         break;
141                     }
142                 }
143             }
144 
145             if ((pathInfo == null) && (servletPath == null)) {
146                 pathInfo = StringPool.BLANK;
147                 servletPath = pathNoQueryString;
148             }
149 
150             requestURI = portletRequest.getContextPath() + pathNoQueryString;
151         }
152 
153         HttpServletRequest portletServletRequest = getPortletServletRequest(
154             servletRequest, portletRequest, pathInfo, queryString, requestURI,
155             servletPath, include);
156 
157         HttpServletResponse portletServletResponse =
158             getPortletServletResponse(
159                 servletResponse, portletRequest, portletResponse, include);
160 
161         if (include) {
162             _requestDispatcher.include(
163                 portletServletRequest, portletServletResponse);
164         }
165         else {
166             _requestDispatcher.forward(
167                 portletServletRequest, portletServletResponse);
168         }
169     }
170 
171     protected HttpServletRequest getPortletServletRequest(
172         ServletRequest servletRequest, PortletRequest portletRequest,
173         String pathInfo, String queryString, String requestURI,
174         String servletPath, boolean include) {
175 
176         HttpServletRequest request = (HttpServletRequest)servletRequest;
177         boolean named = false;
178 
179         PortletRequestImpl portletRequestImpl =
180             (PortletRequestImpl)portletRequest;
181 
182         return new PortletServletRequest(
183             request, portletRequestImpl, pathInfo, queryString, requestURI,
184             servletPath, named, include);
185     }
186 
187     protected HttpServletResponse getPortletServletResponse(
188         ServletResponse servletResponse, PortletRequest portletRequest,
189         PortletResponse portletResponse, boolean include) {
190 
191         HttpServletResponse response = (HttpServletResponse)servletResponse;
192 
193         PortletResponseImpl portletResponseImpl =
194             (PortletResponseImpl)portletResponse;
195 
196         return new PortletServletResponse(
197             response, portletResponseImpl, include);
198     }
199 
200     protected Set<String> getServletURLPatterns(
201         ServletRequest servletRequest, PortletRequest portletRequest,
202         PortletResponse portletResponse) {
203 
204         PortletRequestImpl portletRequestImpl =
205             (PortletRequestImpl)portletRequest;
206 
207         Portlet portlet = portletRequestImpl.getPortlet();
208 
209         PortletApp portletApp = portlet.getPortletApp();
210 
211         return portletApp.getServletURLPatterns();
212     }
213 
214     private RequestDispatcher _requestDispatcher;
215     private String _path;
216 
217 }