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.hc.client5.http.impl.cache;
28
29 import java.util.LinkedHashMap;
30 import java.util.LinkedList;
31 import java.util.Map;
32 import java.util.Queue;
33 import java.util.function.Consumer;
34
35 import org.apache.hc.client5.http.cache.HttpCacheEntry;
36 import org.apache.hc.client5.http.cache.HttpCacheStorageEntry;
37 import org.apache.hc.core5.annotation.Internal;
38
39 @Internal
40 final public class InternalCacheStorage {
41
42 private final Map<String, HttpCacheEntry> map;
43 private final Queue<HttpCacheStorageEntry> evictionQueue;
44 private final Consumer<HttpCacheStorageEntry> evictionCallback;
45
46 public InternalCacheStorage(final int maxEntries, final Consumer<HttpCacheStorageEntry> evictionCallback) {
47 this.evictionCallback = evictionCallback;
48 this.map = new LinkedHashMap<String, HttpCacheEntry>(20, 0.75f, true) {
49
50 @Override
51 protected boolean removeEldestEntry(final Map.Entry<String, HttpCacheEntry> eldest) {
52 if (size() > maxEntries) {
53 if (evictionCallback != null) {
54 evictionQueue.add(new HttpCacheStorageEntry(eldest.getKey(), eldest.getValue()));
55 }
56 return true;
57 }
58 return false;
59 }
60
61 };
62 this.evictionQueue = new LinkedList<>();
63 }
64
65 public InternalCacheStorage(final int maxEntries) {
66 this(maxEntries, null);
67 }
68
69 public InternalCacheStorage() {
70 this(Integer.MAX_VALUE, null);
71 }
72
73 public void put(final String key, final HttpCacheEntry entry) {
74 map.put(key, entry);
75 HttpCacheStorageEntry evicted;
76 while ((evicted = evictionQueue.poll()) != null) {
77 if (evictionCallback != null) {
78 evictionCallback.accept(evicted);
79 }
80 }
81 }
82
83 public HttpCacheEntry get(final String key) {
84 return map.get(key);
85 }
86
87 public HttpCacheEntry remove(final String key) {
88 return map.remove(key);
89 }
90
91 public void clear() {
92 map.clear();
93 }
94
95 }