1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.ibatis.sqlmap.engine.cache.memory;
17
18 import com.ibatis.sqlmap.engine.cache.CacheController;
19 import com.ibatis.sqlmap.engine.cache.CacheModel;
20
21 import java.lang.ref.SoftReference;
22 import java.lang.ref.WeakReference;
23 import java.util.Collections;
24 import java.util.HashMap;
25 import java.util.Map;
26 import java.util.Properties;
27
28
29
30
31 public class MemoryCacheController implements CacheController {
32
33
34 private MemoryCacheLevel referenceType = MemoryCacheLevel.WEAK;
35
36
37 private Map cache = Collections.synchronizedMap(new HashMap<>());
38
39
40
41
42
43
44
45 @Override
46 public void setProperties(Properties props) {
47 String refType = props.getProperty("reference-type");
48 if (refType == null) {
49 refType = props.getProperty("referenceType");
50 }
51 if (refType != null) {
52 referenceType = MemoryCacheLevel.getByReferenceType(refType);
53 }
54 }
55
56
57
58
59
60
61 public MemoryCacheLevel getReferenceType() {
62 return referenceType;
63 }
64
65
66
67
68
69
70
71 public void setReferenceType(MemoryCacheLevel referenceType) {
72 this.referenceType = referenceType;
73 }
74
75
76
77
78
79
80
81
82
83
84
85 @Override
86 public void putObject(CacheModel cacheModel, Object key, Object value) {
87 Object reference = null;
88 if (referenceType.equals(MemoryCacheLevel.WEAK)) {
89 reference = new WeakReference(value);
90 } else if (referenceType.equals(MemoryCacheLevel.SOFT)) {
91 reference = new SoftReference(value);
92 } else if (referenceType.equals(MemoryCacheLevel.STRONG)) {
93 reference = new StrongReference(value);
94 }
95 cache.put(key, reference);
96 }
97
98
99
100
101
102
103
104
105
106
107
108 @Override
109 public Object getObject(CacheModel cacheModel, Object key) {
110 Object value = null;
111 Object ref = cache.get(key);
112 if (ref != null) {
113 if (ref instanceof StrongReference) {
114 value = ((StrongReference) ref).get();
115 } else if (ref instanceof SoftReference) {
116 value = ((SoftReference) ref).get();
117 } else if (ref instanceof WeakReference) {
118 value = ((WeakReference) ref).get();
119 }
120 }
121 return value;
122 }
123
124 @Override
125 public Object removeObject(CacheModel cacheModel, Object key) {
126 Object value = null;
127 Object ref = cache.remove(key);
128 if (ref != null) {
129 if (ref instanceof StrongReference) {
130 value = ((StrongReference) ref).get();
131 } else if (ref instanceof SoftReference) {
132 value = ((SoftReference) ref).get();
133 } else if (ref instanceof WeakReference) {
134 value = ((WeakReference) ref).get();
135 }
136 }
137 return value;
138 }
139
140
141
142
143
144
145
146 @Override
147 public void flush(CacheModel cacheModel) {
148 cache.clear();
149 }
150
151
152
153
154 private static class StrongReference {
155
156
157 private Object object;
158
159
160
161
162
163
164
165 public StrongReference(Object object) {
166 this.object = object;
167 }
168
169
170
171
172
173
174 public Object get() {
175 return object;
176 }
177 }
178
179 }