SGF-504 - Support Repositories with multiple Spring Data modules on the class path.

(cherry picked from commit 8423cdbe8578e0cdb7dd39017231f3f5c755cd33)
Signed-off-by: John Blum <jblum@pivotal.io>
This commit is contained in:
John Blum
2016-06-21 19:44:45 -07:00
parent a5d6777589
commit fa046050bd
2 changed files with 103 additions and 50 deletions

View File

@@ -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 @@ import org.springframework.util.StringUtils;
/**
* {@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<Class<? extends Annotation>> getIdentifyingAnnotations() {
return Collections.<Class<? extends Annotation>>singleton(Region.class);
}
/*
* (non-Javadoc)
* @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getIdentifyingTypes()
*/
@Override
protected Collection<Class<?>> getIdentifyingTypes() {
return Collections.<Class<?>>singleton(GemfireRepository.class);
}
/*
@@ -64,19 +79,13 @@ public class GemfireRepositoryConfigurationExtension extends RepositoryConfigura
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 class GemfireRepositoryConfigurationExtension extends RepositoryConfigura
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));
}
}
}

View File

@@ -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 @@ import org.w3c.dom.Element;
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 class GemfireRepositoryConfigurationExtensionTest {
}
@Test
public void repositoryFactoryClassNameIsGemfireRepositoryFactoryBean() {
assertThat(repositoryConfigurationExtension.getRepositoryFactoryClassName(),
is(equalTo(GemfireRepositoryFactoryBean.class.getName())));
public void identifyingAnnotationsIncludesRegionAnnotation() {
Collection<Class<? extends Annotation>> identifyingAnnotations =
repositoryConfigurationExtension.getIdentifyingAnnotations();
assertThat(identifyingAnnotations, is(notNullValue(Collection.class)));
assertThat(identifyingAnnotations.contains(Region.class), is(true));
}
@Test
public void identifyingTypesContainsGemfireRepositoryAnnotation() {
Collection<Class<?>> identifyingTypes = repositoryConfigurationExtension.getIdentifyingTypes();
assertThat(identifyingTypes, is(notNullValue(Collection.class)));
assertThat(identifyingTypes.contains(GemfireRepository.class), is(true));
}
@Test
@@ -62,6 +86,12 @@ public class GemfireRepositoryConfigurationExtensionTest {
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 class GemfireRepositoryConfigurationExtensionTest {
}
@Test
public void postProcessWithAnnotationRepositoryConfigurationSourceHaingNoMappingContextRefAttribute() {
public void postProcessWithAnnotationRepositoryConfigurationSourceHavingNoMappingContextRefAttribute() {
AnnotationRepositoryConfigurationSource mockRepositoryConfigurationSource =
mock(AnnotationRepositoryConfigurationSource.class);
@@ -96,36 +126,13 @@ public class GemfireRepositoryConfigurationExtensionTest {
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() {
Element mockElement = mock(Element.class);
XmlRepositoryConfigurationSource mockRepositoryConfigurationSource =
mock(XmlRepositoryConfigurationSource.class);
when(mockRepositoryConfigurationSource.getElement()).thenReturn(mockElement);
when(mockElement.getAttribute(eq("mapping-context-ref"))).thenReturn(null);
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition();
repositoryConfigurationExtension.postProcess(beanDefinitionBuilder, mockRepositoryConfigurationSource);
PropertyValue mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues()
.getPropertyValue("gemfireMappingContext");
assertThat(mappingContextRef.getValue(), is((Object) defaultMappingContextReference));
verify(mockRepositoryConfigurationSource, times(1)).getElement();
verify(mockElement, times(1)).getAttribute(eq("mapping-context-ref"));
}
@Test
public void postProcessWithXmlRepositoryConfigurationSourceWith() {
public void postProcessWithXmlRepositoryConfigurationSource() {
Element mockElement = mock(Element.class);
XmlRepositoryConfigurationSource mockRepositoryConfigurationSource =
@@ -148,4 +155,26 @@ public class GemfireRepositoryConfigurationExtensionTest {
verify(mockElement, times(1)).getAttribute(eq("mapping-context-ref"));
}
@Test
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(null);
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition();
repositoryConfigurationExtension.postProcess(beanDefinitionBuilder, mockRepositoryConfigurationSource);
PropertyValue mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues()
.getPropertyValue("gemfireMappingContext");
assertThat(mappingContextRef.getValue(), is(equalTo((Object) defaultMappingContextReference)));
verify(mockRepositoryConfigurationSource, times(1)).getElement();
verify(mockElement, times(1)).getAttribute(eq("mapping-context-ref"));
}
}