From 87506ef775b21454212b673da9e6dedeab375f84 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Thu, 22 Sep 2011 10:28:40 +0300 Subject: [PATCH] SGF-71 + add support for region interest receive-values property --- .../reference/docbook/reference/bootstrap.xml | 13 +++++-- .../data/gemfire/IndexFactoryBean.java | 23 +++++++++++++ .../client/ClientRegionFactoryBean.java | 6 ++-- .../data/gemfire/client/Interest.java | 34 ++++++++++++++++--- .../gemfire/config/ClientRegionParser.java | 1 + .../gemfire/config/spring-gemfire-1.1.xsd | 15 ++++++++ .../data/gemfire/client/basic-region.xml | 2 +- 7 files changed, 84 insertions(+), 10 deletions(-) diff --git a/docs/src/reference/docbook/reference/bootstrap.xml b/docs/src/reference/docbook/reference/bootstrap.xml index 256e1bfd..bf784f09 100644 --- a/docs/src/reference/docbook/reference/bootstrap.xml +++ b/docs/src/reference/docbook/reference/bootstrap.xml @@ -583,8 +583,12 @@ redundancy. Each copy provides extra backup at the expense of extra storages. - + ]]> + + A special key ALL_KEYS means interest is registered for all keys (identical to a regex interest of .*. + The receive-values attribute indicates whether or not the values are received for create and update events. If true, values are received; if false, only + invalidation events are received - refer to the GemFire documentation for more details. @@ -782,7 +786,12 @@ redundancy. Each copy provides extra backup at the expense of extra storages.]]> - Note that index declaration are not bound to a region but rather are top-level elements (just like gfe:cache). This allows one to declare any number of indecies on any region + Before creating an index, SGF will verify whether one with the same name already exists. If it does, it will compare the properties and if they don't match, will remove the old one to create + a new one. If the properties match, SGF will simply return the index (in case it does not exist it will simply create one). To prevent the update of the index, even if the properties do not match, + set the property override to false. + + + Note that index declaration are not bound to a region but rather are top-level elements (just like gfe:cache). This allows one to declare any number of indecies on any region whether they are just created or already exist - an improvement versus the GemFire cache.xml. By default the index relies on the default cache declaration but one can customize it accordingly or use a pool (if need be) - see the namespace schema for the full set of options. diff --git a/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java b/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java index 5f657157..fb66051b 100644 --- a/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java @@ -45,6 +45,7 @@ public class IndexFactoryBean implements InitializingBean, BeanNameAware, Factor private String beanName; private String name, expression, from, imports; private IndexType type = IndexType.FUNCTIONAL; + private boolean override = true; public void afterPropertiesSet() throws Exception { if (queryService == null) { @@ -72,8 +73,23 @@ public class IndexFactoryBean implements InitializingBean, BeanNameAware, Factor private Index createIndex(QueryService queryService, String indexName) throws Exception { Collection indexes = queryService.getIndexes(); + + Index old = null; + for (Index index : indexes) { if (indexName.equals(index.getName())) { + if (!override) { + return index; + } + old = index; + break; + } + } + + if (old != null) { + // compare indices + if (from.equals(old.getFromClause()) && expression.equals(old.getIndexedExpression()) + && type.equals(old.getType())) { return index; } } @@ -167,4 +183,11 @@ public class IndexFactoryBean implements InitializingBean, BeanNameAware, Factor public void setType(IndexType type) { this.type = type; } + + /** + * @param override the override to set + */ + public void setOverride(boolean override) { + this.override = override; + } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/client/ClientRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/client/ClientRegionFactoryBean.java index d8ec564a..65db4eaf 100644 --- a/src/main/java/org/springframework/data/gemfire/client/ClientRegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/client/ClientRegionFactoryBean.java @@ -153,10 +153,12 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean for (Interest interest : interests) { if (interest instanceof RegexInterest) { // do the cast since it's safe - region.registerInterestRegex((String) interest.getKey(), interest.getPolicy(), interest.isDurable()); + region.registerInterestRegex((String) interest.getKey(), interest.getPolicy(), + interest.isDurable(), interest.isReceiveValues()); } else { - region.registerInterest(interest.getKey(), interest.getPolicy(), interest.isDurable()); + region.registerInterest(interest.getKey(), interest.getPolicy(), interest.isDurable(), + interest.isReceiveValues()); } } } diff --git a/src/main/java/org/springframework/data/gemfire/client/Interest.java b/src/main/java/org/springframework/data/gemfire/client/Interest.java index 57f74087..0bce0a0f 100644 --- a/src/main/java/org/springframework/data/gemfire/client/Interest.java +++ b/src/main/java/org/springframework/data/gemfire/client/Interest.java @@ -35,6 +35,7 @@ public class Interest implements InitializingBean { private K key; private InterestResultPolicy policy = InterestResultPolicy.DEFAULT; private boolean durable = false; + private boolean receiveValues = true; public Interest() { } @@ -52,20 +53,25 @@ public class Interest implements InitializingBean { } public Interest(K key, String policy, boolean durable) { - this.key = key; - this.policy = (InterestResultPolicy) constants.asObject(policy); - this.durable = durable; - afterPropertiesSet(); + this(key, policy, false, true); + } + + public Interest(K key, String policy, boolean durable, boolean receiveValues) { + this(key, (InterestResultPolicy) constants.asObject(policy), durable, receiveValues); } public Interest(K key, InterestResultPolicy policy, boolean durable) { + this(key, policy, durable, true); + } + + public Interest(K key, InterestResultPolicy policy, boolean durable, boolean receiveValues) { this.key = key; this.policy = policy; this.durable = durable; + this.receiveValues = receiveValues; afterPropertiesSet(); } - public void afterPropertiesSet() { Assert.notNull(key, "a non-null key is required"); } @@ -135,4 +141,22 @@ public class Interest implements InitializingBean { public void setDurable(boolean durable) { this.durable = durable; } + + /** + * Returns the type of values received by the listener. + * + * @return the receiveValues + */ + protected boolean isReceiveValues() { + return receiveValues; + } + + /** + * Switches between the different entities received by the listener. + * + * @param receiveValues the receiveValues to set + */ + public void setReceiveValues(boolean receiveValues) { + this.receiveValues = receiveValues; + } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java index bc817d79..65270ac7 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java @@ -145,5 +145,6 @@ class ClientRegionParser extends AliasReplacingBeanDefinitionParser { private void parseCommonInterestAttr(Element element, BeanDefinitionBuilder builder) { ParsingUtils.setPropertyValue(element, builder, "durable", "durable"); ParsingUtils.setPropertyValue(element, builder, "result-policy", "policy"); + ParsingUtils.setPropertyValue(element, builder, "receive-values", "receiveValues"); } } \ No newline at end of file diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd index 286bbc39..ee21f867 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd @@ -911,6 +911,15 @@ NONE - Does not initialize the local cache. + + + + + @@ -1174,6 +1183,12 @@ The name of the index.]]> + + + + + diff --git a/src/test/resources/org/springframework/data/gemfire/client/basic-region.xml b/src/test/resources/org/springframework/data/gemfire/client/basic-region.xml index dd10be36..11ad80ed 100644 --- a/src/test/resources/org/springframework/data/gemfire/client/basic-region.xml +++ b/src/test/resources/org/springframework/data/gemfire/client/basic-region.xml @@ -36,7 +36,7 @@ - +