diff --git a/spring-session/src/integration-test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationXmlTests.java b/spring-session/src/integration-test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationXmlTests.java new file mode 100644 index 0000000..36032d8 --- /dev/null +++ b/spring-session/src/integration-test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationXmlTests.java @@ -0,0 +1,197 @@ +/* + * Copyright 2002-2015 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.session.hazelcast.config.annotation.web.http; + +import static org.fest.assertions.Assertions.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.session.ExpiringSession; +import org.springframework.session.SessionRepository; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.util.SocketUtils; + +import com.hazelcast.config.ClasspathXmlConfig; +import com.hazelcast.config.Config; +import com.hazelcast.config.NetworkConfig; +import com.hazelcast.core.Hazelcast; +import com.hazelcast.core.HazelcastInstance; + +/** + * Test the different configuration options for the + * {@link EnableHazelcastHttpSession} annotation. + * + * @author Tommy Ludwig + */ +public class HazelcastHttpSessionConfigurationXmlTests { + + @RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration + @WebAppConfiguration + public static class CustomXmlInactiveIntervalTest { + + @Autowired + private SessionRepository repository; + + @Autowired + private HazelcastInstance hazelcast; + + @Test + public void saveSessionTest() throws InterruptedException { + + S sessionToSave = repository.createSession(); + + assertThat(sessionToSave.getMaxInactiveIntervalInSeconds()) + .isEqualTo(150); + + repository.save(sessionToSave); + + S session = repository.getSession(sessionToSave.getId()); + + assertThat(session.getId()).isEqualTo(sessionToSave.getId()); + assertThat(session.getMaxInactiveIntervalInSeconds()) + .isEqualTo(150); + } + + @Test + public void checkUnderlyingMapSettingsTest() { + assertThat( + hazelcast.getConfig() + .getMapConfig("spring:session:sessions") + .getMaxIdleSeconds()) + .isEqualTo(150); + } + + @Configuration + @EnableHazelcastHttpSession(maxInactiveIntervalInSeconds = "") + static class HazelcastSessionXmlConfigCustomIdle { + + @Bean + public HazelcastInstance embeddedHazelcast() { + Config hazelcastConfig = new ClasspathXmlConfig( + "org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time.xml"); + NetworkConfig netConfig = new NetworkConfig(); + netConfig.setPort(SocketUtils.findAvailableTcpPort()); + hazelcastConfig.setNetworkConfig(netConfig); + return Hazelcast.newHazelcastInstance(hazelcastConfig); + } + } + } + + @RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration + @WebAppConfiguration + public static class CustomXmlMapNameTest { + + @Autowired + private SessionRepository repository; + + @Autowired + private HazelcastInstance hazelcast; + + @Test + public void saveSessionTest() throws InterruptedException { + + S sessionToSave = repository.createSession(); + + repository.save(sessionToSave); + + S session = repository.getSession(sessionToSave.getId()); + + assertThat(session.getId()).isEqualTo(sessionToSave.getId()); + assertThat(session.getMaxInactiveIntervalInSeconds()).isEqualTo(1800); + } + + @Test + public void checkUnderlyingMapSettingsTest() { + assertThat( + hazelcast.getConfig() + .getMapConfig("my-sessions") + .getMaxIdleSeconds()) + .isEqualTo(1800); + } + + @Configuration + @EnableHazelcastHttpSession(sessionMapName = "my-sessions") + static class HazelcastSessionXmlConfigCustomMapName { + + @Bean + public HazelcastInstance embeddedHazelcast() { + Config hazelcastConfig = new ClasspathXmlConfig( + "org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-map-name.xml"); + NetworkConfig netConfig = new NetworkConfig(); + netConfig.setPort(SocketUtils.findAvailableTcpPort()); + hazelcastConfig.setNetworkConfig(netConfig); + return Hazelcast.newHazelcastInstance(hazelcastConfig); + } + } + } + + @RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration + @WebAppConfiguration + public static class CustomXmlMapNameAndIdleTest { + + @Autowired + private SessionRepository repository; + + @Autowired + private HazelcastInstance hazelcast; + + @Test + public void saveSessionTest() throws InterruptedException { + + S sessionToSave = repository.createSession(); + + repository.save(sessionToSave); + + S session = repository.getSession(sessionToSave.getId()); + + assertThat(session.getId()).isEqualTo(sessionToSave.getId()); + assertThat(session.getMaxInactiveIntervalInSeconds()).isEqualTo(1200); + } + + @Test + public void checkUnderlyingMapSettingsTest() { + assertThat( + hazelcast.getConfig() + .getMapConfig("test-sessions") + .getMaxIdleSeconds()) + .isEqualTo(1200); + } + + @Configuration + @EnableHazelcastHttpSession(sessionMapName = "test-sessions", maxInactiveIntervalInSeconds = "1200") + static class HazelcastSessionXmlConfigCustomMapNameAndIdle { + + @Bean + public HazelcastInstance embeddedHazelcast() { + Config hazelcastConfig = new ClasspathXmlConfig( + "org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time-map-name.xml"); + NetworkConfig netConfig = new NetworkConfig(); + netConfig.setPort(SocketUtils.findAvailableTcpPort()); + hazelcastConfig.setNetworkConfig(netConfig); + return Hazelcast.newHazelcastInstance(hazelcastConfig); + } + } + } + +} diff --git a/spring-session/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java b/spring-session/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java index b787bdd..be2adf5 100644 --- a/spring-session/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java +++ b/spring-session/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java @@ -89,7 +89,8 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur /** * Make a {@link MapConfig} for the given sessionMapName if one does not exist. - * Ensure that maxIdleSeconds is set to maxInactiveIntervalInSeconds for proper session expiration. + * Set Hazelcast's maxIdleSeconds to maxInactiveIntervalInSeconds if set (not ""). + * Otherwise get the externally configured maxIdleSeconds for the distributed sessions map. * * @param hazelcastInstance the {@link HazelcastInstance} to configure */ @@ -97,6 +98,8 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur MapConfig sessionMapConfig = hazelcastInstance.getConfig().getMapConfig(sessionMapName); if (this.maxInactiveIntervalInSeconds != null) { sessionMapConfig.setMaxIdleSeconds(this.maxInactiveIntervalInSeconds); + } else { + this.maxInactiveIntervalInSeconds = sessionMapConfig.getMaxIdleSeconds(); } } diff --git a/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time-map-name.xml b/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time-map-name.xml new file mode 100644 index 0000000..6f5954b --- /dev/null +++ b/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time-map-name.xml @@ -0,0 +1,37 @@ + + + + spring-session-it-test-idle-time-map-name + test-pass + + + 5701 + + 0 + + + + + + 127.0.0.1 + + 127.0.0.1 + + + + + + + + BINARY + 1 + 0 + 0 + 300 + com.hazelcast.map.merge.PutIfAbsentMapMergePolicy + + + + diff --git a/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time.xml b/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time.xml new file mode 100644 index 0000000..791f516 --- /dev/null +++ b/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-idle-time.xml @@ -0,0 +1,37 @@ + + + + spring-session-it-test-idle-time + test-pass + + + 5701 + + 0 + + + + + + 127.0.0.1 + + 127.0.0.1 + + + + + + + + BINARY + 1 + 0 + 0 + 150 + com.hazelcast.map.merge.PutIfAbsentMapMergePolicy + + + + diff --git a/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-map-name.xml b/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-map-name.xml new file mode 100644 index 0000000..1be4d1e --- /dev/null +++ b/spring-session/src/test/resources/org/springframework/session/hazelcast/config/annotation/web/http/hazelcast-custom-map-name.xml @@ -0,0 +1,37 @@ + + + + spring-session-it-test-map-name + test-pass + + + 5701 + + 0 + + + + + + 127.0.0.1 + + 127.0.0.1 + + + + + + + + BINARY + 1 + 0 + 0 + 0 + com.hazelcast.map.merge.PutIfAbsentMapMergePolicy + + + +