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