001 // Copyright 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.web; 016 017 import java.io.IOException; 018 import java.security.Principal; 019 import java.util.List; 020 import java.util.Locale; 021 022 import javax.servlet.RequestDispatcher; 023 import javax.servlet.ServletException; 024 import javax.servlet.http.HttpServletRequest; 025 import javax.servlet.http.HttpServletResponse; 026 import javax.servlet.http.HttpSession; 027 028 import org.apache.hivemind.ApplicationRuntimeException; 029 import org.apache.hivemind.HiveMind; 030 import org.apache.hivemind.util.Defense; 031 import org.apache.tapestry.describe.DescriptionReceiver; 032 033 /** 034 * Adapter from {@link javax.servlet.http.HttpServletRequest} to 035 * {@link org.apache.tapestry.web.WebRequest}. 036 * 037 * @author Howard M. Lewis Ship 038 * @since 4.0 039 */ 040 public class ServletWebRequest implements WebRequest 041 { 042 private final HttpServletRequest _servletRequest; 043 044 private final HttpServletResponse _servletResponse; 045 046 private WebSession _webSession; 047 048 public ServletWebRequest(HttpServletRequest request, HttpServletResponse response) 049 { 050 Defense.notNull(request, "request"); 051 Defense.notNull(response, "response"); 052 053 _servletRequest = request; 054 _servletResponse = response; 055 } 056 057 public List getParameterNames() 058 { 059 return WebUtils.toSortedList(_servletRequest.getParameterNames()); 060 } 061 062 public String getParameterValue(String parameterName) 063 { 064 return _servletRequest.getParameter(parameterName); 065 } 066 067 public String[] getParameterValues(String parameterName) 068 { 069 return _servletRequest.getParameterValues(parameterName); 070 } 071 072 public String getContextPath() 073 { 074 return _servletRequest.getContextPath(); 075 } 076 077 public WebSession getSession(boolean create) 078 { 079 if (_webSession != null) 080 return _webSession; 081 082 HttpSession session = _servletRequest.getSession(create); 083 084 if (session != null) 085 _webSession = new ServletWebSession(session); 086 087 return _webSession; 088 } 089 090 public List getAttributeNames() 091 { 092 return WebUtils.toSortedList(_servletRequest.getAttributeNames()); 093 } 094 095 public Object getAttribute(String name) 096 { 097 return _servletRequest.getAttribute(name); 098 } 099 100 public void setAttribute(String name, Object attribute) 101 { 102 if (attribute == null) 103 _servletRequest.removeAttribute(name); 104 else 105 _servletRequest.setAttribute(name, attribute); 106 } 107 108 public String getScheme() 109 { 110 return _servletRequest.getScheme(); 111 } 112 113 public String getServerName() 114 { 115 return _servletRequest.getServerName(); 116 } 117 118 public int getServerPort() 119 { 120 return _servletRequest.getServerPort(); 121 } 122 123 public String getRequestURI() 124 { 125 return _servletRequest.getRequestURI(); 126 } 127 128 public void forward(String URL) 129 { 130 if (HiveMind.isBlank(URL)) 131 { 132 performForward("/"); 133 return; 134 } 135 136 boolean internal = !(URL.startsWith("/") || URL.indexOf("://") > 0); 137 138 if (internal) 139 performForward("/" + URL); 140 else 141 sendRedirect(URL); 142 } 143 144 private void sendRedirect(String URL) 145 { 146 String finalURL = _servletResponse.encodeRedirectURL(URL); 147 148 try 149 { 150 _servletResponse.sendRedirect(finalURL); 151 } 152 catch (IOException ex) 153 { 154 throw new ApplicationRuntimeException(WebMessages.unableToRedirect(URL, ex), ex); 155 } 156 157 } 158 159 private void performForward(String URL) 160 { 161 RequestDispatcher dispatcher = _servletRequest.getRequestDispatcher(URL); 162 163 if (dispatcher == null) 164 throw new ApplicationRuntimeException(WebMessages.unableToFindDispatcher(URL)); 165 166 try 167 { 168 dispatcher.forward(_servletRequest, _servletResponse); 169 } 170 catch (ServletException ex) 171 { 172 throw new ApplicationRuntimeException(WebMessages.unableToForward(URL, ex), ex); 173 } 174 catch (IOException ex) 175 { 176 throw new ApplicationRuntimeException(WebMessages.unableToForward(URL, ex), ex); 177 } 178 } 179 180 /** 181 * Returns {@link HttpServletRequest#getServletPath()}. 182 */ 183 public String getActivationPath() 184 { 185 return _servletRequest.getServletPath(); 186 } 187 188 public String getPathInfo() 189 { 190 return _servletRequest.getPathInfo(); 191 } 192 193 public Locale getLocale() 194 { 195 return _servletRequest.getLocale(); 196 } 197 198 public void describeTo(DescriptionReceiver receiver) 199 { 200 receiver.describeAlternate(_servletRequest); 201 } 202 203 public String getHeader(String name) 204 { 205 return _servletRequest.getHeader(name); 206 } 207 208 public String getRemoteUser() 209 { 210 return _servletRequest.getRemoteUser(); 211 } 212 213 public Principal getUserPrincipal() 214 { 215 return _servletRequest.getUserPrincipal(); 216 } 217 218 public boolean isUserInRole(String role) 219 { 220 return _servletRequest.isUserInRole(role); 221 } 222 }