You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by jo...@apache.org on 2010/12/12 14:24:30 UTC

svn commit: r1044818 - in /httpcomponents/httpclient/trunk/httpclient-cache/src: main/java/org/apache/http/client/cache/ main/java/org/apache/http/impl/client/cache/ test/java/org/apache/http/client/cache/ test/java/org/apache/http/impl/client/cache/

Author: jonm
Date: Sun Dec 12 13:24:29 2010
New Revision: 1044818

URL: http://svn.apache.org/viewvc?rev=1044818&view=rev
Log:
HTTPCLIENT-1032: change variant storage mechanism in HttpCacheEntry from
a Set to a Map; Set-based interface retained for backwards-compatibility.
Currently, the map just maps a variantURI to itself--in essence it is
still really just a set; however, this sets us up for mapping different
variant keys to the same cache key (coming next).

Modified:
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheInvalidator.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/URIExtractor.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/HttpTestUtils.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheInvalidator.java
    httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpCacheEntrySerializers.java

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java Sun Dec 12 13:24:29 2010
@@ -29,7 +29,9 @@ package org.apache.http.client.cache;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.http.Header;
@@ -58,28 +60,16 @@ public class HttpCacheEntry implements S
     private final HeaderGroup responseHeaders;
     private final Resource resource;
     private final Set<String> variantURIs;
+    private final Map<String,String> variantMap;
 
-    /**
-     * Create a new {@link HttpCacheEntry}
-     *
-     * @param requestDate
-     *          Date/time when the request was made (Used for age
-     *            calculations)
-     * @param responseDate
-     *          Date/time that the response came back (Used for age
-     *            calculations)
-     * @param statusLine
-     *          HTTP status line
-     * @param responseHeaders
-     *          Header[] from original HTTP Response
-     */
-    public HttpCacheEntry(
+    private HttpCacheEntry(
             final Date requestDate,
             final Date responseDate,
             final StatusLine statusLine,
             final Header[] responseHeaders,
             final Resource resource,
-            final Set<String> variants) {
+            final Set<String> variants,
+            final Map<String,String> variantMap) {
         super();
         if (requestDate == null) {
             throw new IllegalArgumentException("Request date may not be null");
@@ -102,7 +92,50 @@ public class HttpCacheEntry implements S
         this.responseHeaders = new HeaderGroup();
         this.responseHeaders.setHeaders(responseHeaders);
         this.resource = resource;
-        this.variantURIs = variants != null ? new HashSet<String>(variants) : new HashSet<String>();
+        this.variantURIs = variants != null
+            ? new HashSet<String>(variants) : null;
+        this.variantMap = variantMap != null
+            ? new HashMap<String,String>(variantMap)
+            : null;
+    }
+    
+    /**
+     * Create a new {@link HttpCacheEntry}
+     *
+     * @param requestDate
+     *          Date/time when the request was made (Used for age
+     *            calculations)
+     * @param responseDate
+     *          Date/time that the response came back (Used for age
+     *            calculations)
+     * @param statusLine
+     *          HTTP status line
+     * @param responseHeaders
+     *          Header[] from original HTTP Response
+     */
+    @Deprecated
+    public HttpCacheEntry(
+            final Date requestDate,
+            final Date responseDate,
+            final StatusLine statusLine,
+            final Header[] responseHeaders,
+            final Resource resource,
+            final Set<String> variants) {
+        this(requestDate, responseDate, statusLine, responseHeaders,
+                resource, variants, null);
+    }
+
+    public HttpCacheEntry(Date requestDate, Date responseDate, StatusLine statusLine,
+            Header[] headers, Resource resource) {
+        this(requestDate, responseDate, statusLine, headers, resource, null,
+                new HashMap<String,String>());
+    }
+
+    public HttpCacheEntry(Date requestDate, Date responseDate,
+            StatusLine statusLine, Header[] headers,
+            Resource resource, Map<String, String> variantMap) {
+        this(requestDate, responseDate, statusLine, headers,
+             resource, null, variantMap);
     }
 
     public StatusLine getStatusLine() {
@@ -141,16 +174,28 @@ public class HttpCacheEntry implements S
         return responseHeaders.getHeaders(name);
     }
 
+    public Resource getResource() {
+        return this.resource;
+    }
+    
     public boolean hasVariants() {
         return getFirstHeader(HeaderConstants.VARY) != null;
     }
 
+    @Deprecated
     public Set<String> getVariantURIs() {
-        return Collections.unmodifiableSet(this.variantURIs);
+        if (variantMap != null) {
+            return Collections.unmodifiableSet(new HashSet<String>(variantMap.values()));
+        }
+        return Collections.unmodifiableSet(variantURIs);
     }
 
-    public Resource getResource() {
-        return this.resource;
+    public Map<String, String> getVariantMap() {
+        if (variantMap == null) {
+            throw new UnsupportedOperationException("variant maps not" +
+            		"supported if constructed with deprecated variant set");
+        }
+        return Collections.unmodifiableMap(variantMap);
     }
 
     @Override
@@ -158,5 +203,4 @@ public class HttpCacheEntry implements S
         return "[request date=" + this.requestDate + "; response date=" + this.responseDate
                 + "; statusLine=" + this.statusLine + "]";
     }
-
 }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCache.java Sun Dec 12 13:24:29 2010
@@ -28,7 +28,9 @@ package org.apache.http.impl.client.cach
 
 import java.io.IOException;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.logging.Log;
@@ -165,8 +167,9 @@ class BasicHttpCache implements HttpCach
         if (src == null) {
             src = entry;
         }
-        Set<String> variants = new HashSet<String>(src.getVariantURIs());
-        variants.add(variantURI);
+        
+        Map<String,String> variantMap = new HashMap<String,String>(src.getVariantMap());
+        variantMap.put(variantURI, variantURI);
         Resource resource = resourceFactory.copy(requestId, src.getResource());
         return new HttpCacheEntry(
                 src.getRequestDate(),
@@ -174,7 +177,7 @@ class BasicHttpCache implements HttpCach
                 src.getStatusLine(),
                 src.getAllHeaders(),
                 resource,
-                variants);
+                variantMap);
     }
 
     public HttpCacheEntry updateCacheEntry(HttpHost target, HttpRequest request,
@@ -211,8 +214,7 @@ class BasicHttpCache implements HttpCach
                 responseReceived,
                 originResponse.getStatusLine(),
                 originResponse.getAllHeaders(),
-                resource,
-                null);
+                resource);
         storeInCache(host, request, entry);
         return responseGenerator.generateResponse(entry);
     }
