From c2536e91d89fc15ec012913acbbbd5273be544b4 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Fri, 10 Aug 2012 11:12:42 -0400 Subject: [PATCH] modified for Gemfire 7 WAN API changes --- .springBeans | 1 + gradle.properties | 2 +- samples/readme.txt | 3 +- .../data/gemfire/CacheFactoryBean.java | 7 + .../data/gemfire/RegionFactoryBean.java | 6 +- .../data/gemfire/config/CacheParser.java | 2 - .../wan/AbstractWANComponentFactoryBean.java | 7 + .../wan/AsyncEventQueueFactoryBean.java | 23 +- .../gemfire/wan/GatewaySenderFactoryBean.java | 11 +- .../data/gemfire/RecreatingContextTest.java | 10 +- .../config/GemfireV7GatewayNamespaceTest.java | 289 +++++++++++++++++- src/test/resources/log4j.properties | 2 +- .../data/gemfire/config/gateway-v7-ns.xml | 3 +- 13 files changed, 319 insertions(+), 47 deletions(-) diff --git a/.springBeans b/.springBeans index 08fe5a66..d3321de6 100644 --- a/.springBeans +++ b/.springBeans @@ -7,6 +7,7 @@ + src/test/resources/org/springframework/data/gemfire/support/GemfirePersistenceExceptionTranslationTest-context.xml diff --git a/gradle.properties b/gradle.properties index ba90fe26..28e0a6af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ slf4jVersion = 1.6.4 springVersion = 3.1.2.RELEASE springDataCommonsVersion = 1.4.0.M1 #Temporary until release of 7.0 -gemfireVersion = 7.0-beta +gemfireVersion = 7.0.Beta-SNAPSHOT gemfireVersion6x = 6.6.3 # Testing diff --git a/samples/readme.txt b/samples/readme.txt index ba16df50..4f598f03 100644 --- a/samples/readme.txt +++ b/samples/readme.txt @@ -1,6 +1,7 @@ Spring GemFire Samples ---------------------- - +NOTE: Spring Data GemFire Sample code has been moved to https://github.com/SpringSource/spring-gemfire-examples +----------------------------------------------------------------------------------------------------------------- This folder contains various various demo applications and samples for Spring GemFire. Please see each folder for detailed instructions (readme.txt). diff --git a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java index 5a6687cd..80e6ce34 100644 --- a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java @@ -38,6 +38,7 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; +import com.gemstone.gemfire.GemFireCheckedException; import com.gemstone.gemfire.GemFireException; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheClosedException; @@ -454,6 +455,12 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl return wrapped; } } + if (ex.getCause() instanceof GemFireException) { + return GemfireCacheUtils.convertGemfireAccessException((GemFireException)ex.getCause()); + } + if (ex.getCause() instanceof GemFireCheckedException) { + return GemfireCacheUtils.convertGemfireAccessException((GemFireCheckedException)ex.getCause()); + } return null; } diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java index daaab3aa..86f45d3f 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java @@ -27,7 +27,7 @@ import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; -import com.gemstone.gemfire.cache.AsyncEventQueue; +import com.gemstone.gemfire.cache.asyncqueue.AsyncEventQueue; import com.gemstone.gemfire.cache.AttributesFactory; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheClosedException; @@ -133,13 +133,13 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple hubId == null, "It is invalid to configure a region with both a hubId and gatewaySenders. Note that the enableGateway and hubId properties are deprecated since Gemfire 7.0"); for (Object gatewaySender : gatewaySenders) { - regionFactory.addGatewaySender((GatewaySender) gatewaySender); + regionFactory.addGatewaySenderId(((GatewaySender) gatewaySender).getId()); } } if (!ObjectUtils.isEmpty(asyncEventQueues)) { for (Object asyncEventQueue : asyncEventQueues) { - regionFactory.addAsyncEventQueue((AsyncEventQueue) asyncEventQueue); + regionFactory.addAsyncEventQueueId(((AsyncEventQueue) asyncEventQueue).getId()); } } 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 c3770f85..2eab0002 100644 --- a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java @@ -19,10 +19,8 @@ package org.springframework.data.gemfire.config; import java.util.List; import org.springframework.beans.factory.BeanDefinitionStoreException; -import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -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; diff --git a/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java index 1b601a42..9c3c3802 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/AbstractWANComponentFactoryBean.java @@ -38,6 +38,8 @@ public abstract class AbstractWANComponentFactoryBean implements FactoryBean< protected final Cache cache; + protected Object factory; + protected AbstractWANComponentFactoryBean(Cache cache) { this.cache = cache; } @@ -71,4 +73,9 @@ public abstract class AbstractWANComponentFactoryBean implements FactoryBean< public final boolean isSingleton() { return true; } + + public void setFactory(Object factory) { + this.factory = factory; + } + } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/wan/AsyncEventQueueFactoryBean.java b/src/main/java/org/springframework/data/gemfire/wan/AsyncEventQueueFactoryBean.java index 0cecf9a6..255b2381 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/AsyncEventQueueFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/AsyncEventQueueFactoryBean.java @@ -17,11 +17,11 @@ package org.springframework.data.gemfire.wan; import org.springframework.util.Assert; -import com.gemstone.gemfire.cache.AsyncEventQueue; -import com.gemstone.gemfire.cache.AsyncEventQueueFactory; +import com.gemstone.gemfire.cache.asyncqueue.AsyncEventQueue; +import com.gemstone.gemfire.cache.asyncqueue.AsyncEventQueueFactory; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheClosedException; -import com.gemstone.gemfire.cache.wan.AsyncEventListener; +import com.gemstone.gemfire.cache.asyncqueue.AsyncEventListener; /** * FactoryBean for creating GemFire {@link AsyncEventQueue}s. @@ -44,8 +44,6 @@ public class AsyncEventQueueFactoryBean extends AbstractWANComponentFactoryBean< private Boolean persistent; - private Boolean parallel; - private String diskStoreRef; /** @@ -71,11 +69,13 @@ public class AsyncEventQueueFactoryBean extends AbstractWANComponentFactoryBean< @Override protected void doInit() { Assert.notNull(asyncEventListener, "AsyncEventListener cannot be null"); - - AsyncEventQueueFactory asyncEventQueueFactory = cache.createAsyncEventQueueFactory(); - if (parallel != null) { - asyncEventQueueFactory.setParallel(parallel); + AsyncEventQueueFactory asyncEventQueueFactory = null; + if (this.factory == null) { + asyncEventQueueFactory = cache.createAsyncEventQueueFactory(); + } else { + asyncEventQueueFactory = (AsyncEventQueueFactory)factory; } + if (persistent != null) { asyncEventQueueFactory.setPersistent(persistent); } @@ -99,7 +99,6 @@ public class AsyncEventQueueFactoryBean extends AbstractWANComponentFactoryBean< public void destroy() throws Exception { if (!cache.isClosed()) { try { - asyncEventQueue.stop(); asyncEventListener.close(); } catch (CacheClosedException cce) { @@ -119,8 +118,4 @@ public class AsyncEventQueueFactoryBean extends AbstractWANComponentFactoryBean< public void setPersistent(Boolean persistent) { this.persistent = persistent; } - - public void setParallel(Boolean parallel) { - this.parallel = parallel; - } } 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 4845afa0..829ef50d 100644 --- a/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/wan/GatewaySenderFactoryBean.java @@ -92,7 +92,12 @@ public class GatewaySenderFactoryBean extends AbstractWANComponentFactoryBean region = ctx.getBean("region-inner-gateway-sender", Region.class); GatewaySender gws = ctx.getBean("gateway-sender", GatewaySender.class); - assertNotNull(region.getAttributes().getGatewaySenders()); - assertEquals(2, region.getAttributes().getGatewaySenders().size()); + assertNotNull(region.getAttributes().getGatewaySenderIds()); + assertEquals(2, region.getAttributes().getGatewaySenderIds().size()); - // Isolate the inner gateway - Set gatewaySenders = region.getAttributes().getGatewaySenders(); - assertTrue(gatewaySenders.remove(gws)); - gatewaySenders.remove(gws); +// // Isolate the inner gateway +// Set gatewaySenders = region.getAttributes().getGatewaySenderIds(); +// assertTrue(gatewaySenders.remove(gws)); +// gatewaySenders.remove(gws); - gws = gatewaySenders.iterator().next(); + RegionFactoryBean rfb = ctx.getBean("®ion-inner-gateway-sender", RegionFactoryBean.class); + Object[] gwsenders = TestUtils.readField("gatewaySenders", rfb); + gws = (GatewaySender)gwsenders[0]; List eventFilters = gws.getGatewayEventFilters(); assertNotNull(eventFilters); assertEquals(1, eventFilters.size()); @@ -179,18 +197,19 @@ public class GemfireV7GatewayNamespaceTest extends RecreatingContextTest { } @Override - public void afterAcknowledgement(AsyncEvent arg0) { + public void afterAcknowledgement(GatewayQueueEvent arg0) { // TODO Auto-generated method stub + } @Override - public boolean beforeEnqueue(AsyncEvent arg0) { + public boolean beforeEnqueue(GatewayQueueEvent arg0) { // TODO Auto-generated method stub return false; } @Override - public boolean beforeTransmit(AsyncEvent arg0) { + public boolean beforeTransmit(GatewayQueueEvent arg0) { // TODO Auto-generated method stub return false; } @@ -234,4 +253,242 @@ public class GemfireV7GatewayNamespaceTest extends RecreatingContextTest { } } + + + public static class StubAsyncEventQueueFactory implements AsyncEventQueueFactory { + + private AsyncEventListener listener; + + private AsyncEventQueue asyncEventQueue = mock(AsyncEventQueue.class); + + private boolean persistent; + private int maxQueueMemory; + private String diskStoreName; + private int batchSize; + + private String name; + + @Override + public AsyncEventQueue create(String name, AsyncEventListener listener) { + this.name = name; + this.listener = listener; + + when(asyncEventQueue.getAsyncEventListener()).thenReturn(this.listener); + when(asyncEventQueue.getBatchSize()).thenReturn(this.batchSize); + when(asyncEventQueue.getDiskStoreName()).thenReturn(this.diskStoreName); + when(asyncEventQueue.isPersistent()).thenReturn(this.persistent); + when(asyncEventQueue.getId()).thenReturn(this.name); + when(asyncEventQueue.getMaximumQueueMemory()).thenReturn(this.maxQueueMemory); + return this.asyncEventQueue; + } + + @Override + public AsyncEventQueueFactory setBatchSize(int batchSize) { + this.batchSize = batchSize; + return this; + } + + @Override + public AsyncEventQueueFactory setDiskStoreName(String diskStoreName) { + this.diskStoreName = diskStoreName; + return this; + } + + @Override + public AsyncEventQueueFactory setMaximumQueueMemory(int maxQueueMemory) { + this.maxQueueMemory = maxQueueMemory; + return this; + } + + @Override + public AsyncEventQueueFactory setPersistent(boolean persistent) { + this.persistent = persistent; + return this; + } + } + + public static class StubGWSenderFactory implements GatewaySenderFactory { + + private GatewaySender gatewaySender = mock(GatewaySender.class); + + private int alertThreshold; + private boolean batchConflationEnabled; + private int batchSize; + private int batchTimeInterval; + private String diskStoreName; + private boolean diskSynchronous; + private int dispatcherThreads; + private boolean manualStart; + private int maxQueueMemory; + private OrderPolicy orderPolicy; + private boolean parallel; + private boolean persistenceEnabled; + private int socketBufferSize; + private int socketReadTimeout; + private List eventFilters; + private List transportFilters; + + private String name; + + private int remoteSystemId; + + public StubGWSenderFactory() { + this.eventFilters = new ArrayList(); + this.transportFilters = new ArrayList(); + + } + + @Override + public GatewaySenderFactory addGatewayEventFilter(GatewayEventFilter filter) { + eventFilters.add(filter); + return this; + } + + @Override + public GatewaySenderFactory addGatewayTransportFilter(GatewayTransportFilter filter) { + transportFilters.add(filter); + return this; + } + + @Override + public GatewaySender create(String name, int remoteSystemId) { + this.name = name; + this.remoteSystemId = remoteSystemId; + when(gatewaySender.getId()).thenReturn(this.name); + when(gatewaySender.getRemoteDSId()).thenReturn(this.remoteSystemId); + when(gatewaySender.getAlertThreshold()).thenReturn(this.alertThreshold); + when(gatewaySender.getBatchSize()).thenReturn(this.batchSize); + when(gatewaySender.getBatchTimeInterval()).thenReturn(this.batchTimeInterval); + when(gatewaySender.getDiskStoreName()).thenReturn(this.diskStoreName); + when(gatewaySender.getDispatcherThreads()).thenReturn(this.dispatcherThreads); + when(gatewaySender.getGatewayEventFilters()).thenReturn(this.eventFilters); + when(gatewaySender.getGatewayTransportFilters()).thenReturn(this.transportFilters); + when(gatewaySender.getMaximumQueueMemory()).thenReturn(this.maxQueueMemory); + when(gatewaySender.getOrderPolicy()).thenReturn(this.orderPolicy); + when(gatewaySender.getSocketBufferSize()).thenReturn(this.socketBufferSize); + when(gatewaySender.getSocketReadTimeout()).thenReturn(this.socketReadTimeout); + when(gatewaySender.isManualStart()).thenReturn(this.manualStart); + when(gatewaySender.isBatchConflationEnabled()).thenReturn(this.batchConflationEnabled); + when(gatewaySender.isDiskSynchronous()).thenReturn(this.diskSynchronous); + when(gatewaySender.isParallel()).thenReturn(this.parallel); + when(gatewaySender.isPersistenceEnabled()).thenReturn(this.persistenceEnabled); + return gatewaySender; + } + + @Override + public GatewaySenderFactory removeGatewayEventFilter(GatewayEventFilter filter) { + gatewaySender.removeGatewayEventFilter(filter); + return this; + } + + @Override + public GatewaySenderFactory removeGatewayTransportFilter(GatewayTransportFilter filter) { + gatewaySender.removeGatewayTransportFilter(filter); + return this; + } + + @Override + public GatewaySenderFactory setAlertThreshold(int alertThreshold) { + this.alertThreshold = alertThreshold; + return this; + } + + @Override + public GatewaySenderFactory setBatchConflationEnabled(boolean batchConflationEnabled) { + this.batchConflationEnabled = batchConflationEnabled; + return this; + } + + @Override + public GatewaySenderFactory setBatchSize(int batchSize) { + this.batchSize = batchSize; + return this; + } + + @Override + public GatewaySenderFactory setBatchTimeInterval(int batchTimeInterval) { + this.batchTimeInterval = batchTimeInterval; + return this; + } + + @Override + public GatewaySenderFactory setDiskStoreName(String diskStoreName) { + this.diskStoreName = diskStoreName; + return this; + } + + @Override + public GatewaySenderFactory setDiskSynchronous(boolean diskSynchronous) { + this.diskSynchronous = diskSynchronous; + return this; + } + + @Override + public GatewaySenderFactory setDispatcherThreads(int dispatcherThreads) { + this.dispatcherThreads = dispatcherThreads; + return this; + } + + @Override + public GatewaySenderFactory setManualStart(boolean manualStart) { + this.manualStart = manualStart; + return this; + } + + @Override + public GatewaySenderFactory setMaximumQueueMemory(int maxQueueMemory) { + this.maxQueueMemory = maxQueueMemory; + return this; + } + + @Override + public GatewaySenderFactory setOrderPolicy(OrderPolicy orderPolicy) { + this.orderPolicy = orderPolicy; + return this; + } + + @Override + public GatewaySenderFactory setParallel(boolean parallel) { + this.parallel = parallel; + return this; + } + + @Override + public GatewaySenderFactory setPersistenceEnabled(boolean persistenceEnabled) { + this.persistenceEnabled = persistenceEnabled; + return this; + } + + @Override + public GatewaySenderFactory setSocketBufferSize(int socketBufferSize) { + this.socketBufferSize = socketBufferSize; + return this; + } + + @Override + public GatewaySenderFactory setSocketReadTimeout(int socketReadTimeout) { + this.socketReadTimeout = socketReadTimeout; + return this; + } + } + + + /* + * This mocks out the WAN components which are disabled in the developer edition + */ + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof GatewaySenderFactoryBean) { + ((GatewaySenderFactoryBean)bean).setFactory(new StubGWSenderFactory()); + } + if (bean instanceof AsyncEventQueueFactoryBean) { + ((AsyncEventQueueFactoryBean)bean).setFactory(new StubAsyncEventQueueFactory()); + } + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } } diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 6db93321..9676596b 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -6,7 +6,7 @@ log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n log4j.category.org.springframework.data.gemfire.listener=TRACE log4j.category.org.springframework.data.gemfire=DEBUG -log4j.category.org.springframework.beans=DEBUG +log4j.category.org.springframework=DEBUG # for debugging datasource initialization # log4j.category.test.jdbc=DEBUG diff --git a/src/test/resources/org/springframework/data/gemfire/config/gateway-v7-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/gateway-v7-ns.xml index 44ee6696..fbdddb1a 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/gateway-v7-ns.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/gateway-v7-ns.xml @@ -10,11 +10,10 @@ -