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