Skip to content

Commit a795b01

Browse files
committed
refactor cache decorator
1 parent e52fd77 commit a795b01

File tree

16 files changed

+232
-260
lines changed

16 files changed

+232
-260
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Copyright 2009-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.apache.ibatis.cache;
17+
18+
import java.util.concurrent.locks.ReadWriteLock;
19+
20+
/**
21+
* abstract cache decorator.
22+
*
23+
* @author wuwen
24+
*/
25+
public abstract class CacheDecorator implements Cache {
26+
27+
private final Cache delegate;
28+
29+
public CacheDecorator(Cache cache) {
30+
this.delegate = cache;
31+
}
32+
33+
@Override
34+
public String getId() {
35+
return delegate.getId();
36+
}
37+
38+
@Override
39+
public void putObject(Object key, Object value) {
40+
delegate.putObject(key, value);
41+
}
42+
43+
@Override
44+
public Object getObject(Object key) {
45+
return delegate.getObject(key);
46+
}
47+
48+
@Override
49+
public Object removeObject(Object key) {
50+
return delegate.removeObject(key);
51+
}
52+
53+
@Override
54+
public void clear() {
55+
delegate.clear();
56+
}
57+
58+
@Override
59+
public int getSize() {
60+
return delegate.getSize();
61+
}
62+
63+
@Override
64+
public ReadWriteLock getReadWriteLock() {
65+
return delegate.getReadWriteLock();
66+
}
67+
68+
public Cache getDelegate() {
69+
return delegate;
70+
}
71+
72+
}

src/main/java/org/apache/ibatis/cache/decorators/BlockingCache.java

+6-21
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.concurrent.TimeUnit;
2121

2222
import org.apache.ibatis.cache.Cache;
23+
import org.apache.ibatis.cache.CacheDecorator;
2324
import org.apache.ibatis.cache.CacheException;
2425

