Add SpringSessionGemFireConfigurer support for configuring custom session expiration policies.

Resolve gh-5.
This commit is contained in:
John Blum
2018-10-22 21:33:20 -07:00
parent 9024da840f
commit c905b365e1
5 changed files with 65 additions and 5 deletions

View File

@@ -41,6 +41,7 @@ import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockO
import org.springframework.mock.env.MockPropertySource;
import org.springframework.session.Session;
import org.springframework.session.data.gemfire.config.annotation.web.http.support.SpringSessionGemFireConfigurer;
import org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy;
import org.springframework.session.data.gemfire.serialization.SessionSerializer;
/**
@@ -73,7 +74,7 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
}
private ConfigurableApplicationContext newApplicationContext(PropertySource<?> testPropertySource,
Class<?>... annotatedClasses) {
Class<?>... annotatedClasses) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
@@ -86,7 +87,7 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
}
@Test
public void springSessionGemFireConfigurerOverridesAnnotationAttributeAndPropertyConfiguration() {
public void springSessionGemFireConfigurerOverridesAnnotationAttributesAndPropertyConfiguration() {
MockPropertySource testPropertySource = new MockPropertySource("TestProperties")
.withProperty("spring.session.data.gemfire.cache.client.pool.name", "Car")
@@ -95,6 +96,7 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
.withProperty("spring.session.data.gemfire.session.attributes.indexable", "firstName, lastName")
.withProperty("spring.session.data.gemfire.session.expiration.max-inactive-interval-seconds", "600")
.withProperty("spring.session.data.gemfire.session.region.name", "PropertyRegionName")
.withProperty("spring.session.data.gemfire.session.expiration.bean-name", "MockSessionExpirationPolicy")
.withProperty("spring.session.data.gemfire.session.serializer.bean-name", "MockSessionSerializer");
this.applicationContext = newApplicationContext(testPropertySource, TestConfiguration.class);
@@ -109,6 +111,7 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
assertThat(sessionConfiguration.getPoolName()).isEqualTo("Dead");
assertThat(sessionConfiguration.getServerRegionShortcut()).isEqualTo(RegionShortcut.PARTITION);
assertThat(sessionConfiguration.getSessionRegionName()).isEqualTo("ConfigurerRegionName");
assertThat(sessionConfiguration.getSessionExpirationPolicyBeanName().orElse(null)).isEqualTo("ConfigurerSessionExpirationPolicy");
assertThat(sessionConfiguration.getSessionSerializerBeanName()).isEqualTo("SessionPdxSerializer");
}
@@ -140,6 +143,7 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
assertThat(sessionConfiguration.getPoolName()).isEqualTo("Car");
assertThat(sessionConfiguration.getServerRegionShortcut()).isEqualTo(RegionShortcut.PARTITION_PERSISTENT);
assertThat(sessionConfiguration.getSessionRegionName()).isEqualTo("TestSessionRegionName");
assertThat(sessionConfiguration.getSessionExpirationPolicyBeanName().orElse(null)).isNull();
assertThat(sessionConfiguration.getSessionSerializerBeanName()).isEqualTo("SessionPdxSerializer");
}
@@ -158,6 +162,7 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
assertThat(sessionConfiguration.getPoolName()).isEqualTo("Dead");
assertThat(sessionConfiguration.getServerRegionShortcut()).isEqualTo(RegionShortcut.PARTITION);
assertThat(sessionConfiguration.getSessionRegionName()).isEqualTo("ConfigurerRegionName");
assertThat(sessionConfiguration.getSessionExpirationPolicyBeanName().orElse(null)).isEqualTo("ConfigurerSessionExpirationPolicy");
assertThat(sessionConfiguration.getSessionSerializerBeanName()).isEqualTo("SessionPdxSerializer");
}
@@ -170,6 +175,7 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
poolName = "Swimming",
regionName = "AnnotationAttributeRegionName",
serverRegionShortcut = RegionShortcut.REPLICATE,
sessionExpirationPolicyBeanName = "TestSessionExpirationPolicy",
sessionSerializerBeanName = "TestSessionSerializer"
)
static class TestConfiguration {
@@ -184,6 +190,11 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
return mock(Pool.class);
}
@Bean("TestSessionExpirationPolicy")
SessionExpirationPolicy testSessionExpirationPolicy() {
return mock(SessionExpirationPolicy.class);
}
@Bean("TestSessionSerializer")
Object testSessionSerializer() {
return mock(SessionSerializer.class);
@@ -218,6 +229,11 @@ public class ConfigurerBasedGemFireHttpSessionConfigurationIntegrationTests {
public String getRegionName() {
return "ConfigurerRegionName";
}
@Override
public String getSessionExpirationPolicyBeanName() {
return "ConfigurerSessionExpirationPolicy";
}
};
}
}

View File

@@ -36,6 +36,7 @@ import org.springframework.data.gemfire.config.annotation.ClientCacheApplication
import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects;
import org.springframework.mock.env.MockPropertySource;
import org.springframework.session.Session;
import org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy;
import org.springframework.session.data.gemfire.serialization.SessionSerializer;
/**
@@ -93,6 +94,7 @@ public class PropertyBasedGemFireHttpSessionConfigurationIntegrationTests {
assertThat(sessionConfiguration.getMaxInactiveIntervalInSeconds()).isEqualTo(900);
assertThat(sessionConfiguration.getPoolName()).isEqualTo("Swimming");
assertThat(sessionConfiguration.getServerRegionShortcut()).isEqualTo(RegionShortcut.LOCAL);
assertThat(sessionConfiguration.getSessionExpirationPolicyBeanName().orElse(null)).isEqualTo("TestSessionExpirationPolicy");
assertThat(sessionConfiguration.getSessionRegionName()).isEqualTo("AnnotationAttributeRegionName");
assertThat(sessionConfiguration.getSessionSerializerBeanName()).isEqualTo("TestSessionSerializer");
}
@@ -103,6 +105,7 @@ public class PropertyBasedGemFireHttpSessionConfigurationIntegrationTests {
MockPropertySource testPropertySource = new MockPropertySource("TestProperties")
.withProperty("spring.session.data.gemfire.cache.client.pool.name", "Dead")
.withProperty("spring.session.data.gemfire.session.attributes.indexable", "two, four")
.withProperty("spring.session.data.gemfire.session.expiration.bean-name", "MockSessionExpirationPolicy")
.withProperty("spring.session.data.gemfire.session.region.name", "TestRegionName");
this.applicationContext = newApplicationContext(testPropertySource, TestConfiguration.class);
@@ -116,6 +119,7 @@ public class PropertyBasedGemFireHttpSessionConfigurationIntegrationTests {
assertThat(sessionConfiguration.getMaxInactiveIntervalInSeconds()).isEqualTo(900);
assertThat(sessionConfiguration.getPoolName()).isEqualTo("Dead");
assertThat(sessionConfiguration.getServerRegionShortcut()).isEqualTo(RegionShortcut.LOCAL);
assertThat(sessionConfiguration.getSessionExpirationPolicyBeanName().orElse(null)).isEqualTo("MockSessionExpirationPolicy");
assertThat(sessionConfiguration.getSessionRegionName()).isEqualTo("TestRegionName");
assertThat(sessionConfiguration.getSessionSerializerBeanName()).isEqualTo("TestSessionSerializer");
}
@@ -128,6 +132,7 @@ public class PropertyBasedGemFireHttpSessionConfigurationIntegrationTests {
.withProperty("spring.session.data.gemfire.cache.client.region.shortcut", ClientRegionShortcut.CACHING_PROXY.name())
.withProperty("spring.session.data.gemfire.cache.server.region.shortcut", RegionShortcut.REPLICATE_PERSISTENT_OVERFLOW.name())
.withProperty("spring.session.data.gemfire.session.attributes.indexable", "firstName, lastName")
.withProperty("spring.session.data.gemfire.session.expiration.bean-name", "MockSessionExpirationPolicy")
.withProperty("spring.session.data.gemfire.session.expiration.max-inactive-interval-seconds", "3600")
.withProperty("spring.session.data.gemfire.session.region.name", "PropertyRegionName")
.withProperty("spring.session.data.gemfire.session.serializer.bean-name", "MockSessionSerializer");
@@ -143,6 +148,7 @@ public class PropertyBasedGemFireHttpSessionConfigurationIntegrationTests {
assertThat(sessionConfiguration.getMaxInactiveIntervalInSeconds()).isEqualTo(3600);
assertThat(sessionConfiguration.getPoolName()).isEqualTo("Dead");
assertThat(sessionConfiguration.getServerRegionShortcut()).isEqualTo(RegionShortcut.REPLICATE_PERSISTENT_OVERFLOW);
assertThat(sessionConfiguration.getSessionExpirationPolicyBeanName().orElse(null)).isEqualTo("MockSessionExpirationPolicy");
assertThat(sessionConfiguration.getSessionRegionName()).isEqualTo("PropertyRegionName");
assertThat(sessionConfiguration.getSessionSerializerBeanName()).isEqualTo("MockSessionSerializer");
}
@@ -156,6 +162,7 @@ public class PropertyBasedGemFireHttpSessionConfigurationIntegrationTests {
poolName = "Swimming",
regionName = "AnnotationAttributeRegionName",
serverRegionShortcut = RegionShortcut.LOCAL,
sessionExpirationPolicyBeanName = "TestSessionExpirationPolicy",
sessionSerializerBeanName = "TestSessionSerializer"
)
static class TestConfiguration {
@@ -175,6 +182,11 @@ public class PropertyBasedGemFireHttpSessionConfigurationIntegrationTests {
return mock(SessionSerializer.class);
}
@Bean("TestSessionExpirationPolicy")
SessionExpirationPolicy testSessionExpirationPolicy() {
return mock(SessionExpirationPolicy.class);
}
@Bean("TestSessionSerializer")
Object testSessionSerializer() {
return mock(SessionSerializer.class);

View File

@@ -81,14 +81,16 @@ import org.springframework.util.StringUtils;
* {@link javax.servlet.http.HttpSession} provider implementation in Spring {@link Session}.
*
* @author John Blum
* @see org.apache.geode.cache.Cache
* @see org.apache.geode.cache.ExpirationAttributes
* @see org.apache.geode.cache.GemFireCache
* @see org.apache.geode.cache.Region
* @see org.apache.geode.cache.RegionAttributes
* @see org.apache.geode.cache.RegionShortcut
* @see org.apache.geode.cache.client.ClientCache
* @see org.apache.geode.cache.client.ClientRegionShortcut
* @see org.apache.geode.cache.client.Pool
* @see org.springframework.beans.factory.BeanClassLoaderAware
* @see org.apache.geode.pdx.PdxSerializer
* @see org.springframework.beans.factory.config.BeanPostProcessor
* @see org.springframework.context.annotation.Bean
* @see org.springframework.context.annotation.Configuration
* @see org.springframework.context.annotation.DependsOn
@@ -109,8 +111,10 @@ import org.springframework.util.StringUtils;
* @see org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession
* @see org.springframework.session.data.gemfire.config.annotation.web.http.support.GemFireCacheTypeAwareRegionFactoryBean
* @see org.springframework.session.data.gemfire.config.annotation.web.http.support.SessionAttributesIndexFactoryBean
* @see org.springframework.session.data.gemfire.config.annotation.web.http.support.SpringSessionGemFireConfigurer
* @see org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy
* @see org.springframework.session.data.gemfire.expiration.config.SessionExpirationTimeoutAwareBeanPostProcessor
* @see org.springframework.session.data.gemfire.expiration.support.SessionExpirationPolicyCustomExpiryAdapter
* @see org.springframework.session.data.gemfire.serialization.SessionSerializer
* @since 1.1.0
*/
@@ -524,6 +528,7 @@ public class GemFireHttpSessionConfiguration extends AbstractGemFireHttpSessionC
setPoolName(configurer.getPoolName());
setServerRegionShortcut(configurer.getServerRegionShortcut());
setSessionRegionName(configurer.getRegionName());
setSessionExpirationPolicyBeanName(configurer.getSessionExpirationPolicyBeanName());
setSessionSerializerBeanName(configurer.getSessionSerializerBeanName());
});
}

