001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/enterprise/servlet/GZIPFilter.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.IOException;
015    
016    import javax.servlet.Filter;
017    import javax.servlet.FilterChain;
018    import javax.servlet.FilterConfig;
019    import javax.servlet.ServletException;
020    import javax.servlet.ServletRequest;
021    import javax.servlet.ServletResponse;
022    import javax.servlet.http.HttpServletRequest;
023    import javax.servlet.http.HttpServletResponse;
024    
025    import org.deegree.framework.log.ILogger;
026    import org.deegree.framework.log.LoggerFactory;
027    
028    /**
029     * ServletFilter that enables compression of response content, if the client supports GZIP compression
030     * (accept-encoding=gzip ...).
031     * 
032     * @author <a href="mailto:jayson@jspinsider.com">Jayson Falkner</a>
033     * @author last edited by: $Author: mschneider $
034     * 
035     * @version $Revision: 20326 $, $Date: 2009-10-22 18:41:56 +0200 (Do, 22. Okt 2009) $
036     */
037    public class GZIPFilter implements Filter {
038    
039        private static final ILogger LOG = LoggerFactory.getLogger( GZIPFilter.class );
040    
041        /**
042         * @param req
043         * @param res
044         * @param chain
045         * @throws IOException
046         * @throws ServletException
047         */
048        public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain )
049                                throws IOException, ServletException {
050            if ( req instanceof HttpServletRequest ) {
051                HttpServletRequest request = (HttpServletRequest) req;
052                HttpServletResponse response = (HttpServletResponse) res;
053                String ae = request.getHeader( "accept-encoding" );
054                if ( ae != null && ae.indexOf( "gzip" ) != -1 ) {
055                    LOG.logDebug( "GZIP supported, compressing." );
056                    GZIPResponseWrapper wrappedResponse = new GZIPResponseWrapper( response );
057                    chain.doFilter( req, wrappedResponse );
058                    wrappedResponse.finishResponse();
059                    return;
060                }
061                chain.doFilter( req, res );
062            }
063        }
064    
065        /**
066         * @param filterConfig
067         */
068        public void init( FilterConfig filterConfig ) {
069            // noop
070        }
071    
072        /**
073         *
074         */
075        public void destroy() {
076            // noop
077        }
078    }