From fccb7378495e84386b4402b5f3cf2b70c927decb Mon Sep 17 00:00:00 2001 From: John Blum Date: Thu, 25 Sep 2014 21:39:23 -0700 Subject: [PATCH] SGF-332 - Add support for the GatewaySender 'eventSubstitutionFilter' property in the SDG XSD and GatewaySenderFactoryBean API. --- .../gemfire/config/GatewaySenderParser.java | 7 + .../data/gemfire/config/ParsingUtils.java | 5 +- .../gemfire/wan/GatewaySenderFactoryBean.java | 11 ++ .../gemfire/config/spring-gemfire-2.0.xsd | 129 +++++++++++------- .../config/GemfireV8GatewayNamespaceTest.java | 117 ++++++++++++++++ .../test/StubGatewaySenderFactory.java | 2 +- .../data/gemfire/config/gateway-v8-ns.xml | 35 +++++ 7 files changed, 252 insertions(+), 54 deletions(-) create mode 100644 src/test/java/org/springframework/data/gemfire/config/GemfireV8GatewayNamespaceTest.java create mode 100644 src/test/resources/org/springframework/data/gemfire/config/gateway-v8-ns.xml diff --git a/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java b/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java index 1c3d1f80..c9283bd6 100644 --- a/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/GatewaySenderParser.java @@ -66,6 +66,13 @@ class GatewaySenderParser extends AbstractSimpleBeanDefinitionParser { parserContext, eventFilterElement, builder)); } + Element eventSubstitutionFilterElement = DomUtils.getChildElementByTagName(element, "event-substitution-filter"); + + if (eventSubstitutionFilterElement != null) { + builder.addPropertyValue("eventSubstitutionFilter", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( + parserContext, eventSubstitutionFilterElement, builder)); + } + ParsingUtils.parseTransportFilters(element, parserContext, builder); // set the name for the GatewaySender as an inner bean diff --git a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java index 6c4a761d..c153214f 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java @@ -251,13 +251,12 @@ abstract class ParsingUtils { return false; } - static void parseTransportFilters(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { Element transportFilterElement = DomUtils.getChildElementByTagName(element, "transport-filter"); if (transportFilterElement != null) { - builder.addPropertyValue("transportFilters", - parseRefOrNestedBeanDeclaration(parserContext, transportFilterElement, builder)); + builder.addPropertyValue("transportFilters", parseRefOrNestedBeanDeclaration(parserContext, + transportFilterElement, builder)); } } diff --git a/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java index e3ab8e06..578b61dd 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java @@ -24,6 +24,7 @@ import org.springframework.util.CollectionUtils; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.util.Gateway; import com.gemstone.gemfire.cache.wan.GatewayEventFilter; +import com.gemstone.gemfire.cache.wan.GatewayEventSubstitutionFilter; import com.gemstone.gemfire.cache.wan.GatewaySender; import com.gemstone.gemfire.cache.wan.GatewaySenderFactory; import com.gemstone.gemfire.cache.wan.GatewayTransportFilter; @@ -60,6 +61,8 @@ public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -2629,8 +2599,7 @@ to when the acknowldgement was received from the gateway receiver. ]]> - + +Determines how updates to Region Entries are distributed to the other Caches in the Distributed System where +the Region and Entry are defined. Scope also determines whether to allow remote invocation of some of +the Region’s event handlers + ]]> @@ -3027,17 +2997,15 @@ Scope also determines whether to allow remote invocation of some of the region - - + + - + - + @@ -3045,16 +3013,77 @@ A transport filter for this gateway component +Inner bean definition(s) to declare and add GatewayEventFilter(s) to the GatewaySender. + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/config/GemfireV8GatewayNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/GemfireV8GatewayNamespaceTest.java new file mode 100644 index 00000000..304231ad --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/GemfireV8GatewayNamespaceTest.java @@ -0,0 +1,117 @@ +/* + * Copyright 2010-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.data.gemfire.config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.gemstone.gemfire.cache.EntryEvent; +import com.gemstone.gemfire.cache.wan.GatewayEventSubstitutionFilter; +import com.gemstone.gemfire.cache.wan.GatewaySender; + +/** + * The GemfireV8GatewayNamespaceTest class is a test suite of test cases testing the contract and functionality of + * GemFire 8 Gateway Sender/Receiver support. + * + * @author John Blum + * @see org.junit.Test + * @see org.junit.runner.RunWith + * @see org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer + * @see org.springframework.data.gemfire.wan.GatewaySenderFactoryBean + * @see org.springframework.test.context.ContextConfiguration + * @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner + * @see com.gemstone.gemfire.cache.wan.GatewaySender + * @see com.gemstone.gemfire.cache.wan.GatewayEventSubstitutionFilter + * @since 2.0.0 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(value = "gateway-v8-ns.xml", initializers = GemfireTestApplicationContextInitializer.class) +@SuppressWarnings("unused") +public class GemfireV8GatewayNamespaceTest { + + @Autowired + @Qualifier("gateway-sender-with-event-substitution-filter") + private GatewaySender gatewaySenderWithEventSubstitutionFilter; + + @Autowired + @Qualifier("gateway-sender-with-event-substitution-filter-ref") + private GatewaySender gatewaySenderWithEventSubstitutionFilterRef; + + @Test + public void testGatewaySenderEventSubstitutionFilter() { + assertNotNull("The 'gatewaySenderEventSubtitutionFilter' bean was not properly configured and initialized!", + gatewaySenderWithEventSubstitutionFilter); + assertEquals("gateway-sender-with-event-substitution-filter", gatewaySenderWithEventSubstitutionFilter.getId()); + assertEquals(3, gatewaySenderWithEventSubstitutionFilter.getRemoteDSId()); + assertEquals(10, gatewaySenderWithEventSubstitutionFilter.getDispatcherThreads()); + assertTrue(gatewaySenderWithEventSubstitutionFilter.isParallel()); + assertFalse(gatewaySenderWithEventSubstitutionFilter.isRunning()); + assertNotNull(gatewaySenderWithEventSubstitutionFilter.getGatewayEventSubstitutionFilter()); + assertEquals("inner", gatewaySenderWithEventSubstitutionFilter.getGatewayEventSubstitutionFilter().toString()); + } + + @Test + public void testGatewaySenderEventSubstitutionFilterRef() { + assertNotNull("The 'gatewaySenderEventSubtitutionFilter' bean was not properly configured and initialized!", + gatewaySenderWithEventSubstitutionFilterRef); + assertEquals("gateway-sender-with-event-substitution-filter-ref", gatewaySenderWithEventSubstitutionFilterRef.getId()); + assertEquals(33, gatewaySenderWithEventSubstitutionFilterRef.getRemoteDSId()); + assertEquals(1, gatewaySenderWithEventSubstitutionFilterRef.getDispatcherThreads()); + assertFalse(gatewaySenderWithEventSubstitutionFilterRef.isParallel()); + assertFalse(gatewaySenderWithEventSubstitutionFilterRef.isRunning()); + assertNotNull(gatewaySenderWithEventSubstitutionFilterRef.getGatewayEventSubstitutionFilter()); + assertEquals("ref", gatewaySenderWithEventSubstitutionFilterRef.getGatewayEventSubstitutionFilter().toString()); + } + + public static class TestGatewayEventSubstitutionFilter implements GatewayEventSubstitutionFilter { + + private String name; + + public final void setName(final String name) { + this.name = name; + } + + protected String getName() { + return name; + } + + @Override + public Object getSubstituteValue(final EntryEvent objectObjectEntryEvent) { + throw new UnsupportedOperationException("Not Implemented!"); + } + + @Override + public void close() { + } + + @Override + public String toString() { + return getName(); + } + } + +} diff --git a/src/test/java/org/springframework/data/gemfire/test/StubGatewaySenderFactory.java b/src/test/java/org/springframework/data/gemfire/test/StubGatewaySenderFactory.java index e1c40809..97236ec5 100644 --- a/src/test/java/org/springframework/data/gemfire/test/StubGatewaySenderFactory.java +++ b/src/test/java/org/springframework/data/gemfire/test/StubGatewaySenderFactory.java @@ -44,7 +44,7 @@ public class StubGatewaySenderFactory implements GatewaySenderFactory { private boolean manualStart; private boolean parallel; private boolean persistenceEnabled; - private boolean running = true; + private boolean running = false; private int alertThreshold; private int batchSize; diff --git a/src/test/resources/org/springframework/data/gemfire/config/gateway-v8-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/gateway-v8-ns.xml new file mode 100644 index 00000000..3c81b569 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/gateway-v8-ns.xml @@ -0,0 +1,35 @@ + + + + + GemfireV8GatewayNamespaceTest + 0 + config + + + + + + + + + + + + + + + + +