@@ -243,7 +245,7 @@ class BasicHttpCache implements HttpCach
         HttpCacheEntry root = storage.getEntry(uriExtractor.getURI(host, request));
         if (root != null) {
             if (root.hasVariants()) {
-                for(String variantUri : root.getVariantURIs()) {
+                for(String variantUri : root.getVariantMap().values()) {
                     variants.add(storage.getEntry(variantUri));
                 }
             }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java Sun Dec 12 13:24:29 2010
@@ -93,8 +93,7 @@ class CacheEntryUpdater {
                 responseDate,
                 entry.getStatusLine(),
                 mergedHeaders,
-                resource,
-                null);
+                resource);
     }
 
     protected Header[] mergeHeaders(HttpCacheEntry entry, HttpResponse response) {

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheInvalidator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheInvalidator.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheInvalidator.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheInvalidator.java Sun Dec 12 13:24:29 2010
@@ -86,7 +86,7 @@ class CacheInvalidator {
             log.debug("parent entry: " + parent);
 
             if (parent != null) {
-                for (String variantURI : parent.getVariantURIs()) {
+                for (String variantURI : parent.getVariantMap().values()) {
                     storage.removeEntry(variantURI);
                 }
                 storage.removeEntry(theUri);

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/URIExtractor.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/URIExtractor.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/URIExtractor.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/URIExtractor.java Sun Dec 12 13:24:29 2010
@@ -140,7 +140,10 @@ class URIExtractor {
         if (varyHdrs == null || varyHdrs.length == 0) {
             return getURI(host, req);
         }
+        return getVariantKey(req, varyHdrs) + getURI(host, req);
+    }
 
+    public String getVariantKey(HttpRequest req, Header[] varyHdrs) {
         List<String> variantHeaderNames = new ArrayList<String>();
         for (Header varyHdr : varyHdrs) {
             for (HeaderElement elt : varyHdr.getElements()) {
@@ -149,8 +152,9 @@ class URIExtractor {
         }
         Collections.sort(variantHeaderNames);
 
+        StringBuilder buf;
         try {
-            StringBuilder buf = new StringBuilder("{");
+            buf = new StringBuilder("{");
             boolean first = true;
             for (String headerName : variantHeaderNames) {
                 if (!first) {
@@ -163,11 +167,10 @@ class URIExtractor {
                 first = false;
             }
             buf.append("}");
-            buf.append(getURI(host, req));
-            return buf.toString();
         } catch (UnsupportedEncodingException uee) {
             throw new RuntimeException("couldn't encode to UTF-8", uee);
         }
+        return buf.toString();
     }
 
 }
\ No newline at end of file

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java Sun Dec 12 13:24:29 2010
@@ -30,7 +30,9 @@ import static org.easymock.classextensio
 import static org.junit.Assert.*;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.http.Header;
@@ -65,7 +67,7 @@ public class TestHttpCacheEntry {
 
     private HttpCacheEntry makeEntry(Header[] headers) {
         return new HttpCacheEntry(elevenSecondsAgo, nineSecondsAgo,
-                statusLine, headers, mockResource, null);
+                statusLine, headers, mockResource);
     }
 
     @Test
@@ -142,7 +144,7 @@ public class TestHttpCacheEntry {
     public void mustProvideRequestDate() {
         try {
             new HttpCacheEntry(null, new Date(), statusLine,
-                    new Header[]{}, mockResource, null);
+                    new Header[]{}, mockResource);
             fail("Should have thrown exception");
         } catch (IllegalArgumentException expected) {
         }
@@ -152,7 +154,7 @@ public class TestHttpCacheEntry {
     public void mustProvideResponseDate() {
         try {
             new HttpCacheEntry(new Date(), null, statusLine,
-                    new Header[]{}, mockResource, null);
+                    new Header[]{}, mockResource);
             fail("Should have thrown exception");
         } catch (IllegalArgumentException expected) {
         }
@@ -162,7 +164,7 @@ public class TestHttpCacheEntry {
     public void mustProvideStatusLine() {
         try {
             new HttpCacheEntry(new Date(), new Date(), null,
-                    new Header[]{}, mockResource, null);
+                    new Header[]{}, mockResource);
             fail("Should have thrown exception");
         } catch (IllegalArgumentException expected) {
         }
@@ -172,7 +174,7 @@ public class TestHttpCacheEntry {
     public void mustProvideResponseHeaders() {
         try {
             new HttpCacheEntry(new Date(), new Date(), statusLine,
-                    null, mockResource, null);
+                    null, mockResource);
             fail("Should have thrown exception");
         } catch (IllegalArgumentException expected) {
         }
@@ -182,29 +184,23 @@ public class TestHttpCacheEntry {
     public void mustProvideResource() {
         try {
             new HttpCacheEntry(new Date(), new Date(), statusLine,
-                    new Header[]{}, null, null);
+                    new Header[]{}, null);
             fail("Should have thrown exception");
         } catch (IllegalArgumentException expected) {
         }
     }
 
     @Test
-    public void canProvideVariantSet() {
-        new HttpCacheEntry(new Date(), new Date(), statusLine,
-                new Header[]{}, mockResource, new HashSet<String>());
-    }
-
-    @Test
     public void canRetrieveOriginalStatusLine() {
         entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertSame(statusLine, entry.getStatusLine());
     }
 
     @Test
     public void protocolVersionComesFromOriginalStatusLine() {
         entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertSame(statusLine.getProtocolVersion(),
                 entry.getProtocolVersion());        
     }
@@ -212,14 +208,14 @@ public class TestHttpCacheEntry {
     @Test
     public void reasonPhraseComesFromOriginalStatusLine() {
         entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertSame(statusLine.getReasonPhrase(), entry.getReasonPhrase());        
     }
 
     @Test
     public void statusCodeComesFromOriginalStatusLine() {
         entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertEquals(statusLine.getStatusCode(), entry.getStatusCode());        
     }
 
@@ -227,7 +223,7 @@ public class TestHttpCacheEntry {
     public void canGetOriginalRequestDate() {
         final Date requestDate = new Date();
         entry = new HttpCacheEntry(requestDate, new Date(), statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertSame(requestDate, entry.getRequestDate());        
     }
 
@@ -235,14 +231,14 @@ public class TestHttpCacheEntry {
     public void canGetOriginalResponseDate() {
         final Date responseDate = new Date();
         entry = new HttpCacheEntry(new Date(), responseDate, statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertSame(responseDate, entry.getResponseDate());        
     }
 
     @Test
     public void canGetOriginalResource() {
         entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertSame(mockResource, entry.getResource());        
     }
 
@@ -253,7 +249,7 @@ public class TestHttpCacheEntry {
                 new BasicHeader("Date", DateUtils.formatDate(now))
         };
         entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
-                headers, mockResource, null);
+                headers, mockResource);
         Header[] result = entry.getAllHeaders();
         assertEquals(headers.length, result.length);
         for(int i=0; i<headers.length; i++) {
@@ -261,6 +257,7 @@ public class TestHttpCacheEntry {
         }
     }
 
+    @SuppressWarnings("deprecation")
     @Test
     public void canRetrieveOriginalVariantSet() {
         Set<String> variants = new HashSet<String>();
@@ -275,6 +272,22 @@ public class TestHttpCacheEntry {
         }
     }
 
+    @SuppressWarnings("deprecation")
+    @Test
+    public void throwsExceptionWhenRetrievingVariantMapIfConstructedWithVariantSet() {
+        Set<String> variants = new HashSet<String>();
+        variants.add("variant1");
+        variants.add("variant2");
+        entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
+                new Header[]{}, mockResource, variants);
+        try {
+            entry.getVariantMap();
+            fail("should have thrown exception");
+        } catch (UnsupportedOperationException expected) {
+        }
+    }
+    
+    @SuppressWarnings("deprecation")
     @Test
     public void variantSetIsNotModifiable() {
         Set<String> variants = new HashSet<String>();
@@ -294,11 +307,74 @@ public class TestHttpCacheEntry {
         } catch (UnsupportedOperationException expected) {
         }
     }
+    
+    @Test
+    public void canConstructWithoutVariants() {
+        new HttpCacheEntry(new Date(), new Date(), statusLine,
+                new Header[]{}, mockResource);
+    }
+
+    @Test
+    public void canProvideVariantMap() {
+        new HttpCacheEntry(new Date(), new Date(), statusLine,
+                new Header[]{}, mockResource,
+                new HashMap<String,String>());
+    }
+    
+    @Test
+    public void canRetrieveOriginalVariantMap() {
+        Map<String,String> variantMap = new HashMap<String,String>();
+        variantMap.put("A","B");
+        variantMap.put("C","D");
+        entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
+                new Header[]{}, mockResource,
+                variantMap);
+        Map<String,String> result = entry.getVariantMap();
+        assertEquals(2, result.size());
+        assertEquals("B", result.get("A"));
+        assertEquals("D", result.get("C"));
+    }
 
+    @SuppressWarnings("deprecation")
+    @Test
+    public void returnsVariantMapValuesForVariantSet() {
+        Map<String,String> variantMap = new HashMap<String,String>();
+        variantMap.put("A","B");
+        variantMap.put("C","D");
+        entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
+                new Header[]{}, mockResource,
+                variantMap);
+        Set<String> result = entry.getVariantURIs();
+        assertEquals(2, result.size());
+        assertTrue(result.contains("B"));
+        assertTrue(result.contains("D"));
+    }
+    
+    @Test
+    public void retrievedVariantMapIsNotModifiable() {
+        Map<String,String> variantMap = new HashMap<String,String>();
+        variantMap.put("A","B");
+        variantMap.put("C","D");
+        entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
+                new Header[]{}, mockResource,
+                variantMap);
+        Map<String,String> result = entry.getVariantMap();
+        try {
+            result.remove("A");
+            fail("Should have thrown exception");
+        } catch (UnsupportedOperationException expected) {
+        }
+        try {
+            result.put("E","F");
+            fail("Should have thrown exception");
+        } catch (UnsupportedOperationException expected) {
+        }
+    }
+    
     @Test
     public void canConvertToString() {
         entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
-                new Header[]{}, mockResource, null);
+                new Header[]{}, mockResource);
         assertNotNull(entry.toString());
         assertFalse("".equals(entry.toString()));
     }

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/HttpTestUtils.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/HttpTestUtils.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/HttpTestUtils.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/HttpTestUtils.java Sun Dec 12 13:24:29 2010
@@ -28,9 +28,8 @@ package org.apache.http.impl.client.cach
 
 import java.io.InputStream;
 import java.util.Date;
+import java.util.Map;
 import java.util.Random;
-import java.util.Set;
-
 import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpMessage;
@@ -254,24 +253,24 @@ public class HttpTestUtils {
 
     public static HttpCacheEntry makeCacheEntry(Date requestDate,
             Date responseDate, Header[] headers, byte[] bytes) {
-        Set<String> variants = null;
+        Map<String,String> variantMap = null;
         return makeCacheEntry(requestDate, responseDate, headers, bytes,
-                variants);
+                variantMap);
     }
 
-    public static HttpCacheEntry makeCacheEntry(Set<String> variants) {
+    public static HttpCacheEntry makeCacheEntry(Map<String,String> variantMap) {
         Date now = new Date();
         return makeCacheEntry(now, now, getStockHeaders(now),
-                getRandomBytes(128), variants);
+                getRandomBytes(128), variantMap);
     }
-
+    
     public static HttpCacheEntry makeCacheEntry(Date requestDate,
             Date responseDate, Header[] headers, byte[] bytes,
-            Set<String> variants) {
+            Map<String,String> variantMap) {
         StatusLine statusLine = new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
-        return new HttpCacheEntry(requestDate, responseDate, statusLine, headers, new HeapResource(bytes), variants);
+        return new HttpCacheEntry(requestDate, responseDate, statusLine, headers, new HeapResource(bytes), variantMap);
     }
-
+    
     public static HttpCacheEntry makeCacheEntry(Header[] headers, byte[] bytes) {
         Date now = new Date();
         return makeCacheEntry(now, now, headers, bytes);

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestBasicHttpCache.java Sun Dec 12 13:24:29 2010
@@ -35,7 +35,8 @@ import static org.junit.Assert.assertTru
 
 import java.io.InputStream;
 import java.util.Date;
-import java.util.HashSet;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.http.Header;
@@ -198,15 +199,15 @@ public class TestBasicHttpCache {
         final String parentKey = "parentKey";
         final String variantKey = "variantKey";
         final String existingVariantKey = "existingVariantKey";
-        final Set<String> existingVariants = new HashSet<String>();
-        existingVariants.add(existingVariantKey);
+        final Map<String,String> existingVariants = new HashMap<String,String>();
+        existingVariants.put(existingVariantKey,existingVariantKey);
         final HttpCacheEntry parent = HttpTestUtils.makeCacheEntry(existingVariants);
         final HttpCacheEntry variant = HttpTestUtils.makeCacheEntry();
 
         HttpCacheEntry result = impl.doGetUpdatedParentEntry(parentKey, parent, variant, variantKey);
-        assertEquals(2, result.getVariantURIs().size());
-        assertTrue(result.getVariantURIs().contains(existingVariantKey));
-        assertTrue(result.getVariantURIs().contains(variantKey));
+        assertEquals(2, result.getVariantMap().size());
+        assertTrue(result.getVariantMap().containsKey(existingVariantKey));
+        assertTrue(result.getVariantMap().containsKey(variantKey));
     }
 
     @Test

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheInvalidator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheInvalidator.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheInvalidator.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheInvalidator.java Sun Dec 12 13:24:29 2010
@@ -27,9 +27,8 @@
 package org.apache.http.impl.client.cache;
 
 import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpRequest;
@@ -78,8 +77,8 @@ public class TestCacheInvalidator {
         HttpRequest request = new BasicHttpRequest("POST","/path", HTTP_1_1);
 
         final String theUri = "http://foo.example.com:80/path";
-        Set<String> variantURIs = new HashSet<String>();
-        cacheEntryHasVariantURIs(variantURIs);
+        Map<String,String> variantMap = new HashMap<String,String>();
+        cacheEntryHasVariantMap(variantMap);
 
         cacheReturnsEntryForUri(theUri);
         entryIsRemoved(theUri);
@@ -100,8 +99,7 @@ public class TestCacheInvalidator {
         request.setHeader("Content-Location", contentLocation);
 
         final String theUri = "http://foo.example.com:80/";
-        Set<String> variantURIs = new HashSet<String>();
-        cacheEntryHasVariantURIs(variantURIs);
+        cacheEntryHasVariantMap(new HashMap<String,String>());
 
         cacheReturnsEntryForUri(theUri);
         entryIsRemoved(theUri);
@@ -124,8 +122,7 @@ public class TestCacheInvalidator {
         request.setHeader("Location",contentLocation);
 
         final String theUri = "http://foo.example.com:80/";
-        Set<String> variantURIs = new HashSet<String>();
-        cacheEntryHasVariantURIs(variantURIs);
+        cacheEntryHasVariantMap(new HashMap<String,String>());
 
         cacheReturnsEntryForUri(theUri);
         entryIsRemoved(theUri);
@@ -148,8 +145,7 @@ public class TestCacheInvalidator {
         request.setHeader("Content-Location",relativePath);
 
         final String theUri = "http://foo.example.com:80/";
-        Set<String> variantURIs = new HashSet<String>();
-        cacheEntryHasVariantURIs(variantURIs);
+        cacheEntryHasVariantMap(new HashMap<String,String>());
 
         cacheReturnsEntryForUri(theUri);
         entryIsRemoved(theUri);
@@ -172,8 +168,7 @@ public class TestCacheInvalidator {
         request.setHeader("Content-Location",contentLocation);
 
         final String theUri = "http://foo.example.com:80/";
-        Set<String> variantURIs = new HashSet<String>();
-        cacheEntryHasVariantURIs(variantURIs);
+        cacheEntryHasVariantMap(new HashMap<String,String>());
 
         cacheReturnsEntryForUri(theUri);
         entryIsRemoved(theUri);
@@ -238,11 +233,11 @@ public class TestCacheInvalidator {
         final String theUri = "http://foo.example.com:80/";
         final String variantUri = "theVariantURI";
 
-        Set<String> listOfURIs = new HashSet<String>();
-        listOfURIs.add(variantUri);
+        Map<String,String> mapOfURIs = new HashMap<String,String>();
+        mapOfURIs.put(variantUri,variantUri);
 
         cacheReturnsEntryForUri(theUri);
-        cacheEntryHasVariantURIs(listOfURIs);
+        cacheEntryHasVariantMap(mapOfURIs);
 
         entryIsRemoved(variantUri);
         entryIsRemoved(theUri);
@@ -264,10 +259,8 @@ public class TestCacheInvalidator {
     }
 
     // Expectations
-
-
-    private void cacheEntryHasVariantURIs(Set<String> variantURIs) {
-        org.easymock.EasyMock.expect(mockEntry.getVariantURIs()).andReturn(variantURIs);
+    private void cacheEntryHasVariantMap(Map<String,String> variantMap) {
+        org.easymock.EasyMock.expect(mockEntry.getVariantMap()).andReturn(variantMap);
     }
 
     private void cacheReturnsEntryForUri(String theUri) throws IOException {

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpCacheEntrySerializers.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpCacheEntrySerializers.java?rev=1044818&r1=1044817&r2=1044818&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpCacheEntrySerializers.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestHttpCacheEntrySerializers.java Sun Dec 12 13:24:29 2010
@@ -34,11 +34,11 @@ import java.io.UnsupportedEncodingExcept
 import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
-import junit.framework.TestCase;
-
 import org.apache.commons.codec.binary.Base64;
 import org.apache.http.Header;
 import org.apache.http.ProtocolVersion;
@@ -48,30 +48,46 @@ import org.apache.http.client.cache.Http
 import org.apache.http.client.cache.Resource;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.message.BasicStatusLine;
+import static org.junit.Assert.*;
+import org.junit.Before;
+import org.junit.Test;
 
-public class TestHttpCacheEntrySerializers extends TestCase {
+public class TestHttpCacheEntrySerializers {
 
     private static final Charset UTF8 = Charset.forName("UTF-8");
 
-    public void testDefaultSerializer() throws Exception {
-        readWriteVerify(new DefaultHttpCacheEntrySerializer());
+    private HttpCacheEntrySerializer impl;
+    
+    @Before
+    public void setUp() {
+        impl = new DefaultHttpCacheEntrySerializer();
+    }
+    
+    @Test
+    public void canSerializeOldEntriesWithVariantSets() throws Exception {
+        readWriteVerify(makeCacheEntryWithOldVariantSet());
     }
 
-    public void readWriteVerify(HttpCacheEntrySerializer serializer) throws IOException {
+    @Test
+    public void canSerializeEntriesWithVariantMaps() throws Exception {
+        readWriteVerify(makeCacheEntryWithVariantMap());
+    }
+
+    public void readWriteVerify(HttpCacheEntry writeEntry) throws IOException {
         // write the entry
-        HttpCacheEntry writeEntry = newCacheEntry();
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        serializer.writeTo(writeEntry, out);
+        impl.writeTo(writeEntry, out);
 
         // read the entry
         ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-        HttpCacheEntry readEntry = serializer.readFrom(in);
+        HttpCacheEntry readEntry = impl.readFrom(in);
 
         // compare
         assertTrue(areEqual(readEntry, writeEntry));
     }
 
-    private HttpCacheEntry newCacheEntry() throws UnsupportedEncodingException {
+    @SuppressWarnings("deprecation")
+    private HttpCacheEntry makeCacheEntryWithOldVariantSet() throws UnsupportedEncodingException {
         Header[] headers = new Header[5];
         for (int i = 0; i < headers.length; i++) {
             headers[i] = new BasicHeader("header" + i, "value" + i);
@@ -83,7 +99,6 @@ public class TestHttpCacheEntrySerialize
         Set<String> variants = new HashSet<String>();
         variants.add("test variant 1");
         variants.add("test variant 2");
-
         HttpCacheEntry cacheEntry = new HttpCacheEntry(new Date(), new Date(),
                 slObj, headers, new HeapResource(Base64.decodeBase64(body
                         .getBytes(UTF8.name()))), variants);
@@ -91,6 +106,25 @@ public class TestHttpCacheEntrySerialize
         return cacheEntry;
     }
 
+    private HttpCacheEntry makeCacheEntryWithVariantMap() throws UnsupportedEncodingException {
+        Header[] headers = new Header[5];
+        for (int i = 0; i < headers.length; i++) {
+            headers[i] = new BasicHeader("header" + i, "value" + i);
+        }
+        String body = "Lorem ipsum dolor sit amet";
+
+        ProtocolVersion pvObj = new ProtocolVersion("HTTP", 1, 1);
+        StatusLine slObj = new BasicStatusLine(pvObj, 200, "ok");
+        Map<String,String> variantMap = new HashMap<String,String>();
+        variantMap.put("test variant 1","true");
+        variantMap.put("test variant 2","true");
+        HttpCacheEntry cacheEntry = new HttpCacheEntry(new Date(), new Date(),
+                slObj, headers, new HeapResource(Base64.decodeBase64(body
+                        .getBytes(UTF8.name()))), variantMap);
+
+        return cacheEntry;
+    }
+    
     private boolean areEqual(HttpCacheEntry one, HttpCacheEntry two) throws IOException {
         // dates are only stored with second precision, so scrub milliseconds
         if (!((one.getRequestDate().getTime() / 1000) == (two.getRequestDate()