/* * Copyright 2012 The Solmix Project * * This 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 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.gnu.org/licenses/ * or see the FSF site: http://www.fsf.org. */ package org.solmix.web.filter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.solmix.api.context.WebContext; import org.solmix.api.context.WebContextFactory; import org.solmix.api.interfaces.CompressionService; import org.solmix.web.ServletTools; import org.solmix.web.compression.CompressionServiceImpl; import org.solmix.web.context.WebContextFactoryImpl; /** * * @author solmix.f@gmail.com * @version 110035 2011-6-7 */ public class CompressionFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(CompressionFilter.class.getName()); private CompressionService compression; private WebContextFactory contextFactory; private ServletContext servletContext; private List<String> compressableMimeTypes; protected int compressThreshold = 250; /** * @return the compressableMimeTypes */ public List<String> getCompressableMimeTypes() { return compressableMimeTypes; } /** * @param compressableMimeTypes the compressableMimeTypes to set */ public void setCompressableMimeTypes(List<String> compressableMimeTypes) { this.compressableMimeTypes = compressableMimeTypes; } CompressionFilter() { compressableMimeTypes = null; } @Override public void init(FilterConfig filterConfig) throws ServletException { compression = new CompressionServiceImpl(); contextFactory=WebContextFactoryImpl.getInstance(); this.servletContext = filterConfig.getServletContext(); } /** * @return the compressThreshold */ public int getCompressThreshold() { return compressThreshold; } /** * @param compressThreshold the compressThreshold to set */ public void setCompressThreshold(int compressThreshold) { this.compressThreshold = compressThreshold; } /** * {@inheritDoc} * * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, * javax.servlet.FilterChain) */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (compression == null) return; HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; WebContext context = null; String mimeType = null; boolean compress = false; try { context = contextFactory.createWebContext(req, resp, servletContext); mimeType = ServletTools.mimeTypeForContext(context); compress = true; } catch (Exception e) { e.printStackTrace(); } boolean mimeTypeCompressable; if (mimeType == null || ServletTools.compressionEnabledForMimeType(mimeType, compressableMimeTypes)) if (ServletTools.compressionWorksForMimeType(context, mimeType)) mimeTypeCompressable = true; if (!ServletTools.compressionEnabled()) { compress = false; log.debug("Compression is disabled in config - not compressing"); } if (compress && !ServletTools.compressionWorksForContext(context)) compress = false; if (compress && !ServletTools.browserClaimsGZSupport(req) && !ServletTools.alwaysCompressMimeType(mimeType)) { compress = false; log.debug("Browser is not compression-capable - not compressing"); } if (compress) { chain.doFilter(req, resp); } ByteArrayOutputStream wrapBuf = new ByteArrayOutputStream(); OutputStream out = response.getOutputStream(); wrapBuf.writeTo(out); try { this.compression.compressAndSend(context, wrapBuf, compressThreshold); } catch (Exception e) { e.printStackTrace(); } response.flushBuffer(); } /** * {@inheritDoc} * * @see javax.servlet.Filter#destroy() */ @Override public void destroy() { compression=null; } }