diff --git a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java index 0dbd9a11..e52037ee 100644 --- a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java @@ -21,12 +21,11 @@ import java.util.List; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.data.gemfire.CacheFactoryBean; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -54,6 +53,7 @@ class CacheParser extends AbstractSimpleBeanDefinitionParser { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { super.doParse(element, builder); + ParsingUtils.setPropertyValue(element, builder, "cache-xml-location", "cacheXml"); ParsingUtils.setPropertyReference(element, builder, "properties-ref", "properties"); ParsingUtils.setPropertyReference(element, builder, "pdx-serializer-ref", "pdxSerializer"); @@ -111,15 +111,23 @@ class CacheParser extends AbstractSimpleBeanDefinitionParser { final String pdxDiskStoreName = element.getAttribute("pdx-disk-store"); if (!StringUtils.isEmpty(pdxDiskStoreName)) { - final BeanDefinitionRegistry registry = parserContext.getRegistry(); - - if (registry instanceof ConfigurableApplicationContext) { - ((ConfigurableApplicationContext) registry).addBeanFactoryPostProcessor( - new PdxDiskStoreAwareBeanFactoryPostProcessor(pdxDiskStoreName)); - } + registerPdxDiskStoreAwareBeanFactoryPostProcessor(parserContext, pdxDiskStoreName); } } + private void registerPdxDiskStoreAwareBeanFactoryPostProcessor(ParserContext parserContext, String pdxDiskStoreName) { + BeanDefinitionReaderUtils.registerWithGeneratedName( + createPdxDiskStoreAwareBeanFactoryPostProcessorBeanDefinition(pdxDiskStoreName), + parserContext.getRegistry()); + } + + private AbstractBeanDefinition createPdxDiskStoreAwareBeanFactoryPostProcessorBeanDefinition(String pdxDiskStoreName) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( + PdxDiskStoreAwareBeanFactoryPostProcessor.class); + builder.addConstructorArgValue(pdxDiskStoreName); + return builder.getBeanDefinition(); + } + private void parseDynamicRegionFactory(Element element, BeanDefinitionBuilder builder) { Element dynamicRegionFactory = DomUtils.getChildElementByTagName(element, "dynamic-region-factory"); if (dynamicRegionFactory != null) { diff --git a/src/test/java/org/springframework/data/gemfire/config/CacheUsingPdxNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/CacheUsingPdxNamespaceTest.java index 50cab9e0..b7c7efd9 100644 --- a/src/test/java/org/springframework/data/gemfire/config/CacheUsingPdxNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/CacheUsingPdxNamespaceTest.java @@ -20,14 +20,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.context.ApplicationContext; -import org.springframework.context.support.AbstractApplicationContext; import org.springframework.data.gemfire.CacheFactoryBean; import org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer; import org.springframework.test.context.ContextConfiguration; @@ -55,23 +52,15 @@ public class CacheUsingPdxNamespaceTest { @Autowired private ApplicationContext context; - protected PdxDiskStoreAwareBeanFactoryPostProcessor getPdxDiskStoreAwareBeanFactoryPostProcessor(AbstractApplicationContext context) { - for (BeanFactoryPostProcessor postProcessor : context.getBeanFactoryPostProcessors()) { - if (postProcessor instanceof PdxDiskStoreAwareBeanFactoryPostProcessor) { - return (PdxDiskStoreAwareBeanFactoryPostProcessor) postProcessor; - } - } - - return null; - } - @Test public void testApplicationContextHasPdxDiskStoreAwareBeanFactoryPostProcessor() { - assumeTrue(context instanceof AbstractApplicationContext); - - final PdxDiskStoreAwareBeanFactoryPostProcessor postProcessor = getPdxDiskStoreAwareBeanFactoryPostProcessor( - (AbstractApplicationContext) context); + PdxDiskStoreAwareBeanFactoryPostProcessor postProcessor = context.getBean( + PdxDiskStoreAwareBeanFactoryPostProcessor.class); + // NOTE the postProcessor reference will not be null as the ApplicationContext.getBean(:Class) method (getting + // a bean by Class type) will throw a NoSuchBeanDefinitionException if no bean of type + // PdxDiskStoreAwareBeanFactoryPostProcessor could be found, or throw a NoUniqueBeanDefinitionException if + // our PdxDiskStoreAwareBeanFactoryPostProcessor bean is not unique! assertNotNull(postProcessor); assertEquals("pdxStore", postProcessor.getPdxDiskStoreName()); }