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 } else {
58 return false;
59 }
60 }
61
62 };
63 this.evictionQueue = new LinkedList<>();
64 }
65
66 public InternalCacheStorage(final int maxEntries) {
67 this(maxEntries, null);
68 }
69
70 public InternalCacheStorage() {
71 this(Integer.MAX_VALUE, null);
72 }
73
74 public void put(final String key, final HttpCacheEntry entry) {
75 map.put(key, entry);
76 HttpCacheStorageEntry evicted;
77 while ((evicted = evictionQueue.poll()) != null) {
78 if (evictionCallback != null) {
79 evictionCallback.accept(evicted);
80 }
81 }
82 }
83
84 public HttpCacheEntry get(final String key) {
85 return map.get(key);
86 }
87
88 public HttpCacheEntry remove(final String key) {
89 return map.remove(key);
90 }
91
92 public void clear() {
93 map.clear();
94 }
95
96 }