View Javadoc
1   package com.atlassian.cache.ehcache.wrapper;
2   
3   import net.sf.ehcache.CacheException;
4   import net.sf.ehcache.Ehcache;
5   import net.sf.ehcache.Status;
6   import net.sf.ehcache.loader.CacheLoader;
7   
8   import java.util.Collection;
9   import java.util.HashMap;
10  import java.util.Map;
11  
12  import static com.atlassian.cache.ehcache.wrapper.WrapperUtils.unwrapAllKeys;
13  
14  /**
15   * This class makes sure that during any loading operation, wrapped keys do not leak to the end user.
16   * If the cache that uses {@link ValueProcessor} decides to load the value, this decorator should be used on the provided loader.
17   */
18  public class ValueProcessorEhcacheLoaderDecorator implements CacheLoader {
19  
20      private final CacheLoader delegate;
21      private final ValueProcessor valueProcessor;
22  
23      public ValueProcessorEhcacheLoaderDecorator(final CacheLoader delegate, final ValueProcessor valueProcessor) {
24          this.delegate = delegate;
25          this.valueProcessor = valueProcessor;
26      }
27  
28      @Override
29      public Object load(final Object key) throws CacheException {
30          return valueProcessor.wrap(delegate.load(valueProcessor.unwrap(key)));
31      }
32  
33      @SuppressWarnings("unchecked")
34      @Override
35      public Map loadAll(final Collection keys) {
36          return wrapLoadedValues(delegate.loadAll(unwrapAllKeys(keys, valueProcessor)));
37      }
38  
39      @Override
40      public Object load(final Object key, final Object argument) {
41          return valueProcessor.wrap(delegate.load(valueProcessor.unwrap(key), argument));
42      }
43  
44      @SuppressWarnings("unchecked")
45      @Override
46      public Map loadAll(final Collection keys, final Object argument) {
47          return wrapLoadedValues(delegate.loadAll(unwrapAllKeys(keys, valueProcessor), argument));
48      }
49  
50      @Override
51      public String getName() {
52          return delegate.getName();
53      }
54  
55      @Override
56      public CacheLoader clone(final Ehcache cache) throws CloneNotSupportedException {
57          return delegate.clone(cache);
58      }
59  
60      @Override
61      public void init() {
62          delegate.init();
63      }
64  
65      @Override
66      public void dispose() throws CacheException {
67          delegate.dispose();
68      }
69  
70      @Override
71      public Status getStatus() {
72          return delegate.getStatus();
73      }
74  
75      private Map<Object, Object> wrapLoadedValues(final Map<Object, Object> unwrappedValues) {
76          Map<Object, Object> result = new HashMap<>(unwrappedValues.size());
77  
78          for (final Map.Entry<Object, Object> entry : unwrappedValues.entrySet()) {
79              result.put(valueProcessor.wrap(entry.getKey()), valueProcessor.wrap(entry.getValue()));
80          }
81          return result;
82      }
83  }