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