diff --git a/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/SpringSessionAutoConfiguration.java b/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/SpringSessionAutoConfiguration.java index 9dfcf68b..08dfb9fa 100644 --- a/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/SpringSessionAutoConfiguration.java +++ b/spring-geode-autoconfigure/src/main/java/org/springframework/geode/boot/autoconfigure/SpringSessionAutoConfiguration.java @@ -16,17 +16,27 @@ package org.springframework.geode.boot.autoconfigure; +import static org.springframework.data.gemfire.util.CollectionUtils.asSet; + +import java.util.Optional; +import java.util.Set; + import org.apache.geode.cache.GemFireCache; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +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.session.Session; import org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession; import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration; import org.springframework.session.web.http.SessionRepositoryFilter; +import org.springframework.util.StringUtils; /** * Spring Boot {@link EnableAutoConfiguration auto-configuration} for configuring either Apache Geode @@ -44,6 +54,7 @@ import org.springframework.session.web.http.SessionRepositoryFilter; */ @Configuration @AutoConfigureAfter(ClientCacheAutoConfiguration.class) +@Conditional(SpringSessionAutoConfiguration.SpringSessionStoreTypeCondition.class) @ConditionalOnBean(GemFireCache.class) @ConditionalOnClass({ GemFireCache.class, GemFireHttpSessionConfiguration.class }) @ConditionalOnMissingBean(SessionRepositoryFilter.class) @@ -51,4 +62,22 @@ import org.springframework.session.web.http.SessionRepositoryFilter; @SuppressWarnings("unused") public class SpringSessionAutoConfiguration { + static final Set SPRING_SESSION_STORE_TYPES = asSet("gemfire", "geode"); + + static final String SPRING_SESSION_STORE_TYPE_PROPERTY = "spring.session.store-type"; + + static class SpringSessionStoreTypeCondition implements Condition { + + @Override @SuppressWarnings("all") + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + + String springSessionStoreTypeValue = + context.getEnvironment().getProperty(SPRING_SESSION_STORE_TYPE_PROPERTY); + + return Optional.ofNullable(springSessionStoreTypeValue) + .filter(StringUtils::hasText) + .map(it -> SPRING_SESSION_STORE_TYPES.contains(it.trim().toLowerCase())) + .orElse(true); + } + } } diff --git a/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/session/ManuallyConfiguredWithPropertiesSessionCachingIntegrationTests.java b/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/session/ManuallyConfiguredWithPropertiesSessionCachingIntegrationTests.java new file mode 100644 index 00000000..461453b5 --- /dev/null +++ b/spring-geode-autoconfigure/src/test/java/org/springframework/geode/boot/autoconfigure/session/ManuallyConfiguredWithPropertiesSessionCachingIntegrationTests.java @@ -0,0 +1,86 @@ +/* + * 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.session; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.geode.cache.GemFireCache; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +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.mock.annotation.EnableGemFireMockObjects; +import org.springframework.geode.boot.autoconfigure.ContinuousQueryAutoConfiguration; +import org.springframework.session.SessionRepository; +import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Integration Tests asserting the configuration of Spring Session using Spring Boot's + * {@literal spring.session.store-type} configuration property set to {@literal none} + * and assert neither Apache Geode nor Pivotal GemFire was configured as the Session + * state management provider. + * + * @author John Blum + * @see org.apache.geode.cache.GemFireCache + * @see org.springframework.boot.autoconfigure.SpringBootApplication + * @see org.springframework.boot.test.context.SpringBootTest + * @see org.springframework.context.ApplicationContext + * @see org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects + * @see org.springframework.session.SessionRepository + * @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration + * @see org.springframework.test.context.junit4.SpringRunner + * @since 1.0.0 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(properties = "spring.session.store-type=none") +@SuppressWarnings("unused") +public class ManuallyConfiguredWithPropertiesSessionCachingIntegrationTests { + + @Autowired + private ApplicationContext applicationContext; + + @Before + public void setup() { + assertThat(this.applicationContext).isNotNull(); + } + + @Test(expected = NoSuchBeanDefinitionException.class) + public void gemfireSessionRegionAndSessionRepositoryAreNotPresent() { + + assertThat(this.applicationContext.containsBean("gemfireCache")).isTrue(); + assertThat(this.applicationContext.containsBean("sessionRepository")).isFalse(); + assertThat(this.applicationContext.containsBean(GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME)) + .isFalse(); + + GemFireCache gemfireCache = this.applicationContext.getBean(GemFireCache.class); + + assertThat(gemfireCache).isNotNull(); + assertThat(gemfireCache.rootRegions()).isEmpty(); + + this.applicationContext.getBean(SessionRepository.class); + } + + @EnableGemFireMockObjects + @SpringBootApplication(exclude = ContinuousQueryAutoConfiguration.class) + static class TestConfiguration { } + +}