/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or any later version.
*
* Squale is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
package org.squale.welcom.struts.filter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Hashtable;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* @author M327837 Wrapper de la response pour le filtre
*/
public class GZIPResponseWrapper
extends HttpServletResponseWrapper
{
/** Response d'origine */
protected HttpServletResponse origResponse = null;
/** output stream de la servlet */
protected ServletOutputStream stream = null;
/** le writer */
protected PrintWriter writer = null;
/** le contentType */
protected String contentType;
/** Les headers */
protected Hashtable headers;
/** Ignore le zip */
protected boolean ignoreZip = false;
/**
* Le contructeur
*
* @param response : La response d'origne
*/
public GZIPResponseWrapper( final HttpServletResponse response )
{
super( response );
origResponse = response;
}
/**
* Creation de la outputstream
*
* @return : la outpoutstream
* @throws IOException : Probleme sur la stream
*/
public ServletOutputStream createOutputStream()
throws IOException
{
final GZIPResponseStream zips = new GZIPResponseStream( origResponse );
zips.setContentType( contentType );
zips.setHeaders( headers );
zips.setIgnoreZip( ignoreZip );
return ( zips );
}
/**
* Cloture des responses
*/
public void finishResponse()
{
try
{
if ( writer != null )
{
writer.close();
}
else
{
if ( stream != null )
{
stream.close();
}
}
}
catch ( final IOException e )
{
;
}
}
/**
* Flush de la stream
*
* @throws IOException : Probleme sur la stream
*/
public void flushBuffer()
throws IOException
{
stream.flush();
}
/**
* @return Recupere la output stream
* @throws IOException : Probleme sur la stream
*/
public ServletOutputStream getOutputStream()
throws IOException
{
if ( writer != null )
{
throw new IllegalStateException( "getWriter() has already been called!" );
}
if ( stream == null )
{
stream = createOutputStream();
}
return ( stream );
}
/**
* @return retourne le Writter
* @throws IOException : Probleme sur la stream
*/
public PrintWriter getWriter()
throws IOException
{
if ( writer != null )
{
return ( writer );
}
if ( stream != null )
{
throw new IllegalStateException( "getOutputStream() has already been called!" );
}
stream = createOutputStream();
writer = new PrintWriter( new OutputStreamWriter( stream, "ISO-8859-1" ) );
return ( writer );
}
/**
* @see javax.servlet.http.HttpServletResponseWrapper#addHeader(java.lang.String, java.lang.String)
*/
public void addHeader( final String arg0, final String arg1 )
{
if ( arg0.equalsIgnoreCase( "Content-Type" ) )
{
setContentType( arg1 );
}
else
{
if ( arg0.equalsIgnoreCase( "Content-Encoding" ) )
{
if ( stream != null )
{
( (GZIPResponseStream) stream ).setIgnoreZip( true );
}
ignoreZip = true;
}
if ( headers == null )
{
headers = new Hashtable();
}
headers.put( arg0, arg1 );
if ( stream != null )
{
( (GZIPResponseStream) stream ).setHeaders( headers );
}
super.addHeader( arg0, arg1 );
}
}
/**
* @see javax.servlet.http.HttpServletResponseWrapper#setHeader(java.lang.String, java.lang.String)
*/
public void setHeader( final String arg0, final String arg1 )
{
if ( arg0.equalsIgnoreCase( "Content-Type" ) )
{
setContentType( arg1 );
}
else
{
if ( arg0.equalsIgnoreCase( "Content-Encoding" ) )
{
if ( stream != null )
{
( (GZIPResponseStream) stream ).setIgnoreZip( true );
}
ignoreZip = true;
}
if ( headers == null )
{
headers = new Hashtable();
}
headers.put( arg0, arg1 );
if ( stream != null )
{
( (GZIPResponseStream) stream ).setHeaders( headers );
}
super.setHeader( arg0, arg1 );
}
}
/**
* @see javax.servlet.ServletResponseWrapper#setContentType(java.lang.String)
*/
public void setContentType( final String arg0 )
{
if ( stream != null )
{
( (GZIPResponseStream) stream ).setContentType( arg0 );
}
super.setContentType( arg0 );
}
/**
* Set le content Lent
*
* @param length Longueur
*/
public void setContentLength( final int length )
{
}
/**
* @return le content Type
*/
public String getContentType()
{
return contentType;
}
}