From 88eaa08ec8d838981706f55698ade3cd9c5df88e Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sat, 1 Jun 2019 22:18:57 -0400 Subject: [PATCH 1/8] How to configure additional Datasource for Spring Session #96 --- .../http/MongoHttpSessionConfiguration.java | 151 +++--- .../http/SpringSessionMongoOperations.java | 38 ++ .../MongoHttpSessionConfigurationTest.java | 442 ++++++++++++------ 3 files changed, 422 insertions(+), 209 deletions(-) create mode 100644 src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java index 3415ea47..5d506af3 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java @@ -18,6 +18,7 @@ import java.time.Duration; import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.context.annotation.Bean; @@ -45,74 +46,86 @@ */ @Configuration public class MongoHttpSessionConfiguration extends SpringHttpSessionConfiguration - implements BeanClassLoaderAware, EmbeddedValueResolverAware, ImportAware { - - private AbstractMongoSessionConverter mongoSessionConverter; - private Integer maxInactiveIntervalInSeconds; - private String collectionName; - private StringValueResolver embeddedValueResolver; - private ClassLoader classLoader; - - @Bean - public MongoOperationsSessionRepository mongoSessionRepository(MongoOperations mongoOperations) { - - MongoOperationsSessionRepository repository = new MongoOperationsSessionRepository(mongoOperations); - repository.setMaxInactiveIntervalInSeconds(this.maxInactiveIntervalInSeconds); - - if (this.mongoSessionConverter != null) { - repository.setMongoSessionConverter(this.mongoSessionConverter); - } else { - JdkMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(new SerializingConverter(), - new DeserializingConverter(this.classLoader), - Duration.ofSeconds(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL)); - repository.setMongoSessionConverter(mongoSessionConverter); - } - - if (StringUtils.hasText(this.collectionName)) { - repository.setCollectionName(this.collectionName); - } - - return repository; - } - - public void setCollectionName(String collectionName) { - this.collectionName = collectionName; - } - - public void setMaxInactiveIntervalInSeconds(Integer maxInactiveIntervalInSeconds) { - this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds; - } - - public void setImportMetadata(AnnotationMetadata importMetadata) { - - AnnotationAttributes attributes = AnnotationAttributes - .fromMap(importMetadata.getAnnotationAttributes(EnableMongoHttpSession.class.getName())); - - if (attributes != null) { - this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); - } else { - this.maxInactiveIntervalInSeconds = MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL; - } - - String collectionNameValue = attributes != null ? attributes.getString("collectionName") : ""; - if (StringUtils.hasText(collectionNameValue)) { - this.collectionName = this.embeddedValueResolver.resolveStringValue(collectionNameValue); - } - } - - @Autowired(required = false) - public void setMongoSessionConverter(AbstractMongoSessionConverter mongoSessionConverter) { - this.mongoSessionConverter = mongoSessionConverter; - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - - @Override - public void setEmbeddedValueResolver(StringValueResolver resolver) { - this.embeddedValueResolver = resolver; - } + implements BeanClassLoaderAware, EmbeddedValueResolverAware, ImportAware { + + private AbstractMongoSessionConverter mongoSessionConverter; + private Integer maxInactiveIntervalInSeconds; + private String collectionName; + private StringValueResolver embeddedValueResolver; + private ClassLoader classLoader; + private MongoOperations mongoOperations; + + @Autowired + public void setMongoOperations( + @SpringSessionMongoOperations ObjectProvider springSessionMongoOperations, + ObjectProvider mongoOperations) { + MongoOperations mongoOperationsToUse = springSessionMongoOperations.getIfAvailable(); + if (mongoOperationsToUse == null) { + mongoOperationsToUse = mongoOperations.getObject(); + } + this.mongoOperations = mongoOperationsToUse; + } + + @Bean + public MongoOperationsSessionRepository mongoSessionRepository() { + + MongoOperationsSessionRepository repository = new MongoOperationsSessionRepository(mongoOperations); + repository.setMaxInactiveIntervalInSeconds(this.maxInactiveIntervalInSeconds); + + if (this.mongoSessionConverter != null) { + repository.setMongoSessionConverter(this.mongoSessionConverter); + } else { + JdkMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(new SerializingConverter(), + new DeserializingConverter(this.classLoader), + Duration.ofSeconds(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL)); + repository.setMongoSessionConverter(mongoSessionConverter); + } + + if (StringUtils.hasText(this.collectionName)) { + repository.setCollectionName(this.collectionName); + } + + return repository; + } + + public void setCollectionName(String collectionName) { + this.collectionName = collectionName; + } + + public void setMaxInactiveIntervalInSeconds(Integer maxInactiveIntervalInSeconds) { + this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds; + } + + public void setImportMetadata(AnnotationMetadata importMetadata) { + + AnnotationAttributes attributes = AnnotationAttributes + .fromMap(importMetadata.getAnnotationAttributes(EnableMongoHttpSession.class.getName())); + + if (attributes != null) { + this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); + } else { + this.maxInactiveIntervalInSeconds = MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL; + } + + String collectionNameValue = attributes != null ? attributes.getString("collectionName") : ""; + if (StringUtils.hasText(collectionNameValue)) { + this.collectionName = this.embeddedValueResolver.resolveStringValue(collectionNameValue); + } + } + + @Autowired(required = false) + public void setMongoSessionConverter(AbstractMongoSessionConverter mongoSessionConverter) { + this.mongoSessionConverter = mongoSessionConverter; + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + @Override + public void setEmbeddedValueResolver(StringValueResolver resolver) { + this.embeddedValueResolver = resolver; + } } diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java new file mode 100644 index 00000000..f12aa1f2 --- /dev/null +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java @@ -0,0 +1,38 @@ +package org.springframework.session.data.mongo.config.annotation.web.http; + +import org.springframework.beans.factory.annotation.Qualifier; + +import java.lang.annotation.*; + +/* + * Copyright 2019 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 + * + * https://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. + */ +/** + * Qualifier annotation for a {@link org.springframework.data.mongodb.core.MongoOperations} to be injected in + * {@link org.springframework.session.data.mongo.MongoOperationsSessionRepository}. + * + * This will enable us to have multiple MongoOperations in the application. + * + * @author Visweshwar Ganesh + * @since 2.x.x + */ +@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, + ElementType.ANNOTATION_TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Qualifier +public @interface SpringSessionMongoOperations { + +} \ No newline at end of file diff --git a/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java b/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java index 0e1d580a..ada9608e 100644 --- a/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java +++ b/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java @@ -15,21 +15,12 @@ */ package org.springframework.session.data.mongo.config.annotation.web.http; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.*; - -import java.net.UnknownHostException; - import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.springframework.beans.factory.UnsatisfiedDependencyException; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.annotation.*; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.index.IndexOperations; @@ -38,6 +29,12 @@ import org.springframework.session.data.mongo.MongoOperationsSessionRepository; import org.springframework.test.util.ReflectionTestUtils; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.mock; + /** * Tests for {@link MongoHttpSessionConfiguration}. * @@ -46,199 +43,364 @@ */ public class MongoHttpSessionConfigurationTest { - private static final String COLLECTION_NAME = "testSessions"; + private static final String COLLECTION_NAME = "testSessions"; + + private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600; + + @Rule + public final ExpectedException thrown = ExpectedException.none(); + + + private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + + + @After + public void after() { + + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void noMongoOperationsConfiguration() { + + assertThatExceptionOfType(BeanCreationException.class) + .isThrownBy(() -> registerAndRefresh(NoMongoOperationsConfiguration.class)) + .withMessageContaining( + "expected at least 1 bean which qualifies as autowire candidate"); + } + + @Test + public void defaultConfiguration() { + + registerAndRefresh(DefaultConfiguration.class); + + assertThat(this.context.getBean(MongoOperationsSessionRepository.class)).isNotNull(); + } + + @Test + public void customCollectionName() { + + registerAndRefresh(CustomCollectionNameConfiguration.class); + + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + + assertThat(repository).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "collectionName")).isEqualTo(COLLECTION_NAME); + } + + @Test + public void setCustomCollectionName() { + + registerAndRefresh(CustomCollectionNameSetConfiguration.class); + + MongoHttpSessionConfiguration session = this.context.getBean(MongoHttpSessionConfiguration.class); + + assertThat(session).isNotNull(); + assertThat(ReflectionTestUtils.getField(session, "collectionName")).isEqualTo(COLLECTION_NAME); + } + + @Test + public void customMaxInactiveIntervalInSeconds() { + + registerAndRefresh(CustomMaxInactiveIntervalInSecondsConfiguration.class); + + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + + assertThat(repository).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) + .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); + } + + @Test + public void setCustomMaxInactiveIntervalInSeconds() { + + registerAndRefresh(CustomMaxInactiveIntervalInSecondsSetConfiguration.class); + + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + + assertThat(repository).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) + .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); + } + + @Test + public void setCustomSessionConverterConfiguration() { + + registerAndRefresh(CustomSessionConverterConfiguration.class); + + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + AbstractMongoSessionConverter mongoSessionConverter = this.context.getBean(AbstractMongoSessionConverter.class); + + assertThat(repository).isNotNull(); + assertThat(mongoSessionConverter).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "mongoSessionConverter")).isEqualTo(mongoSessionConverter); + } + + @Test + public void resolveCollectionNameByPropertyPlaceholder() { + + this.context.setEnvironment(new MockEnvironment().withProperty("session.mongo.collectionName", COLLECTION_NAME)); + registerAndRefresh(CustomMongoJdbcSessionConfiguration.class); + + MongoHttpSessionConfiguration configuration = this.context.getBean(MongoHttpSessionConfiguration.class); + + assertThat(ReflectionTestUtils.getField(configuration, "collectionName")).isEqualTo(COLLECTION_NAME); + } + + private void registerAndRefresh(Class... annotatedClasses) { + + this.context.register(annotatedClasses); + this.context.refresh(); + } + + @Test + public void multipleDataSourceConfiguration() { + assertThatExceptionOfType(BeanCreationException.class) + .isThrownBy(() -> registerAndRefresh(MongoOperationConfiguration.class, + MultipleMongoOperationsConfiguration.class)) + .withMessageContaining("expected single matching bean but found 2"); + } + + + @Test + public void primaryMongoOperationConfiguration() { + + registerAndRefresh(MongoOperationConfiguration.class, + PrimaryMongoOperationsConfiguration.class); + + + MongoOperationsSessionRepository repository = this.context + .getBean(MongoOperationsSessionRepository.class); + MongoOperations mongoOperations = this.context.getBean("primaryMongoOperations", + MongoOperations.class); + assertThat(repository).isNotNull(); + assertThat(mongoOperations).isNotNull(); + MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils + .getField(repository, "mongoOperations"); + assertThat(mongoOperationsReflection).isNotNull(); + assertThat((mongoOperationsReflection)) + .isEqualTo(mongoOperations); + } + + + @Test + public void qualifiedDataSourceConfiguration() { + registerAndRefresh(MongoOperationConfiguration.class, + QualifiedMongoOperationsConfiguration.class); + + MongoOperationsSessionRepository repository = this.context + .getBean(MongoOperationsSessionRepository.class); + MongoOperations mongoOperations = this.context.getBean("qualifiedMongoOperations", + MongoOperations.class); + assertThat(repository).isNotNull(); + assertThat(mongoOperations).isNotNull(); + MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils + .getField(repository, "mongoOperations"); + assertThat(mongoOperationsReflection).isNotNull(); + assertThat(mongoOperationsReflection) + .isEqualTo(mongoOperations); + } - private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600; - @Rule public final ExpectedException thrown = ExpectedException.none(); + @Test + public void qualifiedAndPrimaryDataSourceConfiguration() { + registerAndRefresh(MongoOperationConfiguration.class, + QualifiedAndPrimaryMongoConfiguration.class); - private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + MongoOperationsSessionRepository repository = this.context + .getBean(MongoOperationsSessionRepository.class); + MongoOperations mongoOperations = this.context.getBean("qualifiedMongoOperations", + MongoOperations.class); + assertThat(repository).isNotNull(); + assertThat(mongoOperations).isNotNull(); + MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils + .getField(repository, "mongoOperations"); + assertThat(mongoOperations).isNotNull(); + assertThat(mongoOperationsReflection) + .isEqualTo(mongoOperations); + } - @After - public void after() { - if (this.context != null) { - this.context.close(); - } - } + @Configuration + @EnableMongoHttpSession + static class EmptyConfiguration { - @Test - public void noMongoOperationsConfiguration() { + } - this.thrown.expect(UnsatisfiedDependencyException.class); - this.thrown.expectMessage("mongoSessionRepository"); + @Configuration + static class MongoOperationConfiguration { - registerAndRefresh(EmptyConfiguration.class); - } + @Bean + public MongoOperations defaultMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - @Test - public void defaultConfiguration() { + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - registerAndRefresh(DefaultConfiguration.class); + return mongoOperations; + } - assertThat(this.context.getBean(MongoOperationsSessionRepository.class)).isNotNull(); - } + } - @Test - public void customCollectionName() { + static class BaseConfiguration { - registerAndRefresh(CustomCollectionNameConfiguration.class); + @Bean + public MongoOperations mongoOperations() { - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "collectionName")).isEqualTo(COLLECTION_NAME); - } + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - @Test - public void setCustomCollectionName() { + return mongoOperations; + } - registerAndRefresh(CustomCollectionNameSetConfiguration.class); + } - MongoHttpSessionConfiguration session = this.context.getBean(MongoHttpSessionConfiguration.class); + @Configuration + @EnableMongoHttpSession + static class DefaultConfiguration extends BaseConfiguration { - assertThat(session).isNotNull(); - assertThat(ReflectionTestUtils.getField(session, "collectionName")).isEqualTo(COLLECTION_NAME); - } + } - @Test - public void customMaxInactiveIntervalInSeconds() { + @Configuration + static class MongoConfiguration extends BaseConfiguration { - registerAndRefresh(CustomMaxInactiveIntervalInSecondsConfiguration.class); + } - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + @Configuration + @EnableMongoHttpSession(collectionName = COLLECTION_NAME) + static class CustomCollectionNameConfiguration extends BaseConfiguration { - assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) - .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); - } + } - @Test - public void setCustomMaxInactiveIntervalInSeconds() { + @Configuration + @Import(MongoConfiguration.class) + static class CustomCollectionNameSetConfiguration extends MongoHttpSessionConfiguration { - registerAndRefresh(CustomMaxInactiveIntervalInSecondsSetConfiguration.class); + CustomCollectionNameSetConfiguration() { + setCollectionName(COLLECTION_NAME); + } - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + } - assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) - .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); - } + @Configuration + @EnableMongoHttpSession(maxInactiveIntervalInSeconds = MAX_INACTIVE_INTERVAL_IN_SECONDS) + static class CustomMaxInactiveIntervalInSecondsConfiguration extends BaseConfiguration { - @Test - public void setCustomSessionConverterConfiguration() { + } - registerAndRefresh(CustomSessionConverterConfiguration.class); + @Configuration + @Import(MongoConfiguration.class) + static class CustomMaxInactiveIntervalInSecondsSetConfiguration extends MongoHttpSessionConfiguration { - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); - AbstractMongoSessionConverter mongoSessionConverter = this.context.getBean(AbstractMongoSessionConverter.class); + CustomMaxInactiveIntervalInSecondsSetConfiguration() { + setMaxInactiveIntervalInSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS); + } - assertThat(repository).isNotNull(); - assertThat(mongoSessionConverter).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "mongoSessionConverter")).isEqualTo(mongoSessionConverter); - } + } - @Test - public void resolveCollectionNameByPropertyPlaceholder() { + @Configuration + @Import(MongoConfiguration.class) + static class CustomSessionConverterConfiguration extends MongoHttpSessionConfiguration { - this.context.setEnvironment(new MockEnvironment().withProperty("session.mongo.collectionName", COLLECTION_NAME)); - registerAndRefresh(CustomMongoJdbcSessionConfiguration.class); + @Bean + public AbstractMongoSessionConverter mongoSessionConverter() { + return mock(AbstractMongoSessionConverter.class); + } - MongoHttpSessionConfiguration configuration = this.context.getBean(MongoHttpSessionConfiguration.class); + } - assertThat(ReflectionTestUtils.getField(configuration, "collectionName")).isEqualTo(COLLECTION_NAME); - } + @Configuration + @EnableMongoHttpSession(collectionName = "${session.mongo.collectionName}") + static class CustomMongoJdbcSessionConfiguration extends BaseConfiguration { - private void registerAndRefresh(Class... annotatedClasses) { + @Bean + public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } - this.context.register(annotatedClasses); - this.context.refresh(); - } + } - @Configuration - @EnableMongoHttpSession - static class EmptyConfiguration { - } + @EnableMongoHttpSession + static class NoMongoOperationsConfiguration { - static class BaseConfiguration { + } - @Bean - public MongoOperations mongoOperations() throws UnknownHostException { - MongoOperations mongoOperations = mock(MongoOperations.class); - IndexOperations indexOperations = mock(IndexOperations.class); + @EnableMongoHttpSession + static class MultipleMongoOperationsConfiguration { - given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); + @Bean + public MongoOperations secondaryDataSource() { + return mock(MongoOperations.class); + } - return mongoOperations; - } + } - } - @Configuration - @EnableMongoHttpSession - static class DefaultConfiguration extends BaseConfiguration { + @EnableMongoHttpSession + static class PrimaryMongoOperationsConfiguration { - } + @Bean + @Primary + public MongoOperations primaryMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - @Configuration - static class MongoConfiguration extends BaseConfiguration { + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - } + return mongoOperations; + } - @Configuration - @EnableMongoHttpSession(collectionName = COLLECTION_NAME) - static class CustomCollectionNameConfiguration extends BaseConfiguration { + } - } + @EnableMongoHttpSession + static class QualifiedMongoOperationsConfiguration { - @Configuration - @Import(MongoConfiguration.class) - static class CustomCollectionNameSetConfiguration extends MongoHttpSessionConfiguration { + @Bean + @SpringSessionMongoOperations + public MongoOperations qualifiedMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - CustomCollectionNameSetConfiguration() { - setCollectionName(COLLECTION_NAME); - } + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - } + return mongoOperations; + } - @Configuration - @EnableMongoHttpSession(maxInactiveIntervalInSeconds = MAX_INACTIVE_INTERVAL_IN_SECONDS) - static class CustomMaxInactiveIntervalInSecondsConfiguration extends BaseConfiguration { + } - } + @EnableMongoHttpSession + static class QualifiedAndPrimaryMongoConfiguration { - @Configuration - @Import(MongoConfiguration.class) - static class CustomMaxInactiveIntervalInSecondsSetConfiguration extends MongoHttpSessionConfiguration { + @Bean + @SpringSessionMongoOperations + public MongoOperations qualifiedMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - CustomMaxInactiveIntervalInSecondsSetConfiguration() { - setMaxInactiveIntervalInSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS); - } + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - } + return mongoOperations; + } - @Configuration - @Import(MongoConfiguration.class) - static class CustomSessionConverterConfiguration extends MongoHttpSessionConfiguration { - @Bean - public AbstractMongoSessionConverter mongoSessionConverter() { - return mock(AbstractMongoSessionConverter.class); - } + @Bean + @Primary + public MongoOperations primaryMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - } + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - @Configuration - @EnableMongoHttpSession(collectionName = "${session.mongo.collectionName}") - static class CustomMongoJdbcSessionConfiguration extends BaseConfiguration { + return mongoOperations; + } - @Bean - public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { - return new PropertySourcesPlaceholderConfigurer(); - } - } + } } From 09822b583771b364d60409bec34c8e12f97fcb2c Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sat, 1 Jun 2019 22:19:53 -0400 Subject: [PATCH 2/8] How to configure additional Datasource for Spring Session #96 --- .../annotation/web/http/SpringSessionMongoOperations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java index f12aa1f2..7613ef17 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java @@ -26,7 +26,7 @@ * This will enable us to have multiple MongoOperations in the application. * * @author Visweshwar Ganesh - * @since 2.x.x + * @since 2.2.0 */ @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE }) From c6b215ccfbd67fdf92a53e3f5202b6a15df6c9ad Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sat, 1 Jun 2019 22:55:18 -0400 Subject: [PATCH 3/8] Reformatting the code.. #96 --- .../http/MongoHttpSessionConfiguration.java | 162 +++--- .../http/SpringSessionMongoOperations.java | 6 +- .../MongoHttpSessionConfigurationTest.java | 494 +++++++++--------- 3 files changed, 319 insertions(+), 343 deletions(-) diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java index 5d506af3..58324d13 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java @@ -46,86 +46,86 @@ */ @Configuration public class MongoHttpSessionConfiguration extends SpringHttpSessionConfiguration - implements BeanClassLoaderAware, EmbeddedValueResolverAware, ImportAware { - - private AbstractMongoSessionConverter mongoSessionConverter; - private Integer maxInactiveIntervalInSeconds; - private String collectionName; - private StringValueResolver embeddedValueResolver; - private ClassLoader classLoader; - private MongoOperations mongoOperations; - - @Autowired - public void setMongoOperations( - @SpringSessionMongoOperations ObjectProvider springSessionMongoOperations, - ObjectProvider mongoOperations) { - MongoOperations mongoOperationsToUse = springSessionMongoOperations.getIfAvailable(); - if (mongoOperationsToUse == null) { - mongoOperationsToUse = mongoOperations.getObject(); - } - this.mongoOperations = mongoOperationsToUse; - } - - @Bean - public MongoOperationsSessionRepository mongoSessionRepository() { - - MongoOperationsSessionRepository repository = new MongoOperationsSessionRepository(mongoOperations); - repository.setMaxInactiveIntervalInSeconds(this.maxInactiveIntervalInSeconds); - - if (this.mongoSessionConverter != null) { - repository.setMongoSessionConverter(this.mongoSessionConverter); - } else { - JdkMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(new SerializingConverter(), - new DeserializingConverter(this.classLoader), - Duration.ofSeconds(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL)); - repository.setMongoSessionConverter(mongoSessionConverter); - } - - if (StringUtils.hasText(this.collectionName)) { - repository.setCollectionName(this.collectionName); - } - - return repository; - } - - public void setCollectionName(String collectionName) { - this.collectionName = collectionName; - } - - public void setMaxInactiveIntervalInSeconds(Integer maxInactiveIntervalInSeconds) { - this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds; - } - - public void setImportMetadata(AnnotationMetadata importMetadata) { - - AnnotationAttributes attributes = AnnotationAttributes - .fromMap(importMetadata.getAnnotationAttributes(EnableMongoHttpSession.class.getName())); - - if (attributes != null) { - this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); - } else { - this.maxInactiveIntervalInSeconds = MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL; - } - - String collectionNameValue = attributes != null ? attributes.getString("collectionName") : ""; - if (StringUtils.hasText(collectionNameValue)) { - this.collectionName = this.embeddedValueResolver.resolveStringValue(collectionNameValue); - } - } - - @Autowired(required = false) - public void setMongoSessionConverter(AbstractMongoSessionConverter mongoSessionConverter) { - this.mongoSessionConverter = mongoSessionConverter; - } - - @Override - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - - @Override - public void setEmbeddedValueResolver(StringValueResolver resolver) { - this.embeddedValueResolver = resolver; - } + implements BeanClassLoaderAware, EmbeddedValueResolverAware, ImportAware { + + private AbstractMongoSessionConverter mongoSessionConverter; + private Integer maxInactiveIntervalInSeconds; + private String collectionName; + private StringValueResolver embeddedValueResolver; + private ClassLoader classLoader; + private MongoOperations mongoOperations; + + @Autowired + public void setMongoOperations( + @SpringSessionMongoOperations ObjectProvider springSessionMongoOperations, + ObjectProvider mongoOperations) { + MongoOperations mongoOperationsToUse = springSessionMongoOperations.getIfAvailable(); + if (mongoOperationsToUse == null) { + mongoOperationsToUse = mongoOperations.getObject(); + } + this.mongoOperations = mongoOperationsToUse; + } + + @Bean + public MongoOperationsSessionRepository mongoSessionRepository() { + + MongoOperationsSessionRepository repository = new MongoOperationsSessionRepository(mongoOperations); + repository.setMaxInactiveIntervalInSeconds(this.maxInactiveIntervalInSeconds); + + if (this.mongoSessionConverter != null) { + repository.setMongoSessionConverter(this.mongoSessionConverter); + } else { + JdkMongoSessionConverter mongoSessionConverter = new JdkMongoSessionConverter(new SerializingConverter(), + new DeserializingConverter(this.classLoader), + Duration.ofSeconds(MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL)); + repository.setMongoSessionConverter(mongoSessionConverter); + } + + if (StringUtils.hasText(this.collectionName)) { + repository.setCollectionName(this.collectionName); + } + + return repository; + } + + public void setCollectionName(String collectionName) { + this.collectionName = collectionName; + } + + public void setMaxInactiveIntervalInSeconds(Integer maxInactiveIntervalInSeconds) { + this.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds; + } + + public void setImportMetadata(AnnotationMetadata importMetadata) { + + AnnotationAttributes attributes = AnnotationAttributes.fromMap( + importMetadata.getAnnotationAttributes(EnableMongoHttpSession.class.getName())); + + if (attributes != null) { + this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); + } else { + this.maxInactiveIntervalInSeconds = MongoOperationsSessionRepository.DEFAULT_INACTIVE_INTERVAL; + } + + String collectionNameValue = attributes != null ? attributes.getString("collectionName") : ""; + if (StringUtils.hasText(collectionNameValue)) { + this.collectionName = this.embeddedValueResolver.resolveStringValue(collectionNameValue); + } + } + + @Autowired(required = false) + public void setMongoSessionConverter(AbstractMongoSessionConverter mongoSessionConverter) { + this.mongoSessionConverter = mongoSessionConverter; + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + @Override + public void setEmbeddedValueResolver(StringValueResolver resolver) { + this.embeddedValueResolver = resolver; + } } diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java index 7613ef17..edbec87c 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java @@ -19,17 +19,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + /** * Qualifier annotation for a {@link org.springframework.data.mongodb.core.MongoOperations} to be injected in * {@link org.springframework.session.data.mongo.MongoOperationsSessionRepository}. - * + *