View File

@@ -25,6 +25,7 @@ import org.apache.geode.cache.client.Pool;
import org.springframework.session.Session;
import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration;
import org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy;
import org.springframework.session.data.gemfire.serialization.SessionSerializer;
/**
@@ -33,8 +34,16 @@ import org.springframework.session.data.gemfire.serialization.SessionSerializer;
* in Spring Session.
*
* @author John Blum
* @see org.apache.geode.cache.Cache
* @see org.apache.geode.cache.Region
* @see org.apache.geode.cache.RegionShortcut
* @see org.apache.geode.cache.client.ClientCache
* @see org.apache.geode.cache.client.ClientRegionShortcut
* @see org.apache.geode.cache.client.Pool
* @see org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
* @see org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy
* @see org.springframework.session.data.gemfire.serialization.SessionSerializer
* @since 1.0.0
*/
@SuppressWarnings("unused")
@@ -124,11 +133,26 @@ public interface SpringSessionGemFireConfigurer {
return GemFireHttpSessionConfiguration.DEFAULT_SERVER_REGION_SHORTCUT;
}
/**
* Defines the name of the bean referring to the {@link SessionExpirationPolicy} used to configure
* the {@link Session} expiration logic and strategy.
*
* The {@link Object bean} referred to by its {@link String name} must be of type {@link SessionExpirationPolicy}.
*
* Defaults to unset.
* @return a {@link String} containing the bean name of the configured {@link SessionExpirationPolicy}.
* @see org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy
*/
default String getSessionExpirationPolicyBeanName() {
return GemFireHttpSessionConfiguration.DEFAULT_SESSION_EXPIRATION_POLICY_BEAN_NAME;
}
/**
* Defines the bean name of the {@link SessionSerializer} used to serialize {@link Session} state
* between client and server or to disk when persisting or overflowing {@link Session} state.
*
* The bean referred to by its name must be of type {@link SessionSerializer}.
* The {@link Object bean} referred to by its {@link String name} must be of type {@link SessionSerializer}.
*
* Defaults to {@literal SessionPdxSerializer}.
*

View File

@@ -66,9 +66,12 @@ import org.springframework.util.ReflectionUtils;
* @see org.apache.geode.cache.Cache
* @see org.apache.geode.cache.GemFireCache
* @see org.apache.geode.cache.Region
* @see org.apache.geode.cache.RegionAttributes
* @see org.apache.geode.cache.RegionShortcut
* @see org.apache.geode.cache.ExpirationAttributes
* @see org.apache.geode.cache.RegionAttributes
* @see org.apache.geode.cache.client.ClientCache
* @see org.apache.geode.cache.client.ClientRegionShortcut
* @see org.springframework.beans.factory.config.ConfigurableListableBeanFactory
* @see org.springframework.context.ConfigurableApplicationContext
* @see org.springframework.core.type.AnnotationMetadata