001 /** 002 * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved. 003 * 004 * This library is free software; you can redistribute it and/or modify it under 005 * the terms of the GNU Lesser General Public License as published by the Free 006 * Software Foundation; either version 2.1 of the License, or (at your option) 007 * any later version. 008 * 009 * This library is distributed in the hope that it will be useful, but WITHOUT 010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 011 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 012 * details. 013 */ 014 015 package com.liferay.portal.apache.bridges.struts; 016 017 import com.liferay.portal.kernel.servlet.PipingServletResponse; 018 import com.liferay.portal.kernel.util.CharPool; 019 import com.liferay.portal.kernel.util.JavaConstants; 020 import com.liferay.portal.kernel.util.StringPool; 021 import com.liferay.portal.model.Portlet; 022 import com.liferay.portal.model.PortletApp; 023 import com.liferay.portlet.PortletRequestImpl; 024 import com.liferay.portlet.PortletResponseImpl; 025 import com.liferay.portlet.PortletServletRequest; 026 import com.liferay.portlet.PortletServletResponse; 027 028 import java.io.IOException; 029 import java.io.PrintWriter; 030 031 import java.util.Set; 032 033 import javax.portlet.PortletRequest; 034 import javax.portlet.PortletResponse; 035 036 import javax.servlet.RequestDispatcher; 037 import javax.servlet.ServletException; 038 import javax.servlet.ServletRequest; 039 import javax.servlet.ServletResponse; 040 import javax.servlet.http.HttpServletRequest; 041 import javax.servlet.http.HttpServletResponse; 042 043 /** 044 * @author Michael Young 045 * @author Brian Myunghun Kim 046 * @author Brian Wing Shun Chan 047 * @author Deepak Gothe 048 */ 049 public class LiferayRequestDispatcher implements RequestDispatcher { 050 051 public LiferayRequestDispatcher( 052 RequestDispatcher requestDispatcher, String path) { 053 054 _requestDispatcher = requestDispatcher; 055 _path = path; 056 } 057 058 public void forward( 059 ServletRequest servletRequest, ServletResponse servletResponse) 060 throws IOException, ServletException { 061 062 PortletRequest portletRequest = 063 (PortletRequest)servletRequest.getAttribute( 064 JavaConstants.JAVAX_PORTLET_REQUEST); 065 066 if (portletRequest != null) { 067 invoke(servletRequest, servletResponse, false); 068 } 069 else { 070 _requestDispatcher.forward(servletRequest, servletResponse); 071 } 072 } 073 074 /** 075 * @deprecated As of 6.2.0, replaced by {@link #forward(ServletRequest, 076 * ServletResponse)} 077 */ 078 public void forward( 079 ServletRequest servletRequest, ServletResponse servletResponse, 080 boolean named) 081 throws IOException, ServletException { 082 083 forward(servletRequest, servletResponse); 084 } 085 086 public void include( 087 ServletRequest servletRequest, ServletResponse servletResponse) 088 throws IOException, ServletException { 089 090 PortletRequest portletRequest = 091 (PortletRequest)servletRequest.getAttribute( 092 JavaConstants.JAVAX_PORTLET_REQUEST); 093 094 if (portletRequest != null) { 095 invoke(servletRequest, servletResponse, true); 096 } 097 else { 098 _requestDispatcher.include(servletRequest, servletResponse); 099 } 100 } 101 102 /** 103 * @deprecated As of 6.2.0, replaced by {@link #include(ServletRequest, 104 * ServletResponse)} 105 */ 106 public void include( 107 ServletRequest servletRequest, ServletResponse servletResponse, 108 boolean named) 109 throws IOException, ServletException { 110 111 include(servletRequest, servletResponse); 112 } 113 114 public void invoke( 115 ServletRequest servletRequest, ServletResponse servletResponse, 116 boolean include) 117 throws IOException, ServletException { 118 119 String pathInfo = null; 120 String queryString = null; 121 String requestURI = null; 122 String servletPath = null; 123 124 PortletRequest portletRequest = 125 (PortletRequest)servletRequest.getAttribute( 126 JavaConstants.JAVAX_PORTLET_REQUEST); 127 128 PortletResponse portletResponse = 129 (PortletResponse)servletRequest.getAttribute( 130 JavaConstants.JAVAX_PORTLET_RESPONSE); 131 132 if (_path != null) { 133 String pathNoQueryString = _path; 134 135 int pos = _path.indexOf(CharPool.QUESTION); 136 137 if (pos != -1) { 138 pathNoQueryString = _path.substring(0, pos); 139 queryString = _path.substring(pos + 1); 140 } 141 142 Set<String> servletURLPatterns = getServletURLPatterns( 143 servletRequest, portletRequest, portletResponse); 144 145 for (String urlPattern : servletURLPatterns) { 146 if (urlPattern.endsWith("/*")) { 147 pos = urlPattern.indexOf("/*"); 148 149 urlPattern = urlPattern.substring(0, pos + 1); 150 151 if (pathNoQueryString.startsWith(urlPattern)) { 152 pathInfo = pathNoQueryString.substring( 153 urlPattern.length()); 154 servletPath = urlPattern; 155 156 break; 157 } 158 } 159 } 160 161 if ((pathInfo == null) && (servletPath == null)) { 162 pathInfo = StringPool.BLANK; 163 servletPath = pathNoQueryString; 164 } 165 166 requestURI = portletRequest.getContextPath() + pathNoQueryString; 167 } 168 169 HttpServletRequest portletServletRequest = getPortletServletRequest( 170 servletRequest, portletRequest, pathInfo, queryString, requestURI, 171 servletPath, include); 172 173 HttpServletResponse portletServletResponse = getPortletServletResponse( 174 servletResponse, portletRequest, portletResponse, include); 175 176 if (include) { 177 _requestDispatcher.include( 178 portletServletRequest, portletServletResponse); 179 } 180 else { 181 _requestDispatcher.forward( 182 portletServletRequest, portletServletResponse); 183 } 184 } 185 186 /** 187 * @deprecated As of 6.2.0, replaced by {@link #invoke(ServletRequest, 188 * ServletResponse, boolean)} 189 */ 190 public void invoke( 191 ServletRequest servletRequest, ServletResponse servletResponse, 192 boolean named, boolean include) 193 throws IOException, ServletException { 194 195 invoke(servletRequest, servletResponse, include); 196 } 197 198 protected HttpServletRequest getPortletServletRequest( 199 ServletRequest servletRequest, PortletRequest portletRequest, 200 String pathInfo, String queryString, String requestURI, 201 String servletPath, boolean include) { 202 203 HttpServletRequest request = (HttpServletRequest)servletRequest; 204 boolean named = false; 205 206 PortletRequestImpl portletRequestImpl = 207 (PortletRequestImpl)portletRequest; 208 209 return new PortletServletRequest( 210 request, portletRequestImpl, pathInfo, queryString, requestURI, 211 servletPath, named, include); 212 } 213 214 protected HttpServletResponse getPortletServletResponse( 215 ServletResponse servletResponse, PortletRequest portletRequest, 216 PortletResponse portletResponse, boolean include) 217 throws IOException { 218 219 HttpServletResponse response = (HttpServletResponse)servletResponse; 220 221 PortletResponseImpl portletResponseImpl = 222 (PortletResponseImpl)portletResponse; 223 224 HttpServletResponse httpServletResponse = new PortletServletResponse( 225 response, portletResponseImpl, include); 226 227 PrintWriter printWriter = servletResponse.getWriter(); 228 229 if (printWriter != null) { 230 httpServletResponse = new PipingServletResponse( 231 httpServletResponse, printWriter); 232 } 233 234 return httpServletResponse; 235 } 236 237 protected Set<String> getServletURLPatterns( 238 ServletRequest servletRequest, PortletRequest portletRequest, 239 PortletResponse portletResponse) { 240 241 PortletRequestImpl portletRequestImpl = 242 (PortletRequestImpl)portletRequest; 243 244 Portlet portlet = portletRequestImpl.getPortlet(); 245 246 PortletApp portletApp = portlet.getPortletApp(); 247 248 return portletApp.getServletURLPatterns(); 249 } 250 251 private String _path; 252 private RequestDispatcher _requestDispatcher; 253 254 }