You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by rm...@apache.org on 2014/05/11 14:24:40 UTC

svn commit: r1593784 - in /commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web: InMemoryResponse.java JCacheFilter.java

Author: rmannibucau
Date: Sun May 11 12:24:40 2014
New Revision: 1593784

URL: http://svn.apache.org/r1593784
Log:
adding basic gzip support in JCacheFilter

Modified:
    commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/InMemoryResponse.java
    commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/JCacheFilter.java

Modified: commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/InMemoryResponse.java
URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/InMemoryResponse.java?rev=1593784&r1=1593783&r2=1593784&view=diff
==============================================================================
--- commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/InMemoryResponse.java (original)
+++ commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/InMemoryResponse.java Sun May 11 12:24:40 2014
@@ -22,7 +22,6 @@ import javax.servlet.ServletOutputStream
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -38,7 +37,7 @@ import java.util.concurrent.CopyOnWriteA
 
 public class InMemoryResponse extends HttpServletResponseWrapper implements Serializable
 {
-    private final ByteArrayOutputStream buffer;
+    private final OutputStream buffer;
 
     private final Collection<Cookie> cookies = new CopyOnWriteArraySet<Cookie>();
     private final Map<String, List<Serializable>> headers = new TreeMap<String, List<Serializable>>(String.CASE_INSENSITIVE_ORDER);
@@ -47,7 +46,7 @@ public class InMemoryResponse extends Ht
     private PrintWriter writer;
     private int contentLength;
 
-    public InMemoryResponse(final HttpServletResponse response, final ByteArrayOutputStream baos)
+    public InMemoryResponse(final HttpServletResponse response, final OutputStream baos)
     {
         super(response);
         this.buffer = baos;
@@ -254,6 +253,10 @@ public class InMemoryResponse extends Ht
         {
             writer.flush();
         }
+        else
+        {
+            buffer.flush();
+        }
         super.flushBuffer();
     }
 
@@ -271,9 +274,4 @@ public class InMemoryResponse extends Ht
     {
         return headers;
     }
-
-    public byte[] getOut()
-    {
-        return buffer.toByteArray();
-    }
 }

