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