Skip to content

Commit

Permalink
SpringCacheAnnotationParser properly accepts empty @caching annotation
Browse files Browse the repository at this point in the history
Issue: SPR-14162
  • Loading branch information
jhoeller committed Apr 12, 2016
1 parent 836a321 commit da11261
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 7 deletions.
Expand Up @@ -87,7 +87,10 @@ protected Collection<CacheOperation> parseCacheAnnotations(DefaultCacheConfig ca
if (!cachings.isEmpty()) {
ops = lazyInit(ops);
for (Caching caching : cachings) {
ops.addAll(parseCachingAnnotation(ae, cachingConfig, caching));
Collection<CacheOperation> cachingOps = parseCachingAnnotation(ae, cachingConfig, caching);
if (cachingOps != null) {
ops.addAll(cachingOps);
}
}
}

Expand Down
Expand Up @@ -49,7 +49,7 @@ public class AnnotationCacheOperationSourceTests {
@Rule
public final ExpectedException exception = ExpectedException.none();

private AnnotationCacheOperationSource source = new AnnotationCacheOperationSource();
private final AnnotationCacheOperationSource source = new AnnotationCacheOperationSource();


private Collection<CacheOperation> getOps(Class<?> target, String name, int expectedNumberOfOperations) {
Expand Down Expand Up @@ -85,6 +85,11 @@ public void caching() throws Exception {
assertTrue(it.next() instanceof CacheEvictOperation);
}

@Test
public void emptyCaching() throws Exception {
Collection<CacheOperation> ops = getOps(AnnotatedClass.class, "emptyCaching", 0);
}

@Test
public void singularStereotype() throws Exception {
Collection<CacheOperation> ops = getOps(AnnotatedClass.class, "singleStereotype", 1);
Expand Down Expand Up @@ -272,17 +277,20 @@ public void partialClassLevelWithNoCustomization() {
assertSharedConfig(cacheOperation, "classKeyGenerator", "classCacheManager", "", "classCacheName");
}


private void assertSharedConfig(CacheOperation actual, String keyGenerator, String cacheManager,
String cacheResolver, String... cacheNames) {
String cacheResolver, String... cacheNames) {

assertEquals("Wrong key manager", keyGenerator, actual.getKeyGenerator());
assertEquals("Wrong cache manager", cacheManager, actual.getCacheManager());
assertEquals("Wrong cache resolver", cacheResolver, actual.getCacheResolver());
assertEquals("Wrong number of cache names", cacheNames.length, actual.getCacheNames().size());
Arrays.stream(cacheNames).forEach(
cacheName -> assertTrue("Cache '" + cacheName + "' not found in " + actual.getCacheNames(),
actual.getCacheNames().contains(cacheName)));
cacheName -> assertTrue("Cache '" + cacheName + "' not found in " + actual.getCacheNames(),
actual.getCacheNames().contains(cacheName)));
}


private static class AnnotatedClass {

@Cacheable("test")
Expand All @@ -298,6 +306,10 @@ public void multiple() {
public void caching() {
}

@Caching
public void emptyCaching() {
}

@Cacheable(cacheNames = "test", keyGenerator = "custom")
public void customKeyGenerator() {
}
Expand Down Expand Up @@ -361,6 +373,7 @@ public void noCacheNameSpecified() {
}
}


@CacheConfig(cacheNames = "classCacheName",
keyGenerator = "classKeyGenerator",
cacheManager = "classCacheManager", cacheResolver = "classCacheResolver")
Expand All @@ -383,6 +396,7 @@ public void methodLevelCacheResolver() {
}
}


@CacheConfigFoo
private static class AnnotatedClassWithCustomDefault {

Expand All @@ -391,6 +405,7 @@ public void methodLevelCacheName() {
}
}


@CacheConfig(cacheNames = "classCacheName",
keyGenerator = "classKeyGenerator",
cacheManager = "classCacheManager")
Expand All @@ -409,6 +424,7 @@ public void noCustomization() {
}
}


@CacheConfigFoo
@CacheConfig(cacheNames = "myCache") // multiple sources
private static class MultipleCacheConfig {
Expand All @@ -418,48 +434,58 @@ public void multipleCacheConfig() {
}
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Cacheable("foo")
public @interface CacheableFoo {
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Cacheable(cacheNames = "foo", keyGenerator = "custom")
public @interface CacheableFooCustomKeyGenerator {
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Cacheable(cacheNames = "foo", cacheManager = "custom")
public @interface CacheableFooCustomCacheManager {
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Cacheable(cacheNames = "foo", cacheResolver = "custom")
public @interface CacheableFooCustomCacheResolver {
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@CacheEvict("foo")
public @interface EvictFoo {
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@CacheEvict("bar")
public @interface EvictBar {
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@CacheConfig(keyGenerator = "classKeyGenerator", cacheManager = "classCacheManager", cacheResolver = "classCacheResolver")
@CacheConfig(keyGenerator = "classKeyGenerator",
cacheManager = "classCacheManager",
cacheResolver = "classCacheResolver")
public @interface CacheConfigFoo {
}


@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
@Cacheable(cacheNames = "shadowed cache name", key = "shadowed key")
Expand All @@ -475,6 +501,7 @@ public void multipleCacheConfig() {
String key() default "";
}


@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
@CacheEvict(cacheNames = "shadowed cache name", key = "shadowed key")
Expand All @@ -490,4 +517,4 @@ public void multipleCacheConfig() {
String key() default "";
}

}
}

0 comments on commit da11261

Please sign in to comment.