Merged HEAD-BUG-FIX (4.3/Cloud) to HEAD (4.3/Cloud)

59850: Merged BRANCHES/DEV/mward/head_bf_gdata_upgd to BRANCHES/DEV/HEAD-BUG-FIX (upgrade gdata libs):
      59515: Removed gdata-1.45.0 libraries.
      59516: Removed concurrentlinkedhashmap-lru-1.2 library.
      59518: Added gdata-1.47.1 library JARs (dependencies to follow)
      59521: Added gdata-1.47.1 dependencies (guava-11.0.2 and JSR-305)
      59524: Updated ant build files to use gdata-1.47.1
      59528: Removed outdated gdata-1.45.0 src zip.
      59530: Added gdata-1.47.1 src zip
      59531: Update eclipse .classpath with gdata 1.47.1 libraries
      59532: Exported new gdata-1.47.1 and guava-11 libs from 3rd party project
      59559: Fix DefaultSimpleCache to use a Guava Cache, replacing ConcurrentLinkedHashMap usage.
      59568: Reverted r59516: concurrentlinkedhashmap lib is required by Surf.
      59572: Replaced use of google-collections with guava in repository's pom.xml


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@62191 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Alan Davis
2014-02-12 08:06:09 +00:00
parent a4494111b8
commit bdba166058
5 changed files with 26 additions and 39 deletions

View File

@@ -688,9 +688,9 @@
<version>2.0</version> <version>2.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.collections</groupId> <groupId>com.google.guava</groupId>
<artifactId>google-collections</artifactId> <artifactId>guava</artifactId>
<version>1.0</version> <version>11.0.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>

View File