2526
/**
@@ -34,31 +35,20 @@
3435
*
3536
* @author Eduardo Macarron
3637
*/
37-
public class BlockingCache implements Cache {
38+
public class BlockingCache extends CacheDecorator {
3839

3940
private long timeout;
40-
private final Cache delegate;
4141
private final ConcurrentHashMap<Object, CountDownLatch> locks;
4242

4343
public BlockingCache(Cache delegate) {
44-
this.delegate = delegate;
44+
super(delegate);
4545
this.locks = new ConcurrentHashMap<>();
4646
}
4747

48-
@Override
49-
public String getId() {
50-
return delegate.getId();
51-
}
52-
53-
@Override
54-
public int getSize() {
55-
return delegate.getSize();
56-
}
57-
5848
@Override
5949
public void putObject(Object key, Object value) {
6050
try {
61-
delegate.putObject(key, value);
51+
super.putObject(key, value);
6252
} finally {
6353
releaseLock(key);
6454
}
@@ -67,7 +57,7 @@ public void putObject(Object key, Object value) {
6757
@Override
6858
public Object getObject(Object key) {
6959
acquireLock(key);
70-
Object value = delegate.getObject(key);
60+
Object value = super.getObject(key);
7161
if (value != null) {
7262
releaseLock(key);
7363
}
@@ -81,11 +71,6 @@ public Object removeObject(Object key) {
8171
return null;
8272
}
8373

84-
@Override
85-
public void clear() {
86-
delegate.clear();
87-
}
88-
8974
private void acquireLock(Object key) {
9075
CountDownLatch newLatch = new CountDownLatch(1);
9176
while (true) {
@@ -98,7 +83,7 @@ private void acquireLock(Object key) {
9883
boolean acquired = latch.await(timeout, TimeUnit.MILLISECONDS);
9984
if (!acquired) {
10085
throw new CacheException(
101-
"Couldn't get a lock in " + timeout + " for the key " + key + " at the cache " + delegate.getId());
86+
"Couldn't get a lock in " + timeout + " for the key " + key + " at the cache " + super.getId());
10287
}
10388
} else {
10489
latch.await();

src/main/java/org/apache/ibatis/cache/decorators/FifoCache.java

+8-18
Original file line numberDiff line numberDiff line change
@@ -19,66 +19,56 @@
1919
import java.util.LinkedList;
2020

2121
import org.apache.ibatis.cache.Cache;
22+
import org.apache.ibatis.cache.CacheDecorator;
2223

2324
/**
2425
* FIFO (first in, first out) cache decorator.
2526
*
2627
* @author Clinton Begin
2728
*/
28-
public class FifoCache implements Cache {
29+
public class FifoCache extends CacheDecorator {
2930

30-
private final Cache delegate;
3131
private final Deque<Object> keyList;
3232
private int size;
3333

3434
public FifoCache(Cache delegate) {
35-
this.delegate = delegate;
35+
super(delegate);
3636
this.keyList = new LinkedList<>();
3737
this.size = 1024;
3838
}
3939

40-
@Override
41-
public String getId() {
42-
return delegate.getId();
43-
}
44-
45-
@Override
46-
public int getSize() {
47-
return delegate.getSize();
48-
}
49-
5040
public void setSize(int size) {
5141
this.size = size;
5242
}
5343

5444
@Override
5545
public void putObject(Object key, Object value) {
5646
cycleKeyList(key);
57-
delegate.putObject(key, value);
47+
super.putObject(key, value);
5848
}
5949

6050
@Override
6151
public Object getObject(Object key) {
62-
return delegate.getObject(key);
52+
return super.getObject(key);
6353
}
6454

6555
@Override
6656
public Object removeObject(Object key) {
6757
keyList.remove(key);
68-
return delegate.removeObject(key);
58+
return super.removeObject(key);
6959
}
7060

7161
@Override
7262
public void clear() {
73-
delegate.clear();
63+
super.clear();
7464
keyList.clear();
7565
}
7666

7767
private void cycleKeyList(Object key) {
7868
keyList.addLast(key);
7969
if (keyList.size() > size) {
8070
Object oldestKey = keyList.removeFirst();
81-
delegate.removeObject(oldestKey);
71+
super.removeObject(oldestKey);
8272
}
8373
}
8474

src/main/java/org/apache/ibatis/cache/decorators/LoggingCache.java

+9-31
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,28 @@
1616
package org.apache.ibatis.cache.decorators;
1717

1818
import org.apache.ibatis.cache.Cache;
19+
import org.apache.ibatis.cache.CacheDecorator;
1920
import org.apache.ibatis.logging.Log;
2021
import org.apache.ibatis.logging.LogFactory;
2122

2223
/**
2324
* @author Clinton Begin
2425
*/
25-
public class LoggingCache implements Cache {
26+
public class LoggingCache extends CacheDecorator {
2627

2728
private final Log log;
28-
private final Cache delegate;
2929
protected int requests;
3030
protected int hits;
3131

3232
public LoggingCache(Cache delegate) {
33-
this.delegate = delegate;
33+
super(delegate);
3434
this.log = LogFactory.getLog(getId());
3535
}
3636

37-
@Override
38-
public String getId() {
39-
return delegate.getId();
40-
}
41-
42-
@Override
43-
public int getSize() {
44-
return delegate.getSize();
45-
}
46-
47-
@Override
48-
public void putObject(Object key, Object object) {
49-
delegate.putObject(key, object);
50-
}
51-
5237
@Override
5338
public Object getObject(Object key) {
5439
requests++;
55-
final Object value = delegate.getObject(key);
40+
final Object value = super.getObject(key);
5641
if (value != null) {
5742
hits++;
5843
}
@@ -62,28 +47,21 @@ public Object getObject(Object key) {
6247
return value;
6348
}
6449

65-
@Override
66-
public Object removeObject(Object key) {
67-
return delegate.removeObject(key);
68-
}
69-
70-
@Override
71-
public void clear() {
72-
delegate.clear();
73-
}
74-
7550
@Override
7651
public int hashCode() {
77-
return delegate.hashCode();
52+
return getDelegate().hashCode();
7853
}
7954

8055
@Override
8156
public boolean equals(Object obj) {
82-
return delegate.equals(obj);
57+
return getDelegate().equals(obj);
8358
}
8459

8560
private double getHitRatio() {
8661
return (double) hits / (double) requests;
8762
}
8863

64+
public int getHits() {
65+
return hits;
66+
}
8967
}

src/main/java/org/apache/ibatis/cache/decorators/LruCache.java

+8-18
Original file line numberDiff line numberDiff line change
@@ -19,33 +19,23 @@
1919
import java.util.Map;
2020

2121
import org.apache.ibatis.cache.Cache;
22+
import org.apache.ibatis.cache.CacheDecorator;
2223

2324
/**
2425
* Lru (least recently used) cache decorator.
2526
*
2627
* @author Clinton Begin
2728
*/
28-
public class LruCache implements Cache {
29+
public class LruCache extends CacheDecorator {
2930

30-
private final Cache delegate;
3131
private Map<Object, Object> keyMap;
3232
private Object eldestKey;
3333

3434
public LruCache(Cache delegate) {
35-
this.delegate = delegate;
35+
super(delegate);
3636
setSize(1024);
3737
}
3838

39-
@Override
40-
public String getId() {
41-
return delegate.getId();
42-
}
43-
44-
@Override
45-
public int getSize() {
46-
return delegate.getSize();
47-
}
48-
4939
public void setSize(final int size) {
5040
keyMap = new LinkedHashMap<Object, Object>(size, .75F, true) {
5141
private static final long serialVersionUID = 4267176411845948333L;
@@ -63,32 +53,32 @@ protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) {
6353

6454
@Override
6555
public void putObject(Object key, Object value) {
66-
delegate.putObject(key, value);
56+
super.putObject(key, value);
6757
cycleKeyList(key);
6858
}
6959

7060
@Override
7161
public Object getObject(Object key) {
7262
keyMap.get(key); // touch
73-
return delegate.getObject(key);
63+
return super.getObject(key);
7464
}
7565

7666
@Override
7767
public Object removeObject(Object key) {
7868
keyMap.remove(key);
79-
return delegate.removeObject(key);
69+
return super.removeObject(key);
8070
}
8171

8272
@Override
8373
public void clear() {
84-
delegate.clear();
74+
super.clear();
8575
keyMap.clear();
8676
}
8777

8878
private void cycleKeyList(Object key) {
8979
keyMap.put(key, key);
9080
if (eldestKey != null) {
91-
delegate.removeObject(eldestKey);
81+
super.removeObject(eldestKey);
9282
eldestKey = null;
9383
}
9484
}

0 commit comments

Comments
 (0)