Browse Source
+ add no-op cache implementations suitable for cache declarations w/o a backing store git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4641 50f2f4bb-b051-0410-bef5-90022cba6387pull/1/merge
4 changed files with 209 additions and 4 deletions
@ -0,0 +1,99 @@
@@ -0,0 +1,99 @@
|
||||
/* |
||||
* Copyright 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.cache.support; |
||||
|
||||
import java.util.Collection; |
||||
import java.util.Collections; |
||||
import java.util.LinkedHashSet; |
||||
import java.util.Set; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
import java.util.concurrent.ConcurrentMap; |
||||
|
||||
import org.springframework.cache.Cache; |
||||
import org.springframework.cache.CacheManager; |
||||
|
||||
/** |
||||
* A basic, no operation {@link CacheManager} implementation suitable for disabling caching, |
||||
* typically used for backing cache declarations without an actual backing store. |
||||
* |
||||
* Will simply accept any items into the cache not actually storing them. |
||||
* |
||||
* @see CompositeCacheManager |
||||
* @author Costin Leau |
||||
*/ |
||||
public class NoOpCacheManager implements CacheManager { |
||||
|
||||
private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>(); |
||||
private Set<String> names = new LinkedHashSet<String>(); |
||||
|
||||
private static class NoOpCache implements Cache { |
||||
|
||||
private final String name; |
||||
|
||||
public NoOpCache(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public void clear() { |
||||
} |
||||
|
||||
public void evict(Object key) { |
||||
} |
||||
|
||||
public ValueWrapper get(Object key) { |
||||
return null; |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public Object getNativeCache() { |
||||
return null; |
||||
} |
||||
|
||||
public void put(Object key, Object value) { |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* {@inheritDoc} |
||||
* |
||||
* This implementation always returns a {@link Cache} implementation that will not |
||||
* store items. Additionally, the request cache will be remembered by the manager for consistency. |
||||
*/ |
||||
public Cache getCache(String name) { |
||||
Cache cache = caches.get(name); |
||||
if (cache == null) { |
||||
caches.putIfAbsent(name, new NoOpCache(name)); |
||||
synchronized (names) { |
||||
names.add(name); |
||||
} |
||||
} |
||||
|
||||
return caches.get(name); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritDoc} |
||||
* |
||||
* This implementation returns the name of the caches previously requested. |
||||
*/ |
||||
public Collection<String> getCacheNames() { |
||||
return Collections.unmodifiableSet(names); |
||||
} |
||||
} |
||||
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
/* |
||||
* Copyright 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.cache; |
||||
|
||||
import static org.junit.Assert.*; |
||||
|
||||
import java.util.UUID; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.springframework.cache.support.NoOpCacheManager; |
||||
|
||||
public class NoOpCacheManagerTest { |
||||
|
||||
private CacheManager manager; |
||||
|
||||
@Before |
||||
public void setup() { |
||||
manager = new NoOpCacheManager(); |
||||
} |
||||
|
||||
@Test |
||||
public void testGetCache() throws Exception { |
||||
Cache cache = manager.getCache("bucket"); |
||||
assertNotNull(cache); |
||||
assertSame(cache, manager.getCache("bucket")); |
||||
} |
||||
|
||||
@Test |
||||
public void testNoOpCache() throws Exception { |
||||
String name = UUID.randomUUID().toString(); |
||||
Cache cache = manager.getCache(name); |
||||
assertEquals(name, cache.getName()); |
||||
Object key = new Object(); |
||||
cache.put(key, new Object()); |
||||
assertNull(cache.get(key)); |
||||
assertNull(cache.getNativeCache()); |
||||
} |
||||
|
||||
@Test |
||||
public void testCacheName() throws Exception { |
||||
String name = "bucket"; |
||||
assertFalse(manager.getCacheNames().contains(name)); |
||||
manager.getCache(name); |
||||
assertTrue(manager.getCacheNames().contains(name)); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue