001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/enterprise/servlet/ServletResponseWrapper.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 package org.deegree.enterprise.servlet;
039
040 import java.io.ByteArrayOutputStream;
041 import java.io.IOException;
042 import java.io.PrintWriter;
043 import java.io.UnsupportedEncodingException;
044
045 import javax.servlet.ServletOutputStream;
046 import javax.servlet.http.HttpServletResponse;
047 import javax.servlet.http.HttpServletResponseWrapper;
048
049 /**
050 * The <code>ServletResponse</code> class is a wrapper for an HttpServletResponse object. It allows to repeadetly
051 * access the stream, without emptying it.
052 *
053 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
054 *
055 * @author last edited by: $Author: apoth $
056 *
057 * @version $Revision: 9338 $, $Date: 2007-12-27 13:31:31 +0100 (Do, 27 Dez 2007) $
058 *
059 */
060 public class ServletResponseWrapper extends HttpServletResponseWrapper {
061
062 protected ServletOutputStream stream = null;
063
064 protected PrintWriter writer = null;
065
066 protected HttpServletResponse origResponse = null;
067
068 private String contentType = null;
069
070 /**
071 *
072 * @param response
073 */
074 public ServletResponseWrapper( HttpServletResponse response ) {
075 super( response );
076 origResponse = response;
077 }
078
079 /**
080 * It is possible to re-send the response of an allready handled request (by a servlet) as a new request object. The
081 * new reponse will then be adde (at the end) of the first response, if -for some reason- the (new) reponse alone
082 * should be send to the client. In this case the response stream must be resetted before it is sent anew to the
083 * servlet. This is what this method is for.
084 */
085 @Override
086 public void reset() {
087 createOutputStream();
088 }
089
090 /**
091 *
092 * @return a new ServletOutputStream.
093 * @throws IOException
094 */
095 private ServletOutputStream createOutputStream() {
096 stream = new ProxyServletOutputStream( 10000 );
097 return stream;
098 }
099
100 @Override
101 public ServletOutputStream getOutputStream() throws IOException {
102
103 if ( stream == null ) {
104 stream = createOutputStream();
105 }
106 return stream;
107 }
108
109 @Override
110 public PrintWriter getWriter() throws IOException {
111 if ( writer != null ) {
112 return writer;
113 }
114 stream = createOutputStream();
115 writer = new PrintWriter( stream );
116 return writer;
117 }
118
119
120 @Override
121 public void setContentType( String contentType ) {
122 this.contentType = contentType;
123 if ( contentType != null ) {
124 super.setContentType( contentType );
125 }
126 }
127
128
129 @Override
130 public String getContentType() {
131 return this.contentType;
132 }
133
134 // ///////////////////////////////////////////////////////////////////////
135 // inner classes //
136 // ///////////////////////////////////////////////////////////////////////
137
138 /**
139 * The <code>ProxyServletOutputStream</code> class is a wrapper for OutputStream object thus allowing repeaded
140 * access to the stream.
141 *
142 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
143 *
144 * @author last edited by: $Author: apoth $
145 *
146 * @version $Revision: 9338 $, $Date: 2007-12-27 13:31:31 +0100 (Do, 27 Dez 2007) $
147 *
148 */
149 public class ProxyServletOutputStream extends ServletOutputStream {
150
151 private ByteArrayOutputStream bos = null;
152
153 /**
154 * @param length of the buffer
155 */
156 public ProxyServletOutputStream( int length ) {
157 if ( length > 0 )
158 bos = new ByteArrayOutputStream( length );
159 else
160 bos = new ByteArrayOutputStream( 10000 );
161 }
162
163 @Override
164 public void close() throws IOException {
165 bos.close();
166 }
167
168
169 @Override
170 public void flush() throws IOException {
171 bos.flush();
172 }
173
174 @Override
175 public void write( byte[] b, int off, int len ) throws IOException {
176 bos.write( b, off, len );
177 }
178
179 @Override
180 public void write( byte[] b ) throws IOException {
181 bos.write( b );
182 }
183
184 @Override
185 public void write( int v ) throws IOException {
186 bos.write( v );
187 }
188
189 /**
190 * @return the actual bytes of the stream.
191 */
192 public byte[] toByteArray() {
193 return bos.toByteArray();
194 }
195
196 /**
197 * @param enc encoding to which the bytes must encoded.
198 * @return a string representation of the byte array with the given encoding.
199 * @throws UnsupportedEncodingException if the encoding is not supported
200 */
201 public String toString( String enc ) throws UnsupportedEncodingException{
202 return bos.toString( enc );
203 }
204 }
205 }