diff --git a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java index daee69bb..144a06db 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -119,6 +119,7 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { } ParsingUtils.parseExpiration(parserContext, element, attrBuilder); + ParsingUtils.parseSubscription(parserContext, element, attrBuilder); ParsingUtils.parseEviction(parserContext, element, attrBuilder); ParsingUtils.parseMembershipAttributes(parserContext, element, attrBuilder); 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 8170e1de..fdfb591e 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java @@ -48,6 +48,7 @@ import com.gemstone.gemfire.cache.Scope; * * @author Costin Leau * @author David Turanski + * @author Lyndon Adams */ abstract class ParsingUtils { @@ -256,6 +257,36 @@ abstract class ParsingUtils { attrBuilder.addPropertyValue("evictionAttributes", evictionDefBuilder.getBeanDefinition()); return true; } + + /** + * Parses the subscription sub-element. Populates the given attribute factory + * with the proper attributes. + * + * @author Lyndon Adams + * @param parserContext + * @param element + * @param attrBuilder + * @return true if parsing actually occured, false otherwise + */ + static boolean parseSubscription(ParserContext parserContext, Element element, BeanDefinitionBuilder attrBuilder) { + Element subscriptionElement = DomUtils.getChildElementByTagName(element, "subscription"); + + if (subscriptionElement == null) + return false; + + BeanDefinitionBuilder subscriptionDefBuilder = BeanDefinitionBuilder + .genericBeanDefinition(SubscriptionAttributesFactoryBean.class); + + // do manual conversion since the enum is not public + String attr = subscriptionElement.getAttribute("type"); + if (StringUtils.hasText(attr)) { + subscriptionDefBuilder.addPropertyValue("type", SubscriptionType.valueOf(attr.toUpperCase())); + } + + attrBuilder.addPropertyValue("subscriptionAttributes", subscriptionDefBuilder.getBeanDefinition()); + return true; + } + static void parseTransportFilters(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { Element transportFilterElement = DomUtils.getChildElementByTagName(element, "transport-filter"); diff --git a/src/main/java/org/springframework/data/gemfire/config/SubscriptionAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/config/SubscriptionAttributesFactoryBean.java new file mode 100644 index 00000000..474cf12d --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/SubscriptionAttributesFactoryBean.java @@ -0,0 +1,102 @@ +/* + * 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 org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; + +import com.gemstone.gemfire.cache.InterestPolicy; +import com.gemstone.gemfire.cache.SubscriptionAttributes; + +/** + * Simple utility class used for defining nested factory-method like definitions w/o polluting the container with useless beans. + * + * @author Lyndon Adams + * @since 12 March 2013 + */ +public class SubscriptionAttributesFactoryBean implements FactoryBean, InitializingBean { + + SubscriptionAttributes subscriptionAttri; + InterestPolicy policy; + SubscriptionType type = SubscriptionType.ALL; + + + /* (non-Javadoc) + * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() + */ + @Override + public void afterPropertiesSet() throws Exception { + if( policy == null ){ + policy = InterestPolicy.DEFAULT; + } + subscriptionAttri = createAttributes(); + } + + private SubscriptionAttributes createAttributes(){ + switch( type ){ + case ALL : + policy = InterestPolicy.ALL; + break; + case CACHE_CONTENT : + policy = InterestPolicy.CACHE_CONTENT; + break; + default : + policy = InterestPolicy.DEFAULT; + } + return new SubscriptionAttributes( policy ); + } + + + /* (non-Javadoc) + * @see org.springframework.beans.factory.FactoryBean#getObject() + */ + @Override + public SubscriptionAttributes getObject() throws Exception { + return subscriptionAttri; + } + + /* (non-Javadoc) + * @see org.springframework.beans.factory.FactoryBean#getObjectType() + */ + @Override + public Class getObjectType() { + return ( subscriptionAttri != null ) ? subscriptionAttri.getClass() : SubscriptionAttributes.class; + } + + /* (non-Javadoc) + * @see org.springframework.beans.factory.FactoryBean#isSingleton() + */ + @Override + public boolean isSingleton() { + return true; + } + + public InterestPolicy getPolicy() { + return policy; + } + + public SubscriptionType getType() { + return type; + } + + public void setPolicy(InterestPolicy policy) { + this.policy = policy; + } + + public void setType(SubscriptionType type) { + this.type = type; + } +} diff --git a/src/main/java/org/springframework/data/gemfire/config/SubscriptionType.java b/src/main/java/org/springframework/data/gemfire/config/SubscriptionType.java new file mode 100644 index 00000000..83cc8439 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/SubscriptionType.java @@ -0,0 +1,26 @@ +/* + * 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; + +/** + * Simple enumeration for the various GemFire subscription types. + * + * @author Lyndon Adams + * + */ +enum SubscriptionType { + ALL, CACHE_CONTENT; +} \ No newline at end of file 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 c9aad6bc..7959fc29 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 @@ -974,6 +974,24 @@ up to date copy of the data. + + + + + + + + + + + + @@ -1075,6 +1093,24 @@ Defines a GemFire local region instance. Each local region is scoped only to the + + + + + + + + + + + + @@ -1226,6 +1262,24 @@ Specifies the number of buckets to allocate to the fixed partition + + + + + + + + + + + + @@ -1249,7 +1303,25 @@ The action to take when performing eviction. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/config/CacheSubscriptionTest.java b/src/test/java/org/springframework/data/gemfire/config/CacheSubscriptionTest.java new file mode 100644 index 00000000..12bee4a6 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/CacheSubscriptionTest.java @@ -0,0 +1,43 @@ +/* + * 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 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.test.GemfireTestRunner; +import org.springframework.test.context.ContextConfiguration; + +/** + * @author Lyndon Adams + */ +@RunWith(GemfireTestRunner.class) +@ContextConfiguration("/org/springframework/data/gemfire/config/subscription-ns.xml") +public class CacheSubscriptionTest{ + @Autowired ApplicationContext ctx; + + @Test + public void testRRSubscription() throws Exception { + + } + + @Test + public void testPRSubscription() throws Exception { + + } +} diff --git a/src/test/resources/org/springframework/data/gemfire/basic-region.xml b/src/test/resources/org/springframework/data/gemfire/basic-region.xml index 508a0f39..9b457c76 100644 --- a/src/test/resources/org/springframework/data/gemfire/basic-region.xml +++ b/src/test/resources/org/springframework/data/gemfire/basic-region.xml @@ -12,4 +12,5 @@ + diff --git a/src/test/resources/org/springframework/data/gemfire/client/client-cache.xml b/src/test/resources/org/springframework/data/gemfire/client/client-cache.xml index b0a76411..29eecb6b 100644 --- a/src/test/resources/org/springframework/data/gemfire/client/client-cache.xml +++ b/src/test/resources/org/springframework/data/gemfire/client/client-cache.xml @@ -9,5 +9,5 @@ - + diff --git a/src/test/resources/org/springframework/data/gemfire/config/subscription-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/subscription-ns.xml new file mode 100644 index 00000000..56c2322c --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/subscription-ns.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file