From cac1432472a1bec4c39482c12cc993d23473683f Mon Sep 17 00:00:00 2001 From: Jonathan Moore Date: Tue, 17 Jan 2012 21:35:08 +0000 Subject: [PATCH] HTTPCLIENT-1154: MemcachedHttpCacheStorage should allow client to specify custom prefix string for keys. This is implemented by providing a decorator KeyHashingScheme that adds the prefix. git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1232588 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE_NOTES.txt | 8 +++++ .../memcached/PrefixKeyHashingScheme.java | 34 +++++++++++++++++++ .../memcached/SHA256KeyHashingScheme.java | 4 ++- .../memcached/TestPrefixKeyHashingScheme.java | 32 +++++++++++++++++ .../memcached/TestSHA256HashingScheme.java | 1 + 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/PrefixKeyHashingScheme.java create mode 100644 httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestPrefixKeyHashingScheme.java diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 23716c27d..792878152 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,5 +1,13 @@ Changes since 4.2 ALPHA1 ------------------- +* [HTTPCLIENT-1154] MemcachedHttpCacheStorage should allow client to + specify custom prefix string for keys. + Contributed by Jon Moore . + +* [HTTPCLIENT-1153] MemcachedHttpCacheStorage uses URL as cache key; + shouldn't due to fixed maximum-length memcached keys. + Contributed by Jon Moore . + * [HTTPCLIENT-1157] MemcachedHttpCacheStroage should throw IOExceptions instead of RuntimeExceptions. Contributed by James Miller . diff --git a/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/PrefixKeyHashingScheme.java b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/PrefixKeyHashingScheme.java new file mode 100644 index 000000000..e3a841fb9 --- /dev/null +++ b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/PrefixKeyHashingScheme.java @@ -0,0 +1,34 @@ +package org.apache.http.impl.client.cache.memcached; + +import org.apache.http.client.cache.memcached.KeyHashingScheme; + +/** + * This is a {@link KeyHashingScheme} decorator that simply adds + * a known prefix to the results of another KeyHashingScheme. + * Primarily useful for namespacing a shared memcached cluster, for + * example. + */ +public class PrefixKeyHashingScheme implements KeyHashingScheme { + + private String prefix; + private KeyHashingScheme backingScheme; + + /** + * Creates a new {@link KeyHashingScheme} that prepends the given + * prefix to the results of hashes from the given backing scheme. + * Users should be aware that memcached has a fixed maximum key + * length, so the combination of this prefix plus the results of + * the backing hashing scheme must still fit within these limits. + * @param prefix + * @param backingScheme + */ + public PrefixKeyHashingScheme(String prefix, KeyHashingScheme backingScheme) { + this.prefix = prefix; + this.backingScheme = backingScheme; + } + + public String hash(String storageKey) { + return prefix + backingScheme.hash(storageKey); + } + +} diff --git a/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/SHA256KeyHashingScheme.java b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/SHA256KeyHashingScheme.java index d182c7b80..272d1ab15 100644 --- a/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/SHA256KeyHashingScheme.java +++ b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/memcached/SHA256KeyHashingScheme.java @@ -37,7 +37,9 @@ import org.apache.http.client.cache.memcached.KeyHashingScheme; /** * This is a {@link KeyHashingScheme} based on the * SHA-256 - * algorithm. + * algorithm. The hashes produced are hex-encoded SHA-256 + * digests and hence are always 64-character hexadecimal + * strings. */ public class SHA256KeyHashingScheme implements KeyHashingScheme { diff --git a/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestPrefixKeyHashingScheme.java b/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestPrefixKeyHashingScheme.java new file mode 100644 index 000000000..997e61585 --- /dev/null +++ b/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestPrefixKeyHashingScheme.java @@ -0,0 +1,32 @@ +package org.apache.http.impl.client.cache.memcached; + +import static org.junit.Assert.*; + +import org.apache.http.client.cache.memcached.KeyHashingScheme; +import org.junit.Before; +import org.junit.Test; + + +public class TestPrefixKeyHashingScheme { + + private static final String KEY = "key"; + private static final String PREFIX = "prefix"; + private PrefixKeyHashingScheme impl; + private KeyHashingScheme scheme; + + @Before + public void setUp() { + scheme = new KeyHashingScheme() { + public String hash(String storageKey) { + assertEquals(KEY, storageKey); + return "hash"; + } + }; + impl = new PrefixKeyHashingScheme(PREFIX, scheme); + } + + @Test + public void addsPrefixToBackingScheme() { + assertEquals("prefixhash", impl.hash(KEY)); + } +} diff --git a/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestSHA256HashingScheme.java b/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestSHA256HashingScheme.java index 38b0080fb..bda5540d2 100644 --- a/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestSHA256HashingScheme.java +++ b/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/memcached/TestSHA256HashingScheme.java @@ -13,4 +13,5 @@ public class TestSHA256HashingScheme { String result = impl.hash("hello, hashing world"); assertTrue(result != null && result.length() > 0); } + }