1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.http.impl.client.cache;
28
29 import java.io.File;
30
31 import org.apache.http.client.cache.HttpCacheStorage;
32 import org.apache.http.client.cache.ResourceFactory;
33 import org.apache.http.impl.client.HttpClientBuilder;
34 import org.apache.http.impl.execchain.ClientExecChain;
35
36
37
38
39 public class CachingHttpClientBuilder extends HttpClientBuilder {
40
41 private ResourceFactory resourceFactory;
42 private HttpCacheStorage storage;
43 private File cacheDir;
44 private CacheConfig cacheConfig;
45 private SchedulingStrategy schedulingStrategy;
46
47 public static CachingHttpClientBuilder create() {
48 return new CachingHttpClientBuilder();
49 }
50
51 protected CachingHttpClientBuilder() {
52 super();
53 }
54
55 public final CachingHttpClientBuilder setResourceFactory(
56 final ResourceFactory resourceFactory) {
57 this.resourceFactory = resourceFactory;
58 return this;
59 }
60
61 public final CachingHttpClientBuilder setHttpCacheStorage(
62 final HttpCacheStorage storage) {
63 this.storage = storage;
64 return this;
65 }
66
67 public final CachingHttpClientBuilder setCacheDir(
68 final File cacheDir) {
69 this.cacheDir = cacheDir;
70 return this;
71 }
72
73 public final CachingHttpClientBuilder setCacheConfig(
74 final CacheConfig cacheConfig) {
75 this.cacheConfig = cacheConfig;
76 return this;
77 }
78
79 public final CachingHttpClientBuilder setSchedulingStrategy(
80 final SchedulingStrategy schedulingStrategy) {
81 this.schedulingStrategy = schedulingStrategy;
82 return this;
83 }
84
85 @Override
86 protected ClientExecChain decorateMainExec(final ClientExecChain mainExec) {
87 final CacheConfig config = this.cacheConfig != null ? this.cacheConfig : CacheConfig.DEFAULT;
88 ResourceFactory resourceFactory = this.resourceFactory;
89 if (resourceFactory == null) {
90 if (this.cacheDir == null) {
91 resourceFactory = new HeapResourceFactory();
92 } else {
93 resourceFactory = new FileResourceFactory(cacheDir);
94 }
95 }
96 HttpCacheStorage storage = this.storage;
97 if (storage == null) {
98 if (this.cacheDir == null) {
99 storage = new BasicHttpCacheStorage(cacheConfig);
100 } else {
101 final ManagedHttpCacheStorage managedStorage = new ManagedHttpCacheStorage(cacheConfig);
102 addCloseable(managedStorage);
103 storage = managedStorage;
104 }
105 storage = new BasicHttpCacheStorage(cacheConfig);
106 }
107 final AsynchronousValidator revalidator = createAsynchronousRevalidator(config);
108 return new CachingExec(mainExec,
109 new BasicHttpCache(resourceFactory, storage, config), config, revalidator);
110 }
111
112 private AsynchronousValidator createAsynchronousRevalidator(final CacheConfig config) {
113 if (config.getAsynchronousWorkersMax() > 0) {
114 final SchedulingStrategy configuredSchedulingStrategy = createSchedulingStrategy(config);
115 final AsynchronousValidator revalidator = new AsynchronousValidator(configuredSchedulingStrategy);
116 addCloseable(revalidator);
117 return revalidator;
118 }
119 return null;
120 }
121
122 @SuppressWarnings("resource")
123 private SchedulingStrategy createSchedulingStrategy(final CacheConfig config) {
124 return schedulingStrategy != null ? schedulingStrategy : new ImmediateSchedulingStrategy(config);
125 }
126
127 }