diff --git a/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/CachingProviderAutoConfiguration.java b/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/CachingProviderAutoConfiguration.java index 7115656d..b5688ee5 100644 --- a/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/CachingProviderAutoConfiguration.java +++ b/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/CachingProviderAutoConfiguration.java @@ -16,9 +16,11 @@ package org.springframework.geode.boot.autoconfigure; +import static org.springframework.data.gemfire.util.CollectionUtils.asSet; import static org.springframework.data.gemfire.util.RuntimeExceptionFactory.newIllegalStateException; import java.util.Optional; +import java.util.Set; import javax.annotation.PostConstruct; @@ -32,9 +34,14 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cache.CacheManager; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.data.gemfire.cache.GemfireCacheManager; import org.springframework.data.gemfire.cache.config.EnableGemfireCaching; +import org.springframework.util.StringUtils; /** * Spring Boot {@link EnableAutoConfiguration auto-configuration} for Spring's Cache Abstraction @@ -55,6 +62,7 @@ import org.springframework.data.gemfire.cache.config.EnableGemfireCaching; */ @Configuration @AutoConfigureAfter(ClientCacheAutoConfiguration.class) +@Conditional(CachingProviderAutoConfiguration.SpringCacheTypeCondition.class) @ConditionalOnBean(GemFireCache.class) @ConditionalOnClass({ GemfireCacheManager.class, GemFireCache.class }) @ConditionalOnMissingBean(CacheManager.class) @@ -62,6 +70,10 @@ import org.springframework.data.gemfire.cache.config.EnableGemfireCaching; @SuppressWarnings("all") public class CachingProviderAutoConfiguration { + protected static final Set SPRING_CACHE_TYPES = asSet("gemfire", "geode"); + + protected static final String SPRING_CACHE_TYPE_PROPERTY = "spring.cache.type"; + private final CacheManagerCustomizers cacheManagerCustomizers; private final CacheProperties cacheProperties; @@ -95,4 +107,18 @@ public class CachingProviderAutoConfiguration { getCacheManagerCustomizers() .ifPresent(cacheManagerCustomizers -> cacheManagerCustomizers.customize(getCacheManager())); } + + public static class SpringCacheTypeCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + + String springCacheType = context.getEnvironment().getProperty(SPRING_CACHE_TYPE_PROPERTY); + + return Optional.ofNullable(springCacheType) + .filter(StringUtils::hasText) + .map(it -> SPRING_CACHE_TYPES.contains(it.trim().toLowerCase())) + .orElse(true); + } + } } diff --git a/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/caching/ManuallyConfiguredCachingIntegrationTests.java b/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/caching/ManuallyConfiguredCachingIntegrationTests.java index b4e48e5b..dea50655 100644 --- a/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/caching/ManuallyConfiguredCachingIntegrationTests.java +++ b/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/caching/ManuallyConfiguredCachingIntegrationTests.java @@ -28,7 +28,6 @@ import org.springframework.cache.CacheManager; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.data.gemfire.cache.GemfireCacheManager; -import org.springframework.data.gemfire.config.annotation.EnableDiskStore; import org.springframework.data.gemfire.tests.integration.IntegrationTestsSupport; import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects; import org.springframework.geode.boot.autoconfigure.CachingProviderAutoConfiguration; @@ -68,8 +67,8 @@ public class ManuallyConfiguredCachingIntegrationTests extends IntegrationTestsS public void gemfireCacheManagerNotPresent() { assertThat(this.applicationContext).isNotNull(); - assertThat(this.applicationContext.containsBean("gemfireCache")); - assertThat(this.applicationContext.containsBean("cacheManager")); + assertThat(this.applicationContext.containsBean("gemfireCache")).isTrue(); + assertThat(this.applicationContext.containsBean("cacheManager")).isTrue(); CacheManager mockCacheManager = this.applicationContext.getBean("cacheManager", CacheManager.class); diff --git a/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/caching/ManuallyConfiguredWithPropertiesCachingIntegrationTests.java b/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/caching/ManuallyConfiguredWithPropertiesCachingIntegrationTests.java new file mode 100644 index 00000000..7bcefbc9 --- /dev/null +++ b/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/caching/ManuallyConfiguredWithPropertiesCachingIntegrationTests.java @@ -0,0 +1,71 @@ +/* + * Copyright 2018 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.geode.boot.autoconfigure.caching; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.data.gemfire.tests.integration.IntegrationTestsSupport; +import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects; +import org.springframework.geode.boot.autoconfigure.CachingProviderAutoConfiguration; +import org.springframework.geode.boot.autoconfigure.ContinuousQueryAutoConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Integration tests asserting that the {@link CachingProviderAutoConfiguration} + * respects the Spring Boot {@literal spring.cache.type} property. + * + * @author John Blum + * @see org.junit.Test + * @see org.springframework.boot.autoconfigure.SpringBootApplication + * @see org.springframework.boot.test.context.SpringBootTest + * @see org.springframework.context.ApplicationContext + * @see org.springframework.data.gemfire.tests.integration.IntegrationTestsSupport + * @see org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects + * @see org.springframework.geode.boot.autoconfigure.CachingProviderAutoConfiguration + * @see org.springframework.test.context.junit4.SpringRunner + * @since 1.0.0 + */ +@RunWith(SpringRunner.class) +@SpringBootTest( + properties = "spring.cache.type=none", + webEnvironment = SpringBootTest.WebEnvironment.NONE +) +@SuppressWarnings("unused") +public class ManuallyConfiguredWithPropertiesCachingIntegrationTests extends IntegrationTestsSupport { + + @Autowired + private ApplicationContext applicationContext; + + @Test + public void gemfireCacheManagerNotPresent() { + + assertThat(this.applicationContext).isNotNull(); + assertThat(this.applicationContext.containsBean("gemfireCache")).isTrue(); + assertThat(this.applicationContext.containsBean("cacheManager")).isFalse(); + } + + @EnableGemFireMockObjects + @SpringBootApplication(exclude = ContinuousQueryAutoConfiguration.class) + static class TestConfiguration { } + +}