1 package com.atlassian.httpclient.apache.httpcomponents.cache;
2
3 import com.google.common.base.Supplier;
4 import com.google.common.base.Suppliers;
5 import org.apache.http.client.cache.HttpCacheEntry;
6 import org.apache.http.client.cache.HttpCacheUpdateCallback;
7 import org.apache.http.client.cache.HttpCacheUpdateException;
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10
11 import java.io.IOException;
12 import java.util.regex.Pattern;
13
14 import static com.google.common.base.Preconditions.checkNotNull;
15
16 public final class LoggingHttpCacheStorage extends ForwardingFlushableHttpCacheStorage {
17 private final Logger logger;
18
19 private final FlushableHttpCacheStorage httpCacheStorage;
20 private final Supplier<String> instanceId;
21
22 public LoggingHttpCacheStorage(FlushableHttpCacheStorage httpCacheStorage) {
23 this.httpCacheStorage = checkNotNull(httpCacheStorage);
24 this.instanceId = Suppliers.memoize(new Supplier<String>() {
25 @Override
26 public String get() {
27 return Integer.toHexString(System.identityHashCode(LoggingHttpCacheStorage.this));
28 }
29 });
30 this.logger = LoggerFactory.getLogger(delegate().getClass());
31 }
32
33 @Override
34 protected FlushableHttpCacheStorage delegate() {
35 return httpCacheStorage;
36 }
37
38 @Override
39 public void flushByUriPattern(Pattern urlPattern) {
40 logger.debug("Cache [{}] is flushing entries matching {}", instanceId.get(), urlPattern);
41 super.flushByUriPattern(urlPattern);
42 }
43
44 @Override
45 public void putEntry(String key, HttpCacheEntry entry) throws IOException {
46 logger.debug("Cache [{}] is adding '{}'s response: {}", new Object[]{instanceId.get(), key, toString(entry)});
47 super.putEntry(key, entry);
48 }
49
50 @Override
51 public HttpCacheEntry getEntry(String key) throws IOException {
52 final HttpCacheEntry entry = super.getEntry(key);
53 logger.debug("Cache [{}] is getting '{}'s response: {}", new Object[]{instanceId.get(), key, toString(entry)});
54 return entry;
55 }
56
57 @Override
58 public void removeEntry(String key) throws IOException {
59 if (logger.isDebugEnabled()) {
60 logger.debug("Cache [{}] is removing '{}''s response: {}", new Object[]{instanceId.get(), key, toString(super.getEntry(key))});
61 }
62 super.removeEntry(key);
63 }
64
65 @Override
66 public void updateEntry(String key, HttpCacheUpdateCallback callback) throws IOException, HttpCacheUpdateException {
67 if (logger.isDebugEnabled()) {
68 final HttpCacheEntry oldEntry = super.getEntry(key);
69 super.updateEntry(key, callback);
70 final HttpCacheEntry newEntry = super.getEntry(key);
71 logger.debug("Cache [{}] is updating '{}'s response from {} to {}", new Object[]{instanceId.get(), key, toString(oldEntry), toString(newEntry)});
72 } else {
73 super.updateEntry(key, callback);
74 }
75 }
76
77 private static HttpCacheEntryToString toString(HttpCacheEntry httpCacheEntry) {
78 return httpCacheEntry == null ? null : new HttpCacheEntryToString(httpCacheEntry);
79 }
80
81 private static final class HttpCacheEntryToString {
82 private final HttpCacheEntry httpCacheEntry;
83
84 private HttpCacheEntryToString(HttpCacheEntry httpCacheEntry) {
85 this.httpCacheEntry = checkNotNull(httpCacheEntry);
86 }
87
88 @Override
89 public String toString() {
90 return httpCacheEntry.toString();
91 }
92 }
93 }