diff --git a/org.springframework.context/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java b/org.springframework.context/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java index 37c2c3fd9deaf674cc9265eac05767ce1fbb5a15..43e7bf15f3b8840fb816027cc73f943bf54b0391 100644 --- a/org.springframework.context/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java +++ b/org.springframework.context/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java @@ -58,10 +58,14 @@ public class EhCacheCache implements Cache { } public boolean containsKey(Object key) { - return cache.isKeyInCache(key); + // get the element to force the expiry check (since #isKeyInCache does not considers that) + Element element = cache.getQuiet(key); + return (element != null ? true : false); } public boolean containsValue(Object value) { + // force expiry check to guarantee a valid result (otherwise expired elements are considered) + cache.evictExpiredElements(); return cache.isValueInCache(value); } @@ -77,11 +81,8 @@ public class EhCacheCache implements Cache { } public Object remove(Object key) { - Object value = null; - if (cache.isKeyInCache(key)) { - Element element = cache.getQuiet(key); - value = (element != null ? element.getObjectValue() : null); - } + Element element = cache.getQuiet(key); + Object value = (element != null ? element.getObjectValue() : null); cache.remove(key); return value; } diff --git a/org.springframework.context/src/test/java/org/springframework/cache/ehcache/EhCacheCacheTest.java b/org.springframework.context/src/test/java/org/springframework/cache/ehcache/EhCacheCacheTest.java index 2d5b70b7e361e8d5be42c0ab73c75a698e283224..aaa231d93ed4f70069e0db55228e6ab9ff82bbcd 100644 --- a/org.springframework.context/src/test/java/org/springframework/cache/ehcache/EhCacheCacheTest.java +++ b/org.springframework.context/src/test/java/org/springframework/cache/ehcache/EhCacheCacheTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010 the original author or authors. + * Copyright 2010-2011 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,8 +16,11 @@ package org.springframework.cache.ehcache; +import static org.junit.Assert.*; import net.sf.ehcache.Ehcache; +import net.sf.ehcache.Element; +import org.junit.Test; import org.springframework.cache.Cache; import org.springframework.cache.vendor.AbstractNativeCacheTest; @@ -41,4 +44,21 @@ public class EhCacheCacheTest extends AbstractNativeCacheTest { protected Cache createCache(Ehcache nativeCache) { return new EhCacheCache(nativeCache); } -} + + @Test + public void testExpiredElements() throws Exception { + String key = "brancusi"; + String value = "constantin"; + Element brancusi = new Element(key, value); + // ttl = 10s + brancusi.setTimeToLive(3); + nativeCache.put(brancusi); + + assertTrue(cache.containsKey(key)); + assertEquals(value, cache.get(key)); + // wait for the entry to expire + Thread.sleep(5 * 1000); + assertFalse("expired entry returned", cache.containsKey(key)); + assertNull(cache.get(key)); + } +} \ No newline at end of file diff --git a/org.springframework.context/src/test/java/org/springframework/cache/vendor/AbstractNativeCacheTest.java b/org.springframework.context/src/test/java/org/springframework/cache/vendor/AbstractNativeCacheTest.java index 5fd03f6a57b3e3d1320a8c12d6202662adff150f..b30e2c30e0ce8ee1764adec842d1128f2887d698 100644 --- a/org.springframework.context/src/test/java/org/springframework/cache/vendor/AbstractNativeCacheTest.java +++ b/org.springframework.context/src/test/java/org/springframework/cache/vendor/AbstractNativeCacheTest.java @@ -16,9 +16,7 @@ package org.springframework.cache.vendor; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; +import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; @@ -31,8 +29,8 @@ import org.springframework.cache.Cache; */ public abstract class AbstractNativeCacheTest { - private T nativeCache; - private Cache cache; + protected T nativeCache; + protected Cache cache; protected final static String CACHE_NAME = "testCache"; @Before