001 // Copyright 2006, 2007, 2008, 2010, 2011 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.tapestry5.internal.services; 016 017 import org.apache.tapestry5.ioc.internal.util.InternalUtils; 018 import org.apache.tapestry5.services.Request; 019 import org.apache.tapestry5.services.Session; 020 021 import javax.servlet.http.HttpServletRequest; 022 import java.io.UnsupportedEncodingException; 023 import java.util.List; 024 import java.util.Locale; 025 026 /** 027 * Basic implementation of {@link org.apache.tapestry5.services.Request} that wraps around an 028 * {@link javax.servlet.http.HttpServletRequest}. 029 */ 030 public class RequestImpl implements Request 031 { 032 static final String REQUESTED_WITH_HEADER = "X-Requested-With"; 033 034 static final String XML_HTTP_REQUEST = "XMLHttpRequest"; 035 036 private final HttpServletRequest request; 037 038 private final String requestEncoding; 039 040 private final TapestrySessionFactory sessionFactory; 041 042 private boolean encodingSet; 043 044 Session session; 045 046 public RequestImpl( 047 HttpServletRequest request, 048 String requestEncoding, 049 TapestrySessionFactory sessionFactory) 050 { 051 this.request = request; 052 this.requestEncoding = requestEncoding; 053 this.sessionFactory = sessionFactory; 054 } 055 056 public List<String> getParameterNames() 057 { 058 setupEncoding(); 059 060 return InternalUtils.toList(request.getParameterNames()); 061 } 062 063 public List<String> getHeaderNames() 064 { 065 return InternalUtils.toList(request.getHeaderNames()); 066 } 067 068 public String getParameter(String name) 069 { 070 setupEncoding(); 071 072 return request.getParameter(name); 073 } 074 075 public String[] getParameters(String name) 076 { 077 setupEncoding(); 078 079 return request.getParameterValues(name); 080 } 081 082 public String getHeader(String name) 083 { 084 return request.getHeader(name); 085 } 086 087 public String getPath() 088 { 089 String pathInfo = request.getPathInfo(); 090 091 if (pathInfo == null) 092 return request.getServletPath(); 093 094 // Websphere 6.1 is a bit wonky (see TAPESTRY-1713), and tends to return the empty string 095 // for the servlet path, and return the true path in pathInfo. 096 097 return pathInfo.length() == 0 ? "/" : pathInfo; 098 } 099 100 public String getContextPath() 101 { 102 return request.getContextPath(); 103 } 104 105 public Session getSession(boolean create) 106 { 107 if (session != null && session.isInvalidated()) 108 { 109 session = null; 110 } 111 112 if (session == null) 113 { 114 // TAP5-1489 - Re-storage of session attributes at end of request should be configurable 115 session = sessionFactory.getSession(create); 116 } 117 118 return session; 119 } 120 121 public Locale getLocale() 122 { 123 return request.getLocale(); 124 } 125 126 public long getDateHeader(String name) 127 { 128 return request.getDateHeader(name); 129 } 130 131 private void setupEncoding() 132 { 133 if (encodingSet) 134 return; 135 136 try 137 { 138 request.setCharacterEncoding(requestEncoding); 139 } catch (UnsupportedEncodingException ex) 140 { 141 throw new RuntimeException(ex); 142 } 143 144 encodingSet = true; 145 } 146 147 public boolean isXHR() 148 { 149 return XML_HTTP_REQUEST.equals(request.getHeader(REQUESTED_WITH_HEADER)); 150 } 151 152 public boolean isSecure() 153 { 154 return request.isSecure(); 155 } 156 157 public boolean isRequestedSessionIdValid() 158 { 159 return request.isRequestedSessionIdValid(); 160 } 161 162 public Object getAttribute(String name) 163 { 164 return request.getAttribute(name); 165 } 166 167 public void setAttribute(String name, Object value) 168 { 169 request.setAttribute(name, value); 170 } 171 172 public String getMethod() 173 { 174 return request.getMethod(); 175 } 176 177 public String getServerName() 178 { 179 return request.getServerName(); 180 } 181 182 public int getLocalPort() 183 { 184 return request.getLocalPort(); 185 } 186 187 /** 188 * @since 5.2.5 189 */ 190 public int getServerPort() 191 { 192 return request.getServerPort(); 193 } 194 195 public String getRemoteHost() 196 { 197 return request.getRemoteHost(); 198 } 199 }