001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/enterprise/servlet/ServletRequestWrapper.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 This file is part of deegree. 004 Copyright (C) 2001-2008 by: 005 Department of Geography, University of Bonn 006 http://www.giub.uni-bonn.de/deegree/ 007 lat/lon GmbH 008 http://www.lat-lon.de 009 010 This library is free software; you can redistribute it and/or 011 modify it under the terms of the GNU Lesser General Public 012 License as published by the Free Software Foundation; either 013 version 2.1 of the License, or (at your option) any later version. 014 This library is distributed in the hope that it will be useful, 015 but WITHOUT ANY WARRANTY; without even the implied warranty of 016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 Lesser General Public License for more details. 018 You should have received a copy of the GNU Lesser General Public 019 License along with this library; if not, write to the Free Software 020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 021 Contact: 022 023 Andreas Poth 024 lat/lon GmbH 025 Aennchenstr. 19 026 53177 Bonn 027 Germany 028 E-Mail: poth@lat-lon.de 029 030 Prof. Dr. Klaus Greve 031 Department of Geography 032 University of Bonn 033 Meckenheimer Allee 166 034 53115 Bonn 035 Germany 036 E-Mail: greve@giub.uni-bonn.de 037 ---------------------------------------------------------------------------*/ 038 039 package org.deegree.enterprise.servlet; 040 041 import java.io.BufferedInputStream; 042 import java.io.BufferedReader; 043 import java.io.ByteArrayInputStream; 044 import java.io.ByteArrayOutputStream; 045 import java.io.IOException; 046 import java.io.InputStream; 047 import java.io.InputStreamReader; 048 import java.security.Principal; 049 import java.util.Arrays; 050 import java.util.Enumeration; 051 import java.util.HashMap; 052 import java.util.Iterator; 053 import java.util.Map; 054 import java.util.ResourceBundle; 055 056 import javax.servlet.ServletInputStream; 057 import javax.servlet.http.HttpServletRequest; 058 import javax.servlet.http.HttpServletRequestWrapper; 059 060 import org.deegree.framework.log.ILogger; 061 import org.deegree.framework.log.LoggerFactory; 062 import org.deegree.framework.util.CharsetUtils; 063 import org.deegree.framework.util.StringTools; 064 065 /** 066 * TODO describe function and usage of the class here. 067 * 068 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 069 * @author last edited by: $Author: mays$ 070 * 071 * @version $Revision: 9338 $, $Date: 23.05.2007 18:09:52$ 072 */ 073 public class ServletRequestWrapper extends HttpServletRequestWrapper { 074 075 private static ILogger LOG = LoggerFactory.getLogger( ServletRequestWrapper.class ); 076 077 private static final String BUNDLE_NAME = "org.deegree.enterprise.servlet.ServletRequestWrapper"; 078 079 static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle( BUNDLE_NAME ); 080 081 private HttpServletRequest origReq = null; 082 083 private byte[] bytes = null; 084 085 private Map<String, Object> paramMap; 086 087 private String queryString; 088 089 /** 090 * @param request 091 */ 092 public ServletRequestWrapper( HttpServletRequest request ) { 093 super( request ); 094 095 this.origReq = request; 096 097 ByteArrayOutputStream bos = new ByteArrayOutputStream( 10000 ); 098 try { 099 InputStream is = origReq.getInputStream(); 100 int c = 0; 101 while ( ( c = is.read() ) > -1 ) { 102 bos.write( c ); 103 } 104 bytes = bos.toByteArray(); 105 LOG.logDebug( "The constructor created a new bytearray in the HttpServletRequestWrapper" ); 106 } catch ( IOException ioe ) { 107 LOG.logError( "An error occured while creating a byte-buffered inputstream from the HttpServletRequest inputstream because: " + ioe.getMessage(), 108 ioe ); 109 bytes = null; 110 } 111 queryString = request.getQueryString(); 112 } 113 114 115 116 // /** 117 // * creates a new ServletInputStream with a copy of the content of the original one 118 // * 119 // * @return 120 // * @throws IOException 121 // */ 122 // private ServletInputStream createInputStream() 123 // throws IOException { 124 // 125 // if ( bytes == null ) { 126 // LOG.logDebug( "Creating new bytearray in the HttpServletRequestWrapper" ); 127 // ByteArrayOutputStream bos = new ByteArrayOutputStream( 10000 ); 128 // InputStream is = origReq.getInputStream(); 129 // int c = 0; 130 // while ( ( c = is.read() ) > -1 ) { 131 // bos.write( c ); 132 // } 133 // bytes = bos.toByteArray(); 134 // } 135 // 136 // return new ProxyServletInputStream( new ByteArrayInputStream( bytes ), bytes.length ); 137 // } 138 139 @Override 140 public Map getParameterMap() { 141 if ( paramMap == null ) { 142 paramMap = super.getParameterMap(); 143 } 144 return paramMap; 145 } 146 147 @Override 148 public String getParameter( String key ) { 149 if ( paramMap == null ) { 150 paramMap = super.getParameterMap(); 151 } 152 Object o = paramMap.get( key ); 153 String tmp = null; 154 if ( o != null && o.getClass() == String[].class ) { 155 tmp = StringTools.arrayToString( (String[])o, ',' ); 156 } else { 157 tmp = (String)o; 158 } 159 return tmp; 160 } 161 162 163 @Override 164 public String[] getParameterValues( String arg0 ) { 165 if ( paramMap == null ) { 166 paramMap = super.getParameterMap(); 167 } 168 Object o = paramMap.get( arg0 ); 169 if ( o instanceof String) { 170 return new String[] { (String)o }; 171 } 172 return (String[])o; 173 } 174 175 /** 176 * 177 * @param param 178 */ 179 public void setParameter(Map<String,String> param) { 180 this.paramMap = new HashMap<String, Object>(param.size()); 181 182 Iterator<String> iter = param.keySet().iterator(); 183 StringBuffer sb = new StringBuffer(500); 184 while ( iter.hasNext() ) { 185 String key = iter.next(); 186 String value = param.get( key); 187 sb.append( key ).append( '=' ).append( value ); 188 if ( iter.hasNext() ) { 189 sb.append( '&' ); 190 } 191 this.paramMap.put( key, StringTools.toArray( value, ",", false ) ); 192 } 193 this.queryString = sb.toString(); 194 } 195 196 197 @Override 198 public String getQueryString() { 199 return queryString; 200 } 201 202 203 204 /** 205 * sets the content of the inputstream returned by the 206 * 207 * @see #getReader() and the 208 * @see #getInputStream() method as a byte array. Calling this method will override the content that may has been 209 * read from the <code>HttpServletRequest</code> that has been passed to the constructor 210 * 211 * @param b 212 */ 213 public void setInputStreamAsByteArray( byte[] b ) { 214 LOG.logDebug( "ServletRequestWrapper: setting inputstream#byteArray to given bytearra" ); 215 this.bytes = b; 216 } 217 218 @Override 219 public BufferedReader getReader() throws IOException { 220 return new BufferedReader( new InputStreamReader( getInputStream(), CharsetUtils.getSystemCharset() ) ); 221 } 222 223 /** 224 * @see javax.servlet.ServletRequest#getInputStream() 225 */ 226 @Override 227 public ServletInputStream getInputStream() throws IOException { 228 if ( bytes == null ) { 229 LOG.logDebug( "Creating new bytearray in the HttpServletRequestWrapper#getInputStream" ); 230 ByteArrayOutputStream bos = new ByteArrayOutputStream( 10000 ); 231 InputStream is = origReq.getInputStream(); 232 int c = 0; 233 while ( ( c = is.read() ) > -1 ) { 234 bos.write( c ); 235 } 236 bytes = bos.toByteArray(); 237 } 238 239 return new ProxyServletInputStream( new ByteArrayInputStream( bytes ), bytes.length ); 240 } 241 242 @Override 243 public Principal getUserPrincipal() { 244 if ( origReq.getUserPrincipal() != null ) { 245 return origReq.getUserPrincipal(); 246 } 247 return new Principal() { 248 public String getName() { 249 return RESOURCE_BUNDLE.getString( "defaultuser" ); 250 } 251 }; 252 253 } 254 255 // /////////////////////////////////////////////////////////////////////// 256 // inner classes // 257 // /////////////////////////////////////////////////////////////////////// 258 259 /** 260 * @author Administrator 261 * 262 * TODO To change the template for this generated type comment go to Window - Preferences - Java - Code Style - Code 263 * Templates 264 */ 265 private class ProxyServletInputStream extends ServletInputStream { 266 267 private BufferedInputStream buffered; 268 269 /** 270 * @param in 271 * the InputStream which will be buffered. 272 * @param length 273 */ 274 public ProxyServletInputStream( InputStream in, int length ) { 275 if ( length > 0 ) 276 buffered = new BufferedInputStream( in, length ); 277 else 278 buffered = new BufferedInputStream( in ); 279 } 280 281 @Override 282 public synchronized int read() throws IOException { 283 return buffered.read(); 284 } 285 286 @Override 287 public synchronized int read( byte b[], int off, int len ) throws IOException { 288 return buffered.read( b, off, len ); 289 } 290 291 @Override 292 public synchronized long skip( long n ) throws IOException { 293 return buffered.skip( n ); 294 } 295 296 @Override 297 public synchronized int available() throws IOException { 298 return buffered.available(); 299 } 300 301 @Override 302 public synchronized void mark( int readlimit ) { 303 buffered.mark( readlimit ); 304 } 305 306 @Override 307 public synchronized void reset() throws IOException { 308 buffered.reset(); 309 } 310 311 @Override 312 public boolean markSupported() { 313 return buffered.markSupported(); 314 } 315 316 @Override 317 public void close() throws IOException { 318 buffered.close(); 319 } 320 } 321 322 }