From cf64807b095637fea43ec00acfaa1204cdedd8cb Mon Sep 17 00:00:00 2001 From: John Blum Date: Thu, 3 Dec 2015 15:59:49 -0800 Subject: [PATCH] SGF-448 - GemfireRepositoryConfigurationExtension needs to override the RepositoryConfigurationExtensionSupport postProcess(:BeanDefinitionBuilder, :AnnotationRepositoryConfigurationSource) method. --- .../data/gemfire/config/package-info.java | 7 + ...mfireRepositoryConfigurationExtension.java | 38 +++-- ...eRepositoryConfigurationExtensionTest.java | 139 ++++++++++++++++++ 3 files changed, 171 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/springframework/data/gemfire/config/package-info.java create mode 100644 src/test/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtensionTest.java diff --git a/src/main/java/org/springframework/data/gemfire/config/package-info.java b/src/main/java/org/springframework/data/gemfire/config/package-info.java new file mode 100644 index 00000000..d747a243 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/package-info.java @@ -0,0 +1,7 @@ +/** + * This package provides classes and components for configuring GemFire using Spring Data GemFire's XML namespace + * support. See more details here... + * + * Spring Data GemFire Core Schema (gfe) + */ +package org.springframework.data.gemfire.config; 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 a1271fd1..0c0b1ccc 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 @@ -17,11 +17,11 @@ package org.springframework.data.gemfire.repository.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.data.gemfire.repository.support.GemfireRepositoryFactoryBean; +import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource; import org.springframework.data.repository.config.RepositoryConfigurationExtension; import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport; import org.springframework.data.repository.config.XmlRepositoryConfigurationSource; import org.springframework.util.StringUtils; -import org.w3c.dom.Element; /** * {@link RepositoryConfigurationExtension} implementation to add Gemfire @@ -29,10 +29,13 @@ import org.w3c.dom.Element; * configuration. * * @author Oliver Gierke + * @author John Blum */ public class GemfireRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { - private static final String MAPPING_CONTEXT_REF = "mapping-context-ref"; + private static final String ANNOTATION_MAPPING_CONTEXT_REF = "mappingContextRef"; + private static final String MAPPING_CONTEXT_PROPERTY_NAME = "gemfireMappingContext"; + private static final String XML_MAPPING_CONTEXT_REF = "mapping-context-ref"; /* * (non-Javadoc) @@ -57,24 +60,33 @@ public class GemfireRepositoryConfigurationExtension extends RepositoryConfigura return "gemfire"; } + /** + * + * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport + * #postProcess(BeanDefinitionBuilder, AnnotationRepositoryConfigurationSource) + */ + @Override + public void postProcess(BeanDefinitionBuilder builder, AnnotationRepositoryConfigurationSource config) { + String mappingContextRef = config.getAttribute(ANNOTATION_MAPPING_CONTEXT_REF); + + if (StringUtils.hasText(mappingContextRef)) { + builder.addPropertyReference(MAPPING_CONTEXT_PROPERTY_NAME, mappingContextRef); + } + } + /* * (non-Javadoc) - * - * @see org.springframework.data.repository.config. - * RepositoryConfigurationExtensionSupport - * #postProcess(org.springframework.beans - * .factory.support.BeanDefinitionBuilder, - * org.springframework.data.repository - * .config.XmlRepositoryConfigurationSource) + * + * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport + * #postProcess(BeanDefinitionBuilder, XmlRepositoryConfigurationSource) */ @Override public void postProcess(BeanDefinitionBuilder builder, XmlRepositoryConfigurationSource config) { - - Element element = config.getElement(); - String mappingContextRef = element.getAttribute(MAPPING_CONTEXT_REF); + String mappingContextRef = config.getElement().getAttribute(XML_MAPPING_CONTEXT_REF); if (StringUtils.hasText(mappingContextRef)) { - builder.addPropertyReference("gemfireMappingContext", mappingContextRef); + builder.addPropertyReference(MAPPING_CONTEXT_PROPERTY_NAME, mappingContextRef); } } + } 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 new file mode 100644 index 00000000..e7db55f8 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/repository/config/GemfireRepositoryConfigurationExtensionTest.java @@ -0,0 +1,139 @@ +package org.springframework.data.gemfire.repository.config; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +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 org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +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. + * + * @author John Blum + * @see org.junit.Test + * @see org.mockito.Mockito + * @see org.springframework.data.gemfire.repository.config.GemfireRepositoryConfigurationExtension + * @since 1.6.3 + */ +public class GemfireRepositoryConfigurationExtensionTest { + + private GemfireRepositoryConfigurationExtension repositoryConfigurationExtension; + + @Before + public void setup() { + repositoryConfigurationExtension = new GemfireRepositoryConfigurationExtension(); + } + + @Test + public void repositoryFactoryClassNameIsGemfireRepositoryFactoryBean() { + assertThat(repositoryConfigurationExtension.getRepositoryFactoryClassName(), + is(equalTo(GemfireRepositoryFactoryBean.class.getName()))); + } + + @Test + public void modulePrefixIsGemFire() { + assertThat(repositoryConfigurationExtension.getModulePrefix(), is(equalTo("gemfire"))); + } + + @Test + public void postProcessWithAnnotationRepositoryConfigurationSource() { + AnnotationRepositoryConfigurationSource mockRepositoryConfigurationSource = + mock(AnnotationRepositoryConfigurationSource.class); + + when(mockRepositoryConfigurationSource.getAttribute(eq("mappingContextRef"))).thenReturn("testMappingContext"); + + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(); + + repositoryConfigurationExtension.postProcess(beanDefinitionBuilder, mockRepositoryConfigurationSource); + + Object mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() + .getPropertyValue("gemfireMappingContext").getValue(); + + assertThat(mappingContextRef, is(instanceOf(RuntimeBeanReference.class))); + assertThat(((RuntimeBeanReference) mappingContextRef).getBeanName(), is(equalTo("testMappingContext"))); + + verify(mockRepositoryConfigurationSource, times(1)).getAttribute(eq("mappingContextRef")); + } + + @Test + public void postProcessWithAnnotationRepositoryConfigurationSourceHaingNoMappingContextRefAttribute() { + AnnotationRepositoryConfigurationSource mockRepositoryConfigurationSource = + mock(AnnotationRepositoryConfigurationSource.class); + + when(mockRepositoryConfigurationSource.getAttribute(eq("mappingContextRef"))).thenReturn(" "); + + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(); + + repositoryConfigurationExtension.postProcess(beanDefinitionBuilder, mockRepositoryConfigurationSource); + + Object mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() + .getPropertyValue("gemfireMappingContext"); + + assertThat(mappingContextRef, is(nullValue())); + + 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); + + Object mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() + .getPropertyValue("gemfireMappingContext"); + + assertThat(mappingContextRef, is(nullValue())); + + verify(mockRepositoryConfigurationSource, times(1)).getElement(); + verify(mockElement, times(1)).getAttribute(eq("mapping-context-ref")); + } + + @Test + public void postProcessWithXmlRepositoryConfigurationSourceWith() { + Element mockElement = mock(Element.class); + + XmlRepositoryConfigurationSource mockRepositoryConfigurationSource = + mock(XmlRepositoryConfigurationSource.class); + + when(mockRepositoryConfigurationSource.getElement()).thenReturn(mockElement); + when(mockElement.getAttribute(eq("mapping-context-ref"))).thenReturn("testMappingContext"); + + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(); + + repositoryConfigurationExtension.postProcess(beanDefinitionBuilder, mockRepositoryConfigurationSource); + + Object mappingContextRef = beanDefinitionBuilder.getRawBeanDefinition().getPropertyValues() + .getPropertyValue("gemfireMappingContext").getValue(); + + 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")); + } + +}