diff --git a/pom.xml b/pom.xml index aa13db3015..3d254101d3 100644 --- a/pom.xml +++ b/pom.xml @@ -688,9 +688,9 @@ 2.0 - com.google.collections - google-collections - 1.0 + com.google.guava + guava + 11.0.2 org.springframework.security diff --git a/source/java/org/alfresco/repo/cache/DefaultCacheFactory.java b/source/java/org/alfresco/repo/cache/DefaultCacheFactory.java index 7828002c24..8f4432053f 100644 --- a/source/java/org/alfresco/repo/cache/DefaultCacheFactory.java +++ b/source/java/org/alfresco/repo/cache/DefaultCacheFactory.java @@ -45,14 +45,8 @@ public class DefaultCacheFactory extends AbstractCach private SimpleCache createLocalCache(String cacheName) { - DefaultSimpleCache cache = new DefaultSimpleCache(); - cache.setCacheName(cacheName); int maxItems = maxItems(cacheName); - // maxItems of zero has no effect, DefaultSimpleCache will use its default capacity. - if (maxItems > 0) - { - cache.setMaxItems(maxItems); - } + DefaultSimpleCache cache = new DefaultSimpleCache(maxItems, cacheName); if (log.isDebugEnabled()) { log.debug("Creating cache: " + cache); diff --git a/source/java/org/alfresco/repo/cache/DefaultCacheProvider.java b/source/java/org/alfresco/repo/cache/DefaultCacheProvider.java index dd1d9ee9ca..f5da70085e 100644 --- a/source/java/org/alfresco/repo/cache/DefaultCacheProvider.java +++ b/source/java/org/alfresco/repo/cache/DefaultCacheProvider.java @@ -47,8 +47,7 @@ public class DefaultCacheProvider implements CacheProvider { log.debug("building cache for regionName=" + regionName + ", with properties: " + properties); } - DefaultSimpleCache cache = new DefaultSimpleCache(); - cache.setMaxItems(defaultMaxItems); + DefaultSimpleCache cache = new DefaultSimpleCache(defaultMaxItems, null); Cache hibCache = new HibernateSimpleCacheAdapter(cache, regionName); return hibCache; } diff --git a/source/java/org/alfresco/repo/cache/DefaultSimpleCache.java b/source/java/org/alfresco/repo/cache/DefaultSimpleCache.java index 6d75d23301..93648b1fab 100644 --- a/source/java/org/alfresco/repo/cache/DefaultSimpleCache.java +++ b/source/java/org/alfresco/repo/cache/DefaultSimpleCache.java @@ -24,11 +24,11 @@ import java.util.Collection; import org.springframework.beans.factory.BeanNameAware; -import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; -import com.googlecode.concurrentlinkedhashmap.Weighers; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; /** - * {@link SimpleCache} implementation backed by a {@link ConcurrentLinkedHashMap}. + * {@link SimpleCache} implementation backed by a Google {@link Cache} implementation. * * @author Matt Ward */ @@ -36,8 +36,9 @@ public final class DefaultSimpleCache implements SimpleCache, BeanNameAware { private static final int DEFAULT_CAPACITY = 200000; - private ConcurrentLinkedHashMap> map; + private Cache> map; private String cacheName; + private final int maxItems; /** * Construct a cache using the specified capacity and name. @@ -50,14 +51,17 @@ public final class DefaultSimpleCache { throw new IllegalArgumentException("maxItems must be a positive integer, but was " + maxItems); } - + else if (maxItems == 0) + { + maxItems = DEFAULT_CAPACITY; + } + this.maxItems = maxItems; setBeanName(cacheName); // The map will have a bounded size determined by the maxItems member variable. - map = new ConcurrentLinkedHashMap.Builder>() - .maximumWeightedCapacity(maxItems) + map = CacheBuilder.newBuilder() + .maximumSize(maxItems) .concurrencyLevel(32) - .weigher(Weighers.singleton()) .build(); } @@ -73,19 +77,19 @@ public final class DefaultSimpleCache @Override public boolean contains(K key) { - return map.containsKey(key); + return map.asMap().containsKey(key); } @Override public Collection getKeys() { - return map.keySet(); + return map.asMap().keySet(); } @Override public V get(K key) { - AbstractMap.SimpleImmutableEntry kvp = map.get(key); + AbstractMap.SimpleImmutableEntry kvp = map.getIfPresent(key); if (kvp == null) { return null; @@ -107,36 +111,26 @@ public final class DefaultSimpleCache public boolean putAndCheckUpdate(K key, V value) { AbstractMap.SimpleImmutableEntry kvp = new AbstractMap.SimpleImmutableEntry(key, value); - AbstractMap.SimpleImmutableEntry priorKVP = map.put(key, kvp); + AbstractMap.SimpleImmutableEntry priorKVP = map.asMap().put(key, kvp); return priorKVP != null && (! priorKVP.equals(kvp)); } @Override public void remove(K key) { - map.remove(key); + map.invalidate(key); } @Override public void clear() { - map.clear(); + map.invalidateAll(); } @Override public String toString() { - return "DefaultSimpleCache[maxItems=" + map.capacity() + ", cacheName=" + cacheName + "]"; - } - - /** - * Sets the maximum number of items that the cache will hold. - * - * @param maxItems - */ - public void setMaxItems(int maxItems) - { - map.setCapacity(maxItems); + return "DefaultSimpleCache[maxItems=" + maxItems + ", cacheName=" + cacheName + "]"; } /** @@ -146,7 +140,7 @@ public final class DefaultSimpleCache */ public int getMaxItems() { - return map.capacity(); + return maxItems; } diff --git a/source/test-java/org/alfresco/repo/cache/DefaultSimpleCacheTest.java b/source/test-java/org/alfresco/repo/cache/DefaultSimpleCacheTest.java index 1299eda236..f3e5b1b511 100644 --- a/source/test-java/org/alfresco/repo/cache/DefaultSimpleCacheTest.java +++ b/source/test-java/org/alfresco/repo/cache/DefaultSimpleCacheTest.java @@ -41,7 +41,7 @@ public class DefaultSimpleCacheTest extends SimpleCacheTestBase(3, getClass().getName()); cache.put(1, "1"); cache.put(2, "2");