@@ -45,14 +45,8 @@ public class DefaultCacheFactory<K extends Serializable, V> extends AbstractCach
private SimpleCache<K, V> createLocalCache(String cacheName) private SimpleCache<K, V> createLocalCache(String cacheName)
{ {
DefaultSimpleCache<K, V> cache = new DefaultSimpleCache<K, V>();
cache.setCacheName(cacheName);
int maxItems = maxItems(cacheName); int maxItems = maxItems(cacheName);
// maxItems of zero has no effect, DefaultSimpleCache will use its default capacity. DefaultSimpleCache<K, V> cache = new DefaultSimpleCache<K, V>(maxItems, cacheName);
if (maxItems > 0)
{
cache.setMaxItems(maxItems);
}
if (log.isDebugEnabled()) if (log.isDebugEnabled())
{ {
log.debug("Creating cache: " + cache); log.debug("Creating cache: " + cache);

View File

@@ -47,8 +47,7 @@ public class DefaultCacheProvider implements CacheProvider
{ {
log.debug("building cache for regionName=" + regionName + ", with properties: " + properties); log.debug("building cache for regionName=" + regionName + ", with properties: " + properties);
} }
DefaultSimpleCache<Serializable, Object> cache = new DefaultSimpleCache<Serializable, Object>(); DefaultSimpleCache<Serializable, Object> cache = new DefaultSimpleCache<Serializable, Object>(defaultMaxItems, null);
cache.setMaxItems(defaultMaxItems);
Cache hibCache = new HibernateSimpleCacheAdapter(cache, regionName); Cache hibCache = new HibernateSimpleCacheAdapter(cache, regionName);
return hibCache; return hibCache;
} }

View File

@@ -24,11 +24,11 @@ import java.util.Collection;
import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.BeanNameAware;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; import com.google.common.cache.Cache;
import com.googlecode.concurrentlinkedhashmap.Weighers; 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 * @author Matt Ward
*/ */
@@ -36,8 +36,9 @@ public final class DefaultSimpleCache<K extends Serializable, V extends Object>
implements SimpleCache<K, V>, BeanNameAware implements SimpleCache<K, V>, BeanNameAware
{ {
private static final int DEFAULT_CAPACITY = 200000; private static final int DEFAULT_CAPACITY = 200000;
private ConcurrentLinkedHashMap<K, AbstractMap.SimpleImmutableEntry<K, V>> map; private Cache<K, AbstractMap.SimpleImmutableEntry<K, V>> map;
private String cacheName; private String cacheName;
private final int maxItems;
/** /**
* Construct a cache using the specified capacity and name. * Construct a cache using the specified capacity and name.
@@ -50,14 +51,17 @@ public final class DefaultSimpleCache<K extends Serializable, V extends Object>
{ {
throw new IllegalArgumentException("maxItems must be a positive integer, but was " + maxItems); throw new IllegalArgumentException("maxItems must be a positive integer, but was " + maxItems);
} }
else if (maxItems == 0)
{
maxItems = DEFAULT_CAPACITY;
}
this.maxItems = maxItems;
setBeanName(cacheName); setBeanName(cacheName);
// The map will have a bounded size determined by the maxItems member variable. // The map will have a bounded size determined by the maxItems member variable.
map = new ConcurrentLinkedHashMap.Builder<K, AbstractMap.SimpleImmutableEntry<K, V>>() map = CacheBuilder.newBuilder()
.maximumWeightedCapacity(maxItems) .maximumSize(maxItems)
.concurrencyLevel(32) .concurrencyLevel(32)
.weigher(Weighers.singleton())
.build(); .build();
} }
@@ -73,19 +77,19 @@ public final class DefaultSimpleCache<K extends Serializable, V extends Object>
@Override @Override
public boolean contains(K key) public boolean contains(K key)
{ {
return map.containsKey(key); return map.asMap().containsKey(key);
} }
@Override @Override
public Collection<K> getKeys() public Collection<K> getKeys()
{ {
return map.keySet(); return map.asMap().keySet();
} }
@Override @Override
public V get(K key) public V get(K key)
{ {
AbstractMap.SimpleImmutableEntry<K, V> kvp = map.get(key); AbstractMap.SimpleImmutableEntry<K, V> kvp = map.getIfPresent(key);
if (kvp == null) if (kvp == null)
{ {
return null; return null;
@@ -107,36 +111,26 @@ public final class DefaultSimpleCache<K extends Serializable, V extends Object>
public boolean putAndCheckUpdate(K key, V value) public boolean putAndCheckUpdate(K key, V value)
{ {
AbstractMap.SimpleImmutableEntry<K, V> kvp = new AbstractMap.SimpleImmutableEntry<K, V>(key, value); AbstractMap.SimpleImmutableEntry<K, V> kvp = new AbstractMap.SimpleImmutableEntry<K, V>(key, value);
AbstractMap.SimpleImmutableEntry<K, V> priorKVP = map.put(key, kvp); AbstractMap.SimpleImmutableEntry<K, V> priorKVP = map.asMap().put(key, kvp);
return priorKVP != null && (! priorKVP.equals(kvp)); return priorKVP != null && (! priorKVP.equals(kvp));
} }
@Override @Override
public void remove(K key) public void remove(K key)
{ {
map.remove(key); map.invalidate(key);
} }
@Override @Override
public void clear() public void clear()
{ {
map.clear(); map.invalidateAll();
} }
@Override @Override
public String toString() public String toString()
{ {
return "DefaultSimpleCache[maxItems=" + map.capacity() + ", cacheName=" + cacheName + "]"; return "DefaultSimpleCache[maxItems=" + maxItems + ", cacheName=" + cacheName + "]";
}
/**
* Sets the maximum number of items that the cache will hold.
*
* @param maxItems
*/
public void setMaxItems(int maxItems)
{
map.setCapacity(maxItems);
} }
/** /**
@@ -146,7 +140,7 @@ public final class DefaultSimpleCache<K extends Serializable, V extends Object>
*/ */
public int getMaxItems() public int getMaxItems()
{ {
return map.capacity(); return maxItems;
} }

View File

@@ -41,7 +41,7 @@ public class DefaultSimpleCacheTest extends SimpleCacheTestBase<DefaultSimpleCac
public void boundedSizeCache() throws Exception public void boundedSizeCache() throws Exception
{ {
// We'll only keep the LAST 3 items // We'll only keep the LAST 3 items
cache.setMaxItems(3); cache = new DefaultSimpleCache<Integer, String>(3, getClass().getName());
cache.put(1, "1"); cache.put(1, "1");
cache.put(2, "2"); cache.put(2, "2");