diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/AbstractPeerRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/AbstractPeerRegionParser.java index bc96abd7..cde31c15 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/AbstractPeerRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/AbstractPeerRegionParser.java @@ -15,6 +15,7 @@ */ package org.springframework.data.gemfire.config.xml; +import org.apache.geode.cache.Region; import org.apache.geode.cache.asyncqueue.AsyncEventQueue; import org.apache.geode.cache.wan.GatewaySender; @@ -24,10 +25,16 @@ import org.springframework.beans.factory.xml.ParserContext; import org.w3c.dom.Element; /** - * The AbstractPeerRegionParser class... + * Abstract Spring XML Parser for peer {@link Region} bean definitions. * * @author John Blum - * @since 1.0.0 + * @see org.apache.geode.cache.Region + * @see org.apache.geode.cache.asyncqueue.AsyncEventQueue + * @see org.apache.geode.cache.wan.GatewaySender + * @see org.springframework.beans.factory.support.BeanDefinitionBuilder + * @see org.springframework.beans.factory.xml.ParserContext + * @see org.w3c.dom.Element + * @since 2.2.0 */ public abstract class AbstractPeerRegionParser extends AbstractRegionParser { diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java index d84db3a1..2bcf57ca 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java @@ -13,15 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.data.gemfire.config.xml; import org.apache.geode.cache.asyncqueue.AsyncEventQueue; import org.apache.geode.cache.wan.GatewaySender; + import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.LookupRegionFactoryBean; import org.springframework.util.xml.DomUtils; + import org.w3c.dom.Element; /** @@ -30,8 +31,13 @@ import org.w3c.dom.Element; * @author Costin Leau * @author David Turanski * @author John Blum + * @see org.apache.geode.cache.asyncqueue.AsyncEventQueue + * @see org.apache.geode.cache.wan.GatewaySender + * @see org.springframework.beans.factory.support.BeanDefinitionBuilder + * @see org.springframework.beans.factory.xml.ParserContext * @see org.springframework.data.gemfire.LookupRegionFactoryBean - * @see AbstractRegionParser + * @see org.springframework.data.gemfire.config.xml.AbstractRegionParser + * @see org.w3c.dom.Element */ class LookupRegionParser extends AbstractRegionParser { @@ -52,14 +58,17 @@ class LookupRegionParser extends AbstractRegionParser { super.doParse(element, builder); - String resolvedCacheRef = ParsingUtils.resolveCacheReference( - element.getAttribute(ParsingUtils.CACHE_REF_ATTRIBUTE_NAME)); + String resolvedCacheRef = + ParsingUtils.resolveCacheReference(element.getAttribute(ParsingUtils.CACHE_REF_ATTRIBUTE_NAME)); builder.addPropertyReference("cache", resolvedCacheRef); + ParsingUtils.setPropertyValue(element, builder, "async-event-queue-ids"); ParsingUtils.setPropertyValue(element, builder, "cloning-enabled"); ParsingUtils.setPropertyValue(element, builder, "eviction-maximum"); + ParsingUtils.setPropertyValue(element, builder, "gateway-sender-ids"); ParsingUtils.setPropertyValue(element, builder, "name"); + ParsingUtils.parseExpiration(element, parserContext, builder); parseCollectionOfCustomSubElements(element, parserContext, builder, AsyncEventQueue.class.getName(), @@ -71,23 +80,22 @@ class LookupRegionParser extends AbstractRegionParser { Element cacheListenerElement = DomUtils.getChildElementByTagName(element, "cache-listener"); if (cacheListenerElement != null) { - builder.addPropertyValue("cacheListeners", ParsingUtils.parseRefOrNestedBeanDeclaration( - cacheListenerElement, parserContext, - builder)); + builder.addPropertyValue("cacheListeners", + ParsingUtils.parseRefOrNestedBeanDeclaration(cacheListenerElement, parserContext, builder)); } Element cacheLoaderElement = DomUtils.getChildElementByTagName(element, "cache-loader"); if (cacheLoaderElement != null) { - builder.addPropertyValue("cacheLoader", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - cacheLoaderElement, parserContext, builder)); + builder.addPropertyValue("cacheLoader", + ParsingUtils.parseRefOrSingleNestedBeanDeclaration(cacheLoaderElement, parserContext, builder)); } Element cacheWriterElement = DomUtils.getChildElementByTagName(element, "cache-writer"); if (cacheWriterElement != null) { - builder.addPropertyValue("cacheWriter", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - cacheWriterElement, parserContext, builder)); + builder.addPropertyValue("cacheWriter", + ParsingUtils.parseRefOrSingleNestedBeanDeclaration(cacheWriterElement, parserContext, builder)); } if (!subRegion) { diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-2.1.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-2.1.xsd index 90b267cc..f0e67f95 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-2.1.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-2.1.xsd @@ -975,7 +975,7 @@ The name of the region definition.]]> - + - + example; + + @Test + public void regionWithAsyncEventQueuesAndGatewaySenderConfigurationIsCorrect() { + + assertThat(this.example).isNotNull(); + assertThat(this.example.getName()).isEqualTo("Example"); + + RegionAttributes exampleAttributes = this.example.getAttributes(); + + assertThat(exampleAttributes).isNotNull(); + assertThat(exampleAttributes.getDataPolicy()).isEqualTo(DataPolicy.REPLICATE); + + assertThat(exampleAttributes.getAsyncEventQueueIds()).containsExactlyInAnyOrder( + "TestAsyncEventQueueZero", + "TestAsyncEventQueueOne", + "TestAsyncEventQueueTwo", + "TestAsyncEventQueueThree", + "TestAsyncEventQueueFour" + ); + + assertThat(exampleAttributes.getGatewaySenderIds()).containsExactlyInAnyOrder( + "TestGatewaySenderZero", + "TestGatewaySenderOne", + "TestGatewaySenderTwo", + "TestGatewaySenderThree", + "TestGatewaySenderFour" + ); + } + + public static final class AsyncEventListenerFactoryBean extends AbstractFactoryBeanSupport { + + private final AsyncEventListener mockAsyncEventListener = mock(AsyncEventListener.class); + + @Nullable @Override + public AsyncEventListener getObject() { + return this.mockAsyncEventListener; + } + + @Nullable @Override + public Class getObjectType() { + + return this.mockAsyncEventListener != null + ? this.mockAsyncEventListener.getClass() + : AsyncEventListener.class; + } + } +} diff --git a/src/test/resources/org/springframework/data/gemfire/config/xml/LookupRegionWithAsyncEventQueuesAndGatewaySendersIntegrationTests-context.xml b/src/test/resources/org/springframework/data/gemfire/config/xml/LookupRegionWithAsyncEventQueuesAndGatewaySendersIntegrationTests-context.xml new file mode 100644 index 00000000..acd14648 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/xml/LookupRegionWithAsyncEventQueuesAndGatewaySendersIntegrationTests-context.xml @@ -0,0 +1,50 @@ + + + + + + + LookupRegionWithAsyncEventQueuesAndGatewaySendersIntegrationTests + error + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/region-with-asynceventqueues-gatewaysenders-cache.xml b/src/test/resources/region-with-asynceventqueues-gatewaysenders-cache.xml new file mode 100644 index 00000000..3fb3ca95 --- /dev/null +++ b/src/test/resources/region-with-asynceventqueues-gatewaysenders-cache.xml @@ -0,0 +1,11 @@ + + + + + + + +