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