From d5edd33fcdd065bebfd63c3f0201e2c321a687d0 Mon Sep 17 00:00:00 2001 From: Lyndon Adams Date: Tue, 12 Feb 2013 10:03:15 +0000 Subject: [PATCH] Completed changes for client ready-for-events attribute implementation. --- .../client/ClientCacheFactoryBean.java | 42 +++++++++++++++++- .../gemfire/config/ClientCacheParser.java | 7 +-- .../test/MockClientCacheFactoryBean.java | 2 + .../gemfire/config/spring-gemfire-1.3.xsd | 28 +++++++----- .../client/ClientReadyForEventsTest.java | 44 +++++++++++++++++++ .../client/client-readyforevents-cache.xml | 15 +++++++ 6 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 src/test/java/org/springframework/data/gemfire/client/ClientReadyForEventsTest.java create mode 100644 src/test/resources/org/springframework/data/gemfire/client/client-readyforevents-cache.xml diff --git a/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java index 2ca7f4d6..3a5f56a8 100644 --- a/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java @@ -27,6 +27,7 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; import com.gemstone.gemfire.cache.GemFireCache; +import com.gemstone.gemfire.cache.client.ClientCache; import com.gemstone.gemfire.cache.client.ClientCacheFactory; import com.gemstone.gemfire.cache.client.Pool; import com.gemstone.gemfire.cache.client.PoolManager; @@ -38,6 +39,7 @@ import com.gemstone.gemfire.pdx.PdxSerializer; * configuration of the generic cache). * * @author Costin Leau + * @author Lyndon Adams */ public class ClientCacheFactoryBean extends CacheFactoryBean { @@ -78,12 +80,22 @@ public class ClientCacheFactoryBean extends CacheFactoryBean { private String poolName; private Pool pool; + + protected Boolean readyForEvents = false; @Override protected GemFireCache createCache(Object factory) { ClientCacheFactory ccf = (ClientCacheFactory) factory; initializePool(ccf); - return ccf.create(); + + // Now create the cache + GemFireCache cache = ccf.create(); + + // Register for events after pool/regions been created and iff non-durable client + readyForEvents(); + + // Return the cache + return cache; } @Override @@ -176,6 +188,20 @@ public class ClientCacheFactoryBean extends CacheFactoryBean { } } + /** + * Inform cluster client cache is ready to receive events. + */ + private void readyForEvents(){ + ClientCache clientCache = ClientCacheFactory.getAnyInstance(); + if( readyForEvents != null && readyForEvents.booleanValue() && !clientCache.isClosed()){ + try { + clientCache.readyForEvents(); + }catch(IllegalStateException ex){ + // Cannot be called for a non-durable client so exception is throw + } + } + } + /** * Sets the pool name used by this client. * @@ -186,6 +212,19 @@ public class ClientCacheFactoryBean extends CacheFactoryBean { this.poolName = poolName; } + /** + * Set the readyForEvents event flag. + * + * @param readyForEvents + */ + public void setReadyForEvents(Boolean readyForEvents){ + this.readyForEvents = readyForEvents; + } + + public Boolean getReadyForEvents(){ + return this.readyForEvents; + } + /** * Sets the pool used by this client. * @@ -202,4 +241,5 @@ public class ClientCacheFactoryBean extends CacheFactoryBean { new PdxOptions((ClientCacheFactory) factory).run(); } } + } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java b/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java index 0448a33b..aa731f47 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java @@ -26,6 +26,7 @@ import org.w3c.dom.Element; * * @author Costin Leau * @author David Turanski + * @author Lyndon Adams */ class ClientCacheParser extends CacheParser { @@ -37,12 +38,12 @@ class ClientCacheParser extends CacheParser { @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { super.doParse(element, parserContext, builder); - //ParsingUtils.setPropertyValue(element, builder, "pool-name","poolName",GemfireConstants.DEFAULT_GEMFIRE_POOL_NAME); + ParsingUtils.setPropertyValue(element, builder, "pool-name","poolName",GemfireConstants.DEFAULT_GEMFIRE_POOL_NAME); + ParsingUtils.setPropertyValue(element, builder, "ready-for-events"); } @Override protected void postProcessDynamicRegionSupport(Element element, BeanDefinitionBuilder dynamicRegionSupport) { - ParsingUtils.setPropertyValue(element, dynamicRegionSupport, "pool-name"); - + ParsingUtils.setPropertyValue(element, dynamicRegionSupport, "pool-name"); } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/test/MockClientCacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/test/MockClientCacheFactoryBean.java index 8b303028..9e098de7 100644 --- a/src/main/java/org/springframework/data/gemfire/test/MockClientCacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/test/MockClientCacheFactoryBean.java @@ -22,6 +22,7 @@ import com.gemstone.gemfire.cache.client.ClientCacheFactory; /** * @author David Turanski + * @author Lyndon Adams * */ public class MockClientCacheFactoryBean extends ClientCacheFactoryBean { @@ -58,6 +59,7 @@ public class MockClientCacheFactoryBean extends ClientCacheFactoryBean { this.searchTimeout = cacheFactoryBean.getSearchTimeout(); this.transactionListeners = cacheFactoryBean.getTransactionListeners(); this.transactionWriter = cacheFactoryBean.getTransactionWriter(); + this.readyForEvents = cacheFactoryBean.getReadyForEvents(); } } diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd index ca33b44d..1c276f52 100755 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd @@ -322,18 +322,26 @@ Defines a GemFire Client Cache instance used for creating or retrieving 'regions - - - - - + + + + - - - - + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/client/ClientReadyForEventsTest.java b/src/test/java/org/springframework/data/gemfire/client/ClientReadyForEventsTest.java new file mode 100644 index 00000000..a91e5873 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/client/ClientReadyForEventsTest.java @@ -0,0 +1,44 @@ +/* + * 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.client; + +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.context.ApplicationContext; +import org.springframework.data.gemfire.TestUtils; +import org.springframework.data.gemfire.test.GemfireTestRunner; +import org.springframework.test.context.ContextConfiguration; + +/** + * @author Lyndon Adams + * + */ +@RunWith(GemfireTestRunner.class) +@ContextConfiguration("client-readyforevents-cache.xml") +public class ClientReadyForEventsTest { + + @Autowired ApplicationContext ctx; + + @Test + public void testReadyForEvents() throws Exception { + ClientCacheFactoryBean cfb = (ClientCacheFactoryBean) ctx.getBean("&gemfireCache"); + Boolean readyforevents = (Boolean) TestUtils.readField("readyForEvents", cfb); + assertTrue( readyforevents ); + } +} diff --git a/src/test/resources/org/springframework/data/gemfire/client/client-readyforevents-cache.xml b/src/test/resources/org/springframework/data/gemfire/client/client-readyforevents-cache.xml new file mode 100644 index 00000000..b1f3aef1 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/client/client-readyforevents-cache.xml @@ -0,0 +1,15 @@ + + + + + + + + + + +