fixed CachingMapDecorator to support garbage-collected weak references (again)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
* Copyright 2002-2009 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,41 +16,91 @@
|
||||
|
||||
package org.springframework.util;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* @author Keith Donald
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class CachingMapDecoratorTests extends TestCase {
|
||||
|
||||
public void testValidCache() {
|
||||
MyCachingMap cache = new MyCachingMap();
|
||||
Object value;
|
||||
|
||||
assertFalse(cache.containsKey("value key"));
|
||||
assertFalse(cache.containsValue("expensive value to cache"));
|
||||
Object value = cache.get("value key");
|
||||
assertTrue(cache.createCalled());
|
||||
assertEquals(value, "expensive value to cache");
|
||||
assertTrue(cache.containsKey("value key"));
|
||||
assertTrue(cache.containsValue("expensive value to cache"));
|
||||
|
||||
assertFalse(cache.containsKey("value key 2"));
|
||||
value = cache.get("value key 2");
|
||||
assertTrue(cache.createCalled());
|
||||
assertEquals(value, "expensive value to cache");
|
||||
assertTrue(cache.containsKey("value key 2"));
|
||||
|
||||
value = cache.get("value key");
|
||||
assertTrue(cache.createCalled());
|
||||
assertFalse(cache.createCalled());
|
||||
assertEquals(value, "expensive value to cache");
|
||||
|
||||
cache.get("value key 2");
|
||||
assertFalse(cache.createCalled());
|
||||
assertEquals(value, "expensive value to cache");
|
||||
|
||||
assertFalse(cache.containsKey(null));
|
||||
assertFalse(cache.containsValue(null));
|
||||
value = cache.get(null);
|
||||
assertTrue(cache.createCalled());
|
||||
assertNull(value);
|
||||
assertTrue(cache.containsKey(null));
|
||||
assertTrue(cache.containsValue(null));
|
||||
|
||||
value = cache.get("value key");
|
||||
assertEquals(cache.createCalled(), false);
|
||||
assertEquals(value, "expensive value to cache");
|
||||
value = cache.get(null);
|
||||
assertFalse(cache.createCalled());
|
||||
assertNull(value);
|
||||
|
||||
cache.get("value key 2");
|
||||
assertEquals(cache.createCalled(), false);
|
||||
assertEquals(value, "expensive value to cache");
|
||||
Set<String> keySet = cache.keySet();
|
||||
assertEquals(3, keySet.size());
|
||||
assertTrue(keySet.contains("value key"));
|
||||
assertTrue(keySet.contains("value key 2"));
|
||||
assertTrue(keySet.contains(null));
|
||||
|
||||
Collection<String> values = cache.values();
|
||||
assertEquals(3, values.size());
|
||||
assertTrue(values.contains("expensive value to cache"));
|
||||
assertTrue(values.contains(null));
|
||||
|
||||
Set<Map.Entry<String, String>> entrySet = cache.entrySet();
|
||||
assertEquals(3, entrySet.size());
|
||||
keySet = new HashSet<String>();
|
||||
values = new HashSet<String>();
|
||||
for (Map.Entry<String, String> entry : entrySet) {
|
||||
keySet.add(entry.getKey());
|
||||
values.add(entry.getValue());
|
||||
}
|
||||
assertTrue(keySet.contains("value key"));
|
||||
assertTrue(keySet.contains("value key 2"));
|
||||
assertTrue(keySet.contains(null));
|
||||
assertEquals(2, values.size());
|
||||
assertTrue(values.contains("expensive value to cache"));
|
||||
assertTrue(values.contains(null));
|
||||
}
|
||||
|
||||
|
||||
private static class MyCachingMap extends CachingMapDecorator {
|
||||
private static class MyCachingMap extends CachingMapDecorator<String, String> {
|
||||
|
||||
private boolean createCalled;
|
||||
|
||||
protected Object create(Object key) {
|
||||
protected String create(String key) {
|
||||
createCalled = true;
|
||||
return "expensive value to cache";
|
||||
return (key != null ? "expensive value to cache" : null);
|
||||
}
|
||||
|
||||
public boolean createCalled() {
|
||||
|
||||
Reference in New Issue
Block a user