* This will enable us to have multiple MongoOperations in the application. * * @author Visweshwar Ganesh * @since 2.2.0 */ -@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, - ElementType.ANNOTATION_TYPE }) +@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Qualifier diff --git a/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java b/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java index ada9608e..62ee715d 100644 --- a/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java +++ b/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java @@ -43,364 +43,340 @@ */ public class MongoHttpSessionConfigurationTest { - private static final String COLLECTION_NAME = "testSessions"; + private static final String COLLECTION_NAME = "testSessions"; - private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600; + private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600; - @Rule - public final ExpectedException thrown = ExpectedException.none(); + @Rule + public final ExpectedException thrown = ExpectedException.none(); + private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + @After + public void after() { + if (this.context != null) { + this.context.close(); + } + } - @After - public void after() { + @Test + public void noMongoOperationsConfiguration() { - if (this.context != null) { - this.context.close(); - } - } + assertThatExceptionOfType(BeanCreationException.class).isThrownBy( + () -> registerAndRefresh(NoMongoOperationsConfiguration.class)).withMessageContaining( + "expected at least 1 bean which qualifies as autowire candidate"); + } - @Test - public void noMongoOperationsConfiguration() { + @Test + public void defaultConfiguration() { - assertThatExceptionOfType(BeanCreationException.class) - .isThrownBy(() -> registerAndRefresh(NoMongoOperationsConfiguration.class)) - .withMessageContaining( - "expected at least 1 bean which qualifies as autowire candidate"); - } + registerAndRefresh(DefaultConfiguration.class); - @Test - public void defaultConfiguration() { + assertThat(this.context.getBean(MongoOperationsSessionRepository.class)).isNotNull(); + } - registerAndRefresh(DefaultConfiguration.class); + @Test + public void customCollectionName() { - assertThat(this.context.getBean(MongoOperationsSessionRepository.class)).isNotNull(); - } + registerAndRefresh(CustomCollectionNameConfiguration.class); - @Test - public void customCollectionName() { + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); - registerAndRefresh(CustomCollectionNameConfiguration.class); + assertThat(repository).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "collectionName")).isEqualTo(COLLECTION_NAME); + } - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + @Test + public void setCustomCollectionName() { - assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "collectionName")).isEqualTo(COLLECTION_NAME); - } + registerAndRefresh(CustomCollectionNameSetConfiguration.class); - @Test - public void setCustomCollectionName() { + MongoHttpSessionConfiguration session = this.context.getBean(MongoHttpSessionConfiguration.class); - registerAndRefresh(CustomCollectionNameSetConfiguration.class); + assertThat(session).isNotNull(); + assertThat(ReflectionTestUtils.getField(session, "collectionName")).isEqualTo(COLLECTION_NAME); + } - MongoHttpSessionConfiguration session = this.context.getBean(MongoHttpSessionConfiguration.class); + @Test + public void customMaxInactiveIntervalInSeconds() { - assertThat(session).isNotNull(); - assertThat(ReflectionTestUtils.getField(session, "collectionName")).isEqualTo(COLLECTION_NAME); - } + registerAndRefresh(CustomMaxInactiveIntervalInSecondsConfiguration.class); - @Test - public void customMaxInactiveIntervalInSeconds() { + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); - registerAndRefresh(CustomMaxInactiveIntervalInSecondsConfiguration.class); + assertThat(repository).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")).isEqualTo( + MAX_INACTIVE_INTERVAL_IN_SECONDS); + } - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + @Test + public void setCustomMaxInactiveIntervalInSeconds() { - assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) - .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); - } + registerAndRefresh(CustomMaxInactiveIntervalInSecondsSetConfiguration.class); - @Test - public void setCustomMaxInactiveIntervalInSeconds() { + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); - registerAndRefresh(CustomMaxInactiveIntervalInSecondsSetConfiguration.class); + assertThat(repository).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")).isEqualTo( + MAX_INACTIVE_INTERVAL_IN_SECONDS); + } - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + @Test + public void setCustomSessionConverterConfiguration() { - assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) - .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); - } + registerAndRefresh(CustomSessionConverterConfiguration.class); - @Test - public void setCustomSessionConverterConfiguration() { + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + AbstractMongoSessionConverter mongoSessionConverter = this.context.getBean(AbstractMongoSessionConverter.class); - registerAndRefresh(CustomSessionConverterConfiguration.class); + assertThat(repository).isNotNull(); + assertThat(mongoSessionConverter).isNotNull(); + assertThat(ReflectionTestUtils.getField(repository, "mongoSessionConverter")).isEqualTo(mongoSessionConverter); + } - MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); - AbstractMongoSessionConverter mongoSessionConverter = this.context.getBean(AbstractMongoSessionConverter.class); + @Test + public void resolveCollectionNameByPropertyPlaceholder() { - assertThat(repository).isNotNull(); - assertThat(mongoSessionConverter).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "mongoSessionConverter")).isEqualTo(mongoSessionConverter); - } + this.context.setEnvironment( + new MockEnvironment().withProperty("session.mongo.collectionName", COLLECTION_NAME)); + registerAndRefresh(CustomMongoJdbcSessionConfiguration.class); - @Test - public void resolveCollectionNameByPropertyPlaceholder() { + MongoHttpSessionConfiguration configuration = this.context.getBean(MongoHttpSessionConfiguration.class); - this.context.setEnvironment(new MockEnvironment().withProperty("session.mongo.collectionName", COLLECTION_NAME)); - registerAndRefresh(CustomMongoJdbcSessionConfiguration.class); + assertThat(ReflectionTestUtils.getField(configuration, "collectionName")).isEqualTo(COLLECTION_NAME); + } - MongoHttpSessionConfiguration configuration = this.context.getBean(MongoHttpSessionConfiguration.class); + private void registerAndRefresh(Class... annotatedClasses) { - assertThat(ReflectionTestUtils.getField(configuration, "collectionName")).isEqualTo(COLLECTION_NAME); - } + this.context.register(annotatedClasses); + this.context.refresh(); + } - private void registerAndRefresh(Class... annotatedClasses) { + @Test + public void multipleDataSourceConfiguration() { + assertThatExceptionOfType(BeanCreationException.class).isThrownBy( + () -> registerAndRefresh(MongoOperationConfiguration.class, + MultipleMongoOperationsConfiguration.class)).withMessageContaining( + "expected single matching bean but found 2"); + } - this.context.register(annotatedClasses); - this.context.refresh(); - } + @Test + public void primaryMongoOperationConfiguration() { - @Test - public void multipleDataSourceConfiguration() { - assertThatExceptionOfType(BeanCreationException.class) - .isThrownBy(() -> registerAndRefresh(MongoOperationConfiguration.class, - MultipleMongoOperationsConfiguration.class)) - .withMessageContaining("expected single matching bean but found 2"); - } + registerAndRefresh(MongoOperationConfiguration.class, PrimaryMongoOperationsConfiguration.class); + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + MongoOperations mongoOperations = this.context.getBean("primaryMongoOperations", MongoOperations.class); + assertThat(repository).isNotNull(); + assertThat(mongoOperations).isNotNull(); + MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils.getField(repository, + "mongoOperations"); + assertThat(mongoOperationsReflection).isNotNull(); + assertThat((mongoOperationsReflection)).isEqualTo(mongoOperations); + } - @Test - public void primaryMongoOperationConfiguration() { + @Test + public void qualifiedDataSourceConfiguration() { + registerAndRefresh(MongoOperationConfiguration.class, QualifiedMongoOperationsConfiguration.class); - registerAndRefresh(MongoOperationConfiguration.class, - PrimaryMongoOperationsConfiguration.class); + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + MongoOperations mongoOperations = this.context.getBean("qualifiedMongoOperations", MongoOperations.class); + assertThat(repository).isNotNull(); + assertThat(mongoOperations).isNotNull(); + MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils.getField(repository, + "mongoOperations"); + assertThat(mongoOperationsReflection).isNotNull(); + assertThat(mongoOperationsReflection).isEqualTo(mongoOperations); + } + @Test + public void qualifiedAndPrimaryDataSourceConfiguration() { + registerAndRefresh(MongoOperationConfiguration.class, QualifiedAndPrimaryMongoConfiguration.class); - MongoOperationsSessionRepository repository = this.context - .getBean(MongoOperationsSessionRepository.class); - MongoOperations mongoOperations = this.context.getBean("primaryMongoOperations", - MongoOperations.class); - assertThat(repository).isNotNull(); - assertThat(mongoOperations).isNotNull(); - MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils - .getField(repository, "mongoOperations"); - assertThat(mongoOperationsReflection).isNotNull(); - assertThat((mongoOperationsReflection)) - .isEqualTo(mongoOperations); - } + MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); + MongoOperations mongoOperations = this.context.getBean("qualifiedMongoOperations", MongoOperations.class); + assertThat(repository).isNotNull(); + assertThat(mongoOperations).isNotNull(); + MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils.getField(repository, + "mongoOperations"); + assertThat(mongoOperations).isNotNull(); + assertThat(mongoOperationsReflection).isEqualTo(mongoOperations); + } + @Configuration + @EnableMongoHttpSession + static class EmptyConfiguration { - @Test - public void qualifiedDataSourceConfiguration() { - registerAndRefresh(MongoOperationConfiguration.class, - QualifiedMongoOperationsConfiguration.class); + } - MongoOperationsSessionRepository repository = this.context - .getBean(MongoOperationsSessionRepository.class); - MongoOperations mongoOperations = this.context.getBean("qualifiedMongoOperations", - MongoOperations.class); - assertThat(repository).isNotNull(); - assertThat(mongoOperations).isNotNull(); - MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils - .getField(repository, "mongoOperations"); - assertThat(mongoOperationsReflection).isNotNull(); - assertThat(mongoOperationsReflection) - .isEqualTo(mongoOperations); - } + @Configuration + static class MongoOperationConfiguration { + @Bean + public MongoOperations defaultMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - @Test - public void qualifiedAndPrimaryDataSourceConfiguration() { - registerAndRefresh(MongoOperationConfiguration.class, - QualifiedAndPrimaryMongoConfiguration.class); + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - MongoOperationsSessionRepository repository = this.context - .getBean(MongoOperationsSessionRepository.class); - MongoOperations mongoOperations = this.context.getBean("qualifiedMongoOperations", - MongoOperations.class); - assertThat(repository).isNotNull(); - assertThat(mongoOperations).isNotNull(); - MongoOperations mongoOperationsReflection = (MongoOperations) ReflectionTestUtils - .getField(repository, "mongoOperations"); - assertThat(mongoOperations).isNotNull(); - assertThat(mongoOperationsReflection) - .isEqualTo(mongoOperations); - } + return mongoOperations; + } + } - @Configuration - @EnableMongoHttpSession - static class EmptyConfiguration { + static class BaseConfiguration { - } + @Bean + public MongoOperations mongoOperations() { - @Configuration - static class MongoOperationConfiguration { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - @Bean - public MongoOperations defaultMongoOperations() { - MongoOperations mongoOperations = mock(MongoOperations.class); - IndexOperations indexOperations = mock(IndexOperations.class); + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); + return mongoOperations; + } - return mongoOperations; - } + } - } + @Configuration + @EnableMongoHttpSession + static class DefaultConfiguration extends BaseConfiguration { - static class BaseConfiguration { + } - @Bean - public MongoOperations mongoOperations() { + @Configuration + static class MongoConfiguration extends BaseConfiguration { - MongoOperations mongoOperations = mock(MongoOperations.class); - IndexOperations indexOperations = mock(IndexOperations.class); + } - given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); + @Configuration + @EnableMongoHttpSession(collectionName = COLLECTION_NAME) + static class CustomCollectionNameConfiguration extends BaseConfiguration { - return mongoOperations; - } + } - } + @Configuration + @Import(MongoConfiguration.class) + static class CustomCollectionNameSetConfiguration extends MongoHttpSessionConfiguration { - @Configuration - @EnableMongoHttpSession - static class DefaultConfiguration extends BaseConfiguration { + CustomCollectionNameSetConfiguration() { + setCollectionName(COLLECTION_NAME); + } - } + } - @Configuration - static class MongoConfiguration extends BaseConfiguration { + @Configuration + @EnableMongoHttpSession(maxInactiveIntervalInSeconds = MAX_INACTIVE_INTERVAL_IN_SECONDS) + static class CustomMaxInactiveIntervalInSecondsConfiguration extends BaseConfiguration { - } + } - @Configuration - @EnableMongoHttpSession(collectionName = COLLECTION_NAME) - static class CustomCollectionNameConfiguration extends BaseConfiguration { + @Configuration + @Import(MongoConfiguration.class) + static class CustomMaxInactiveIntervalInSecondsSetConfiguration extends MongoHttpSessionConfiguration { - } + CustomMaxInactiveIntervalInSecondsSetConfiguration() { + setMaxInactiveIntervalInSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS); + } - @Configuration - @Import(MongoConfiguration.class) - static class CustomCollectionNameSetConfiguration extends MongoHttpSessionConfiguration { + } - CustomCollectionNameSetConfiguration() { - setCollectionName(COLLECTION_NAME); - } + @Configuration + @Import(MongoConfiguration.class) + static class CustomSessionConverterConfiguration extends MongoHttpSessionConfiguration { - } + @Bean + public AbstractMongoSessionConverter mongoSessionConverter() { + return mock(AbstractMongoSessionConverter.class); + } - @Configuration - @EnableMongoHttpSession(maxInactiveIntervalInSeconds = MAX_INACTIVE_INTERVAL_IN_SECONDS) - static class CustomMaxInactiveIntervalInSecondsConfiguration extends BaseConfiguration { + } - } + @Configuration + @EnableMongoHttpSession(collectionName = "${session.mongo.collectionName}") + static class CustomMongoJdbcSessionConfiguration extends BaseConfiguration { - @Configuration - @Import(MongoConfiguration.class) - static class CustomMaxInactiveIntervalInSecondsSetConfiguration extends MongoHttpSessionConfiguration { + @Bean + public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } - CustomMaxInactiveIntervalInSecondsSetConfiguration() { - setMaxInactiveIntervalInSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS); - } + } - } + @EnableMongoHttpSession + static class NoMongoOperationsConfiguration { - @Configuration - @Import(MongoConfiguration.class) - static class CustomSessionConverterConfiguration extends MongoHttpSessionConfiguration { + } - @Bean - public AbstractMongoSessionConverter mongoSessionConverter() { - return mock(AbstractMongoSessionConverter.class); - } + @EnableMongoHttpSession + static class MultipleMongoOperationsConfiguration { - } + @Bean + public MongoOperations secondaryDataSource() { + return mock(MongoOperations.class); + } - @Configuration - @EnableMongoHttpSession(collectionName = "${session.mongo.collectionName}") - static class CustomMongoJdbcSessionConfiguration extends BaseConfiguration { + } - @Bean - public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { - return new PropertySourcesPlaceholderConfigurer(); - } + @EnableMongoHttpSession + static class PrimaryMongoOperationsConfiguration { - } + @Bean + @Primary + public MongoOperations primaryMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - @EnableMongoHttpSession - static class NoMongoOperationsConfiguration { + return mongoOperations; + } - } + } + @EnableMongoHttpSession + static class QualifiedMongoOperationsConfiguration { - @EnableMongoHttpSession - static class MultipleMongoOperationsConfiguration { + @Bean + @SpringSessionMongoOperations + public MongoOperations qualifiedMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - @Bean - public MongoOperations secondaryDataSource() { - return mock(MongoOperations.class); - } + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - } + return mongoOperations; + } + } - @EnableMongoHttpSession - static class PrimaryMongoOperationsConfiguration { + @EnableMongoHttpSession + static class QualifiedAndPrimaryMongoConfiguration { - @Bean - @Primary - public MongoOperations primaryMongoOperations() { - MongoOperations mongoOperations = mock(MongoOperations.class); - IndexOperations indexOperations = mock(IndexOperations.class); + @Bean + @SpringSessionMongoOperations + public MongoOperations qualifiedMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - return mongoOperations; - } + return mongoOperations; + } - } + @Bean + @Primary + public MongoOperations primaryMongoOperations() { + MongoOperations mongoOperations = mock(MongoOperations.class); + IndexOperations indexOperations = mock(IndexOperations.class); - @EnableMongoHttpSession - static class QualifiedMongoOperationsConfiguration { + given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - @Bean - @SpringSessionMongoOperations - public MongoOperations qualifiedMongoOperations() { - MongoOperations mongoOperations = mock(MongoOperations.class); - IndexOperations indexOperations = mock(IndexOperations.class); + return mongoOperations; + } - given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - - return mongoOperations; - } - - } - - @EnableMongoHttpSession - static class QualifiedAndPrimaryMongoConfiguration { - - @Bean - @SpringSessionMongoOperations - public MongoOperations qualifiedMongoOperations() { - MongoOperations mongoOperations = mock(MongoOperations.class); - IndexOperations indexOperations = mock(IndexOperations.class); - - given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - - return mongoOperations; - } - - - @Bean - @Primary - public MongoOperations primaryMongoOperations() { - MongoOperations mongoOperations = mock(MongoOperations.class); - IndexOperations indexOperations = mock(IndexOperations.class); - - given(mongoOperations.indexOps(anyString())).willReturn(indexOperations); - - return mongoOperations; - } - - - } + } } From d74bad09c8dcab4916eebb7f77f2f98c436647d7 Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sun, 2 Jun 2019 08:03:10 -0400 Subject: [PATCH 4/8] Reformatting the code.. #96 --- .../http/MongoHttpSessionConfiguration.java | 4 +-- .../MongoHttpSessionConfigurationTest.java | 31 ++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java index 58324d13..fdbfff64 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java @@ -98,8 +98,8 @@ public void setMaxInactiveIntervalInSeconds(Integer maxInactiveIntervalInSeconds public void setImportMetadata(AnnotationMetadata importMetadata) { - AnnotationAttributes attributes = AnnotationAttributes.fromMap( - importMetadata.getAnnotationAttributes(EnableMongoHttpSession.class.getName())); + AnnotationAttributes attributes = AnnotationAttributes + .fromMap(importMetadata.getAnnotationAttributes(EnableMongoHttpSession.class.getName())); if (attributes != null) { this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); diff --git a/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java b/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java index 62ee715d..0c23f87e 100644 --- a/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java +++ b/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java @@ -15,12 +15,21 @@ */ package org.springframework.session.data.mongo.config.annotation.web.http; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.*; + + import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.index.IndexOperations; @@ -29,12 +38,6 @@ import org.springframework.session.data.mongo.MongoOperationsSessionRepository; import org.springframework.test.util.ReflectionTestUtils; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.mock; - /** * Tests for {@link MongoHttpSessionConfiguration}. * @@ -47,8 +50,7 @@ public class MongoHttpSessionConfigurationTest { private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 600; - @Rule - public final ExpectedException thrown = ExpectedException.none(); + @Rule public final ExpectedException thrown = ExpectedException.none(); private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); @@ -106,8 +108,8 @@ public void customMaxInactiveIntervalInSeconds() { MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")).isEqualTo( - MAX_INACTIVE_INTERVAL_IN_SECONDS); + assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) + .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); } @Test @@ -118,8 +120,8 @@ public void setCustomMaxInactiveIntervalInSeconds() { MongoOperationsSessionRepository repository = this.context.getBean(MongoOperationsSessionRepository.class); assertThat(repository).isNotNull(); - assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")).isEqualTo( - MAX_INACTIVE_INTERVAL_IN_SECONDS); + assertThat(ReflectionTestUtils.getField(repository, "maxInactiveIntervalInSeconds")) + .isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); } @Test @@ -138,8 +140,7 @@ public void setCustomSessionConverterConfiguration() { @Test public void resolveCollectionNameByPropertyPlaceholder() { - this.context.setEnvironment( - new MockEnvironment().withProperty("session.mongo.collectionName", COLLECTION_NAME)); + this.context.setEnvironment(new MockEnvironment().withProperty("session.mongo.collectionName", COLLECTION_NAME)); registerAndRefresh(CustomMongoJdbcSessionConfiguration.class); MongoHttpSessionConfiguration configuration = this.context.getBean(MongoHttpSessionConfiguration.class); From 201a53b7375b0f65a3e1f74752727dd41e12e932 Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sun, 2 Jun 2019 08:52:28 -0400 Subject: [PATCH 5/8] Fixing Style Errors #96 --- .../annotation/web/http/MongoHttpSessionConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java index fdbfff64..a7a00744 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java @@ -69,7 +69,7 @@ public void setMongoOperations( @Bean public MongoOperationsSessionRepository mongoSessionRepository() { - MongoOperationsSessionRepository repository = new MongoOperationsSessionRepository(mongoOperations); + MongoOperationsSessionRepository repository = new MongoOperationsSessionRepository(this.mongoOperations); repository.setMaxInactiveIntervalInSeconds(this.maxInactiveIntervalInSeconds); if (this.mongoSessionConverter != null) { @@ -128,4 +128,4 @@ public void setEmbeddedValueResolver(StringValueResolver resolver) { this.embeddedValueResolver = resolver; } -} +} \ No newline at end of file From 56c5329badab17b50909c9ba7f9a33874356760a Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sun, 2 Jun 2019 08:53:18 -0400 Subject: [PATCH 6/8] Fixing Style Errors #96 --- .../annotation/web/http/MongoHttpSessionConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java index a7a00744..0b33b7b8 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfiguration.java @@ -128,4 +128,4 @@ public void setEmbeddedValueResolver(StringValueResolver resolver) { this.embeddedValueResolver = resolver; } -} \ No newline at end of file +} From 07a3e30b95f022e48a5c6ee059cdcfd5701aaceb Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sun, 2 Jun 2019 09:05:08 -0400 Subject: [PATCH 7/8] Fixing Style Errors #96 --- .../http/SpringSessionMongoOperations.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java index edbec87c..e48f9573 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java @@ -1,9 +1,3 @@ -package org.springframework.session.data.mongo.config.annotation.web.http; - -import org.springframework.beans.factory.annotation.Qualifier; - -import java.lang.annotation.*; - /* * Copyright 2019 the original author or authors. * @@ -20,6 +14,17 @@ * limitations under the License. */ +package org.springframework.session.data.mongo.config.annotation.web.http; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.beans.factory.annotation.Qualifier; + + /** * Qualifier annotation for a {@link org.springframework.data.mongodb.core.MongoOperations} to be injected in * {@link org.springframework.session.data.mongo.MongoOperationsSessionRepository}. @@ -35,4 +40,4 @@ @Qualifier public @interface SpringSessionMongoOperations { -} \ No newline at end of file +} From 04cc78288fb47a7e39c2b2c4ad0a448390aba423 Mon Sep 17 00:00:00 2001 From: Visweshwar Date: Sun, 2 Jun 2019 10:51:56 -0400 Subject: [PATCH 8/8] Fixing Style Errors #96 --- .../annotation/web/http/SpringSessionMongoOperations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java index e48f9573..bb6ac7bb 100644 --- a/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java +++ b/src/main/java/org/springframework/session/data/mongo/config/annotation/web/http/SpringSessionMongoOperations.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 the original author or authors. + * Copyright 2014-2019 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.