001
014
015 package com.liferay.portlet;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.portlet.LiferayPortletContext;
020 import com.liferay.portal.kernel.portlet.LiferayPortletRequestDispatcher;
021 import com.liferay.portal.kernel.portlet.LiferayPortletURL;
022 import com.liferay.portal.kernel.servlet.DynamicServletRequest;
023 import com.liferay.portal.kernel.servlet.URLEncoder;
024 import com.liferay.portal.kernel.util.ArrayUtil;
025 import com.liferay.portal.kernel.util.CharPool;
026 import com.liferay.portal.kernel.util.JavaConstants;
027 import com.liferay.portal.kernel.util.StringPool;
028 import com.liferay.portal.kernel.util.StringUtil;
029 import com.liferay.portal.kernel.util.WebKeys;
030 import com.liferay.portal.model.Portlet;
031 import com.liferay.portal.model.PortletApp;
032 import com.liferay.portal.servlet.NamespaceServletRequest;
033 import com.liferay.portal.struts.StrutsURLEncoder;
034 import com.liferay.portal.theme.ThemeDisplay;
035 import com.liferay.portal.util.PortalUtil;
036
037 import java.io.IOException;
038
039 import java.util.HashMap;
040 import java.util.Map;
041 import java.util.Set;
042
043 import javax.portlet.PortletContext;
044 import javax.portlet.PortletException;
045 import javax.portlet.PortletRequest;
046 import javax.portlet.PortletResponse;
047 import javax.portlet.RenderRequest;
048 import javax.portlet.RenderResponse;
049
050 import javax.servlet.RequestDispatcher;
051 import javax.servlet.ServletException;
052 import javax.servlet.http.HttpServletRequest;
053 import javax.servlet.http.HttpServletResponse;
054
055 import org.apache.struts.Globals;
056
057
062 public class PortletRequestDispatcherImpl
063 implements LiferayPortletRequestDispatcher {
064
065 public PortletRequestDispatcherImpl(
066 RequestDispatcher requestDispatcher, boolean named,
067 PortletContext portletContext) {
068
069 this(requestDispatcher, named, portletContext, null);
070 }
071
072 public PortletRequestDispatcherImpl(
073 RequestDispatcher requestDispatcher, boolean named,
074 PortletContext portletContext, String path) {
075
076 _requestDispatcher = requestDispatcher;
077 _named = named;
078 _liferayPortletContext = (LiferayPortletContext)portletContext;
079 _path = path;
080
081 _portlet = _liferayPortletContext.getPortlet();
082 }
083
084 @Override
085 public void forward(
086 PortletRequest portletRequest, PortletResponse portletResponse)
087 throws IllegalStateException, IOException, PortletException {
088
089 HttpServletResponse httpServletResponse =
090 PortalUtil.getHttpServletResponse(portletResponse);
091
092 if (httpServletResponse.isCommitted()) {
093 throw new IllegalStateException("Response is already committed");
094 }
095
096 dispatch(portletRequest, portletResponse, false, false);
097 }
098
099 @Override
100 public void include(
101 PortletRequest portletRequest, PortletResponse portletResponse)
102 throws IOException, PortletException {
103
104 dispatch(portletRequest, portletResponse, false, true);
105 }
106
107 @Override
108 public void include(
109 PortletRequest portletRequest, PortletResponse portletResponse,
110 boolean strutsURLEncoder)
111 throws IOException, PortletException {
112
113 dispatch(portletRequest, portletResponse, strutsURLEncoder, true);
114 }
115
116 @Override
117 public void include(
118 RenderRequest renderRequest, RenderResponse renderResponse)
119 throws IOException, PortletException {
120
121 dispatch(renderRequest, renderResponse, false, true);
122 }
123
124 protected void checkCalledFlushBuffer(
125 boolean include, PortletResponse portletResponse) {
126
127 if (!include && (portletResponse instanceof MimeResponseImpl)) {
128 MimeResponseImpl mimeResponseImpl =
129 (MimeResponseImpl)portletResponse;
130
131 if (mimeResponseImpl.isCalledFlushBuffer()) {
132 throw new IllegalStateException();
133 }
134 }
135 }
136
137 protected HttpServletRequest createDynamicServletRequest(
138 HttpServletRequest httpServletRequest,
139 PortletRequestImpl portletRequestImpl,
140 Map<String, String[]> parameterMap) {
141
142 DynamicServletRequest dynamicServletRequest = null;
143
144 if (portletRequestImpl.isPrivateRequestAttributes()) {
145 String portletNamespace = PortalUtil.getPortletNamespace(
146 portletRequestImpl.getPortletName());
147
148 dynamicServletRequest = new NamespaceServletRequest(
149 httpServletRequest, portletNamespace, portletNamespace);
150 }
151 else {
152 dynamicServletRequest = new DynamicServletRequest(
153 httpServletRequest);
154 }
155
156 for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
157 String name = entry.getKey();
158
159 String[] values = entry.getValue();
160
161 String[] oldValues = dynamicServletRequest.getParameterValues(name);
162
163 if (oldValues != null) {
164 values = ArrayUtil.append(values, oldValues);
165 }
166
167 dynamicServletRequest.setParameterValues(name, values);
168 }
169
170 return dynamicServletRequest;
171 }
172
173 protected void dispatch(
174 PortletRequest portletRequest, PortletResponse portletResponse,
175 boolean strutsURLEncoder, boolean include)
176 throws IOException, PortletException {
177
178 checkCalledFlushBuffer(include, portletResponse);
179
180 PortletRequestImpl portletRequestImpl =
181 PortletRequestImpl.getPortletRequestImpl(portletRequest);
182 PortletResponseImpl portletResponseImpl =
183 PortletResponseImpl.getPortletResponseImpl(portletResponse);
184
185 HttpServletRequest httpServletRequest =
186 PortalUtil.getHttpServletRequest(portletRequest);
187
188 httpServletRequest.setAttribute(
189 JavaConstants.JAVAX_PORTLET_REQUEST, portletRequest);
190 httpServletRequest.setAttribute(
191 JavaConstants.JAVAX_PORTLET_RESPONSE, portletResponse);
192
193 String pathInfo = null;
194 String queryString = null;
195 String requestURI = null;
196 String servletPath = null;
197
198 if (_path != null) {
199 String pathNoQueryString = _path;
200
201 int pos = _path.indexOf(CharPool.QUESTION);
202
203 if (pos != -1) {
204 pathNoQueryString = _path.substring(0, pos);
205 queryString = _path.substring(pos + 1);
206
207 httpServletRequest = createDynamicServletRequest(
208 httpServletRequest, portletRequestImpl,
209 toParameterMap(queryString));
210 }
211
212 Portlet portlet = portletRequestImpl.getPortlet();
213
214 PortletApp portletApp = portlet.getPortletApp();
215
216 Set<String> servletURLPatterns = portletApp.getServletURLPatterns();
217
218 for (String urlPattern : servletURLPatterns) {
219 if (urlPattern.endsWith("