Modified: commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/JCacheFilter.java
URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/JCacheFilter.java?rev=1593784&r1=1593783&r2=1593784&view=diff
==============================================================================
--- commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/JCacheFilter.java (original)
+++ commons/proper/jcs/trunk/commons-jcs-jcache-extras/src/main/java/org/apache/commons/jcs/jcache/extras/web/JCacheFilter.java Sun May 11 12:24:40 2014
@@ -39,19 +39,23 @@ import javax.servlet.http.HttpServletRes
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.io.Serializable;
 import java.net.URI;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.zip.GZIPOutputStream;
 
 import static java.util.Collections.list;
 import static javax.servlet.http.HttpServletResponse.SC_OK;
 
 public class JCacheFilter implements Filter
 {
-    private Cache<String, Page> cache;
+    private Cache<PageKey, Page> cache;
     private CachingProvider provider;
     private CacheManager manager;
 
@@ -85,17 +89,17 @@ public class JCacheFilter implements Fil
         cache = manager.getCache(cacheName);
         if (cache == null)
         {
-            final MutableConfiguration<String, Page> configuration = new MutableConfiguration<String, Page>()
+            final MutableConfiguration<PageKey, Page> configuration = new MutableConfiguration<PageKey, Page>()
                     .setStoreByValue(false);
             configuration.setReadThrough("true".equals(properties.getProperty("read-through", "false")));
             configuration.setWriteThrough("true".equals(properties.getProperty("write-through", "false")));
             if (configuration.isReadThrough())
             {
-                configuration.setCacheLoaderFactory(new FactoryBuilder.ClassFactory<CacheLoader<String, Page>>(properties.getProperty("cache-loader-factory")));
+                configuration.setCacheLoaderFactory(new FactoryBuilder.ClassFactory<CacheLoader<PageKey, Page>>(properties.getProperty("cache-loader-factory")));
             }
             if (configuration.isWriteThrough())
             {
-                configuration.setCacheWriterFactory(new FactoryBuilder.ClassFactory<CacheWriter<? super String, ? super Page>>(properties.getProperty("cache-writer-factory")));
+                configuration.setCacheWriterFactory(new FactoryBuilder.ClassFactory<CacheWriter<? super PageKey, ? super Page>>(properties.getProperty("cache-writer-factory")));
             }
             final String expirtyPolicy = properties.getProperty("expiry-policy-factory");
             if (expirtyPolicy != null)
@@ -111,15 +115,37 @@ public class JCacheFilter implements Fil
     @Override
     public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException
     {
+        boolean gzip = false;
+        if (HttpServletRequest.class.isInstance(servletRequest))
+        {
+            final Enumeration<String> acceptEncoding = HttpServletRequest.class.cast(servletRequest).getHeaders("Accept-Encoding");
+            while (acceptEncoding != null && acceptEncoding.hasMoreElements())
+            {
+                if ("gzip".equals(acceptEncoding.nextElement()))
+                {
+                    gzip = true;
+                    break;
+                }
+            }
+        }
+
         final HttpServletResponse httpServletResponse = HttpServletResponse.class.cast(servletResponse);
         checkResponse(httpServletResponse);
 
-        final String key = key(servletRequest);
+        final PageKey key = new PageKey(key(servletRequest), gzip);
         Page page = cache.get(key);
         if (page == null)
         {
             final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            final InMemoryResponse response = new InMemoryResponse(httpServletResponse, baos);
+            final InMemoryResponse response;
+            if (gzip)
+            {
+                response = new InMemoryResponse(httpServletResponse, new GZIPOutputStream(baos));
+            }
+            else
+            {
+                response = new InMemoryResponse(httpServletResponse, baos);
+            }
             filterChain.doFilter(servletRequest, response);
             response.flushBuffer();
 
@@ -129,13 +155,18 @@ public class JCacheFilter implements Fil
                     response.getContentLength(),
                     response.getCookies(),
                     response.getHeaders(),
-                    response.getOut());
+                    baos.toByteArray());
             cache.put(key, page);
         }
 
         if (page.status == SC_OK) {
             checkResponse(httpServletResponse);
 
+            if (gzip)
+            {
+                httpServletResponse.setHeader("Content-Encoding", "gzip");
+            }
+
             httpServletResponse.setStatus(page.status);
             if (page.contentType != null)
             {
@@ -212,6 +243,47 @@ public class JCacheFilter implements Fil
         provider.close();
     }
 
+    protected static class PageKey implements Serializable {
+        private final String uri;
+        private boolean gzip;
+
+        public PageKey(final String uri, final boolean gzip)
+        {
+            this.uri = uri;
+            this.gzip = gzip;
+        }
+
+        public void setGzip(final boolean gzip)
+        {
+            this.gzip = gzip;
+        }
+
+        @Override
+        public boolean equals(final Object o)
+        {
+            if (this == o)
+            {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass())
+            {
+                return false;
+            }
+
+            final PageKey pageKey = PageKey.class.cast(o);
+            return gzip == pageKey.gzip && uri.equals(pageKey.uri);
+
+        }
+
+        @Override
+        public int hashCode()
+        {
+            int result = uri.hashCode();
+            result = 31 * result + (gzip ? 1 : 0);
+            return result;
+        }
+    }
+
     protected static class Page implements Serializable {
         private final int status;
         private final String contentType;
@@ -232,5 +304,39 @@ public class JCacheFilter implements Fil
             this.headers = headers;
             this.out = out;
         }
+
+        @Override
+        public boolean equals(final Object o)
+        {
+            if (this == o)
+            {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass())
+            {
+                return false;
+            }
+
+            final Page page = Page.class.cast(o);
+            return contentLength == page.contentLength
+                    && status == page.status
+                    && !(contentType != null ? !contentType.equals(page.contentType) : page.contentType != null)
+                    && cookies.equals(page.cookies)
+                    && headers.equals(page.headers)
+                    && Arrays.equals(out, page.out);
+
+        }
+
+        @Override
+        public int hashCode()
+        {
+            int result = status;
+            result = 31 * result + (contentType != null ? contentType.hashCode() : 0);
+            result = 31 * result + contentLength;
+            result = 31 * result + cookies.hashCode();
+            result = 31 * result + headers.hashCode();
+            result = 31 * result + Arrays.hashCode(out);
+            return result;
+        }
     }
 }