1 | /* |
2 | * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, |
3 | * and the EPL 1.0 (http://h2database.com/html/license.html). |
4 | * Initial Developer: Jan Kotek |
5 | */ |
6 | package org.h2.util; |
7 | |
8 | import java.util.ArrayList; |
9 | import java.util.Map; |
10 | |
11 | /** |
12 | * Cache which wraps another cache (proxy pattern) and adds caching using map. |
13 | * This is useful for WeakReference, SoftReference or hard reference cache. |
14 | */ |
15 | class CacheSecondLevel implements Cache { |
16 | |
17 | private final Cache baseCache; |
18 | private final Map<Integer, CacheObject> map; |
19 | |
20 | CacheSecondLevel(Cache cache, Map<Integer, CacheObject> map) { |
21 | this.baseCache = cache; |
22 | this.map = map; |
23 | } |
24 | |
25 | @Override |
26 | public void clear() { |
27 | map.clear(); |
28 | baseCache.clear(); |
29 | } |
30 | |
31 | @Override |
32 | public CacheObject find(int pos) { |
33 | CacheObject ret = baseCache.find(pos); |
34 | if (ret == null) { |
35 | ret = map.get(pos); |
36 | } |
37 | return ret; |
38 | } |
39 | |
40 | @Override |
41 | public CacheObject get(int pos) { |
42 | CacheObject ret = baseCache.get(pos); |
43 | if (ret == null) { |
44 | ret = map.get(pos); |
45 | } |
46 | return ret; |
47 | } |
48 | |
49 | @Override |
50 | public ArrayList<CacheObject> getAllChanged() { |
51 | return baseCache.getAllChanged(); |
52 | } |
53 | |
54 | @Override |
55 | public int getMaxMemory() { |
56 | return baseCache.getMaxMemory(); |
57 | } |
58 | |
59 | @Override |
60 | public int getMemory() { |
61 | return baseCache.getMemory(); |
62 | } |
63 | |
64 | @Override |
65 | public void put(CacheObject r) { |
66 | baseCache.put(r); |
67 | map.put(r.getPos(), r); |
68 | } |
69 | |
70 | @Override |
71 | public boolean remove(int pos) { |
72 | boolean result = baseCache.remove(pos); |
73 | result |= map.remove(pos) != null; |
74 | return result; |
75 | } |
76 | |
77 | @Override |
78 | public void setMaxMemory(int size) { |
79 | baseCache.setMaxMemory(size); |
80 | } |
81 | |
82 | @Override |
83 | public CacheObject update(int pos, CacheObject record) { |
84 | CacheObject oldRec = baseCache.update(pos, record); |
85 | map.put(pos, record); |
86 | return oldRec; |
87 | } |
88 | |
89 | } |