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
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 }