001 /** 002 * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved. 003 * 004 * The contents of this file are subject to the terms of the Liferay Enterprise 005 * Subscription License ("License"). You may not use this file except in 006 * compliance with the License. You can obtain a copy of the License by 007 * contacting Liferay, Inc. See the License for the specific language governing 008 * permissions and limitations under the License, including but not limited to 009 * distribution rights of the Software. 010 * 011 * 012 * 013 */ 014 015 package com.liferay.portal.apache.bridges.struts; 016 017 import com.liferay.portal.kernel.util.CharPool; 018 import com.liferay.portal.kernel.util.JavaConstants; 019 import com.liferay.portal.kernel.util.StringPool; 020 import com.liferay.portal.model.Portlet; 021 import com.liferay.portal.model.PortletApp; 022 import com.liferay.portlet.PortletRequestImpl; 023 import com.liferay.portlet.PortletResponseImpl; 024 import com.liferay.portlet.PortletServletRequest; 025 import com.liferay.portlet.PortletServletResponse; 026 027 import java.io.IOException; 028 029 import java.util.Set; 030 031 import javax.portlet.PortletRequest; 032 import javax.portlet.PortletResponse; 033 034 import javax.servlet.RequestDispatcher; 035 import javax.servlet.ServletException; 036 import javax.servlet.ServletRequest; 037 import javax.servlet.ServletResponse; 038 import javax.servlet.http.HttpServletRequest; 039 import javax.servlet.http.HttpServletResponse; 040 041 /** 042 * @author Michael Young 043 * @author Brian Myunghun Kim 044 * @author Brian Wing Shun Chan 045 * @author Deepak Gothe 046 */ 047 public class LiferayRequestDispatcher implements RequestDispatcher { 048 049 public LiferayRequestDispatcher( 050 RequestDispatcher requestDispatcher, String path) { 051 052 _requestDispatcher = requestDispatcher; 053 _path = path; 054 } 055 056 public void forward( 057 ServletRequest servletRequest, ServletResponse servletResponse) 058 throws IOException, ServletException { 059 060 PortletRequest portletRequest = 061 (PortletRequest)servletRequest.getAttribute( 062 JavaConstants.JAVAX_PORTLET_REQUEST); 063 064 if (portletRequest != null) { 065 invoke(servletRequest, servletResponse, false); 066 } 067 else { 068 _requestDispatcher.forward(servletRequest, servletResponse); 069 } 070 } 071 072 public void include( 073 ServletRequest servletRequest, ServletResponse servletResponse) 074 throws IOException, ServletException { 075 076 PortletRequest portletRequest = 077 (PortletRequest)servletRequest.getAttribute( 078 JavaConstants.JAVAX_PORTLET_REQUEST); 079 080 if (portletRequest != null) { 081 invoke(servletRequest, servletResponse, true); 082 } 083 else { 084 _requestDispatcher.include(servletRequest, servletResponse); 085 } 086 } 087 088 public void invoke( 089 ServletRequest servletRequest, ServletResponse servletResponse, 090 boolean include) 091 throws IOException, ServletException { 092 093 String pathInfo = null; 094 String queryString = null; 095 String requestURI = null; 096 String servletPath = null; 097 098 PortletRequest portletRequest = 099 (PortletRequest)servletRequest.getAttribute( 100 JavaConstants.JAVAX_PORTLET_REQUEST); 101 102 PortletResponse portletResponse = 103 (PortletResponse)servletRequest.getAttribute( 104 JavaConstants.JAVAX_PORTLET_RESPONSE); 105 106 if (_path != null) { 107 String pathNoQueryString = _path; 108 109 int pos = _path.indexOf(CharPool.QUESTION); 110 111 if (pos != -1) { 112 pathNoQueryString = _path.substring(0, pos); 113 queryString = _path.substring(pos + 1, _path.length()); 114 } 115 116 Set<String> servletURLPatterns = getServletURLPatterns( 117 servletRequest, portletRequest, portletResponse); 118 119 for (String urlPattern : servletURLPatterns) { 120 if (urlPattern.endsWith("/*")) { 121 pos = urlPattern.indexOf("/*"); 122 123 urlPattern = urlPattern.substring(0, pos); 124 125 if (pathNoQueryString.startsWith(urlPattern)) { 126 pathInfo = pathNoQueryString.substring( 127 urlPattern.length()); 128 servletPath = urlPattern; 129 130 break; 131 } 132 } 133 } 134 135 if ((pathInfo == null) && (servletPath == null)) { 136 pathInfo = StringPool.BLANK; 137 servletPath = pathNoQueryString; 138 } 139 140 requestURI = portletRequest.getContextPath() + pathNoQueryString; 141 } 142 143 HttpServletRequest portletServletRequest = getPortletServletRequest( 144 servletRequest, portletRequest, pathInfo, queryString, requestURI, 145 servletPath, include); 146 147 HttpServletResponse portletServletResponse = 148 getPortletServletResponse( 149 servletResponse, portletRequest, portletResponse, include); 150 151 if (include) { 152 _requestDispatcher.include( 153 portletServletRequest, portletServletResponse); 154 } 155 else { 156 _requestDispatcher.forward( 157 portletServletRequest, portletServletResponse); 158 } 159 } 160 161 protected HttpServletRequest getPortletServletRequest( 162 ServletRequest servletRequest, PortletRequest portletRequest, 163 String pathInfo, String queryString, String requestURI, 164 String servletPath, boolean include) { 165 166 HttpServletRequest request = (HttpServletRequest)servletRequest; 167 boolean named = false; 168 169 PortletRequestImpl portletRequestImpl = 170 (PortletRequestImpl)portletRequest; 171 172 return new PortletServletRequest( 173 request, portletRequestImpl, pathInfo, queryString, requestURI, 174 servletPath, named, include); 175 } 176 177 protected HttpServletResponse getPortletServletResponse( 178 ServletResponse servletResponse, PortletRequest portletRequest, 179 PortletResponse portletResponse, boolean include) { 180 181 HttpServletResponse response = (HttpServletResponse)servletResponse; 182 183 PortletResponseImpl portletResponseImpl = 184 (PortletResponseImpl)portletResponse; 185 186 return new PortletServletResponse( 187 response, portletResponseImpl, include); 188 } 189 190 protected Set<String> getServletURLPatterns( 191 ServletRequest servletRequest, PortletRequest portletRequest, 192 PortletResponse portletResponse) { 193 194 PortletRequestImpl portletRequestImpl = 195 (PortletRequestImpl)portletRequest; 196 197 Portlet portlet = portletRequestImpl.getPortlet(); 198 199 PortletApp portletApp = portlet.getPortletApp(); 200 201 return portletApp.getServletURLPatterns(); 202 } 203 204 private RequestDispatcher _requestDispatcher; 205 private String _path; 206 207 }