View Javadoc

1   package com.atlassian.cache.hazelcast;
2   
3   import javax.annotation.Nonnull;
4   
5   import com.atlassian.cache.CacheLoader;
6   
7   import static com.google.common.base.Preconditions.checkNotNull;
8   
9   /**
10   * Cache loader wrapper which will re-invoke original loader if cache version changes while entry loading was in
11   * progress
12   * <p/>
13   * Cache version changed each time when removeAll or clear is called
14   */
15  public class CacheVersionAwareCacheLoader<K, V> implements CacheLoader<K, V>
16  {
17      private final CacheLoader<K, V> delegate;
18      private final CacheVersion cacheVersion;
19  
20      CacheVersionAwareCacheLoader(CacheLoader<K, V> delegate, CacheVersion cacheVersion)
21      {
22          this.delegate = checkNotNull(delegate);
23          this.cacheVersion = checkNotNull(cacheVersion);
24      }
25  
26      @Nonnull
27      @Override
28      public V load(@Nonnull K key)
29      {
30          V v;
31          long currentVersion;
32  
33          do
34          {
35              currentVersion = cacheVersion.get();
36              v = delegate.load(key);
37          }
38          while (currentVersion != cacheVersion.get());
39  
40          return v;
41      }
42  }