diff --git a/httpclient-cache/src/main/java/org/apache/http/client/cache/CacheResponseStatus.java b/httpclient-cache/src/main/java/org/apache/http/client/cache/CacheResponseStatus.java index 3bc07b2de..81899ab54 100644 --- a/httpclient-cache/src/main/java/org/apache/http/client/cache/CacheResponseStatus.java +++ b/httpclient-cache/src/main/java/org/apache/http/client/cache/CacheResponseStatus.java @@ -31,7 +31,8 @@ package org.apache.http.client.cache; * by the {@link org.apache.http.impl.client.cache.CachingHttpClient}; * if a request is executed with an {@link org.apache.http.protocol.HttpContext} * then a parameter with one of these values will be registered in the - * context. + * context under the key + * {@link org.apache.http.impl.client.cache.CachingHttpClient#CACHE_RESPONSE_STATUS}. */ public enum CacheResponseStatus { diff --git a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java index 5806961ff..f87d91c92 100644 --- a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java +++ b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java @@ -287,6 +287,10 @@ public class HttpCacheEntry implements Serializable { return Collections.unmodifiableMap(variantMap); } + /** + * Provides a string representation of this instance suitable for + * human consumption. + */ @Override public String toString() { return "[request date=" + this.requestDate + "; response date=" + this.responseDate diff --git a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntrySerializer.java b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntrySerializer.java index a834d068a..d95c119db 100644 --- a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntrySerializer.java +++ b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntrySerializer.java @@ -37,8 +37,18 @@ import java.io.OutputStream; */ public interface HttpCacheEntrySerializer { - public void writeTo(HttpCacheEntry entry, OutputStream os) throws IOException; + /** + * Serializes the given entry to a byte representation on the + * given {@link OutputStream}. + * @throws IOException + */ + void writeTo(HttpCacheEntry entry, OutputStream os) throws IOException; - public HttpCacheEntry readFrom(InputStream is) throws IOException; + /** + * Deserializes a byte representation of a cache entry by reading + * from the given {@link InputStream}. + * @throws IOException + */ + HttpCacheEntry readFrom(InputStream is) throws IOException; } diff --git a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheStorage.java b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheStorage.java index c5ef92838..c4b2ecc41 100644 --- a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheStorage.java +++ b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheStorage.java @@ -65,10 +65,13 @@ public interface HttpCacheStorage { void removeEntry(String key) throws IOException; /** - * Atomically applies the given callback to update an - * existing cache entry under a given key. + * Atomically applies the given callback to update an existing cache + * entry under a given key. * @param key indicates which entry to modify - * @param callback performs the update + * @param callback performs the update; see + * {@link HttpCacheUpdateCallback} for details, but roughly the + * callback expects to be handed the current entry and will return + * the new value for the entry. * @throws IOException * @throws HttpCacheUpdateException */ diff --git a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheUpdateCallback.java b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheUpdateCallback.java index bd017a329..ea2e80b41 100644 --- a/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheUpdateCallback.java +++ b/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheUpdateCallback.java @@ -42,8 +42,8 @@ public interface HttpCacheUpdateCallback { * @param existing * the cache entry currently in-place in the cache, possibly * null if nonexistent - * @return HttpCacheEntry the cache entry that should replace it, again, - * possibly null + * @return the cache entry that should replace it, again, + * possibly null if the entry should be deleted * * @since 4.1 */ diff --git a/httpclient-cache/src/main/java/org/apache/http/client/cache/Resource.java b/httpclient-cache/src/main/java/org/apache/http/client/cache/Resource.java index 8a3ccad1e..56e14db43 100644 --- a/httpclient-cache/src/main/java/org/apache/http/client/cache/Resource.java +++ b/httpclient-cache/src/main/java/org/apache/http/client/cache/Resource.java @@ -40,7 +40,7 @@ public interface Resource extends Serializable { /** * Returns an {@link InputStream} from which the response - * body can be returned. + * body can be read. * @throws IOException */ InputStream getInputStream() throws IOException; diff --git a/httpclient-cache/src/main/java/org/apache/http/client/cache/ResourceFactory.java b/httpclient-cache/src/main/java/org/apache/http/client/cache/ResourceFactory.java index 5d857426d..09664799c 100644 --- a/httpclient-cache/src/main/java/org/apache/http/client/cache/ResourceFactory.java +++ b/httpclient-cache/src/main/java/org/apache/http/client/cache/ResourceFactory.java @@ -59,7 +59,7 @@ public interface ResourceFactory { * @param requestId unique identifier provided to associate * with the cloned response body. * @param resource the original response body to clone. - * @return {@code Resource} + * @return the {@code Resource} copy * @throws IOException */ Resource copy(String requestId, Resource resource) throws IOException; diff --git a/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCacheStorage.java b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCacheStorage.java index 6c0904249..f8c6dad64 100644 --- a/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCacheStorage.java +++ b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/BasicHttpCacheStorage.java @@ -35,9 +35,12 @@ import org.apache.http.client.cache.HttpCacheStorage; import org.apache.http.client.cache.HttpCacheUpdateCallback; /** - * Basic {@link HttpCacheStorage} implementation backed by an instance of {@link LinkedHashMap}. - * This cache does NOT deallocate resources associated with the cache entries. It is intended - * for use with {@link HeapResource} and similar. + * Basic {@link HttpCacheStorage} implementation backed by an instance of + * {@link LinkedHashMap}. In other words, cache entries and the cached + * response bodies are held in-memory. This cache does NOT deallocate + * resources associated with the cache entries; it is intended for use + * with {@link HeapResource} and similar. This is the default cache + * storage backend used by {@link CachingHttpClient}. * * @since 4.1 */ diff --git a/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheConfig.java b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheConfig.java index 79276e820..821a51a3b 100644 --- a/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheConfig.java +++ b/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheConfig.java @@ -27,8 +27,59 @@ package org.apache.http.impl.client.cache; /** - * Java Beans-style configuration for a - * {@link org.apache.http.impl.client.cache.CachingHttpClient}. + *

Java Beans-style configuration for a {@link CachingHttpClient}. Any class + * in the caching module that has configuration options should take a + * {@link CacheConfig} argument in one of its constructors. A + * {@code CacheConfig} instance has sane and conservative defaults, so the + * easiest way to specify options is to get an instance and then set just + * the options you want to modify from their defaults.

+ * + *

N.B. This class is only for caching-specific configuration; to + * configure the behavior of the rest of the client, configure the + * {@link org.apache.http.client.HttpClient} used as the "backend" + * for the {@code CachingHttpClient}.

+ * + *

Cache configuration can be grouped into the following categories:

+ * + *

Cache size. If the backend storage supports these limits, you + * can specify the {@link CacheConfig#setMaxCacheEntries maximum number of + * cache entries} as well as the {@link CacheConfig#setMaxObjectSizeBytes + * maximum cacheable response body size}.

+ * + *

Public/private caching. By default, the caching module considers + * itself to be a shared (public) cache, and will not, for example, cache + * responses to requests with {@code Authorization} headers or responses + * marked with {@code Cache-Control: private}. If, however, the cache + * is only going to be used by one logical "user" (behaving similarly to a + * browser cache), then you will want to {@link + * CacheConfig#setSharedCache(boolean) turn off the shared cache setting}.

+ * + *

Heuristic caching. Per RFC2616, a cache may cache certain cache + * entries even if no explicit cache control headers are set by the origin. + * This behavior is off by default, but you may want to turn this on if you + * are working with an origin that doesn't set proper headers but where you + * still want to cache the responses. You will want to {@link + * CacheConfig#setHeuristicCachingEnabled(boolean) enable heuristic caching}, + * then specify either a {@link CacheConfig#setHeuristicDefaultLifetime(long) + * default freshness lifetime} and/or a {@link + * CacheConfig#setHeuristicCoefficient(float) fraction of the time since + * the resource was last modified}. See Sections + * + * 13.2.2 and + * 13.2.4 of the HTTP/1.1 RFC for more details on heuristic caching.

+ * + *

Background validation. The cache module supports the + * {@code stale-while-revalidate} directive of + * RFC5861, which allows + * certain cache entry revalidations to happen in the background. You may + * want to tweak the settings for the {@link + * CacheConfig#setAsynchronousWorkersCore(int) minimum} and {@link + * CacheConfig#setAsynchronousWorkersMax(int) maximum} number of background + * worker threads, as well as the {@link + * CacheConfig#setAsynchronousWorkerIdleLifetimeSecs(int) maximum time they + * can be idle before being reclaimed}. You can also control the {@link + * CacheConfig#setRevalidationQueueSize(int) size of the queue} used for + * revalidations when there aren't enough workers to keep up with demand. */ public class CacheConfig { @@ -64,21 +115,21 @@ public class CacheConfig { /** Default number of worker threads to allow for background revalidations * resulting from the stale-while-revalidate directive. */ - private static final int DEFAULT_ASYNCHRONOUS_WORKERS_MAX = 1; + public static final int DEFAULT_ASYNCHRONOUS_WORKERS_MAX = 1; /** Default minimum number of worker threads to allow for background * revalidations resulting from the stale-while-revalidate directive. */ - private static final int DEFAULT_ASYNCHRONOUS_WORKERS_CORE = 1; + public static final int DEFAULT_ASYNCHRONOUS_WORKERS_CORE = 1; /** Default maximum idle lifetime for a background revalidation thread * before it gets reclaimed. */ - private static final int DEFAULT_ASYNCHRONOUS_WORKER_IDLE_LIFETIME_SECS = 60; + public static final int DEFAULT_ASYNCHRONOUS_WORKER_IDLE_LIFETIME_SECS = 60; /** Default maximum queue length for background revalidation requests. */ - private static final int DEFAULT_REVALIDATION_QUEUE_SIZE = 100; + public static final int DEFAULT_REVALIDATION_QUEUE_SIZE = 100; private int maxObjectSizeBytes = DEFAULT_MAX_OBJECT_SIZE_BYTES; private int maxCacheEntries = DEFAULT_MAX_CACHE_ENTRIES; @@ -93,7 +144,7 @@ public class CacheConfig { private int revalidationQueueSize = DEFAULT_REVALIDATION_QUEUE_SIZE; /** - * Returns the current maximum object size that will be cached. + * Returns the current maximum response body size that will be cached. * @return size in bytes */ public int getMaxObjectSizeBytes() { @@ -101,7 +152,7 @@ public class CacheConfig { } /** - * Specifies the maximum object size that will be eligible for caching. + * Specifies the maximum response body size that will be eligible for caching. * @param maxObjectSizeBytes size in bytes */ public void setMaxObjectSizeBytes(int maxObjectSizeBytes) { @@ -110,8 +161,8 @@ public class CacheConfig { /** * Returns whether the cache will behave as a shared cache or not. - * @return true for a shared cache, false for a non-shared (private) - * cache + * @return {@code true} for a shared cache, {@code false} for a non- + * shared (private) cache */ public boolean isSharedCache() { return isSharedCache; @@ -120,7 +171,8 @@ public class CacheConfig { /** * Sets whether the cache should behave as a shared cache or not. * @param isSharedCache true to behave as a shared cache, false to - * behave as a non-shared (private) cache. + * behave as a non-shared (private) cache. To have the cache + * behave like a browser cache, you want to set this to {@code false}. */ public void setSharedCache(boolean isSharedCache) { this.isSharedCache = isSharedCache; @@ -155,28 +207,36 @@ public class CacheConfig { } /** - * Returns if heuristic freshness caching is in enabled + * Returns whether heuristic caching is enabled. + * @return {@code true} if it is enabled. */ public boolean isHeuristicCachingEnabled() { return heuristicCachingEnabled; } /** - * Set if heuristic freshness caching is enabled + * Enables or disables heuristic caching. + * @param heuristicCachingEnabled should be {@code true} to + * permit heuristic caching, {@code false} to enable it. */ public void setHeuristicCachingEnabled(boolean heuristicCachingEnabled) { this.heuristicCachingEnabled = heuristicCachingEnabled; } /** - * Returns coefficient used in heuristic freshness caching + * Returns lifetime coefficient used in heuristic freshness caching. */ public float getHeuristicCoefficient() { return heuristicCoefficient; } /** - * Set coefficient to be used in heuristic freshness caching + * Sets coefficient to be used in heuristic freshness caching. This is + * interpreted as the fraction of the time between the {@code Last-Modified} + * and {@code Date} headers of a cached response during which the cached + * response will be considered heuristically fresh. + * @param heuristicCoefficient should be between {@code 0.0} and + * {@code 1.0}. */ public void setHeuristicCoefficient(float heuristicCoefficient) { this.heuristicCoefficient = heuristicCoefficient; @@ -184,22 +244,30 @@ public class CacheConfig { /** * Get the default lifetime to be used if heuristic freshness calculation is - * not possible + * not possible. */ public long getHeuristicDefaultLifetime() { return heuristicDefaultLifetime; } /** - * Set default lifetime to be used if heuristic freshness calculation is not possible + * Sets default lifetime in seconds to be used if heuristic freshness + * calculation is not possible. Explicit cache control directives on + * either the request or origin response will override this, as will + * the heuristic {@code Last-Modified} freshness calculation if it is + * available. + * @param heuristicDefaultLifetimeSecs is the number of seconds to + * consider a cache-eligible response fresh in the absence of other + * information. Set this to {@code 0} to disable this style of + * heuristic caching. */ - public void setHeuristicDefaultLifetime(long heuristicDefaultLifetime) { - this.heuristicDefaultLifetime = heuristicDefaultLifetime; + public void setHeuristicDefaultLifetime(long heuristicDefaultLifetimeSecs) { + this.heuristicDefaultLifetime = heuristicDefaultLifetimeSecs; } /** * Returns the maximum number of threads to allow for background - * revalidations due to the stale-while-revalidate directive. A + * revalidations due to the {@code stale-while-revalidate} directive. A * value of 0 means background revalidations are disabled. */ public int getAsynchronousWorkersMax() { @@ -208,7 +276,7 @@ public class CacheConfig { /** * Sets the maximum number of threads to allow for background - * revalidations due to the stale-while-revalidate directive. + * revalidations due to the {@code stale-while-revalidate} directive. * @param max number of threads; a value of 0 disables background * revalidations. */ @@ -218,7 +286,7 @@ public class CacheConfig { /** * Returns the minimum number of threads to keep alive for background - * revalidations due to the stale-while-revalidate directive. + * revalidations due to the {@code stale-while-revalidate} directive. */ public int getAsynchronousWorkersCore() { return asynchronousWorkersCore; @@ -226,7 +294,7 @@ public class CacheConfig { /** * Sets the minimum number of threads to keep alive for background - * revalidations due to the stale-while-revalidate directive. + * revalidations due to the {@code stale-while-revalidate} directive. * @param min should be greater than zero and less than or equal * to getAsynchronousWorkersMax() */