001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/enterprise/servlet/GZIPResponseStream.java $
002 /*----------------------------------------------------------------------------
003 This file originated as work from Jayson Falkner.
004
005 Copyright 2003 Jayson Falkner (jayson@jspinsider.com)
006 This code is from "Servlets and JavaServer pages; the J2EE Web Tier",
007 http://www.jspbook.com. You may freely use the code both commercially
008 and non-commercially. If you like the code, please pick up a copy of
009 the book and help support the authors, development of more free code,
010 and the JSP/Servlet/J2EE community.
011 ----------------------------------------------------------------------------*/
012 package org.deegree.enterprise.servlet;
013
014 import java.io.ByteArrayOutputStream;
015 import java.io.IOException;
016 import java.util.zip.GZIPOutputStream;
017
018 import javax.servlet.ServletOutputStream;
019 import javax.servlet.http.HttpServletResponse;
020
021 /**
022 *
023 *
024 * @author <a href="mailto:jayson@jspinsider.com">Jayson Falkner</a>
025 * @author last edited by: $Author: mschneider $
026 *
027 * @version $Revision: 20326 $, $Date: 2009-10-22 18:41:56 +0200 (Do, 22 Okt 2009) $
028 */
029 public class GZIPResponseStream extends ServletOutputStream {
030 /**
031 * the output as a byte array
032 */
033 protected ByteArrayOutputStream baos = null;
034
035 /**
036 * the output as a gzipped stream
037 */
038 protected GZIPOutputStream gzipstream = null;
039
040 /**
041 * true if the stream is closed
042 */
043 protected boolean closed = false;
044
045 /**
046 * the response wrapper
047 */
048 protected HttpServletResponse response = null;
049
050 /**
051 * the output as a stream
052 */
053 protected ServletOutputStream output = null;
054
055 /**
056 *
057 * @param response
058 * @throws IOException
059 */
060 public GZIPResponseStream( HttpServletResponse response ) throws IOException {
061 super();
062 closed = false;
063 this.response = response;
064 this.output = response.getOutputStream();
065 baos = new ByteArrayOutputStream();
066 gzipstream = new GZIPOutputStream( baos );
067 }
068
069 /**
070 * @throws IOException
071 */
072 @Override
073 public void close()
074 throws IOException {
075 if ( closed ) {
076 throw new IOException( "This output stream has already been closed" );
077 }
078 gzipstream.finish();
079
080 byte[] bytes = baos.toByteArray();
081
082 response.addHeader( "Content-Length", Integer.toString( bytes.length ) );
083 response.addHeader( "Content-Encoding", "gzip" );
084 output.write( bytes );
085 output.flush();
086 output.close();
087 closed = true;
088 }
089
090 /**
091 * @throws IOException
092 */
093 @Override
094 public void flush()
095 throws IOException {
096 if ( closed ) {
097 throw new IOException( "Cannot flush a closed output stream" );
098 }
099 gzipstream.flush();
100 }
101
102 /**
103 * @param b
104 * data to write
105 * @throws IOException
106 */
107 @Override
108 public void write( int b )
109 throws IOException {
110 if ( closed ) {
111 throw new IOException( "Cannot write to a closed output stream" );
112 }
113 gzipstream.write( (byte) b );
114 }
115
116 /**
117 * @param b
118 * data array to write
119 * @throws IOException
120 */
121 @Override
122 public void write( byte b[] )
123 throws IOException {
124 write( b, 0, b.length );
125 }
126
127 /**
128 * @param b
129 * data array to write
130 * @param off
131 * index of the for byte
132 * @param len
133 * number of bytes to write
134 * @throws IOException
135 */
136 @Override
137 public void write( byte b[], int off, int len )
138 throws IOException {
139 System.out.println( "writing..." );
140 if ( closed ) {
141 throw new IOException( "Cannot write to a closed output stream" );
142 }
143 gzipstream.write( b, off, len );
144 }
145
146 /**
147 *
148 * @return true if already has been closed
149 */
150 public boolean closed() {
151 return ( this.closed );
152 }
153
154 /**
155 *
156 *
157 */
158 public void reset() {
159 // noop
160 }
161 }