001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/enterprise/servlet/GZIPResponseStream.java $ 002 /* 003 This file is part of deegree. 004 Copyright (C) 2001-2008 by: 005 EXSE, 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 015 This library is distributed in the hope that it will be useful, 016 but WITHOUT ANY WARRANTY; without even the implied warranty of 017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 018 Lesser General Public License for more details. 019 020 You should have received a copy of the GNU Lesser General Public 021 License along with this library; if not, write to the Free Software 022 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 023 024 Contact: 025 026 Andreas Poth 027 lat/lon GmbH 028 Aennchenstr. 19 029 53115 Bonn 030 Germany 031 E-Mail: poth@lat-lon.de 032 033 Prof. Dr. Klaus Greve 034 Department of Geography 035 University of Bonn 036 Meckenheimer Allee 166 037 53115 Bonn 038 Germany 039 E-Mail: greve@giub.uni-bonn.de 040 041 Copyright 2003 Jayson Falkner (jayson@jspinsider.com) 042 This code is from "Servlets and JavaServer pages; the J2EE Web Tier", 043 http://www.jspbook.com. 044 */ 045 package org.deegree.enterprise.servlet; 046 047 import java.io.ByteArrayOutputStream; 048 import java.io.IOException; 049 import java.util.zip.GZIPOutputStream; 050 051 import javax.servlet.ServletOutputStream; 052 import javax.servlet.http.HttpServletResponse; 053 054 /** 055 * 056 * 057 * 058 * @version $Revision: 9338 $ 059 * @author <a href="mailto:jayson@jspinsider.com">Jayson Falkner</a> 060 * @author last edited by: $Author: apoth $ 061 * 062 * @version 1.0. $Revision: 9338 $, $Date: 2007-12-27 13:31:31 +0100 (Do, 27 Dez 2007) $ 063 * 064 * @since 2.0 065 */ 066 public class GZIPResponseStream extends ServletOutputStream { 067 protected ByteArrayOutputStream baos = null; 068 069 protected GZIPOutputStream gzipstream = null; 070 071 protected boolean closed = false; 072 073 protected HttpServletResponse response = null; 074 075 protected ServletOutputStream output = null; 076 077 /** 078 * 079 * @param response 080 * @throws IOException 081 */ 082 public GZIPResponseStream( HttpServletResponse response ) throws IOException { 083 super(); 084 closed = false; 085 this.response = response; 086 this.output = response.getOutputStream(); 087 baos = new ByteArrayOutputStream(); 088 gzipstream = new GZIPOutputStream( baos ); 089 } 090 091 /** 092 * @throws IOException 093 */ 094 public void close() throws IOException { 095 if ( closed ) { 096 throw new IOException( "This output stream has already been closed" ); 097 } 098 gzipstream.finish(); 099 100 byte[] bytes = baos.toByteArray(); 101 102 response.addHeader( "Content-Length", Integer.toString( bytes.length ) ); 103 response.addHeader( "Content-Encoding", "gzip" ); 104 output.write( bytes ); 105 output.flush(); 106 output.close(); 107 closed = true; 108 } 109 110 /** 111 * @throws IOException 112 */ 113 public void flush() throws IOException { 114 if ( closed ) { 115 throw new IOException( "Cannot flush a closed output stream" ); 116 } 117 gzipstream.flush(); 118 } 119 120 /** 121 * @param b 122 * data to write 123 * @throws IOException 124 */ 125 public void write( int b ) throws IOException { 126 if ( closed ) { 127 throw new IOException( "Cannot write to a closed output stream" ); 128 } 129 gzipstream.write( (byte) b ); 130 } 131 132 /** 133 * @param b 134 * data array to write 135 * @throws IOException 136 */ 137 public void write( byte b[] ) throws IOException { 138 write( b, 0, b.length ); 139 } 140 141 /** 142 * @param b 143 * data array to write 144 * @param off 145 * index of the for byte 146 * @param len 147 * number of bytes to write 148 * @throws IOException 149 */ 150 public void write( byte b[], int off, int len ) throws IOException { 151 System.out.println( "writing..." ); 152 if ( closed ) { 153 throw new IOException( "Cannot write to a closed output stream" ); 154 } 155 gzipstream.write( b, off, len ); 156 } 157 158 /** 159 * 160 * @return true if already has been closed 161 */ 162 public boolean closed() { 163 return ( this.closed ); 164 } 165 166 /** 167 * 168 * 169 */ 170 public void reset() { 171 // noop 172 } 173 }