From 661c9e00316311995e9a8fd9f261b4efc7c1543e Mon Sep 17 00:00:00 2001 From: costin Date: Thu, 26 Aug 2010 21:26:48 +0300 Subject: [PATCH] + beef up replicated region parser SGF-10 SGF-12 --- .../config/ReplicatedRegionParser.java | 82 +++++++++++++++++-- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java index 3c5618b3..8085273d 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java @@ -16,18 +16,88 @@ package org.springframework.data.gemfire.config; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.xml.BeanDefinitionParser; +import java.util.List; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.ManagedList; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.gemfire.RegionFactoryBean; +import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; +import com.gemstone.gemfire.cache.AttributesFactory; +import com.gemstone.gemfire.cache.DataPolicy; +import com.gemstone.gemfire.cache.Scope; + /** + * Parser for <replicated-region;gt; definitions. + * * @author Costin Leau */ -class ReplicatedRegionParser implements BeanDefinitionParser { +class ReplicatedRegionParser extends AbstractSingleBeanDefinitionParser { - public BeanDefinition parse(Element element, ParserContext parserContext) { - return null; + protected Class getBeanClass(Element element) { + return RegionFactoryBean.class; } -} + @Override + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + super.doParse(element, builder); + + // set the data policy + builder.addPropertyValue("dataPolicy", DataPolicy.REPLICATE); + builder.addPropertyValue("scope", Scope.DISTRIBUTED_ACK); + + ParsingUtils.setPropertyValue(element, builder, "name", "name"); + ParsingUtils.setPropertyValue(element, builder, "cache-ref", "cache"); + + // add attributes + AttributesFactory af = new AttributesFactory(); + + String attr = element.getAttribute("publisher"); + if (StringUtils.hasText(attr)) { + af.setPublisher(Boolean.valueOf(attr)); + } + + builder.addPropertyValue("attributes", af.create()); + + List subElements = DomUtils.getChildElements(element); + ManagedList listeners = new ManagedList(); + + // parse nested cache-listener elements + for (Element subElement : subElements) { + String name = subElement.getLocalName(); + + if ("cache-listener".equals(name)) { + listeners.add(parseCacheListener(parserContext, subElement, builder)); + } + + else if ("cache-loader".equals(name)) { + builder.addPropertyValue("cacheLoader", parseCacheLoader(parserContext, subElement, builder)); + } + + else if ("cache-writer".equals(name)) { + builder.addPropertyValue("cacheWriter", parseCacheWriter(parserContext, subElement, builder)); + } + } + + // add the listeners, after all the elements have been parsed + if (!listeners.isEmpty()) { + builder.addPropertyValue("cacheListeners", listeners); + } + } + + private Object parseCacheListener(ParserContext parserContext, Element subElement, BeanDefinitionBuilder builder) { + return ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, subElement, builder); + } + + private Object parseCacheLoader(ParserContext parserContext, Element subElement, BeanDefinitionBuilder builder) { + return ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, subElement, builder); + } + + private Object parseCacheWriter(ParserContext parserContext, Element subElement, BeanDefinitionBuilder builder) { + return ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, subElement, builder); + } +} \ No newline at end of file