From 8423cdbe8578e0cdb7dd39017231f3f5c755cd33 Mon Sep 17 00:00:00 2001 From: John Blum Date: Tue, 21 Jun 2016 19:44:45 -0700 Subject: [PATCH] SGF-504 - Support Repositories with multiple Spring Data modules on the class path. --- ...mfireRepositoryConfigurationExtension.java | 52 +++++++++---- ...eRepositoryConfigurationExtensionTest.java | 77 +++++++++++++------ 2 files changed, 91 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtension.java b/src/main/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtension.java index 2dfcaf09e..44956394b 100644 --- a/src/main/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtension.java @@ -16,10 +16,16 @@ package org.springframework.data.gemfire.repository.config; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Collections; + import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.data.gemfire.mapping.GemfireMappingContext; +import org.springframework.data.gemfire.mapping.Region; +import org.springframework.data.gemfire.repository.GemfireRepository; import org.springframework.data.gemfire.repository.support.GemfireRepositoryFactoryBean; import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource; import org.springframework.data.repository.config.RepositoryConfigurationExtension; @@ -31,7 +37,7 @@ /** * {@link RepositoryConfigurationExtension} implementation handling GemFire specific extensions to the Repository XML * namespace and annotation-based configuration meta-data. - * + * * @author Oliver Gierke * @author John Blum * @see org.springframework.data.repository.config.RepositoryConfigurationExtension @@ -48,11 +54,20 @@ public class GemfireRepositoryConfigurationExtension extends RepositoryConfigura /* * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtension#getRepositoryFactoryClassName() + * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getIdentifyingAnnotations() */ @Override - public String getRepositoryFactoryClassName() { - return GemfireRepositoryFactoryBean.class.getName(); + protected Collection> getIdentifyingAnnotations() { + return Collections.>singleton(Region.class); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getIdentifyingTypes() + */ + @Override + protected Collection> getIdentifyingTypes() { + return Collections.>singleton(GemfireRepository.class); } /* @@ -64,19 +79,13 @@ protected String getModulePrefix() { return GEMFIRE_MODULE_PREFIX; } - /* + /* * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#registerBeansForRoot(org.springframework.beans.factory.support.BeanDefinitionRegistry, org.springframework.data.repository.config.RepositoryConfigurationSource) + * @see org.springframework.data.repository.config.RepositoryConfigurationExtension#getRepositoryFactoryClassName() */ @Override - public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConfigurationSource configurationSource) { - - super.registerBeansForRoot(registry, configurationSource); - - if (!StringUtils.hasText(configurationSource.getAttribute(MAPPING_CONTEXT_REF_ANNOTATION_ATTRIBUTE))) { - registry.registerBeanDefinition(DEFAULT_MAPPING_CONTEXT_BEAN_NAME, - new RootBeanDefinition(GemfireMappingContext.class)); - } + public String getRepositoryFactoryClassName() { + return GemfireRepositoryFactoryBean.class.getName(); } /* @@ -103,4 +112,19 @@ public void postProcess(BeanDefinitionBuilder builder, XmlRepositoryConfiguratio private static String resolveMappingContextBeanName(String source) { return (StringUtils.hasText(source) ? source : DEFAULT_MAPPING_CONTEXT_BEAN_NAME); } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#registerBeansForRoot(org.springframework.beans.factory.support.BeanDefinitionRegistry, org.springframework.data.repository.config.RepositoryConfigurationSource) + */ + @Override + public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConfigurationSource configurationSource) { + + super.registerBeansForRoot(registry, configurationSource); + + if (!StringUtils.hasText(configurationSource.getAttribute(MAPPING_CONTEXT_REF_ANNOTATION_ATTRIBUTE))) { + registry.registerBeanDefinition(DEFAULT_MAPPING_CONTEXT_BEAN_NAME, + new RootBeanDefinition(GemfireMappingContext.class)); + } + } } diff --git a/src/test/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtensionTest.java b/src/test/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtensionTest.java index 67aed0dfc..0ff8a0454 100644 --- a/src/test/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtensionTest.java +++ b/src/test/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtensionTest.java @@ -16,24 +16,35 @@ package org.springframework.data.gemfire.repository.config; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import static org.mockito.Matchers.*; -import static org.mockito.Mockito.*; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.annotation.Annotation; +import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.springframework.beans.PropertyValue; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.data.gemfire.mapping.Region; +import org.springframework.data.gemfire.repository.GemfireRepository; import org.springframework.data.gemfire.repository.support.GemfireRepositoryFactoryBean; import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource; import org.springframework.data.repository.config.XmlRepositoryConfigurationSource; import org.w3c.dom.Element; /** - * The GemfireRepositoryConfigurationExtensionTest class is a test suite of test cases testing the contract - * and functionality of the GemfireRepositoryConfigurationExtension class. + * Test suite of test cases testing the contract and functionality of the + * {@link GemfireRepositoryConfigurationExtension} class. * * @author John Blum * @see org.junit.Test @@ -44,7 +55,9 @@ public class GemfireRepositoryConfigurationExtensionTest { private GemfireRepositoryConfigurationExtension repositoryConfigurationExtension; - private RuntimeBeanReference defaultMappingContextReference = new RuntimeBeanReference(GemfireRepositoryConfigurationExtension.DEFAULT_MAPPING_CONTEXT_BEAN_NAME); + + private RuntimeBeanReference defaultMappingContextReference = new RuntimeBeanReference( + GemfireRepositoryConfigurationExtension.DEFAULT_MAPPING_CONTEXT_BEAN_NAME); @Before public void setup() { @@ -52,9 +65,20 @@ public void setup() { } @Test - public void repositoryFactoryClassNameIsGemfireRepositoryFactoryBean() { - assertThat(repositoryConfigurationExtension.getRepositoryFactoryClassName(), - is(equalTo(GemfireRepositoryFactoryBean.class.getName()))); + public void identifyingAnnotationsIncludesRegionAnnotation() { + Collection> identifyingAnnotations = + repositoryConfigurationExtension.getIdentifyingAnnotations(); + + assertThat(identifyingAnnotations, is(notNullValue(Collection.class))); + assertThat(identifyingAnnotations.contains(Region.class), is(true)); + } + + @Test + public void identifyingTypesContainsGemfireRepositoryAnnotation() { + Collection> identifyingTypes = repositoryConfigurationExtension.getIdentifyingTypes(); + + assertThat(identifyingTypes, is(notNullValue(Collection.class))); + assertThat(identifyingTypes.contains(GemfireRepository.class), is(true)); } @Test @@ -62,6 +86,12 @@ public void modulePrefixIsGemFire() { assertThat(repositoryConfigurationExtension.getModulePrefix(), is(equalTo("gemfire"))); } + @Test + public void repositoryFactoryClassNameIsGemfireRepositoryFactoryBean() { + assertThat(repositoryConfigurationExtension.getRepositoryFactoryClassName(), + is(equalTo(GemfireRepositoryFactoryBean.class.getName()))); + } + @Test public void postProcessWithAnnotationRepositoryConfigurationSource() { AnnotationRepositoryConfigurationSource mockRepositoryConfigurationSource = @@ -83,7 +113,7 @@ public void postProcessWithAnnotationRepositoryConfigurationSource() { } @Test - public void postProcessWithAnnotationRepositoryConfigurationSourceHaingNoMappingContextRefAttribute() { + public void postProcessWithAnnotationRepositoryConfigurationSourceHavingNoMappingContextRefAttribute() { AnnotationRepositoryConfigurationSource mockRepositoryConfigurationSource = mock(AnnotationRepositoryConfigurationSource.class); @@ -96,56 +126,55 @@ public void postProcessWithAnnotationRepositoryConfigurationSourceHaingNoMapping PropertyValue mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() .getPropertyValue("gemfireMappingContext"); - assertThat(mappingContextRef.getValue(), is((Object) defaultMappingContextReference)); + assertThat(mappingContextRef.getValue(), is(equalTo((Object) defaultMappingContextReference))); verify(mockRepositoryConfigurationSource, times(1)).getAttribute(eq("mappingContextRef")); } @Test - public void postProcessWithXmlRepositoryConfigurationSourceHavingNoMappingContextRefAttribute() { + public void postProcessWithXmlRepositoryConfigurationSource() { Element mockElement = mock(Element.class); XmlRepositoryConfigurationSource mockRepositoryConfigurationSource = mock(XmlRepositoryConfigurationSource.class); when(mockRepositoryConfigurationSource.getElement()).thenReturn(mockElement); - when(mockElement.getAttribute(eq("mapping-context-ref"))).thenReturn(null); + when(mockElement.getAttribute(eq("mapping-context-ref"))).thenReturn("testMappingContext"); BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(); repositoryConfigurationExtension.postProcess(beanDefinitionBuilder, mockRepositoryConfigurationSource); - PropertyValue mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() - .getPropertyValue("gemfireMappingContext"); + Object mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() + .getPropertyValue("gemfireMappingContext").getValue(); - assertThat(mappingContextRef.getValue(), is((Object) defaultMappingContextReference)); + assertThat(mappingContextRef, is(instanceOf(RuntimeBeanReference.class))); + assertThat(((RuntimeBeanReference) mappingContextRef).getBeanName(), is(equalTo("testMappingContext"))); verify(mockRepositoryConfigurationSource, times(1)).getElement(); verify(mockElement, times(1)).getAttribute(eq("mapping-context-ref")); } @Test - public void postProcessWithXmlRepositoryConfigurationSourceWith() { + public void postProcessWithXmlRepositoryConfigurationSourceHavingNoMappingContextRefAttribute() { Element mockElement = mock(Element.class); XmlRepositoryConfigurationSource mockRepositoryConfigurationSource = mock(XmlRepositoryConfigurationSource.class); when(mockRepositoryConfigurationSource.getElement()).thenReturn(mockElement); - when(mockElement.getAttribute(eq("mapping-context-ref"))).thenReturn("testMappingContext"); + when(mockElement.getAttribute(eq("mapping-context-ref"))).thenReturn(null); BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(); repositoryConfigurationExtension.postProcess(beanDefinitionBuilder, mockRepositoryConfigurationSource); - Object mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() - .getPropertyValue("gemfireMappingContext").getValue(); + PropertyValue mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() + .getPropertyValue("gemfireMappingContext"); - assertThat(mappingContextRef, is(instanceOf(RuntimeBeanReference.class))); - assertThat(((RuntimeBeanReference) mappingContextRef).getBeanName(), is(equalTo("testMappingContext"))); + assertThat(mappingContextRef.getValue(), is(equalTo((Object) defaultMappingContextReference))); verify(mockRepositoryConfigurationSource, times(1)).getElement(); verify(mockElement, times(1)).getAttribute(eq("mapping-context-ref")); } - }