Skip to content

Commit

Permalink
SGF-504 - Support Repositories with multiple Spring Data modules on t…
Browse files Browse the repository at this point in the history
…he class path.
  • Loading branch information
jxblum committed Jun 22, 2016
1 parent b7de2ce commit 8423cdb
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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);
}

/*
Expand All @@ -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();
}

/*
Expand All @@ -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));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -44,24 +55,43 @@
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() {
repositoryConfigurationExtension = new GemfireRepositoryConfigurationExtension();
}

@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
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 =
Expand All @@ -83,7 +113,7 @@ public void postProcessWithAnnotationRepositoryConfigurationSource() {
}

@Test
public void postProcessWithAnnotationRepositoryConfigurationSourceHaingNoMappingContextRefAttribute() {
public void postProcessWithAnnotationRepositoryConfigurationSourceHavingNoMappingContextRefAttribute() {
AnnotationRepositoryConfigurationSource mockRepositoryConfigurationSource =
mock(AnnotationRepositoryConfigurationSource.class);

Expand All @@ -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"));
}

}

0 comments on commit 8423cdb

Please sign in to comment.