Add support to disable OQL Indexes created by Spring Session by default.

Resolves gh-46.
This commit is contained in:
John Blum
2019-11-20 14:25:29 -08:00
parent b82a43d625
commit 6778cd0953
3 changed files with 85 additions and 14 deletions

View File

@@ -27,15 +27,21 @@ import org.junit.Test;
import org.apache.geode.DataSerializer; import org.apache.geode.DataSerializer;
import org.apache.geode.cache.GemFireCache; import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionShortcut; import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.cache.client.ClientRegionShortcut; import org.apache.geode.cache.client.ClientRegionShortcut;
import org.apache.geode.cache.query.Index;
import org.apache.geode.internal.InternalDataSerializer; import org.apache.geode.internal.InternalDataSerializer;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.data.gemfire.GemfireTemplate;
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication; import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
import org.springframework.data.gemfire.tests.integration.SpringApplicationContextIntegrationTestsSupport; import org.springframework.data.gemfire.tests.integration.SpringApplicationContextIntegrationTestsSupport;
import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects; import org.springframework.data.gemfire.tests.mock.annotation.EnableGemFireMockObjects;
import org.springframework.session.SessionRepository;
import org.springframework.session.data.gemfire.GemFireOperationsSessionRepository;
import org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy; import org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy;
import org.springframework.session.data.gemfire.serialization.SessionSerializer; import org.springframework.session.data.gemfire.serialization.SessionSerializer;
import org.springframework.session.data.gemfire.serialization.data.AbstractDataSerializableSessionSerializer; import org.springframework.session.data.gemfire.serialization.data.AbstractDataSerializableSessionSerializer;
@@ -43,10 +49,13 @@ import org.springframework.session.data.gemfire.serialization.data.provider.Data
import org.springframework.session.data.gemfire.serialization.pdx.support.PdxSerializerSessionSerializerAdapter; import org.springframework.session.data.gemfire.serialization.pdx.support.PdxSerializerSessionSerializerAdapter;
/** /**
* The GemFireHttpSessionConfigurationIntegrationTests class... * Integration Tests for {@link GemFireHttpSessionConfiguration}.
* *
* @author John Blum * @author John Blum
* @since 1.0.0 * @see org.junit.Test
* @see org.mockito.Mockito
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
* @since 1.1.0
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class GemFireHttpSessionConfigurationIntegrationTests extends SpringApplicationContextIntegrationTestsSupport { public class GemFireHttpSessionConfigurationIntegrationTests extends SpringApplicationContextIntegrationTestsSupport {
@@ -64,6 +73,62 @@ public class GemFireHttpSessionConfigurationIntegrationTests extends SpringAppli
.orElse(null)).isNotNull(); .orElse(null)).isNotNull();
} }
@Test
public void basicSpringSessionGemFireConfigurationIsCorrect() {
newApplicationContext(BasicSpringSessionGemFireConfiguration.class);
Region<?, ?> sessionsRegion =
getApplicationContext().getBean(GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME, Region.class);
Index principleNameIndex = getApplicationContext().getBean("principalNameIndex", Index.class);
GemfireTemplate sessionsRegionTemplate =
getApplicationContext().getBean("sessionRegionTemplate", GemfireTemplate.class);
assertThat(sessionsRegion).isNotNull();
assertThat(sessionsRegion.getName()).isEqualTo(GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME);
assertThat(principleNameIndex).isNotNull();
assertThat(principleNameIndex.getName()).isEqualTo("principalNameIndex");
assertThat(principleNameIndex.getRegion()).isEqualTo(sessionsRegion);
assertThat(getApplicationContext().getBean(SessionRepository.class)).isInstanceOf(GemFireOperationsSessionRepository.class);
assertThat(sessionsRegionTemplate).isNotNull();
assertThat(sessionsRegionTemplate.getRegion()).isEqualTo(sessionsRegion);
}
@Test
public void basicSpringSessionGemFireConfigurationWithIndexesDisableIsCorrect() {
try {
System.setProperty("spring.profiles.active", "disable-spring-session-data-gemfire-indexes");
assertThat(System.getProperty("spring.profiles.active")).contains("disable-spring-session-data-gemfire-indexes");
ConfigurableApplicationContext applicationContext =
newApplicationContext(BasicSpringSessionGemFireConfiguration.class);
assertThat(applicationContext).isNotNull();
assertThat(applicationContext.getEnvironment().getActiveProfiles()).contains("disable-spring-session-data-gemfire-indexes");
Region<?, ?> sessionsRegion =
getApplicationContext().getBean(GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME, Region.class);
GemfireTemplate sessionsRegionTemplate =
getApplicationContext().getBean("sessionRegionTemplate", GemfireTemplate.class);
assertThat(sessionsRegion).isNotNull();
assertThat(sessionsRegion.getName()).isEqualTo(GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME);
assertThat(getApplicationContext().containsBean("principalNameIndex")).isFalse();
assertThat(getApplicationContext().getBean(SessionRepository.class)).isInstanceOf(GemFireOperationsSessionRepository.class);
assertThat(sessionsRegionTemplate).isNotNull();
assertThat(sessionsRegionTemplate.getRegion()).isEqualTo(sessionsRegion);
}
finally {
System.clearProperty("spring.profiles.active");
}
}
private void testUsesDataSerialization(Class<? extends DataSerializer> expectedDataSerializerType) { private void testUsesDataSerialization(Class<? extends DataSerializer> expectedDataSerializerType) {
GemFireHttpSessionConfiguration configuration = GemFireHttpSessionConfiguration configuration =
@@ -147,6 +212,11 @@ public class GemFireHttpSessionConfigurationIntegrationTests extends SpringAppli
assertThat(properties.sessionSerializerBeanName()).isEqualTo("MockSessionSerializer"); assertThat(properties.sessionSerializerBeanName()).isEqualTo("MockSessionSerializer");
} }
@ClientCacheApplication
@EnableGemFireMockObjects
@EnableGemFireHttpSession(clientRegionShortcut = ClientRegionShortcut.LOCAL, poolName = "DEFAULT")
static class BasicSpringSessionGemFireConfiguration { }
@ClientCacheApplication @ClientCacheApplication
@EnableGemFireMockObjects @EnableGemFireMockObjects
@EnableGemFireHttpSession( @EnableGemFireHttpSession(

View File

@@ -55,6 +55,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportAware; import org.springframework.context.annotation.ImportAware;
import org.springframework.context.annotation.Profile;
import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
@@ -1172,6 +1173,7 @@ public class GemFireHttpSessionConfiguration extends AbstractGemFireHttpSessionC
*/ */
@Bean @Bean
@DependsOn(DEFAULT_SESSION_REGION_NAME) @DependsOn(DEFAULT_SESSION_REGION_NAME)
@Profile("!disable-spring-session-data-gemfire-indexes")
public IndexFactoryBean principalNameIndex(GemFireCache gemfireCache) { public IndexFactoryBean principalNameIndex(GemFireCache gemfireCache) {
IndexFactoryBean principalNameIndex = new IndexFactoryBean(); IndexFactoryBean principalNameIndex = new IndexFactoryBean();
@@ -1198,6 +1200,7 @@ public class GemFireHttpSessionConfiguration extends AbstractGemFireHttpSessionC
*/ */
@Bean @Bean
@DependsOn(DEFAULT_SESSION_REGION_NAME) @DependsOn(DEFAULT_SESSION_REGION_NAME)
@Profile("!disable-spring-session-data-gemfire-indexes")
public SessionAttributesIndexFactoryBean sessionAttributesIndex(GemFireCache gemfireCache) { public SessionAttributesIndexFactoryBean sessionAttributesIndex(GemFireCache gemfireCache) {
SessionAttributesIndexFactoryBean sessionAttributesIndex = new SessionAttributesIndexFactoryBean(); SessionAttributesIndexFactoryBean sessionAttributesIndex = new SessionAttributesIndexFactoryBean();

View File

@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.session.data.gemfire.config.annotation.web.http; package org.springframework.session.data.gemfire.config.annotation.web.http;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@@ -29,7 +28,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@@ -72,10 +71,9 @@ import org.springframework.session.data.gemfire.support.IsDirtyPredicate;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
/** /**
* Unit tests for {@link GemFireHttpSessionConfiguration} class. * Unit Tests for {@link GemFireHttpSessionConfiguration} class.
* *
* @author John Blum * @author John Blum
* @since 1.1.0
* @see org.junit.Test * @see org.junit.Test
* @see org.mockito.Mockito * @see org.mockito.Mockito
* @see org.apache.geode.cache.Cache * @see org.apache.geode.cache.Cache
@@ -95,6 +93,7 @@ import org.springframework.util.ReflectionUtils;
* @see org.springframework.session.Session * @see org.springframework.session.Session
* @see org.springframework.session.data.gemfire.GemFireOperationsSessionRepository * @see org.springframework.session.data.gemfire.GemFireOperationsSessionRepository
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration * @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
* @since 1.1.0
*/ */
public class GemFireHttpSessionConfigurationTests { public class GemFireHttpSessionConfigurationTests {
@@ -652,7 +651,7 @@ public class GemFireHttpSessionConfigurationTests {
verify(this.gemfireConfiguration, never()).getServerRegionShortcut(); verify(this.gemfireConfiguration, never()).getServerRegionShortcut();
verify(this.gemfireConfiguration, never()).getSessionExpirationPolicyBeanName(); verify(this.gemfireConfiguration, never()).getSessionExpirationPolicyBeanName();
verify(this.gemfireConfiguration, never()).getSessionSerializerBeanName(); verify(this.gemfireConfiguration, never()).getSessionSerializerBeanName();
verifyZeroInteractions(mockEnvironment); verifyNoInteractions(mockEnvironment);
} }
@Test @Test
@@ -674,7 +673,7 @@ public class GemFireHttpSessionConfigurationTests {
verify(this.gemfireConfiguration, never()).getServerRegionShortcut(); verify(this.gemfireConfiguration, never()).getServerRegionShortcut();
verify(this.gemfireConfiguration, never()).getSessionExpirationPolicyBeanName(); verify(this.gemfireConfiguration, never()).getSessionExpirationPolicyBeanName();
verify(this.gemfireConfiguration, never()).getSessionSerializerBeanName(); verify(this.gemfireConfiguration, never()).getSessionSerializerBeanName();
verifyZeroInteractions(mockEnvironment); verifyNoInteractions(mockEnvironment);
} }
@Test @Test
@@ -762,14 +761,13 @@ public class GemFireHttpSessionConfigurationTests {
assertThat(sessionRegionFactoryBean).isNotNull(); assertThat(sessionRegionFactoryBean).isNotNull();
assertThat(sessionRegionFactoryBean.getClientRegionShortcut()).isEqualTo(ClientRegionShortcut.CACHING_PROXY); assertThat(sessionRegionFactoryBean.getClientRegionShortcut()).isEqualTo(ClientRegionShortcut.CACHING_PROXY);
assertThat(sessionRegionFactoryBean.getCache()).isEqualTo(mockGemFireCache); assertThat(sessionRegionFactoryBean.getCache()).isEqualTo(mockGemFireCache);
assertThat(this.<String>getField(sessionRegionFactoryBean, "poolName")).isEqualTo("TestPool"); assertThat(GemFireHttpSessionConfigurationTests.<String>getField(sessionRegionFactoryBean, "poolName")).isEqualTo("TestPool");
assertThat(this.<RegionAttributes<Object, Session>>getField(sessionRegionFactoryBean, assertThat(GemFireHttpSessionConfigurationTests.<RegionAttributes<Object, Session>>getField(sessionRegionFactoryBean, "regionAttributes")).isEqualTo(mockRegionAttributes);
"regionAttributes")).isEqualTo(mockRegionAttributes); assertThat(GemFireHttpSessionConfigurationTests.<String>getField(sessionRegionFactoryBean, "regionName")).isEqualTo("TestRegion");
assertThat(this.<String>getField(sessionRegionFactoryBean, "regionName")).isEqualTo("TestRegion");
assertThat(sessionRegionFactoryBean.getServerRegionShortcut()).isEqualTo(RegionShortcut.PARTITION_REDUNDANT); assertThat(sessionRegionFactoryBean.getServerRegionShortcut()).isEqualTo(RegionShortcut.PARTITION_REDUNDANT);
verifyZeroInteractions(mockGemFireCache); verifyNoInteractions(mockGemFireCache);
verifyZeroInteractions(mockRegionAttributes); verifyNoInteractions(mockRegionAttributes);
} }
@Test @Test