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 @Override 059 public void forward( 060 ServletRequest servletRequest, ServletResponse servletResponse) 061 throws IOException, ServletException { 062 063 PortletRequest portletRequest = 064 (PortletRequest)servletRequest.getAttribute( 065 JavaConstants.JAVAX_PORTLET_REQUEST); 066 067 if (portletRequest != null) { 068 invoke(servletRequest, servletResponse, false); 069 } 070 else { 071 _requestDispatcher.forward(servletRequest, servletResponse); 072 } 073 } 074 075 /** 076 * @deprecated {@link #forward(ServletRequest, 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 @Override 087 public void include( 088 ServletRequest servletRequest, ServletResponse servletResponse) 089 throws IOException, ServletException { 090 091 PortletRequest portletRequest = 092 (PortletRequest)servletRequest.getAttribute( 093 JavaConstants.JAVAX_PORTLET_REQUEST); 094 095 if (portletRequest != null) { 096 invoke(servletRequest, servletResponse, true); 097 } 098 else { 099 _requestDispatcher.include(servletRequest, servletResponse); 100 } 101 } 102 103 /** 104 * @deprecated {@link #include(ServletRequest, 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 {@link #invoke(ServletRequest, ServletResponse, boolean)} 188 */ 189 public void invoke( 190 ServletRequest servletRequest, ServletResponse servletResponse, 191 boolean named, boolean include) 192 throws IOException, ServletException { 193 194 invoke(servletRequest, servletResponse, include); 195 } 196 197 protected HttpServletRequest getPortletServletRequest( 198 ServletRequest servletRequest, PortletRequest portletRequest, 199 String pathInfo, String queryString, String requestURI, 200 String servletPath, boolean include) { 201 202 HttpServletRequest request = (HttpServletRequest)servletRequest; 203 boolean named = false; 204 205 PortletRequestImpl portletRequestImpl = 206 PortletRequestImpl.getPortletRequestImpl(portletRequest); 207 208 return new PortletServletRequest( 209 request, portletRequestImpl, pathInfo, queryString, requestURI, 210 servletPath, named, include); 211 } 212 213 protected HttpServletResponse getPortletServletResponse( 214 ServletResponse servletResponse, PortletRequest portletRequest, 215 PortletResponse portletResponse, boolean include) 216 throws IOException { 217 218 HttpServletResponse response = (HttpServletResponse)servletResponse; 219 220 PortletResponseImpl portletResponseImpl = 221 (PortletResponseImpl)portletResponse; 222 223 HttpServletResponse httpServletResponse = new PortletServletResponse( 224 response, portletResponseImpl, include); 225 226 PrintWriter printWriter = servletResponse.getWriter(); 227 228 if (printWriter != null) { 229 httpServletResponse = new PipingServletResponse( 230 httpServletResponse, printWriter); 231 } 232 233 return httpServletResponse; 234 } 235 236 protected Set<String> getServletURLPatterns( 237 ServletRequest servletRequest, PortletRequest portletRequest, 238 PortletResponse portletResponse) { 239 240 PortletRequestImpl portletRequestImpl = 241 PortletRequestImpl.getPortletRequestImpl(portletRequest); 242 243 Portlet portlet = portletRequestImpl.getPortlet(); 244 245 PortletApp portletApp = portlet.getPortletApp(); 246 247 return portletApp.getServletURLPatterns(); 248 } 249 250 private String _path; 251 private RequestDispatcher _requestDispatcher; 252 253 }