View Javadoc

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  }