### Eclipse Workspace Patch 1.0 #P httpcomponents-client Index: httpclient-cache/src/main/java/org/apache/http/client/cache/params/CacheParams.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/client/cache/params/CacheParams.java (revision 0) +++ httpclient-cache/src/main/java/org/apache/http/client/cache/params/CacheParams.java (revision 0) @@ -0,0 +1,68 @@ +package org.apache.http.client.cache.params; + +import org.apache.http.annotation.Immutable; +import org.apache.http.impl.client.cache.CacheDefaults; +import org.apache.http.impl.client.cache.CachingHttpClient; +import org.apache.http.params.HttpParams; + +/** + * An adapter for manipulating HTTP cache parameters in {@link HttpParams}. + */ +@Immutable +public final class CacheParams { + + private CacheParams() { + super(); + } + + private static void checkParamsNotNull(final HttpParams params) { + if (params == null) { + throw new IllegalArgumentException("HTTP parameters may not be null"); + } + } + + /** + * Obtains the maximum object size in bytes that will be cached by a + * {@link CachingHttpClient}. If not configured, + * {@link CacheDefaults#DEFAULT_MAX_OBJECT_SIZE_BYTES} is used instead. + * + * @return maximum cached object size in bytes + */ + public static int getMaxObjectSizeBytes(final HttpParams params) { + checkParamsNotNull(params); + return params.getIntParameter(CachePNames.MAX_OBJECT_SIZE_BYTES, + CacheDefaults.DEFAULT_MAX_OBJECT_SIZE_BYTES); + } + + /** + * Sets the maximum object size that will be cached by a + * {@link CachingHttpClient}. + * @param sz maximum size in bytes + */ + public static void setMaxObjectSizeBytes(final HttpParams params, int sz) { + checkParamsNotNull(params); + params.setIntParameter(CachePNames.MAX_OBJECT_SIZE_BYTES, sz); + } + + /** + * Obtains whether a {@link CachingHttpClient} will behave as a + * shared cache or not. If not set, defaults to true + * (behave as a shared cache). + * @return if the cache behaves as a shared cache + */ + public static boolean getSharedCache(final HttpParams params) { + checkParamsNotNull(params); + return params.getBooleanParameter(CachePNames.SHARED_CACHE, true); + } + + /** + * Sets whether a {@link CachingHttpClient} should behave as a + * shared cache or not. + * @param b should be true for a shared cache, false for a non-shared + * (private) cache + */ + public static void setSharedCache(final HttpParams params, boolean b) { + checkParamsNotNull(params); + params.setBooleanParameter(CachePNames.SHARED_CACHE, b); + } +} Index: httpclient-cache/src/test/java/org/apache/http/impl/client/cache/DoNotTestProtocolRequirements.java =================================================================== --- httpclient-cache/src/test/java/org/apache/http/impl/client/cache/DoNotTestProtocolRequirements.java (revision 979784) +++ httpclient-cache/src/test/java/org/apache/http/impl/client/cache/DoNotTestProtocolRequirements.java (working copy) @@ -41,10 +41,13 @@ import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.cache.HttpCache; +import org.apache.http.client.cache.params.CacheParams; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.cookie.DateUtils; import org.apache.http.message.BasicHttpRequest; import org.apache.http.message.BasicHttpResponse; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; import org.easymock.classextension.EasyMock; import org.junit.Assert; @@ -80,7 +83,9 @@ mockBackend = EasyMock.createMock(HttpClient.class); mockEntity = EasyMock.createMock(HttpEntity.class); mockCache = EasyMock.createMock(HttpCache.class); - impl = new CachingHttpClient(mockBackend, cache, MAX_BYTES); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, cache, params); } private HttpResponse make200Response() { Index: httpclient-cache/src/main/java/org/apache/http/client/cache/params/CacheParamBean.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/client/cache/params/CacheParamBean.java (revision 0) +++ httpclient-cache/src/main/java/org/apache/http/client/cache/params/CacheParamBean.java (revision 0) @@ -0,0 +1,22 @@ +package org.apache.http.client.cache.params; + +import org.apache.http.params.HttpAbstractParamBean; +import org.apache.http.params.HttpParams; + +/** + * This class can be used to wrap an instance of {@link HttpParams} + * and manipulate caching parameters using Java Beans conventions. + */ +public class CacheParamBean extends HttpAbstractParamBean { + public CacheParamBean(final HttpParams params) { + super(params); + } + + public void setMaxObjectSizeBytes(int sz) { + CacheParams.setMaxObjectSizeBytes(params, sz); + } + + public void setSharedCache(boolean b) { + CacheParams.setSharedCache(params, b); + } +} Index: httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolRequirements.java =================================================================== --- httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolRequirements.java (revision 979784) +++ httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolRequirements.java (working copy) @@ -46,6 +46,7 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.cache.HttpCache; import org.apache.http.client.cache.HttpCacheEntry; +import org.apache.http.client.cache.params.CacheParams; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.client.RequestWrapper; import org.apache.http.impl.cookie.DateUtils; @@ -53,6 +54,8 @@ import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.message.BasicHttpResponse; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; import org.easymock.Capture; import org.easymock.IExpectationSetters; @@ -101,7 +104,10 @@ mockBackend = EasyMock.createMock(HttpClient.class); mockEntity = EasyMock.createMock(HttpEntity.class); mockCache = EasyMock.createMock(HttpCache.class); - impl = new CachingHttpClient(mockBackend, cache, MAX_BYTES); + + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, cache, params); } private void replayMocks() { @@ -140,7 +146,9 @@ mockCache = EasyMock.createMock(HttpCache.class); mockEntity = EasyMock.createMock(HttpEntity.class); - impl = new CachingHttpClient(mockBackend, mockCache, MAX_BYTES); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, mockCache, params); EasyMock.expect(mockCache.getEntry((String) EasyMock.anyObject())).andReturn(null) .anyTimes(); @@ -2307,7 +2315,9 @@ mockCache.putEntry(EasyMock.eq("http://foo.example.com/thing"), EasyMock.isA(HttpCacheEntry.class)); - impl = new CachingHttpClient(mockBackend, mockCache, MAX_BYTES); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, mockCache, params); HttpRequest validate = new BasicHttpRequest("GET", "/thing", HttpVersion.HTTP_1_1); validate.setHeader("If-None-Match", "\"etag\""); @@ -2349,7 +2359,9 @@ CacheEntry entry = new CacheEntry(tenSecondsAgo, eightSecondsAgo, hdrs, bytes); - impl = new CachingHttpClient(mockBackend, mockCache, MAX_BYTES); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, mockCache, params); EasyMock.expect(mockCache.getEntry("http://foo.example.com/thing")).andReturn(entry); @@ -2390,7 +2402,9 @@ CacheEntry entry = new CacheEntry(tenSecondsAgo, eightSecondsAgo, hdrs, bytes); - impl = new CachingHttpClient(mockBackend, mockCache, MAX_BYTES); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, mockCache, params); EasyMock.expect(mockCache.getEntry("http://foo.example.com/thing")).andReturn(entry); EasyMock.expect( @@ -2591,7 +2605,9 @@ CacheEntry entry = new CacheEntry(tenSecondsAgo, eightSecondsAgo, hdrs, bytes); - impl = new CachingHttpClient(mockBackend, mockCache, MAX_BYTES); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, mockCache, params); EasyMock.expect(mockCache.getEntry("http://foo.example.com/thing")).andReturn(entry); @@ -2635,7 +2651,9 @@ CacheEntry entry = new CacheEntry(requestTime, responseTime, hdrs, bytes); - impl = new CachingHttpClient(mockBackend, mockCache, MAX_BYTES); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, mockCache, params); HttpResponse validated = make200Response(); validated.setHeader("Cache-Control", "public"); Index: httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java (revision 979784) +++ httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java (working copy) @@ -51,12 +51,15 @@ import org.apache.http.client.cache.HttpCache; import org.apache.http.client.cache.HttpCacheEntry; import org.apache.http.client.cache.HttpCacheUpdateCallback; +import org.apache.http.client.cache.params.CacheParams; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.DefaultedHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; @@ -67,8 +70,6 @@ public class CachingHttpClient implements HttpClient { private final static int MAX_CACHE_ENTRIES = 1000; - private final static int DEFAULT_MAX_OBJECT_SIZE_BYTES = 8192; - private final static boolean SUPPORTS_RANGE_AND_CONTENT_RANGE_HEADERS = false; private final AtomicLong cacheHits = new AtomicLong(); @@ -94,11 +95,14 @@ private final RequestProtocolCompliance requestCompliance; private final Log log = LogFactory.getLog(getClass()); + private boolean sharedCache = true; - public CachingHttpClient(HttpClient client, HttpCache cache, int maxObjectSizeBytes) { + public CachingHttpClient(HttpClient client, HttpCache cache, HttpParams params) { super(); this.backend = client; this.responseCache = cache; + this.maxObjectSizeBytes = CacheParams.getMaxObjectSizeBytes(params); + this.sharedCache = CacheParams.getSharedCache(params); this.validityPolicy = new CacheValidityPolicy(); this.responseCachingPolicy = new ResponseCachingPolicy(maxObjectSizeBytes); this.responseGenerator = new CachedHttpResponseGenerator(this.validityPolicy); @@ -109,17 +113,16 @@ this.suitabilityChecker = new CachedResponseSuitabilityChecker(this.validityPolicy); this.conditionalRequestBuilder = new ConditionalRequestBuilder(); this.cacheEntryUpdater = new CacheEntryUpdater(); - this.maxObjectSizeBytes = maxObjectSizeBytes; this.responseCompliance = new ResponseProtocolCompliance(); this.requestCompliance = new RequestProtocolCompliance(); } public CachingHttpClient() { - this(new DefaultHttpClient(), new BasicHttpCache(MAX_CACHE_ENTRIES), DEFAULT_MAX_OBJECT_SIZE_BYTES); + this(new DefaultHttpClient(), new BasicHttpCache(MAX_CACHE_ENTRIES), new BasicHttpParams()); } - public CachingHttpClient(HttpCache cache, int maxObjectSizeBytes) { - this(new DefaultHttpClient(), cache, maxObjectSizeBytes); + public CachingHttpClient(HttpCache cache, HttpParams params) { + this(new DefaultHttpClient(), cache, params); } CachingHttpClient(HttpClient backend, CacheValidityPolicy validityPolicy, ResponseCachingPolicy responseCachingPolicy, @@ -130,7 +133,9 @@ ConditionalRequestBuilder conditionalRequestBuilder, CacheEntryUpdater entryUpdater, ResponseProtocolCompliance responseCompliance, RequestProtocolCompliance requestCompliance) { - this.maxObjectSizeBytes = DEFAULT_MAX_OBJECT_SIZE_BYTES; + HttpParams params = new BasicHttpParams(); + this.maxObjectSizeBytes = CacheParams.getMaxObjectSizeBytes(params); + this.sharedCache = CacheParams.getSharedCache(params); this.backend = backend; this.validityPolicy = validityPolicy; this.responseCachingPolicy = responseCachingPolicy; @@ -383,7 +388,7 @@ } public boolean isSharedCache() { - return true; + return sharedCache; } Date getCurrentDate() { Index: httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheDefaults.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheDefaults.java (revision 0) +++ httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheDefaults.java (revision 0) @@ -0,0 +1,17 @@ +package org.apache.http.impl.client.cache; + +/** + * Default cache parameter settings. + */ +public final class CacheDefaults { + + private CacheDefaults() { + super(); + } + + /** + * Default maximum cacheable object size (8192 bytes). + */ + public final static int DEFAULT_MAX_OBJECT_SIZE_BYTES = 8192; + +} Index: httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolDeviations.java =================================================================== --- httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolDeviations.java (revision 979784) +++ httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolDeviations.java (working copy) @@ -39,11 +39,14 @@ import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.cache.HttpCache; +import org.apache.http.client.cache.params.CacheParams; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.cookie.DateUtils; import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.message.BasicHttpResponse; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; import org.easymock.Capture; import org.easymock.classextension.EasyMock; @@ -97,7 +100,10 @@ mockBackend = EasyMock.createMock(HttpClient.class); mockEntity = EasyMock.createMock(HttpEntity.class); mockCache = EasyMock.createMock(HttpCache.class); - impl = new CachingHttpClient(mockBackend, cache, MAX_BYTES); + + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, MAX_BYTES); + impl = new CachingHttpClient(mockBackend, cache, params); } private HttpResponse make200Response() { Index: httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java =================================================================== --- httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java (revision 979784) +++ httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java (working copy) @@ -51,6 +51,7 @@ import org.apache.http.client.ResponseHandler; import org.apache.http.client.cache.HttpCache; import org.apache.http.client.cache.HttpCacheEntry; +import org.apache.http.client.cache.params.CacheParams; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.ClientConnectionManager; @@ -63,6 +64,7 @@ import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; +import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; import org.easymock.classextension.EasyMock; @@ -884,7 +886,9 @@ HttpCache cacheImpl = new BasicHttpCache(100); - CachingHttpClient cachingClient = new CachingHttpClient(httpClient, cacheImpl, 8192); + HttpParams params = new BasicHttpParams(); + CacheParams.setMaxObjectSizeBytes(params, 8192); + CachingHttpClient cachingClient = new CachingHttpClient(httpClient, cacheImpl, params); HttpUriRequest request = new HttpGet("http://www.fancast.com/static-28262/styles/base.css"); Index: httpclient-cache/src/main/java/org/apache/http/client/cache/params/CachePNames.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/client/cache/params/CachePNames.java (revision 0) +++ httpclient-cache/src/main/java/org/apache/http/client/cache/params/CachePNames.java (revision 0) @@ -0,0 +1,22 @@ +package org.apache.http.client.cache.params; + +/** + * Parameter names for HTTP cache configuration. + */ +public interface CachePNames { + /** + * Defines the maximum size of an object that will be cached + * by a {@link org.apache.http.impl.client.cache.CachingHttpClient}. + *

+ * This parameter expects a value of type {@link Integer}. + */ + public static final String MAX_OBJECT_SIZE_BYTES = "http.cache.max-object-size-bytes"; + + /** + * Defines whether a {@link org.apache.http.impl.client.cache.CachingHttpClient} + * will behave as a shared cache or not. + *

+ * This parameter expects a value of type {@link Boolean}. + */ + public static final String SHARED_CACHE = "http.cache.shared-cache"; +}