19 changed files with 648 additions and 76 deletions
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
/* |
||||
* Copyright 2012-2017 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.boot.autoconfigure.session; |
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
||||
import org.springframework.context.annotation.Conditional; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.data.mongodb.core.ReactiveMongoOperations; |
||||
import org.springframework.session.ReactiveSessionRepository; |
||||
import org.springframework.session.data.mongo.config.annotation.web.reactive.ReactiveMongoWebSessionConfiguration; |
||||
|
||||
/** |
||||
* Mongo-backed reactive session configuration. |
||||
* |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
@Configuration |
||||
@ConditionalOnClass(ReactiveMongoWebSessionConfiguration.class) |
||||
@ConditionalOnMissingBean(ReactiveSessionRepository.class) |
||||
@ConditionalOnBean(ReactiveMongoOperations.class) |
||||
@Conditional(ReactiveSessionCondition.class) |
||||
@EnableConfigurationProperties(MongoSessionProperties.class) |
||||
class MongoReactiveSessionConfiguration { |
||||
|
||||
@Configuration |
||||
static class SpringBootReactiveMongoWebSessionConfiguration |
||||
extends ReactiveMongoWebSessionConfiguration { |
||||
|
||||
@Autowired |
||||
public void customize(SessionProperties sessionProperties, |
||||
MongoSessionProperties mongoSessionProperties) { |
||||
Integer timeout = sessionProperties.getTimeout(); |
||||
if (timeout != null) { |
||||
setMaxInactiveIntervalInSeconds(timeout); |
||||
} |
||||
setCollectionName(mongoSessionProperties.getCollectionName()); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
/* |
||||
* Copyright 2012-2017 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.boot.autoconfigure.session; |
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
||||
import org.springframework.context.annotation.Conditional; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.session.ReactiveSessionRepository; |
||||
|
||||
/** |
||||
* No-op session configuration used to disable Spring Session using the environment. |
||||
* |
||||
* @author Tommy Ludwig |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
@Configuration |
||||
@ConditionalOnMissingBean(ReactiveSessionRepository.class) |
||||
@Conditional(ReactiveSessionCondition.class) |
||||
class NoOpReactiveSessionConfiguration { |
||||
|
||||
} |
||||
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
/* |
||||
* Copyright 2012-2017 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.boot.autoconfigure.session; |
||||
|
||||
import org.springframework.boot.WebApplicationType; |
||||
|
||||
/** |
||||
* General condition used with all reactive session configuration classes. |
||||
* |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
class ReactiveSessionCondition extends AbstractSessionCondition { |
||||
|
||||
ReactiveSessionCondition() { |
||||
super(WebApplicationType.REACTIVE); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
/* |
||||
* Copyright 2012-2017 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.boot.autoconfigure.session; |
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
||||
import org.springframework.context.annotation.Conditional; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; |
||||
import org.springframework.session.ReactiveSessionRepository; |
||||
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository; |
||||
import org.springframework.session.data.redis.config.annotation.web.server.RedisWebSessionConfiguration; |
||||
|
||||
/** |
||||
* Redis-backed reactive session configuration. |
||||
* |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
@Configuration |
||||
@ConditionalOnClass({ ReactiveRedisConnectionFactory.class, |
||||
ReactiveRedisOperationsSessionRepository.class }) |
||||
@ConditionalOnMissingBean(ReactiveSessionRepository.class) |
||||
@ConditionalOnBean(ReactiveRedisConnectionFactory.class) |
||||
@Conditional(ReactiveSessionCondition.class) |
||||
@EnableConfigurationProperties(RedisSessionProperties.class) |
||||
class RedisReactiveSessionConfiguration { |
||||
|
||||
@Configuration |
||||
static class SpringBootRedisWebSessionConfiguration |
||||
extends RedisWebSessionConfiguration { |
||||
|
||||
private SessionProperties sessionProperties; |
||||
|
||||
@Autowired |
||||
public void customize(SessionProperties sessionProperties, |
||||
RedisSessionProperties redisSessionProperties) { |
||||
this.sessionProperties = sessionProperties; |
||||
Integer timeout = this.sessionProperties.getTimeout(); |
||||
if (timeout != null) { |
||||
setMaxInactiveIntervalInSeconds(timeout); |
||||
} |
||||
setRedisNamespace(redisSessionProperties.getNamespace()); |
||||
setRedisFlushMode(redisSessionProperties.getFlushMode()); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
/* |
||||
* Copyright 2012-2017 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.boot.autoconfigure.session; |
||||
|
||||
import org.springframework.boot.WebApplicationType; |
||||
|
||||
/** |
||||
* General condition used with all servlet session configuration classes. |
||||
* |
||||
* @author Tommy Ludwig |
||||
* @author Stephane Nicoll |
||||
* @author Madhura Bhave |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
class ServletSessionCondition extends AbstractSessionCondition { |
||||
|
||||
ServletSessionCondition() { |
||||
super(WebApplicationType.SERVLET); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
/* |
||||
* Copyright 2012-2017 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.boot.autoconfigure.session; |
||||
|
||||
import org.junit.Test; |
||||
|
||||
import org.springframework.beans.DirectFieldAccessor; |
||||
import org.springframework.boot.autoconfigure.AutoConfigurations; |
||||
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration; |
||||
import org.springframework.boot.test.context.HideClassesClassLoader; |
||||
import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplicationContext; |
||||
import org.springframework.boot.test.context.runner.ContextConsumer; |
||||
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; |
||||
import org.springframework.session.data.mongo.ReactiveMongoOperationsSessionRepository; |
||||
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Mongo-specific tests for {@link SessionAutoConfiguration}. |
||||
* |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public class ReactiveSessionAutoConfigurationMongoTests |
||||
extends AbstractSessionAutoConfigurationTests { |
||||
|
||||
private final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner() |
||||
.withConfiguration(AutoConfigurations.of(SessionAutoConfiguration.class)); |
||||
|
||||
@Test |
||||
public void defaultConfig() { |
||||
this.contextRunner.withPropertyValues("spring.session.store-type=mongodb") |
||||
.withConfiguration(AutoConfigurations.of( |
||||
EmbeddedMongoAutoConfiguration.class, |
||||
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, |
||||
MongoReactiveAutoConfiguration.class, |
||||
MongoReactiveDataAutoConfiguration.class)) |
||||
.run(validateSpringSessionUsesMongo("sessions")); |
||||
} |
||||
|
||||
@Test |
||||
public void defaultConfigWithUniqueStoreImplementation() { |
||||
this.contextRunner |
||||
.withClassLoader(new HideClassesClassLoader( |
||||
ReactiveRedisOperationsSessionRepository.class)) |
||||
.withConfiguration(AutoConfigurations.of( |
||||
EmbeddedMongoAutoConfiguration.class, |
||||
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, |
||||
MongoReactiveAutoConfiguration.class, |
||||
MongoReactiveDataAutoConfiguration.class)) |
||||
.run(validateSpringSessionUsesMongo("sessions")); |
||||
} |
||||
|
||||
@Test |
||||
public void mongoSessionStoreWithCustomizations() { |
||||
this.contextRunner |
||||
.withConfiguration(AutoConfigurations.of( |
||||
EmbeddedMongoAutoConfiguration.class, |
||||
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, |
||||
MongoReactiveAutoConfiguration.class, |
||||
MongoReactiveDataAutoConfiguration.class)) |
||||
.withPropertyValues("spring.session.store-type=mongodb", |
||||
"spring.session.mongodb.collection-name=foo") |
||||
.run(validateSpringSessionUsesMongo("foo")); |
||||
} |
||||
|
||||
private ContextConsumer<AssertableReactiveWebApplicationContext> validateSpringSessionUsesMongo( |
||||
String collectionName) { |
||||
return (context) -> { |
||||
ReactiveMongoOperationsSessionRepository repository = validateSessionRepository( |
||||
context, ReactiveMongoOperationsSessionRepository.class); |
||||
assertThat(new DirectFieldAccessor(repository) |
||||
.getPropertyValue("collectionName")).isEqualTo(collectionName); |
||||
}; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
/* |
||||
* Copyright 2012-2017 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.boot.autoconfigure.session; |
||||
|
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
|
||||
import org.springframework.beans.DirectFieldAccessor; |
||||
import org.springframework.boot.autoconfigure.AutoConfigurations; |
||||
import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; |
||||
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration; |
||||
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportMessage; |
||||
import org.springframework.boot.test.context.HideClassesClassLoader; |
||||
import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplicationContext; |
||||
import org.springframework.boot.test.context.runner.ContextConsumer; |
||||
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; |
||||
import org.springframework.boot.testsupport.rule.RedisTestServer; |
||||
import org.springframework.session.data.mongo.ReactiveMongoOperationsSessionRepository; |
||||
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository; |
||||
import org.springframework.session.data.redis.RedisFlushMode; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Reactive Redis-specific tests for {@link SessionAutoConfiguration}. |
||||
* |
||||
* @author Stephane Nicoll |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public class ReactiveSessionAutoConfigurationRedisTests |
||||
extends AbstractSessionAutoConfigurationTests { |
||||
|
||||
@Rule |
||||
public final RedisTestServer redis = new RedisTestServer(); |
||||
|
||||
protected final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner() |
||||
.withConfiguration(AutoConfigurations.of(SessionAutoConfiguration.class)); |
||||
|
||||
@Test |
||||
public void defaultConfig() { |
||||
this.contextRunner.withPropertyValues("spring.session.store-type=redis") |
||||
.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class, |
||||
RedisReactiveAutoConfiguration.class)) |
||||
.run(validateSpringSessionUsesRedis(RedisFlushMode.ON_SAVE)); |
||||
} |
||||
|
||||
@Test |
||||
public void defaultConfigWithUniqueStoreImplementation() { |
||||
this.contextRunner |
||||
.withClassLoader(new HideClassesClassLoader( |
||||
ReactiveMongoOperationsSessionRepository.class)) |
||||
.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class, |
||||
RedisReactiveAutoConfiguration.class)) |
||||
.run(validateSpringSessionUsesRedis(RedisFlushMode.ON_SAVE)); |
||||
} |
||||
|
||||
@Test |
||||
public void redisSessionStoreWithCustomizations() { |
||||
this.contextRunner |
||||
.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class, |
||||
RedisReactiveAutoConfiguration.class)) |
||||
.withPropertyValues("spring.session.store-type=redis", |
||||
"spring.session.redis.namespace=foo", |
||||
"spring.session.redis.flush-mode=immediate") |
||||
.run(validateSpringSessionUsesRedis(RedisFlushMode.IMMEDIATE)); |
||||
} |
||||
|
||||
private ContextConsumer<AssertableReactiveWebApplicationContext> validateSpringSessionUsesRedis( |
||||
RedisFlushMode flushMode) { |
||||
return (context) -> { |
||||
System.out.println(new ConditionEvaluationReportMessage( |
||||
context.getBean(ConditionEvaluationReport.class))); |
||||
ReactiveRedisOperationsSessionRepository repository = validateSessionRepository( |
||||
context, ReactiveRedisOperationsSessionRepository.class); |
||||
assertThat(new DirectFieldAccessor(repository) |
||||
.getPropertyValue("redisFlushMode")).isEqualTo(flushMode); |
||||
}; |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue