From 40cb46a682b1041ddcf18ceed27d49d6c9d2e3da Mon Sep 17 00:00:00 2001 From: David Turanski Date: Tue, 5 Jun 2012 17:00:29 -0400 Subject: [PATCH 01/17] demonstrate problem trying to create subregions --- .../data/gemfire/RegionFactoryBean.java | 17 +- .../data/gemfire/SubRegion.java | 37 + .../data/gemfire/SubRegionFactoryBean.java | 47 + .../AliasReplacingBeanDefinitionParser.java | 14 +- .../config/ReplicatedRegionParser.java | 55 +- .../gemfire/config/spring-gemfire-1.2.xsd | 876 ++++++++++-------- .../gemfire/SubRegionFactoryBeanTest.java | 13 + .../config/ReplicatedRegionNamespaceTest.java | 9 + src/test/resources/log4j.properties | 1 + .../data/gemfire/config/replicated-ns.xml | 4 + 10 files changed, 680 insertions(+), 393 deletions(-) create mode 100644 src/main/java/org/springframework/data/gemfire/SubRegion.java create mode 100644 src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java create mode 100644 src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java index 7a7ea4eb..f81c2909 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java @@ -17,6 +17,7 @@ package org.springframework.data.gemfire; import java.lang.reflect.Field; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -28,6 +29,7 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; import com.gemstone.gemfire.cache.AttributesFactory; +import com.gemstone.gemfire.cache.AttributesMutator; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheClosedException; import com.gemstone.gemfire.cache.CacheListener; @@ -64,6 +66,7 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple private Scope scope; private DataPolicy dataPolicy; private Region region; + private List> subRegions; @Override @@ -73,7 +76,6 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple postProcess(region); } - @Override protected Region lookupFallback(GemFireCache cache, String regionName) throws Exception { Assert.isTrue(cache instanceof Cache, "Unable to create regions from " + cache); @@ -85,6 +87,7 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple final RegionFactory regionFactory = (attributes != null ? c.createRegionFactory(attributes) : c. createRegionFactory()); + if (!ObjectUtils.isEmpty(cacheListeners)) { for (CacheListener listener : cacheListeners) { @@ -110,12 +113,16 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple // get underlying AttributesFactory postProcess(findAttrFactory(regionFactory)); - + Region reg = regionFactory.create(regionName); log.info("Created new cache region [" + regionName + "]"); if (snapshot != null) { reg.loadSnapshot(snapshot.getInputStream()); } + + if (subRegions != null) { + System.out.println("**********************************************" + subRegions.get(0)); + } return reg; } @@ -225,6 +232,12 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple this.cacheListeners = cacheListeners; } + public void setSubRegions(List> subRegions) { + log.info("setting subRegions"); + this.subRegions = subRegions; + } + + /** * Sets the cache loader used for the region used by this factory. * Used only when a new region is created.Overrides the settings diff --git a/src/main/java/org/springframework/data/gemfire/SubRegion.java b/src/main/java/org/springframework/data/gemfire/SubRegion.java new file mode 100644 index 00000000..dbb1b68b --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/SubRegion.java @@ -0,0 +1,37 @@ +package org.springframework.data.gemfire; + +import java.util.List; + +import com.gemstone.gemfire.cache.RegionAttributes; +/** + * + * @author David Turanski + * + * @param + * @param + */ +public class SubRegion { + private final RegionAttributes regionAttributes; + private final String regionName; + private List> subRegions; + + public SubRegion(String regionName, RegionAttributes regionAttributes) { + this.regionAttributes = regionAttributes; + this.regionName = regionName; + } + + public RegionAttributes getRegionAttributes() { + return regionAttributes; + } + + public String getRegionName() { + return regionName; + } + + public List> getSubRegions() { + return subRegions; + } + public void setSubRegions(List> subRegions) { + this.subRegions = subRegions; + } +} diff --git a/src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java new file mode 100644 index 00000000..5c1104dc --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java @@ -0,0 +1,47 @@ +package org.springframework.data.gemfire; + +import java.util.List; + +import org.springframework.beans.factory.BeanNameAware; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; + +import com.gemstone.gemfire.cache.AttributesFactory; + +public class SubRegionFactoryBean extends AttributesFactory implements FactoryBean>, InitializingBean { + private String name; + private SubRegion subRegion; + private String regionName; + private List> subRegions; + + + public void setName(String name) { + this.name = name; + } + + public void setSubRegions(List> subRegions) { + this.subRegions = subRegions; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.subRegion = new SubRegion(name,create()); + this.subRegion.setSubRegions(this.subRegions); + } + + @Override + public SubRegion getObject() throws Exception { + return this.subRegion; + } + + @Override + public Class getObjectType() { + return SubRegion.class; + } + + @Override + public boolean isSingleton() { + return true; + } + +} diff --git a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java index 1184a87c..2ef4259c 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java @@ -21,6 +21,8 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.gemfire.RegionFactoryBean; +import org.springframework.data.gemfire.SubRegionFactoryBean; import org.w3c.dom.Element; /** @@ -32,10 +34,20 @@ import org.w3c.dom.Element; */ abstract class AliasReplacingBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { + protected Class getBeanClass(Element element) { + if (element.hasAttribute("subregion")){ + System.out.println("building subregion " + element.getAttribute(NAME_ATTRIBUTE)); + return SubRegionFactoryBean.class; + } else { + return RegionFactoryBean.class; + } + } + @Override protected final void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + ParsingUtils.addBeanAliasAsMetadata(element, builder); - + doParseInternal(element, parserContext, builder); } 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 13df6b7e..d1e85e3d 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java @@ -18,10 +18,15 @@ package org.springframework.data.gemfire.config; import java.util.List; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.RegionAttributesFactoryBean; -import org.springframework.data.gemfire.RegionFactoryBean; +import org.springframework.data.gemfire.SubRegion; +import org.springframework.data.gemfire.SubRegionFactoryBean; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; @@ -36,14 +41,15 @@ import com.gemstone.gemfire.cache.Scope; */ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { - protected Class getBeanClass(Element element) { - return RegionFactoryBean.class; - } @Override protected void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { super.doParse(element, builder); + System.out.println("building class " + + builder.getBeanDefinition().getBeanClassName()); + boolean subRegion = element.hasAttribute("subregion"); + // set the data policy String attr = element.getAttribute("persistent"); if (Boolean.parseBoolean(attr)) { @@ -57,12 +63,15 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { ParsingUtils.setPropertyValue(element, builder, "name", "name"); - attr = element.getAttribute("cache-ref"); - // add cache reference (fallback to default if nothing is specified) - builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); - + BeanDefinitionBuilder attrBuilder = builder; + + if (!subRegion){ + attr = element.getAttribute("cache-ref"); + // add cache reference (fallback to default if nothing is specified) + builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); + attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class); + } // add attributes - BeanDefinitionBuilder attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class); ParsingUtils.parseStatistics(element, attrBuilder); @@ -79,7 +88,10 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { List subElements = DomUtils.getChildElements(element); - // parse nested cache-listener elements + ManagedList subRegions = new ManagedList(); + subRegions.setElementTypeName(SubRegionFactoryBean.class.getName()); + + // parse nested elements for (Element subElement : subElements) { String name = subElement.getLocalName(); @@ -94,6 +106,22 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { else if ("cache-writer".equals(name)) { builder.addPropertyValue("cacheWriter", parseCacheWriter(parserContext, subElement, builder)); } + //subregion + else if (name.endsWith("region")){ + System.out.println("element type:" + subElement.getSchemaTypeInfo().getTypeName()); + String parentRegionName = StringUtils.hasLength(element.getAttribute(NAME_ATTRIBUTE))? element.getAttribute(NAME_ATTRIBUTE): + element.getAttribute(ID_ATTRIBUTE); + + + + BeanDefinition subRegionDef = this.parseSubRegion(subElement, parserContext, parentRegionName,builder.getBeanDefinition()); + subRegions.add(subRegionDef); + System.out.println("parsed subregion " + subRegionDef); + } + } + + if (!CollectionUtils.isEmpty(subRegions)) { + builder.addPropertyValue("subRegions", subRegions); } } @@ -108,4 +136,11 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { private Object parseCacheWriter(ParserContext parserContext, Element subElement, BeanDefinitionBuilder builder) { return ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, subElement, builder); } + + private BeanDefinition parseSubRegion(Element element, ParserContext parserContext, String parentRegionName, + BeanDefinition parentDefinition) { + element.setAttribute("subregion", "true"); + BeanDefinition beanDefinition = parserContext.getDelegate().parseCustomElement(element, parentDefinition); + return beanDefinition; + } } \ No newline at end of file diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd index 60797d8d..a7f4fd02 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd @@ -1,27 +1,16 @@ - - - - - - - - + + + + + + - - - - + + + namespace and its 'prop ]]> - + - + - + - + - + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - + - + - + - - - - + + - + @@ -197,22 +242,16 @@ The name of the bean referred by this declaration. If no reference exists, use a - + - + - - - - - + - - - - - - - - - + + + @@ -252,13 +283,13 @@ other thread for accessing the region and not waiting for it to complete its tas - - - + + - + @@ -276,7 +307,7 @@ use inner bean declarations. Disk storage configuration for the defined region. ]]> - + @@ -329,12 +360,20 @@ Default is false, meaning statistics are disabled. - - + + - + + + + + + + + + - + - + - - + - + - + - + - - + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> - + - - - - - - - + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - + ]]> + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + @@ -619,7 +717,7 @@ When the region or cached object expires, it is destroyed locally only. Not supp - + @@ -629,7 +727,7 @@ Entity computing sizes for objects stored into the grid. ]]> - + @@ -671,7 +769,7 @@ performed. - + @@ -693,7 +791,6 @@ reclaim memory. - @@ -721,44 +818,22 @@ The maximum size (in megabytes) of data stored in each directory. Default is 102 - + ]]> - + - + ]]> - - + ]]> @@ -766,8 +841,7 @@ amount of file space will be immediately reserved. - + ]]> @@ -776,12 +850,20 @@ It is considered only for asynchronous writing. The maximum number of operations that can be asynchronously queued. Once this many pending async operations have been queued async ops will begin blocking until some of the queued ops have been flushed to disk. Considered only for asynchronous writing. - ]]> - + ]]> + - + - + @@ -811,13 +893,13 @@ to any key in this region in the CacheServer to be pushed to the client. - - - + + - + @@ -865,7 +947,7 @@ The action to take when performing eviction. - + @@ -887,7 +969,7 @@ cache to differ from other caches. - + - + @@ -935,19 +1017,19 @@ The port number of the connection (between 1 and 65535 inclusive). - + - + - + - + - + - + - + - + @@ -1000,37 +1082,36 @@ Note that in order to instantiate a pool, a GemFire cache needs to be already st The name of the pool definition (by default "gemfire-pool").]]> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - + - - + @@ -1052,8 +1133,8 @@ The client subscription configuration that is used to control a clients use of s - - + + @@ -1062,146 +1143,145 @@ The client subscription configuration that is used to control a clients use of s - - - + + + - - - - - - - - - - + + + + + + + + + + - + - + - - - - + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - + + - + - + @@ -1228,30 +1308,29 @@ The name of the bean index definition. If property 'name' is not set, it will be - + - - - - + + + + - - + - + - - + @@ -1275,7 +1353,7 @@ The name of the pool used by the index. Used usually in client scenarios. - + @@ -1284,17 +1362,18 @@ The name of the pool used by the index. Used usually in client scenarios. - + - The reference to a GemfireTemplate. Will default to 'gemfireTemplate'. - + The reference to a GemfireTemplate. + Will default to 'gemfireTemplate'. + - + @@ -1305,5 +1384,42 @@ The name of the pool used by the index. Used usually in client scenarios. - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java b/src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java new file mode 100644 index 00000000..0e387e00 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java @@ -0,0 +1,13 @@ +package org.springframework.data.gemfire; + +import org.junit.Test; + +public class SubRegionFactoryBeanTest { + @Test + public void test() throws Exception { + SubRegionFactoryBean srfb = new SubRegionFactoryBean(); + srfb.setName("child"); + srfb.afterPropertiesSet(); + SubRegion sr = srfb.getObject(); + } +} diff --git a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java index 56eaf569..a943bfc0 100644 --- a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java @@ -18,15 +18,18 @@ package org.springframework.data.gemfire.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.gemfire.RegionFactoryBean; import org.springframework.data.gemfire.RegionLookupFactoryBean; +import org.springframework.data.gemfire.SubRegion; import org.springframework.data.gemfire.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -87,4 +90,10 @@ public class ReplicatedRegionNamespaceTest { assertEquals("existing", TestUtils.readField("name", lfb)); assertEquals(existing, context.getBean("lookup")); } + + @Test + public void testNestedRegions() { + Object parent = context.getBean("parent"); + //SubRegion child = context.getBean("/parent/child", SubRegion.class); + } } \ No newline at end of file diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 5b8659e2..61dc0074 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -6,6 +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.repository=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/replicated-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml index 3fe3436a..a2c3dfa6 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml @@ -28,4 +28,8 @@ + + + + \ No newline at end of file From b740727b9b8042c423163d0a591f83d6b538c0f9 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Fri, 8 Jun 2012 10:19:09 -0400 Subject: [PATCH 02/17] added subregion support --- .../data/gemfire/SubRegion.java | 37 - .../data/gemfire/SubRegionFactoryBean.java | 110 +- .../gemfire/config/AbstractRegionParser.java | 116 + .../gemfire/config/LookupRegionParser.java | 36 +- .../config/PartitionedRegionParser.java | 46 +- .../config/ReplicatedRegionParser.java | 56 +- .../gemfire/config/spring-gemfire-1.2.xsd | 2382 +++++++++-------- .../gemfire/SubRegionFactoryBeanTest.java | 13 - .../data/gemfire/SubRegionTest.java | 78 + .../config/ReplicatedRegionNamespaceTest.java | 11 +- .../config/SubRegionNamespaceTest.java | 114 + src/test/resources/log4j.properties | 4 +- .../data/gemfire/basic-subregion.xml | 18 + .../data/gemfire/config/subregion-ns.xml | 50 + 14 files changed, 1834 insertions(+), 1237 deletions(-) delete mode 100644 src/main/java/org/springframework/data/gemfire/SubRegion.java create mode 100644 src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java delete mode 100644 src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java create mode 100644 src/test/java/org/springframework/data/gemfire/SubRegionTest.java create mode 100644 src/test/java/org/springframework/data/gemfire/config/SubRegionNamespaceTest.java create mode 100644 src/test/resources/org/springframework/data/gemfire/basic-subregion.xml create mode 100644 src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml diff --git a/src/main/java/org/springframework/data/gemfire/SubRegion.java b/src/main/java/org/springframework/data/gemfire/SubRegion.java deleted file mode 100644 index dbb1b68b..00000000 --- a/src/main/java/org/springframework/data/gemfire/SubRegion.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.springframework.data.gemfire; - -import java.util.List; - -import com.gemstone.gemfire.cache.RegionAttributes; -/** - * - * @author David Turanski - * - * @param - * @param - */ -public class SubRegion { - private final RegionAttributes regionAttributes; - private final String regionName; - private List> subRegions; - - public SubRegion(String regionName, RegionAttributes regionAttributes) { - this.regionAttributes = regionAttributes; - this.regionName = regionName; - } - - public RegionAttributes getRegionAttributes() { - return regionAttributes; - } - - public String getRegionName() { - return regionName; - } - - public List> getSubRegions() { - return subRegions; - } - public void setSubRegions(List> subRegions) { - this.subRegions = subRegions; - } -} diff --git a/src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java index 5c1104dc..dd033209 100644 --- a/src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/SubRegionFactoryBean.java @@ -1,42 +1,79 @@ +/* + * Copyright 2010-2012 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; -import java.util.List; - -import org.springframework.beans.factory.BeanNameAware; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; import com.gemstone.gemfire.cache.AttributesFactory; +import com.gemstone.gemfire.cache.Region; -public class SubRegionFactoryBean extends AttributesFactory implements FactoryBean>, InitializingBean { +@SuppressWarnings("deprecation") +/** + * FactoryBean for creating a Gemfire Region as a subregion + * @author David Turanski + * + * @param - Region Key Type + * @param - Region Value Type + */ +public class SubRegionFactoryBean extends AttributesFactory implements FactoryBean>, + InitializingBean { + + protected final Log log = LogFactory.getLog(getClass()); + + @SuppressWarnings("unused") private String name; - private SubRegion subRegion; + private String regionName; - private List> subRegions; - - public void setName(String name) { - this.name = name; - } + private Region subRegion; - public void setSubRegions(List> subRegions) { - this.subRegions = subRegions; + private Region parent; + + private boolean lookupOnly; + + @Override + public void afterPropertiesSet() throws Exception { + Assert.notNull(parent, "parent region must not be null"); + + this.subRegion = parent.getSubregion(regionName); + if (this.subRegion == null) { + if (lookupOnly) { + throw new BeanInitializationException("Cannot find region [" + regionName + "] in cache " + + parent.getRegionService()); + } + else { + log.debug("creating subregion of [" + parent.getFullPath() + "] with name " + regionName); + this.subRegion = this.parent.createSubregion(regionName, create()); + } + } } @Override - public void afterPropertiesSet() throws Exception { - this.subRegion = new SubRegion(name,create()); - this.subRegion.setSubRegions(this.subRegions); - } - - @Override - public SubRegion getObject() throws Exception { + public Region getObject() throws Exception { return this.subRegion; } @Override public Class getObjectType() { - return SubRegion.class; + return Region.class; } @Override @@ -44,4 +81,37 @@ public class SubRegionFactoryBean extends AttributesFactory implements return true; } + /** + * Set the bean name - the same as the subregion full path + * @param name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Set the simple name of the region + * @param regionName + */ + public void setRegionName(String regionName) { + this.regionName = regionName; + } + + /** + * Set the parent Region + * @param parent + */ + public void setParent(Region parent) { + this.parent = parent; + } + + /** + * Set to true if the subregion should already exist, e.g., specified by + * <lookup-region> + * @param lookupOnly + */ + public void setLookupOnly(boolean lookupOnly) { + this.lookupOnly = lookupOnly; + } + } diff --git a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java new file mode 100644 index 00000000..55930f14 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -0,0 +1,116 @@ +/* + * Copyright 2012 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.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.gemfire.RegionFactoryBean; +import org.springframework.data.gemfire.SubRegionFactoryBean; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +/** + * Base class for all Region Parsers + * + * @author David Turanski + */ +abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { + protected final Log log = LogFactory.getLog(getClass()); + + protected Class getBeanClass(Element element) { + if (element.hasAttribute("subregion")) { + return SubRegionFactoryBean.class; + } + else { + return RegionFactoryBean.class; + } + } + + @Override + protected void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder){ + super.doParse(element, builder); + boolean subRegion = element.hasAttribute("subregion"); + + doParseRegion(element, parserContext, builder, subRegion); + + if (subRegion) { + builder.addPropertyValue("parent", parserContext.getContainingBeanDefinition().getAttribute("parent")); + builder.addPropertyValue("regionName", element.getAttribute(NAME_ATTRIBUTE)); + } + } + + protected abstract void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, + boolean subRegion); + + protected void doParseSubRegion(Element element, Element subElement, ParserContext parserContext, + BeanDefinitionBuilder builder, boolean subRegion) { + + String regionPath = null; + String parentBeanName = null; + if (subRegion) { + parentBeanName = parserContext.getContainingBeanDefinition().getAttribute("regionPath").toString(); + } + else { + parentBeanName = getRegionNameFromElement(element); + } + regionPath = StringUtils + .arrayToDelimitedString( + new String[] { parentBeanName, getRegionNameFromElement(subElement) }, "/"); + if (!regionPath.startsWith("/")) { + regionPath = "/" + regionPath; + } + + /* + * The Region parser needs some context to handle recursion correctly + */ + builder.getBeanDefinition().setAttribute("parent", + new BeanDefinitionHolder(builder.getBeanDefinition(), parentBeanName)); + builder.getBeanDefinition().setAttribute("regionPath",regionPath); + + // Make recursive call + BeanDefinition subRegionDef = this.parseSubRegion(subElement, parserContext, builder); + //TODO: Is there a better work-around? + /* + * This setting prevents the BF from generating a name for this been + */ + subRegionDef.setScope(BeanDefinition.SCOPE_PROTOTYPE); + + if (log.isDebugEnabled()) { + log.debug("registering subregion as " + regionPath); + } + this.registerBeanDefinition(new BeanDefinitionHolder(subRegionDef, regionPath), parserContext.getRegistry()); + } + + private BeanDefinition parseSubRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + /* + * Easy way to mark this element as a subregion + */ + element.setAttribute("subregion", "true"); + BeanDefinition beanDefinition = parserContext.getDelegate().parseCustomElement(element, + builder.getBeanDefinition()); + return beanDefinition; + } + + private String getRegionNameFromElement(Element element){ + String name = element.getAttribute(NAME_ATTRIBUTE); + return StringUtils.hasText(name)? name: element.getAttribute(ID_ATTRIBUTE); + } +} \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java index 8c4c925e..0c32d54b 100644 --- a/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java @@ -16,10 +16,14 @@ package org.springframework.data.gemfire.config; +import java.util.List; + import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.RegionLookupFactoryBean; +import org.springframework.data.gemfire.SubRegionFactoryBean; import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; /** @@ -27,21 +31,41 @@ import org.w3c.dom.Element; * * @author Costin Leau */ -class LookupRegionParser extends AliasReplacingBeanDefinitionParser { +class LookupRegionParser extends AbstractRegionParser { + @Override protected Class getBeanClass(Element element) { - return RegionLookupFactoryBean.class; + if (element.hasAttribute("subregion")) { + return SubRegionFactoryBean.class; + } + else { + return RegionLookupFactoryBean.class; + } } @Override - protected void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, + boolean subRegion) { super.doParse(element, builder); ParsingUtils.setPropertyValue(element, builder, "name", "name"); - String attr = element.getAttribute("cache-ref"); - // add cache reference (fallback to default if nothing is specified) - builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); + if (!subRegion) { + String attr = element.getAttribute("cache-ref"); + // add cache reference (fallback to default if nothing is specified) + builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); + } + else { + builder.addPropertyValue("lookupOnly", true); + } + // parse nested elements + List subElements = DomUtils.getChildElements(element); + for (Element subElement : subElements) { + String name = subElement.getLocalName(); + if (name.endsWith("region")) { + doParseSubRegion(element, subElement, parserContext, builder, subRegion); + } + } } } diff --git a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java index 5d046db3..aec50710 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java @@ -23,7 +23,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.PartitionAttributesFactoryBean; import org.springframework.data.gemfire.RegionAttributesFactoryBean; -import org.springframework.data.gemfire.RegionFactoryBean; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; @@ -35,18 +34,17 @@ import com.gemstone.gemfire.cache.Region; /** * Parser for <partitioned-region;gt; definitions. * - * To avoid eager evaluations, the region attributes are declared as a nested definition. + * To avoid eager evaluations, the region attributes are declared as a nested + * definition. * * @author Costin Leau + * @author David Turanski */ -class PartitionedRegionParser extends AliasReplacingBeanDefinitionParser { - - protected Class getBeanClass(Element element) { - return RegionFactoryBean.class; - } +class PartitionedRegionParser extends AbstractRegionParser { @Override - protected void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, + boolean subRegion) { super.doParse(element, builder); // set the data policy @@ -67,23 +65,24 @@ class PartitionedRegionParser extends AliasReplacingBeanDefinitionParser { builder.addPropertyValue("dataPolicy", DataPolicy.PARTITION); } + BeanDefinitionBuilder attrBuilder = builder; + + if (!subRegion) { + attr = element.getAttribute("cache-ref"); + // add cache reference (fallback to default if nothing is specified) + builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); + attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class); + } ParsingUtils.setPropertyValue(element, builder, "name", "name"); - attr = element.getAttribute("cache-ref"); - // add cache reference (fallback to default if nothing is specified) - builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); - - // region attributes - BeanDefinitionBuilder attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class); - ParsingUtils.parseStatistics(element, attrBuilder); ParsingUtils.parseExpiration(parserContext, element, attrBuilder); ParsingUtils.parseEviction(parserContext, element, attrBuilder); ParsingUtils.parseDiskStorage(element, attrBuilder); // partition attributes - BeanDefinitionBuilder parAttrBuilder = BeanDefinitionBuilder.genericBeanDefinition(PartitionAttributesFactoryBean.class); - + BeanDefinitionBuilder parAttrBuilder = BeanDefinitionBuilder + .genericBeanDefinition(PartitionAttributesFactoryBean.class); attr = element.getAttribute("colocated-with"); @@ -122,7 +121,6 @@ class PartitionedRegionParser extends AliasReplacingBeanDefinitionParser { parAttrBuilder.addPropertyValue("totalNumBuckets", Integer.valueOf(attr)); } - List subElements = DomUtils.getChildElements(element); // parse nested cache-listener elements @@ -142,15 +140,21 @@ class PartitionedRegionParser extends AliasReplacingBeanDefinitionParser { } else if ("partition-resolver".equals(name)) { - parAttrBuilder.addPropertyValue("partitionResolver", parsePartitionResolver(parserContext, subElement, - builder)); + parAttrBuilder.addPropertyValue("partitionResolver", + parsePartitionResolver(parserContext, subElement, builder)); + } + // subregion + else if (name.endsWith("region")) { + doParseSubRegion(element, subElement, parserContext, builder, subRegion); } } // add partition attributes attributes attrBuilder.addPropertyValue("partitionAttributes", parAttrBuilder.getBeanDefinition()); // add partition/overflow settings as attributes - builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); + if (!subRegion) { + builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); + } } private Object parseCacheListener(ParserContext parserContext, Element subElement, BeanDefinitionBuilder builder) { 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 d1e85e3d..830f85ea 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. @@ -18,15 +18,9 @@ package org.springframework.data.gemfire.config; import java.util.List; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.RegionAttributesFactoryBean; -import org.springframework.data.gemfire.SubRegion; -import org.springframework.data.gemfire.SubRegionFactoryBean; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; @@ -38,18 +32,13 @@ import com.gemstone.gemfire.cache.Scope; * Parser for <replicated-region;gt; definitions. * * @author Costin Leau + * @author David Turanski */ -class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { - - +class ReplicatedRegionParser extends AbstractRegionParser { @Override - protected void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - super.doParse(element, builder); - System.out.println("building class " + - builder.getBeanDefinition().getBeanClassName()); + protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, + boolean subRegion) { - boolean subRegion = element.hasAttribute("subregion"); - // set the data policy String attr = element.getAttribute("persistent"); if (Boolean.parseBoolean(attr)) { @@ -64,8 +53,8 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { ParsingUtils.setPropertyValue(element, builder, "name", "name"); BeanDefinitionBuilder attrBuilder = builder; - - if (!subRegion){ + + if (!subRegion) { attr = element.getAttribute("cache-ref"); // add cache reference (fallback to default if nothing is specified) builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); @@ -84,13 +73,12 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { ParsingUtils.parseEviction(parserContext, element, attrBuilder); ParsingUtils.parseDiskStorage(element, attrBuilder); - builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); + if (!subRegion) { + builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); + } List subElements = DomUtils.getChildElements(element); - ManagedList subRegions = new ManagedList(); - subRegions.setElementTypeName(SubRegionFactoryBean.class.getName()); - // parse nested elements for (Element subElement : subElements) { String name = subElement.getLocalName(); @@ -106,23 +94,11 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { else if ("cache-writer".equals(name)) { builder.addPropertyValue("cacheWriter", parseCacheWriter(parserContext, subElement, builder)); } - //subregion - else if (name.endsWith("region")){ - System.out.println("element type:" + subElement.getSchemaTypeInfo().getTypeName()); - String parentRegionName = StringUtils.hasLength(element.getAttribute(NAME_ATTRIBUTE))? element.getAttribute(NAME_ATTRIBUTE): - element.getAttribute(ID_ATTRIBUTE); - - - - BeanDefinition subRegionDef = this.parseSubRegion(subElement, parserContext, parentRegionName,builder.getBeanDefinition()); - subRegions.add(subRegionDef); - System.out.println("parsed subregion " + subRegionDef); + // subregion + else if (name.endsWith("region")) { + doParseSubRegion(element, subElement, parserContext, builder, subRegion); } } - - if (!CollectionUtils.isEmpty(subRegions)) { - builder.addPropertyValue("subRegions", subRegions); - } } private Object parseCacheListener(ParserContext parserContext, Element subElement, BeanDefinitionBuilder builder) { @@ -137,10 +113,4 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser { return ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, subElement, builder); } - private BeanDefinition parseSubRegion(Element element, ParserContext parserContext, String parentRegionName, - BeanDefinition parentDefinition) { - element.setAttribute("subregion", "true"); - BeanDefinition beanDefinition = parserContext.getDelegate().parseCustomElement(element, parentDefinition); - return beanDefinition; - } } \ No newline at end of file diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd index a7f4fd02..f301c186 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd @@ -1,75 +1,90 @@ - - - - - - - + + + + + + - - - - - - + + + + + - - - - - + + + + - - - - - + + + + namespace and its 'properties' element. ]]> - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - + + + + + + + + + - - - - - - + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + - - - - - - - + + + + + + - - - - - - + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + - - - - - + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - - + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The reference to a GemfireTemplate. Will default to 'gemfireTemplate'. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java b/src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java deleted file mode 100644 index 0e387e00..00000000 --- a/src/test/java/org/springframework/data/gemfire/SubRegionFactoryBeanTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.springframework.data.gemfire; - -import org.junit.Test; - -public class SubRegionFactoryBeanTest { - @Test - public void test() throws Exception { - SubRegionFactoryBean srfb = new SubRegionFactoryBean(); - srfb.setName("child"); - srfb.afterPropertiesSet(); - SubRegion sr = srfb.getObject(); - } -} diff --git a/src/test/java/org/springframework/data/gemfire/SubRegionTest.java b/src/test/java/org/springframework/data/gemfire/SubRegionTest.java new file mode 100644 index 00000000..86177257 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/SubRegionTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010-2012 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; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +import org.junit.Test; + +import com.gemstone.gemfire.cache.GemFireCache; +import com.gemstone.gemfire.cache.Region; + +/** + * + * @author David Turanski + * + */ +public class SubRegionTest extends RecreatingContextTest { + @Override + protected String location() { + return "org/springframework/data/gemfire/basic-subregion.xml"; + } + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test + public void testBasic() throws Exception { + CacheFactoryBean cfb = new CacheFactoryBean(); + cfb.setUseBeanFactoryLocator(false); + cfb.afterPropertiesSet(); + GemFireCache cache = cfb.getObject(); + RegionFactoryBean rfb = new RegionFactoryBean(); + rfb.setCache(cache); + rfb.setName("parent"); + rfb.afterPropertiesSet(); + Region parent = rfb.getObject(); + + SubRegionFactoryBean srfb = new SubRegionFactoryBean(); + srfb.setParent(parent); + srfb.setName("/parent/child"); + srfb.setRegionName("child"); + srfb.afterPropertiesSet(); + Region child = srfb.getObject(); + + assertNotNull(parent.getSubregion("child")); + assertSame(child,parent.getSubregion("child")); + + cache.close(); + } + @SuppressWarnings("rawtypes") + @Test + public void testContext() throws Exception { + Region parent = ctx.getBean("parent", Region.class); + Region child = ctx.getBean("/parent/child", Region.class); + assertNotNull(parent.getSubregion("child")); + assertSame(child,parent.getSubregion("child")); + assertEquals("/parent/child",child.getFullPath()); + } + + @SuppressWarnings("rawtypes") + @Test + public void testChildOnly() throws Exception { + Region child = ctx.getBean("/parent/child", Region.class); + assertEquals("/parent/child",child.getFullPath()); + } +} diff --git a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java index a943bfc0..415dc7ea 100644 --- a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. @@ -18,18 +18,15 @@ package org.springframework.data.gemfire.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.gemfire.RegionFactoryBean; import org.springframework.data.gemfire.RegionLookupFactoryBean; -import org.springframework.data.gemfire.SubRegion; import org.springframework.data.gemfire.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -90,10 +87,4 @@ public class ReplicatedRegionNamespaceTest { assertEquals("existing", TestUtils.readField("name", lfb)); assertEquals(existing, context.getBean("lookup")); } - - @Test - public void testNestedRegions() { - Object parent = context.getBean("parent"); - //SubRegion child = context.getBean("/parent/child", SubRegion.class); - } } \ No newline at end of file diff --git a/src/test/java/org/springframework/data/gemfire/config/SubRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/SubRegionNamespaceTest.java new file mode 100644 index 00000000..dc7b8c67 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/SubRegionNamespaceTest.java @@ -0,0 +1,114 @@ +/* + * Copyright 2010-2012 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +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.SubRegionFactoryBean; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.gemstone.gemfire.cache.AttributesFactory; +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.CacheLoader; +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.RegionAttributes; + +/** + * @author David Turanski + */ +@SuppressWarnings("deprecation") +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("subregion-ns.xml") +public class SubRegionNamespaceTest { + + @Autowired + private ApplicationContext context; + + + + @SuppressWarnings("rawtypes") + @Test + public void testNestedReplicatedRegions() { + Region parent = context.getBean("parent",Region.class); + Region child = context.getBean("/parent/child", Region.class); + Region grandchild = context.getBean("/parent/child/grandchild", Region.class); + assertNotNull(child); + assertEquals("/parent/child",child.getFullPath()); + assertSame(child,parent.getSubregion("child")); + + assertEquals("/parent/child/grandchild",grandchild.getFullPath()); + assertSame(grandchild,child.getSubregion("grandchild")); + + } + + @SuppressWarnings({ "unused", "rawtypes", "unchecked" }) + @Test + public void testMixedNestedRegions() { + Cache cache = context.getBean(Cache.class); + + Region parent = context.getBean("replicatedParent",Region.class); + parent.createSubregion("lookupChild",new AttributesFactory().create()); + + Region child = context.getBean("/replicatedParent/lookupChild", Region.class); + Region grandchild = context.getBean("/replicatedParent/lookupChild/partitionedGrandchild", Region.class); + assertNotNull(child); + assertEquals("/replicatedParent/lookupChild",child.getFullPath()); + assertSame(child,parent.getSubregion("lookupChild")); + + assertEquals("/replicatedParent/lookupChild/partitionedGrandchild",grandchild.getFullPath()); + assertSame(grandchild,child.getSubregion("partitionedGrandchild")); + + } + + @SuppressWarnings("rawtypes") + @Test + public void testNestedRegionsWithSiblings() { + Region parent = context.getBean("parentWithSiblings",Region.class); + Region child1 = context.getBean("/parentWithSiblings/child1",Region.class); + assertEquals("/parentWithSiblings/child1",child1.getFullPath()); + Region child2 = context.getBean("/parentWithSiblings/child2",Region.class); + assertEquals("/parentWithSiblings/child2",child2.getFullPath()); + assertSame(child1,parent.getSubregion("child1")); + assertSame(child2,parent.getSubregion("child2")); + + Region grandchild1 = context.getBean("/parentWithSiblings/child1/grandChild11",Region.class); + assertEquals("/parentWithSiblings/child1/grandChild11",grandchild1.getFullPath()); + } + + @SuppressWarnings({ "unused", "rawtypes" }) + @Test + public void testComplexNestedRegions() throws Exception { + Region parent = context.getBean("complexNested",Region.class); + Region child1 = context.getBean("/complexNested/child1",Region.class); + Region child2 = context.getBean("/complexNested/child2",Region.class); + Region grandchild1 = context.getBean("/complexNested/child1/grandChild11",Region.class); + + SubRegionFactoryBean grandchild1fb = context.getBean("&/complexNested/child1/grandChild11",SubRegionFactoryBean.class); + assertNotNull(grandchild1fb); + RegionAttributes attr = grandchild1fb.create(); + assertNotNull(attr); + CacheLoader cl = attr.getCacheLoader(); + assertNotNull(cl); + } +} \ No newline at end of file diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 61dc0074..bdaf64ef 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -5,8 +5,8 @@ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n log4j.category.org.springframework.data.gemfire.listener=TRACE -log4j.category.org.springframework.data.gemfire.repository=DEBUG -#log4j.category.org.springframework=DEBUG +log4j.category.org.springframework.data.gemfire=DEBUG +log4j.category.org.springframework.beans.=DEBUG # for debugging datasource initialization # log4j.category.test.jdbc=DEBUG diff --git a/src/test/resources/org/springframework/data/gemfire/basic-subregion.xml b/src/test/resources/org/springframework/data/gemfire/basic-subregion.xml new file mode 100644 index 00000000..ad750a24 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/basic-subregion.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml new file mode 100644 index 00000000..d8cf4560 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ff117b7b7b1d21dbf34df52d11ca37d3a6aef771 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Fri, 8 Jun 2012 17:05:49 -0400 Subject: [PATCH 03/17] modified schema to make name attribute optional for root regions and required for subregions --- .../gemfire/config/spring-gemfire-1.2.xsd | 144 +++++++++++++----- .../data/gemfire/config/replicated-ns.xml | 4 - 2 files changed, 110 insertions(+), 38 deletions(-) diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd index f301c186..1a2fe21d 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd @@ -275,7 +275,7 @@ The name of the bean referred by this declaration. If no reference exists, use a - + - + + + + + + + + + + + + + + @@ -301,18 +315,12 @@ Defines a lookup Subregion - - - - - + - @@ -426,15 +434,29 @@ Default is false, meaning statistics are disabled. - + - - + + - + + + + + + + + + + + + + + @@ -509,28 +531,45 @@ Time to idle (or idle timeout) configuration for the region entries. Default: no - + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + @@ -557,11 +596,18 @@ The name of the bean defining the GemFire cache (by default 'gemfire-cache'). ]]> + + + + + - + - + @@ -609,17 +655,31 @@ The action to take when performing eviction. - - + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + diff --git a/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml index a2c3dfa6..3fe3436a 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml @@ -28,8 +28,4 @@ - - - - \ No newline at end of file From a2f842688448443b5ad42727d3afc8757031eab7 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Tue, 19 Jun 2012 10:23:56 -0400 Subject: [PATCH 04/17] Added missing cache attributes --- .../data/gemfire/CacheFactoryBean.java | 148 +++++++++++++++--- .../data/gemfire/config/CacheParser.java | 5 + 2 files changed, 128 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java index 478d5d1b..d44e138c 100644 --- a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java @@ -41,21 +41,26 @@ import com.gemstone.gemfire.cache.CacheFactory; import com.gemstone.gemfire.cache.GemFireCache; import com.gemstone.gemfire.distributed.DistributedMember; import com.gemstone.gemfire.distributed.DistributedSystem; +import com.gemstone.gemfire.internal.cache.GemFireCacheImpl; import com.gemstone.gemfire.pdx.PdxSerializable; import com.gemstone.gemfire.pdx.PdxSerializer; /** - * Factory used for configuring a Gemfire Cache manager. Allows either retrieval of an existing, opened cache - * or the creation of a new one. - - *

This class implements the {@link org.springframework.dao.support.PersistenceExceptionTranslator} + * Factory used for configuring a Gemfire Cache manager. Allows either retrieval + * of an existing, opened cache or the creation of a new one. + * + *

+ * This class implements the + * {@link org.springframework.dao.support.PersistenceExceptionTranslator} * interface, as auto-detected by Spring's - * {@link org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor}, - * for AOP-based translation of native exceptions to Spring DataAccessExceptions. - * Hence, the presence of this class automatically enables - * a PersistenceExceptionTranslationPostProcessor to translate GemFire exceptions. + * {@link org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor} + * , for AOP-based translation of native exceptions to Spring + * DataAccessExceptions. Hence, the presence of this class automatically enables + * a PersistenceExceptionTranslationPostProcessor to translate GemFire + * exceptions. * * @author Costin Leau + * @author David Turanski */ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware, DisposableBean, InitializingBean, FactoryBean, PersistenceExceptionTranslator { @@ -67,12 +72,13 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl */ private class PdxOptions implements Runnable { - private CacheFactory factory; + private final CacheFactory factory; PdxOptions(CacheFactory factory) { this.factory = factory; } + @Override public void run() { if (pdxSerializer != null) { Assert.isAssignable(PdxSerializer.class, pdxSerializer.getClass(), "Invalid pdx serializer used"); @@ -93,24 +99,70 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } } + private class InternalCacheOptions implements Runnable { + private final GemFireCacheImpl cacheImpl; + + InternalCacheOptions(GemFireCache cache) { + this.cacheImpl = (GemFireCacheImpl) cache; + } + + @Override + public void run() { + if (lockLease != null) { + cacheImpl.setLockLease(lockLease); + } + if (lockTimeout != null) { + cacheImpl.setLockTimeout(lockTimeout); + } + if (searchTimeout != null) { + cacheImpl.setSearchTimeout(searchTimeout); + } + if (messageSyncInterval != null) { + cacheImpl.setMessageSyncInterval(messageSyncInterval); + } + } + } + protected final Log log = LogFactory.getLog(getClass()); private GemFireCache cache; + private Resource cacheXml; + private Properties properties; + private ClassLoader beanClassLoader; + private GemfireBeanFactoryLocator factoryLocator; private BeanFactory beanFactory; + private String beanName; + private boolean useBeanFactoryLocator = true; + // PDX options protected Object pdxSerializer; + protected Boolean pdxPersistent; + protected Boolean pdxReadSerialized; + protected Boolean pdxIgnoreUnreadFields; + protected String pdxDiskStoreName; + protected Boolean copyOnRead; + + protected Integer lockTimeout; + + protected Integer lockLease; + + protected Integer messageSyncInterval; + + protected Integer searchTimeout; + + @Override public void afterPropertiesSet() throws Exception { // initialize locator if (useBeanFactoryLocator) { @@ -132,7 +184,8 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl try { cache = fetchCache(); msg = "Retrieved existing"; - } catch (CacheClosedException ex) { + } + catch (CacheClosedException ex) { Object factory = createFactory(cfgProps); // GemFire 6.6 specific options @@ -147,6 +200,11 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl cache = createCache(factory); msg = "Created"; } + if (this.copyOnRead != null) { + cache.setCopyOnRead(this.copyOnRead); + } + + applyInternalCacheOptions(); DistributedSystem system = cache.getDistributedSystem(); DistributedMember member = system.getDistributedMember(); @@ -163,15 +221,15 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl log.debug("Initialized cache from " + cacheXml); } - - } finally { + } + finally { th.setContextClassLoader(oldTCCL); } } /** - * Sets the PDX properties for the given object. Note this is implementation specific as it depends on the type - * of the factory passed in. + * Sets the PDX properties for the given object. Note this is implementation + * specific as it depends on the type of the factory passed in. * * @param factory */ @@ -181,6 +239,10 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } } + protected void applyInternalCacheOptions() { + new InternalCacheOptions(cache).run(); + } + protected Object createFactory(Properties props) { return new CacheFactory(props); } @@ -198,6 +260,7 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl return cfgProps; } + @Override public void destroy() throws Exception { if (cache != null && !cache.isClosed()) { cache.close(); @@ -211,6 +274,7 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } } + @Override public DataAccessException translateExceptionIfPossible(RuntimeException ex) { if (ex instanceof GemFireException) { return GemfireCacheUtils.convertGemfireAccessException((GemFireException) ex); @@ -226,26 +290,32 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl return null; } + @Override public GemFireCache getObject() throws Exception { return cache; } + @Override public Class getObjectType() { return (cache != null ? cache.getClass() : Cache.class); } + @Override public boolean isSingleton() { return true; } + @Override public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = classLoader; } + @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } + @Override public void setBeanName(String name) { this.beanName = name; } @@ -269,9 +339,11 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Indicates whether a bean factory locator is enabled (default) for this cache definition or not. The locator stores - * the enclosing bean factory reference to allow auto-wiring of Spring beans into GemFire managed classes. Usually disabled - * when the same cache is used in multiple application context/bean factories inside the same VM. + * Indicates whether a bean factory locator is enabled (default) for this + * cache definition or not. The locator stores the enclosing bean factory + * reference to allow auto-wiring of Spring beans into GemFire managed + * classes. Usually disabled when the same cache is used in multiple + * application context/bean factories inside the same VM. * * @param usage true if the bean factory locator is used underneath or not */ @@ -280,8 +352,9 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Sets the {@link PdxSerializable} for this cache. Applicable on GemFire 6.6 or higher. - * The argument is of type object for compatibility with GemFire 6.5. + * Sets the {@link PdxSerializable} for this cache. Applicable on GemFire + * 6.6 or higher. The argument is of type object for compatibility with + * GemFire 6.5. * * @param serializer pdx serializer configured for this cache. */ @@ -290,8 +363,9 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Sets the object preference to PdxInstance type. Applicable on GemFire 6.6 or higher. - * + * Sets the object preference to PdxInstance type. Applicable on GemFire 6.6 + * or higher. + * * @param pdxPersistent the pdxPersistent to set */ public void setPdxPersistent(Boolean pdxPersistent) { @@ -299,7 +373,8 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Controls whether the type metadata for PDX objects is persisted to disk. Applicable on GemFire 6.6 or higher. + * Controls whether the type metadata for PDX objects is persisted to disk. + * Applicable on GemFire 6.6 or higher. * * @param pdxReadSerialized the pdxReadSerialized to set */ @@ -308,7 +383,8 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Controls whether pdx ignores fields that were unread during deserialization. Applicable on GemFire 6.6 or higher. + * Controls whether pdx ignores fields that were unread during + * deserialization. Applicable on GemFire 6.6 or higher. * * @param pdxIgnoreUnreadFields the pdxIgnoreUnreadFields to set */ @@ -317,8 +393,9 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Set the disk store that is used for PDX meta data. Applicable on GemFire 6.6 or higher. - * + * Set the disk store that is used for PDX meta data. Applicable on GemFire + * 6.6 or higher. + * * @param pdxDiskStoreName the pdxDiskStoreName to set */ public void setPdxDiskStoreName(String pdxDiskStoreName) { @@ -331,4 +408,25 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl protected BeanFactory getBeanFactory() { return beanFactory; } + + public void setCopyOnRead(boolean copyOnRead) { + this.copyOnRead = copyOnRead; + } + + public void setLockTimeout(int lockTimeout) { + this.lockTimeout = lockTimeout; + } + + public void setLockLease(int lockLease) { + this.lockLease = lockLease; + } + + public void setMessageSyncInterval(int messageSyncInterval) { + this.messageSyncInterval = messageSyncInterval; + } + + public void setSearchTimeout(int searchTimeout) { + this.searchTimeout = searchTimeout; + } + } \ No newline at end of file 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 357306c7..1b22964d 100644 --- a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java @@ -50,6 +50,11 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { ParsingUtils.setPropertyValue(element, builder, "pdx-read-serialized", "pdxReadSerialized"); ParsingUtils.setPropertyValue(element, builder, "pdx-ignore-unread-fields", "pdxIgnoreUnreadFields"); ParsingUtils.setPropertyValue(element, builder, "use-bean-factory-locator", "useBeanFactoryLocator"); + ParsingUtils.setPropertyValue(element, builder, "copy-on-read", "copyOnRead"); + ParsingUtils.setPropertyValue(element, builder, "lock-timeout", "lockTimeout"); + ParsingUtils.setPropertyValue(element, builder, "lock-lease", "lockLease"); + ParsingUtils.setPropertyValue(element, builder, "message-sync-interval", "messageSyncInterval"); + ParsingUtils.setPropertyValue(element, builder, "search-timeout", "searchTimeout"); } @Override From 400fed166264ee8cb0aba7a90309973c91101c8d Mon Sep 17 00:00:00 2001 From: David Turanski Date: Mon, 25 Jun 2012 08:44:12 -0400 Subject: [PATCH 05/17] Refactored to use DiskStoreFactory --- .../data/gemfire/DiskStoreFactoryBean.java | 172 ++ .../data/gemfire/RegionFactoryBean.java | 112 +- .../gemfire/config/AbstractRegionParser.java | 49 +- .../AliasReplacingBeanDefinitionParser.java | 25 +- .../data/gemfire/config/DiskStoreParser.java | 68 + .../DiskWriteAttributesFactoryBean.java | 10 +- .../config/GemfireNamespaceHandler.java | 7 +- .../gemfire/config/LocalRegionParser.java | 116 + .../gemfire/config/LookupRegionParser.java | 5 +- .../data/gemfire/config/ParsingUtils.java | 86 +- .../config/PartitionedRegionParser.java | 2 +- .../config/ReplicatedRegionParser.java | 2 +- .../gemfire/config/spring-gemfire-1.2.xsd | 2716 ++++++++--------- .../config/DiskStoreNamespaceTest.java | 72 + .../config/LocalRegionNamespaceTest.java | 90 + .../data/gemfire/config/client-ns.xml | 4 +- .../data/gemfire/config/diskstore-ns-new.xml | 29 + .../data/gemfire/config/diskstore-ns.xml | 4 +- .../data/gemfire/config/local-ns.xml | 31 + .../data/gemfire/config/subregion-ns.xml | 2 +- 20 files changed, 2105 insertions(+), 1497 deletions(-) create mode 100644 src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java create mode 100644 src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java create mode 100644 src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java create mode 100644 src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java create mode 100644 src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java create mode 100644 src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml create mode 100644 src/test/resources/org/springframework/data/gemfire/config/local-ns.xml diff --git a/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java b/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java new file mode 100644 index 00000000..6684727b --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java @@ -0,0 +1,172 @@ +/* + * Copyright 2010-2011 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; + +import java.io.File; +import java.util.List; + +import org.springframework.beans.factory.BeanNameAware; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; + +import com.gemstone.gemfire.cache.DiskStore; +import com.gemstone.gemfire.cache.DiskStoreFactory; +import com.gemstone.gemfire.cache.GemFireCache; + +/** + * FactoryBean for creating a DiskStore + * @author David Turanski + */ +public class DiskStoreFactoryBean implements FactoryBean, InitializingBean, BeanNameAware { + + private DiskStoreFactory diskStoreFactory; + + private Boolean autoCompact; + + private Boolean allowForceCompaction; + + private Integer maxOplogSize; + + private Integer timeInterval; + + private Integer queueSize; + + private Integer compactionThreshold; + + private Integer writeBufferSize; + + private GemFireCache cache; + + private String name; + + private List diskDirs; + + @Override + public DiskStore getObject() throws Exception { + return diskStoreFactory.create(name == null ? DiskStoreFactory.DEFAULT_DISK_STORE_NAME : name); + } + + @Override + public Class getObjectType() { + return DiskStore.class; + } + + @Override + public boolean isSingleton() { + return true; + } + + @Override + public void afterPropertiesSet() throws Exception { + Assert.notNull(cache, "Cache property must be set"); + diskStoreFactory = cache.createDiskStoreFactory(); + + if (allowForceCompaction != null) { + diskStoreFactory.setAllowForceCompaction(allowForceCompaction); + } + if (compactionThreshold != null) { + diskStoreFactory.setCompactionThreshold(compactionThreshold); + } + if (autoCompact != null) { + diskStoreFactory.setAutoCompact(autoCompact); + } + if (queueSize != null) { + diskStoreFactory.setQueueSize(queueSize); + } + if (writeBufferSize != null) { + diskStoreFactory.setWriteBufferSize(writeBufferSize); + } + if (timeInterval != null) { + diskStoreFactory.setTimeInterval(timeInterval); + } + if (maxOplogSize != null) { + diskStoreFactory.setMaxOplogSize(maxOplogSize); + } + + if (!CollectionUtils.isEmpty(diskDirs)) { + File[] diskDirFiles = new File[diskDirs.size()]; + int[] diskDirSizes = new int[diskDirs.size()]; + for (int i = 0; i < diskDirs.size(); i++) { + DiskDir diskDir = diskDirs.get(i); + diskDirFiles[i] = new File(diskDir.location); + diskDirSizes[i] = diskDir.maxSize == null ? DiskStoreFactory.DEFAULT_DISK_DIR_SIZE : diskDir.maxSize; + } + diskStoreFactory.setDiskDirsAndSizes(diskDirFiles, diskDirSizes); + } + + } + + public void setCache(GemFireCache cache) { + this.cache = cache; + } + + public void setAutoCompact(Boolean autoCompact) { + this.autoCompact = autoCompact; + } + + public void setAllowForceCompaction(Boolean allowForceCompaction) { + this.allowForceCompaction = allowForceCompaction; + } + + public void setMaxOplogSize(Integer maxOplogSize) { + this.maxOplogSize = maxOplogSize; + } + + public void setTimeInterval(Integer timeInterval) { + this.timeInterval = timeInterval; + } + + public void setQueueSize(Integer queueSize) { + this.queueSize = queueSize; + } + + public void setCompactionThreshold(Integer compactionThreshold) { + this.compactionThreshold = compactionThreshold; + } + + public void setWriteBufferSize(Integer writeBufferSize) { + this.writeBufferSize = writeBufferSize; + } + + public void setDiskDirs(List diskDirs) { + this.diskDirs = diskDirs; + } + + @Override + public void setBeanName(String name) { + this.name = name; + } + + public static class DiskDir { + final String location; + + final Integer maxSize; + + public DiskDir(String location, int maxSize) { + this.location = location; + this.maxSize = maxSize; + } + + public DiskDir(String location) { + this.location = location; + this.maxSize = null; + } + } + +} diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java index f81c2909..51a4438b 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java @@ -29,7 +29,6 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; import com.gemstone.gemfire.cache.AttributesFactory; -import com.gemstone.gemfire.cache.AttributesMutator; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheClosedException; import com.gemstone.gemfire.cache.CacheListener; @@ -43,11 +42,14 @@ import com.gemstone.gemfire.cache.RegionFactory; import com.gemstone.gemfire.cache.Scope; /** - * FactoryBean for creating generic GemFire {@link Region}s. Will try to first locate the region (by name) - * and, in case none if found, proceed to creating one using the given settings. + * FactoryBean for creating generic GemFire {@link Region}s. Will try to first + * locate the region (by name) and, in case none if found, proceed to creating + * one using the given settings. * - * Note that this factory bean allows for very flexible creation of GemFire {@link Region}. For "client" regions - * however, see {@link ClientRegionFactoryBean} which offers easier configuration and defaults. + * Note that this factory bean allows for very flexible creation of GemFire + * {@link Region}. For "client" regions however, see + * {@link ClientRegionFactoryBean} which offers easier configuration and + * defaults. * * @author Costin Leau */ @@ -56,18 +58,26 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple protected final Log log = LogFactory.getLog(getClass()); private boolean destroy = false; + private boolean close = true; + private Resource snapshot; private CacheListener cacheListeners[]; - private CacheLoader cacheLoader; - private CacheWriter cacheWriter; - private RegionAttributes attributes; - private Scope scope; - private DataPolicy dataPolicy; - private Region region; - private List> subRegions; + private CacheLoader cacheLoader; + + private CacheWriter cacheWriter; + + private RegionAttributes attributes; + + private Scope scope; + + private DataPolicy dataPolicy; + + private Region region; + + private List> subRegions; @Override public void afterPropertiesSet() throws Exception { @@ -85,9 +95,8 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple if (attributes != null) AttributesFactory.validateAttributes(attributes); - final RegionFactory regionFactory = (attributes != null ? c.createRegionFactory(attributes) - : c. createRegionFactory()); - + final RegionFactory regionFactory = (attributes != null ? c.createRegionFactory(attributes) : c + . createRegionFactory()); if (!ObjectUtils.isEmpty(cacheListeners)) { for (CacheListener listener : cacheListeners) { @@ -113,13 +122,13 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple // get underlying AttributesFactory postProcess(findAttrFactory(regionFactory)); - + Region reg = regionFactory.create(regionName); log.info("Created new cache region [" + regionName + "]"); if (snapshot != null) { reg.loadSnapshot(snapshot.getInputStream()); } - + if (subRegions != null) { System.out.println("**********************************************" + subRegions.get(0)); } @@ -134,24 +143,24 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple return (AttributesFactory) ReflectionUtils.getField(attrField, regionFactory); } - /** - * Post-process the attribute factory object used for configuring the region of this factory bean during the initialization process. - * The object is already initialized and configured by the factory bean before this method + * Post-process the attribute factory object used for configuring the region + * of this factory bean during the initialization process. The object is + * already initialized and configured by the factory bean before this method * is invoked. * * @param attrFactory attribute factory - * @deprecated as of GemFire 6.5, the use of {@link AttributesFactory} has been deprecated + * @deprecated as of GemFire 6.5, the use of {@link AttributesFactory} has + * been deprecated */ @Deprecated protected void postProcess(AttributesFactory attrFactory) { } - /** - * Post-process the region object for this factory bean during the initialization process. - * The object is already initialized and configured by the factory bean before this method - * is invoked. + * Post-process the region object for this factory bean during the + * initialization process. The object is already initialized and configured + * by the factory bean before this method is invoked. * * @param region */ @@ -159,13 +168,15 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple // do nothing } + @Override public void destroy() throws Exception { if (region != null) { if (close) { if (!region.getCache().isClosed()) { try { region.close(); - } catch (CacheClosedException cce) { + } + catch (CacheClosedException cce) { // nothing to see folks, move on. } } @@ -178,9 +189,9 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple } /** - * Indicates whether the region referred by this factory bean, - * will be destroyed on shutdown (default false). - * Note: destroy and close are mutually exclusive. Enabling one will automatically disable the other. + * Indicates whether the region referred by this factory bean, will be + * destroyed on shutdown (default false). Note: destroy and close are + * mutually exclusive. Enabling one will automatically disable the other. * * @param destroy whether or not to destroy the region * @@ -195,9 +206,9 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple } /** - * Indicates whether the region referred by this factory bean, - * will be closed on shutdown (default true). - * Note: destroy and close are mutually exclusive. Enabling one will automatically disable the other. + * Indicates whether the region referred by this factory bean, will be + * closed on shutdown (default true). Note: destroy and close are mutually + * exclusive. Enabling one will automatically disable the other. * * @param close whether to close or not the region * @see #setDestroy(boolean) @@ -210,9 +221,9 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple } /** - * Sets the snapshots used for loading a newly created region. - * That is, the snapshot will be used only when a new region is created - if the region - * already exists, no loading will be performed. + * Sets the snapshots used for loading a newly created region. That + * is, the snapshot will be used only when a new region is created - + * if the region already exists, no loading will be performed. * * @see #setName(String) * @param snapshot the snapshot to set @@ -222,9 +233,9 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple } /** - * Sets the cache listeners used for the region used by this factory. - * Used only when a new region is created.Overrides the settings - * specified through {@link #setAttributes(RegionAttributes)}. + * Sets the cache listeners used for the region used by this factory. Used + * only when a new region is created.Overrides the settings specified + * through {@link #setAttributes(RegionAttributes)}. * * @param cacheListeners the cacheListeners to set on a newly created region */ @@ -237,11 +248,10 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple this.subRegions = subRegions; } - /** - * Sets the cache loader used for the region used by this factory. - * Used only when a new region is created.Overrides the settings - * specified through {@link #setAttributes(RegionAttributes)}. + * Sets the cache loader used for the region used by this factory. Used only + * when a new region is created.Overrides the settings specified through + * {@link #setAttributes(RegionAttributes)}. * * @param cacheLoader the cacheLoader to set on a newly created region */ @@ -250,9 +260,9 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple } /** - * Sets the cache writer used for the region used by this factory. - * Used only when a new region is created. Overrides the settings - * specified through {@link #setAttributes(RegionAttributes)}. + * Sets the cache writer used for the region used by this factory. Used only + * when a new region is created. Overrides the settings specified through + * {@link #setAttributes(RegionAttributes)}. * * @param cacheWriter the cacheWriter to set on a newly created region */ @@ -261,8 +271,8 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple } /** - * Sets the data policy. Used only when a new region is created. - * Overrides the settings specified through {@link #setAttributes(RegionAttributes)}. + * Sets the data policy. Used only when a new region is created. Overrides + * the settings specified through {@link #setAttributes(RegionAttributes)}. * * @param dataPolicy the region data policy */ @@ -271,8 +281,8 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple } /** - * Sets the region scope. Used only when a new region is created. - * Overrides the settings specified through {@link #setAttributes(RegionAttributes)}. + * Sets the region scope. Used only when a new region is created. Overrides + * the settings specified through {@link #setAttributes(RegionAttributes)}. * * @see Scope * @param scope the region scope @@ -283,8 +293,8 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple /** * Sets the region attributes used for the region used by this factory. - * Allows maximum control in specifying the region settings. - * Used only when a new region is created. + * Allows maximum control in specifying the region settings. Used only when + * a new region is created. * * @param attributes the attributes to set on a newly created region */ 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 55930f14..877edc85 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -22,8 +22,6 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.gemfire.RegionFactoryBean; -import org.springframework.data.gemfire.SubRegionFactoryBean; import org.springframework.util.StringUtils; import org.w3c.dom.Element; @@ -34,35 +32,26 @@ import org.w3c.dom.Element; */ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { protected final Log log = LogFactory.getLog(getClass()); - - protected Class getBeanClass(Element element) { - if (element.hasAttribute("subregion")) { - return SubRegionFactoryBean.class; - } - else { - return RegionFactoryBean.class; - } - } @Override - protected void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder){ + protected void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { super.doParse(element, builder); - boolean subRegion = element.hasAttribute("subregion"); - + boolean subRegion = isSubRegion(element); + doParseRegion(element, parserContext, builder, subRegion); - + if (subRegion) { - builder.addPropertyValue("parent", parserContext.getContainingBeanDefinition().getAttribute("parent")); + builder.addPropertyValue("parent", parserContext.getContainingBeanDefinition().getAttribute("parent")); builder.addPropertyValue("regionName", element.getAttribute(NAME_ATTRIBUTE)); } } - + protected abstract void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, boolean subRegion); protected void doParseSubRegion(Element element, Element subElement, ParserContext parserContext, BeanDefinitionBuilder builder, boolean subRegion) { - + String regionPath = null; String parentBeanName = null; if (subRegion) { @@ -71,28 +60,26 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { else { parentBeanName = getRegionNameFromElement(element); } - regionPath = StringUtils - .arrayToDelimitedString( - new String[] { parentBeanName, getRegionNameFromElement(subElement) }, "/"); + regionPath = StringUtils.arrayToDelimitedString(new String[] { parentBeanName, + getRegionNameFromElement(subElement) }, "/"); if (!regionPath.startsWith("/")) { regionPath = "/" + regionPath; } - /* - * The Region parser needs some context to handle recursion correctly + * The Region parser needs some context to handle recursion correctly */ builder.getBeanDefinition().setAttribute("parent", new BeanDefinitionHolder(builder.getBeanDefinition(), parentBeanName)); - builder.getBeanDefinition().setAttribute("regionPath",regionPath); + builder.getBeanDefinition().setAttribute("regionPath", regionPath); // Make recursive call BeanDefinition subRegionDef = this.parseSubRegion(subElement, parserContext, builder); - //TODO: Is there a better work-around? + // TODO: Is there a better work-around? /* * This setting prevents the BF from generating a name for this been */ subRegionDef.setScope(BeanDefinition.SCOPE_PROTOTYPE); - + if (log.isDebugEnabled()) { log.debug("registering subregion as " + regionPath); } @@ -100,17 +87,13 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { } private BeanDefinition parseSubRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - /* - * Easy way to mark this element as a subregion - */ - element.setAttribute("subregion", "true"); BeanDefinition beanDefinition = parserContext.getDelegate().parseCustomElement(element, builder.getBeanDefinition()); return beanDefinition; } - - private String getRegionNameFromElement(Element element){ + + private String getRegionNameFromElement(Element element) { String name = element.getAttribute(NAME_ATTRIBUTE); - return StringUtils.hasText(name)? name: element.getAttribute(ID_ATTRIBUTE); + return StringUtils.hasText(name) ? name : element.getAttribute(ID_ATTRIBUTE); } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java index 2ef4259c..e8d2f951 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java @@ -26,36 +26,43 @@ import org.springframework.data.gemfire.SubRegionFactoryBean; import org.w3c.dom.Element; /** - * Extension class dealing with the attribute clash (name) that triggers the region name to - * be considered a bean alias. Overrides the automatic alias detection and replaces it with its own - * using meta attributes (since the parsing method is final). + * Extension class dealing with the attribute clash (name) that triggers the + * region name to be considered a bean alias. Overrides the automatic alias + * detection and replaces it with its own using meta attributes (since the + * parsing method is final). * * @author Costin Leau */ abstract class AliasReplacingBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { + @Override protected Class getBeanClass(Element element) { - if (element.hasAttribute("subregion")){ - System.out.println("building subregion " + element.getAttribute(NAME_ATTRIBUTE)); + + if (isSubRegion(element)) { return SubRegionFactoryBean.class; - } else { + } + else { return RegionFactoryBean.class; } } @Override protected final void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - + ParsingUtils.addBeanAliasAsMetadata(element, builder); - + doParseInternal(element, parserContext, builder); } @Override protected void registerBeanDefinition(BeanDefinitionHolder definition, BeanDefinitionRegistry registry) { - // add the aliases from the metadata + // add the aliases from the metadata super.registerBeanDefinition(ParsingUtils.replaceBeanAliasAsMetadata(definition), registry); } + protected boolean isSubRegion(Element element) { + return element.getParentNode().getLocalName().endsWith("region"); + } + protected abstract void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder); } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java b/src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java new file mode 100644 index 00000000..7444b28d --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java @@ -0,0 +1,68 @@ +/* + * Copyright 2010-2012 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 java.util.List; + +import org.springframework.beans.factory.support.AbstractBeanDefinition; +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.DiskStoreFactoryBean; +import org.springframework.data.gemfire.DiskStoreFactoryBean.DiskDir; +import org.springframework.util.CollectionUtils; +import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Element; + +/** + * @author David Turanski + * + */ +public class DiskStoreParser extends AbstractSingleBeanDefinitionParser { + @Override + protected Class getBeanClass(Element element) { + return DiskStoreFactoryBean.class; + } + + @Override + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + super.doParse(element, parserContext, builder); + ParsingUtils.setPropertyReference(element, builder, "cache-ref", "cache"); + ParsingUtils.setPropertyValue(element, builder, "auto-compact"); + ParsingUtils.setPropertyValue(element, builder, "allow-force-compaction"); + ParsingUtils.setPropertyValue(element, builder, "max-oplog-size"); + ParsingUtils.setPropertyValue(element, builder, "time-interval"); + ParsingUtils.setPropertyValue(element, builder, "queue-size"); + ParsingUtils.setPropertyValue(element, builder, "compaction-threshold"); + ParsingUtils.setPropertyValue(element, builder, "write-buffer-size"); + + List diskDirElements = DomUtils.getChildElementsByTagName(element, "disk-dir"); + + if (!CollectionUtils.isEmpty(diskDirElements)) { + ManagedList diskDirs = new ManagedList(); + for (Element diskDirElement : diskDirElements) { + BeanDefinitionBuilder diskDirBuilder = BeanDefinitionBuilder.genericBeanDefinition(DiskDir.class); + diskDirBuilder.addConstructorArgValue(diskDirElement.getAttribute("location")); + if (diskDirElement.hasAttribute("max-size")) { + diskDirBuilder.addConstructorArgValue(diskDirElement.getAttribute("max-size")); + } + diskDirs.add(diskDirBuilder.getBeanDefinition()); + } + builder.addPropertyValue("diskDirs", diskDirs); + } + } +} diff --git a/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java index 32ada080..493dc356 100644 --- a/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java @@ -23,27 +23,35 @@ import com.gemstone.gemfire.cache.DiskWriteAttributes; import com.gemstone.gemfire.cache.DiskWriteAttributesFactory; /** - * Simple utility class used for defining nested factory-method like definitions w/o polluting the container with useless beans. + * Simple utility class used for defining nested factory-method like definitions + * w/o polluting the container with useless beans. * * @author Costin Leau + * @deprecated */ +@Deprecated class DiskWriteAttributesFactoryBean implements FactoryBean, InitializingBean { private DiskWriteAttributes attributes; + private DiskWriteAttributesFactory attrFactory; + @Override public void afterPropertiesSet() { attributes = attrFactory.create(); } + @Override public DiskWriteAttributes getObject() throws Exception { return attributes; } + @Override public Class getObjectType() { return (attributes != null ? attributes.getClass() : DiskWriteAttributes.class); } + @Override public boolean isSingleton() { return true; } diff --git a/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java b/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java index 68f52bfa..ca69e83a 100644 --- a/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java +++ b/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java @@ -23,9 +23,11 @@ import org.springframework.data.gemfire.repository.config.GemfireRepositoryParse * Namespace handler for GemFire definitions. * * @author Costin Leau + * @author David Turanski */ class GemfireNamespaceHandler extends NamespaceHandlerSupport { + @Override public void init() { registerBeanDefinitionParser("cache", new CacheParser()); registerBeanDefinitionParser("client-cache", new ClientCacheParser()); @@ -33,15 +35,14 @@ class GemfireNamespaceHandler extends NamespaceHandlerSupport { registerBeanDefinitionParser("lookup-region", new LookupRegionParser()); registerBeanDefinitionParser("replicated-region", new ReplicatedRegionParser()); registerBeanDefinitionParser("partitioned-region", new PartitionedRegionParser()); + registerBeanDefinitionParser("local-region", new LocalRegionParser()); registerBeanDefinitionParser("client-region", new ClientRegionParser()); registerBeanDefinitionParser("pool", new PoolParser()); registerBeanDefinitionParser("index", new IndexParser()); + registerBeanDefinitionParser("disk-store", new DiskStoreParser()); registerBeanDefinitionParser("cache-server", new CacheServerParser()); - registerBeanDefinitionParser("transaction-manager", new TransactionManagerParser()); - registerBeanDefinitionParser("cq-listener-container", new GemfireListenerContainerParser()); - registerBeanDefinitionParser("repositories", new GemfireRepositoryParser()); } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java new file mode 100644 index 00000000..0111be65 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java @@ -0,0 +1,116 @@ +/* + * Copyright 2010-2012 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 java.util.List; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.gemfire.RegionAttributesFactoryBean; +import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Element; + +import com.gemstone.gemfire.cache.Scope; + +/** + * Parser for <replicated-region;gt; definitions. + * + * @author Costin Leau + * @author David Turanski + */ +class LocalRegionParser extends AbstractRegionParser { + @Override + protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, + boolean subRegion) { + + // set the data policy + String attr = element.getAttribute("persistent"); + // if (Boolean.parseBoolean(attr)) { + // builder.addPropertyValue("dataPolicy", + // DataPolicy.PERSISTENT_REPLICATE); + // } + // else { + // builder.addPropertyValue("dataPolicy", DataPolicy.REPLICATE); + // } + + builder.addPropertyValue("scope", Scope.LOCAL); + + ParsingUtils.setPropertyValue(element, builder, "name", "name"); + + BeanDefinitionBuilder attrBuilder = builder; + + if (!subRegion) { + attr = element.getAttribute("cache-ref"); + // add cache reference (fallback to default if nothing is specified) + builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache")); + attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class); + } + // add attributes + + ParsingUtils.parseStatistics(element, attrBuilder); + + attr = element.getAttribute("publisher"); + if (StringUtils.hasText(attr)) { + attrBuilder.addPropertyValue("publisher", Boolean.valueOf(attr)); + } + + ParsingUtils.parseExpiration(parserContext, element, attrBuilder); + ParsingUtils.parseEviction(parserContext, element, attrBuilder); + ParsingUtils.parseDiskStorage(element, attrBuilder); + + if (!subRegion) { + builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); + } + + List subElements = DomUtils.getChildElements(element); + + // parse nested elements + for (Element subElement : subElements) { + String name = subElement.getLocalName(); + + if ("cache-listener".equals(name)) { + builder.addPropertyValue("cacheListeners", 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)); + } + // subregion + else if (name.endsWith("region")) { + doParseSubRegion(element, subElement, parserContext, builder, subRegion); + } + } + } + + 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 diff --git a/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java index 0c32d54b..00affd19 100644 --- a/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. @@ -30,12 +30,13 @@ import org.w3c.dom.Element; * Parser for <lookup-region;gt; definitions. * * @author Costin Leau + * @author David Turanski */ class LookupRegionParser extends AbstractRegionParser { @Override protected Class getBeanClass(Element element) { - if (element.hasAttribute("subregion")) { + if (isSubRegion(element)) { return SubRegionFactoryBean.class; } else { 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 14def796..ad809893 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java @@ -27,11 +27,13 @@ import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.core.Conventions; +import org.springframework.data.gemfire.DiskStoreFactoryBean; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; -import com.gemstone.gemfire.cache.DiskWriteAttributesFactory; +import com.gemstone.gemfire.cache.DiskStoreFactory; import com.gemstone.gemfire.cache.ExpirationAction; import com.gemstone.gemfire.cache.ExpirationAttributes; @@ -44,14 +46,20 @@ abstract class ParsingUtils { private static final String ALIASES_KEY = ParsingUtils.class.getName() + ":aliases"; - static void setPropertyValue(Element element, BeanDefinitionBuilder builder, String attrName, String propertyName) { - String attr = element.getAttribute(attrName); + static void setPropertyValue(Element element, BeanDefinitionBuilder builder, String attributeName, + String propertyName) { + String attr = element.getAttribute(attributeName); if (StringUtils.hasText(attr)) { builder.addPropertyValue(propertyName, attr); } } - static void setPropertyReference(Element element, BeanDefinitionBuilder builder, String attrName, String propertyName) { + static void setPropertyValue(Element element, BeanDefinitionBuilder builder, String attributeName) { + setPropertyValue(element, builder, attributeName, Conventions.attributeNameToPropertyName(attributeName)); + } + + static void setPropertyReference(Element element, BeanDefinitionBuilder builder, String attrName, + String propertyName) { String attr = element.getAttribute(attrName); if (StringUtils.hasText(attr)) { builder.addPropertyReference(propertyName, attr); @@ -59,9 +67,11 @@ abstract class ParsingUtils { } /** - * Utility for parsing bean aliases. Normally parsed by AbstractBeanDefinitionParser however due to the attribute clash - * (bean uses 'name' for aliases while region use it to indicate their name), the parser needs to handle this differently by - * storing them as metadata which gets deleted just before registration. + * Utility for parsing bean aliases. Normally parsed by + * AbstractBeanDefinitionParser however due to the attribute clash (bean + * uses 'name' for aliases while region use it to indicate their name), the + * parser needs to handle this differently by storing them as metadata which + * gets deleted just before registration. * * @param element * @param builder @@ -87,10 +97,13 @@ abstract class ParsingUtils { /** * Utility method handling parsing of nested definition of the type: + * *

 	 *   
 	 * 
- * or + * + * or + * *
 	 *   
 	 *     
@@ -100,11 +113,13 @@ abstract class ParsingUtils {
 	 * @param element
 	 * @return
 	 */
-	static Object parseRefOrNestedBeanDeclaration(ParserContext parserContext, Element element, BeanDefinitionBuilder builder) {
+	static Object parseRefOrNestedBeanDeclaration(ParserContext parserContext, Element element,
+			BeanDefinitionBuilder builder) {
 		return parseRefOrNestedBeanDeclaration(parserContext, element, builder, "ref");
 	}
 
-	static Object parseRefOrNestedBeanDeclaration(ParserContext parserContext, Element element, BeanDefinitionBuilder builder, String refAttrName) {
+	static Object parseRefOrNestedBeanDeclaration(ParserContext parserContext, Element element,
+			BeanDefinitionBuilder builder, String refAttrName) {
 		String attr = element.getAttribute(refAttrName);
 		boolean hasRef = StringUtils.hasText(attr);
 
@@ -142,10 +157,12 @@ abstract class ParsingUtils {
 	}
 
 	/**
-	 * Parses disk store sub-element. Populates the given attribute factory with the proper attributes.
+	 * Parses disk store sub-element. Populates the given attribute factory with
+	 * the proper attributes.
 	 * 
 	 * @param element - element enclosing the disk-store definition
-	 * @param beanBuilder - beanbuilder for a RegionAttributesFactoryBean instance
+	 * @param beanBuilder - beanbuilder for a RegionAttributesFactoryBean
+	 * instance
 	 * @return true if parsing actually occured, false otherwise
 	 */
 	static boolean parseDiskStorage(Element element, BeanDefinitionBuilder beanBuilder) {
@@ -154,14 +171,16 @@ abstract class ParsingUtils {
 		if (diskStoreElement == null)
 			return false;
 
-		BeanDefinitionBuilder diskDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(DiskWriteAttributesFactory.class);
-		setPropertyValue(diskStoreElement, diskDefBuilder, "synchronous-write", "synchronous");
+		if (diskStoreElement.getParentNode().getLocalName().endsWith("region")) {
+			System.out.println("This is a nested disk-store");
+		}
+
+		BeanDefinitionBuilder diskDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(DiskStoreFactory.class);
 		setPropertyValue(diskStoreElement, diskDefBuilder, "auto-compact", "rollOplogs");
 		setPropertyValue(diskStoreElement, diskDefBuilder, "max-oplog-size", "maxOplogSize");
 		setPropertyValue(diskStoreElement, diskDefBuilder, "time-interval", "timeInterval");
 		setPropertyValue(diskStoreElement, diskDefBuilder, "queue-size", "bytesThreshold");
 
-
 		// parse nested disk-dir
 		List list = DomUtils.getChildElementsByTagName(diskStoreElement, "disk-dir");
 		ManagedList locations = new ManagedList(list.size());
@@ -176,7 +195,7 @@ abstract class ParsingUtils {
 
 		// wrap up the disk attributes factory to call 'create'
 
-		BeanDefinitionBuilder factoryWrapper = BeanDefinitionBuilder.genericBeanDefinition(DiskWriteAttributesFactoryBean.class);
+		BeanDefinitionBuilder factoryWrapper = BeanDefinitionBuilder.genericBeanDefinition(DiskStoreFactoryBean.class);
 		factoryWrapper.addPropertyValue("diskAttributesFactory", diskDefBuilder.getBeanDefinition());
 		beanBuilder.addPropertyValue("diskWriteAttributes", factoryWrapper.getBeanDefinition());
 		beanBuilder.addPropertyValue("diskDirs", locations);
@@ -186,7 +205,8 @@ abstract class ParsingUtils {
 	}
 
 	/**
-	 * Parses the eviction sub-element. Populates the given attribute factory with the proper attributes.
+	 * Parses the eviction sub-element. Populates the given attribute factory
+	 * with the proper attributes.
 	 * 
 	 * @param parserContext
 	 * @param element
@@ -199,7 +219,8 @@ abstract class ParsingUtils {
 		if (evictionElement == null)
 			return false;
 
-		BeanDefinitionBuilder evictionDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(EvictionAttributesFactoryBean.class);
+		BeanDefinitionBuilder evictionDefBuilder = BeanDefinitionBuilder
+				.genericBeanDefinition(EvictionAttributesFactoryBean.class);
 
 		// do manual conversion since the enum is not public
 		String attr = evictionElement.getAttribute("type");
@@ -210,7 +231,6 @@ abstract class ParsingUtils {
 		setPropertyValue(evictionElement, evictionDefBuilder, "threshold", "threshold");
 		setPropertyValue(evictionElement, evictionDefBuilder, "action", "action");
 
-
 		// get object sizer (if declared)
 		Element objectSizerElement = DomUtils.getChildElementByTagName(evictionElement, "object-sizer");
 
@@ -223,13 +243,13 @@ abstract class ParsingUtils {
 		return true;
 	}
 
-
 	static void parseStatistics(Element element, BeanDefinitionBuilder attrBuilder) {
 		setPropertyValue(element, attrBuilder, "statistics", "statisticsEnabled");
 	}
 
 	/**
-	 * Parses the expiration sub-elements. Populates the given attribute factory with proper attributes. 
+	 * Parses the expiration sub-elements. Populates the given attribute factory
+	 * with proper attributes.
 	 * 
 	 * @param parserContext
 	 * @param element
@@ -250,7 +270,25 @@ abstract class ParsingUtils {
 		return result;
 	}
 
-	private static boolean parseExpiration(Element rootElement, String elementName, String propertyName, BeanDefinitionBuilder attrBuilder) {
+	static void parseAdditionalAttributes(ParserContext parserContext, Element element,
+			BeanDefinitionBuilder attrBuilder) {
+		setPropertyValue(element, attrBuilder, "persistent", "persistBackup");
+		setPropertyValue(element, attrBuilder, "ignore-jta", "ignoreJTA");
+		setPropertyValue(element, attrBuilder, "key-constraint", "keyConstraint");
+		setPropertyValue(element, attrBuilder, "value-constraint", "valueConstraint");
+		setPropertyValue(element, attrBuilder, "lock-grantor", "lockGrantor");
+		setPropertyValue(element, attrBuilder, "enable-subscription-conflation", "enableSubscriptionConflation");
+		setPropertyValue(element, attrBuilder, "enable-async-conflation", "enableAsyncConflation");
+		setPropertyValue(element, attrBuilder, "initial-capacity", "initialCapacity");
+		String indexUpdateType = element.getAttribute("index-update-type");
+		if (StringUtils.hasText(indexUpdateType)) {
+			attrBuilder.addPropertyValue("indexMaintenanceSynchronous", "synchronous".equals(indexUpdateType));
+		}
+
+	}
+
+	private static boolean parseExpiration(Element rootElement, String elementName, String propertyName,
+			BeanDefinitionBuilder attrBuilder) {
 		Element expirationElement = DomUtils.getChildElementByTagName(rootElement, elementName);
 
 		if (expirationElement == null)
@@ -259,7 +297,6 @@ abstract class ParsingUtils {
 		String expirationTime = null;
 		ExpirationAction action = ExpirationAction.INVALIDATE;
 
-
 		// do manual conversion since the enum is not public
 		String attr = expirationElement.getAttribute("timeout");
 		if (StringUtils.hasText(attr)) {
@@ -284,7 +321,8 @@ abstract class ParsingUtils {
 				action = ExpirationAction.LOCAL_INVALIDATE;
 			}
 		}
-		BeanDefinitionBuilder expirationAttributes = BeanDefinitionBuilder.genericBeanDefinition(ExpirationAttributes.class);
+		BeanDefinitionBuilder expirationAttributes = BeanDefinitionBuilder
+				.genericBeanDefinition(ExpirationAttributes.class);
 		expirationAttributes.addConstructorArgValue(expirationTime);
 		expirationAttributes.addConstructorArgValue(action);
 		attrBuilder.addPropertyValue(propertyName, expirationAttributes.getBeanDefinition());
diff --git a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
index aec50710..78e504c3 100644
--- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
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 830f85ea..bb40f29a 100644
--- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java
@@ -61,7 +61,7 @@ class ReplicatedRegionParser extends AbstractRegionParser {
 			attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class);
 		}
 		// add attributes
-
+		ParsingUtils.parseAdditionalAttributes(parserContext, element, attrBuilder);
 		ParsingUtils.parseStatistics(element, attrBuilder);
 
 		attr = element.getAttribute("publisher");
diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd
index 1a2fe21d..0f351362 100644
--- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd
+++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd
@@ -1,90 +1,76 @@
 
-
-    
-    
-    
-    
-    
-        
+
+	
+	
+	
+	
+	
+		
-    
-    
-    
-        
-            
-                
+	
+	
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				 namespace and its 'properties' element.
 				]]>
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-    
-    
-    
-        
-            
+		
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                    
-                        
-                            
-                                
-                                    
-                                
-                            
-                        
-                    
-                    
-                        
-                            
+				
+					
+				
+			
+		
+		
+			
+				
+					
+						
+							
+								
+									
+								
+							
+						
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                
-            
-        
-    
-    
-    
-        
-            
+					
+				
+			
+		
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                    
-                        
-                            
+				
+					
+				
+			
+		
+		
+			
+				
+					
+						
+							
-                        
-                    
-                
-            
-        
-    
-    
-    
-        
-            
+					
+				
+			
+		
+	
+	
+	
+		
+			
-        
-        
-            
-                
-                    
+		
+			
+				
+					
-                
-            
-            
-                
-                    
+			
+			
+				
+					
-                
-            
-            
-                
-                    
+			
+			
+				
+					
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                    
+			
+		
+	
+	
+	
+		
+			
+				
+					
-                
-            
-        
-        
-            
-                
+			
+		
+		
+			
+				
-            
-        
-    
-    
-    
-        
-            
+		
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                        
-                            
+				
+					
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                    
-                
-            
-        
-
-
-    
-
-
-    
-    
-        
-            
-                
-                    
-                        
-                            
+				
+			
+		
+	
+	
+		
+			
+				
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
+							
-                            
-                                
-                                    
-                                
-                            
-                        
-                        
-                            
-                                
-                                    
-                                        
+								
+									
+								
+							
+						
+						
+							
+								
+									
+										
-                                    
-                                
-                            
-                            
-                                
-                                    
+								
+							
+							
+								
+									
-                                
-                            
-                        
-                    
-                    
-                        
-                            
+							
+						
+					
+					
+						
+							
-                        
-                    
-                
-                
-                    
-                        
+					
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                        
-                            
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+				
+				
+					
+						
+					
+					
+						
+							
+							
+						
+					
+				
+				
+					
+						
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
-                    
-                
-            
-        
-    
-
-    
-    
-        
-            
-                
-                    
-                        
-                            
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
+							
-                            
-                                
-                                    
-                                
-                            
-                        
-                    
-                    
-                        
-                            
+								
+									
+								
+							
+						
+					
+					
+						
+							
-                            
-                                
-                                    
-                                
-                            
-                        
-                    
-                    
-                        
-                            
+								
+									
+								
+							
+						
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-            
-        
-    
-    
-     
-        
-            
-               
-                    
-                        
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-            
-        
-    
-     
-        
-            
-               
-                    
-                        
+				
+			
+		
+	
+	
+	
+		
+			
+				
+			
+		
+	
+	
+		
+			
+				
+					
+						
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-            
-            
-        
-    
-    
-    
-        
-            
-                
+				
+			
+		
+	
+	
+	
+		
+			
+			
+			
+			
+		
+	
+	
+	
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-    
-    
-    
-    
-    
-        
-            
+		
+	
+	
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                    
-                        
-                            
+				
+					
+				
+			
+		
+		
+			
+				
+					
+						
+							
-                        
-                        
-                            
-                                
-                                    
-                                        
-                                            
+						
+							
+								
+									
+										
+											
-                                        
-                                    
-                                
-                            
-                        
-                    
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-            
-        
-    
-    
-      
-        
-            
-                   
-                    
-                        
+									
+								
+							
+						
+					
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
-                    
-                
-            
-        
-    
-    
-
-    
-    
-    
-    
-        
-            
+				
+			
+		
+	
+	
+	
+	
+	
+		
+			
+			
+				
+					
+				
+			
+		
+		
+			
+				
+					
+						
+							
+						
+						
+							
+								
+									
+										
+											
+										
+									
+								
+							
+						
+					
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			
+		
+	
+	
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                    
-                        
-                            
+				
+					
+				
+			
+		
+		
+			
+				
+					
+						
+							
-                            
-                                
-                                    
-                                
-                            
-                        
-                    
-                    
-                        
-                            
+								
+									
+								
+							
+						
+					
+					
+						
+							
-                        
-                        
-                            
-                                
-                                    
-                                        
-                                            
+						
+							
+								
+									
+										
+											
-                                        
-                                    
-                                
-                            
-                        
-                    
-                
-                
-                    
-                        
+									
+								
+							
+						
+					
+				
+				
+					
+						
+					
+					
+						
+							
+							
+							
+						
+					
+				
+				
+					
+						
-                    
-                    
-                        
-                            
-                            
-                        
-                    
-                
-                
-                    
-                        
+					
+						
+							
+							
+						
+					
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
-                    
-                
-                
-                    
-                        
+				
+				
+					
+						
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                
-            
-        
-    
-    
-      
-        
-            
-                
-                      
-                    
-                        
+				
+			
+		
+	
+	
+	
+		
+			
+				
+			
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
-                    
-                
-            
-        
-    
-
-    
-    
-    
-    
-        
-            
-                
+				
+			
+			
+		
+	
+	
+	
+	
+	
+		
+			
+				
-            
-        
-        
-            
-                
-                    
-                        
-                            
+		
+		
+			
+				
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                    
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
-                    
-                        
-                            
-                        
-                    
-                
-            
-        
-        
-            
-                
-                    
-                        
-                            
+						
+							
+						
+					
+				
+			
+		
+		
+			
+				
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                
-            
-        
-        
-            
-                
+					
+				
+			
+		
+		
+			
+				
-            
-        
-    
-    
-    
-        
-            
-                
-                    
+		
+	
+	
+	
+		
+			
+				
+					
-                
-            
-            
-                
-                    
+			
+			
+				
+					
-                
-            
-        
-    
-    
-        
-            
-                
-                    
-                        
-                            
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                
-            
-        
-        
-            
-                
-            
-        
-        
-            
-                
+					
+				
+			
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-    
-    
-    
-        
-            
+			
+			
+				
+					
+					
+				
+			
+		
+		
+			
+				
+			
+		
+		
+			
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
+					
+				
+			    
+				  
+					 
+				 
+							
+			
+		
+	
+	
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                    
-                        
-                            
-                                
-                                    
+				
+					
+				
+			
+		
+		
+			
+				
+					
+						
+							
+								
+									
-                                
-                                
-                                    
-                                        
-                                            
-                                                
-                                                    
-                                                        
+								
+									
+										
+											
+												
+													
+														
-                                                    
-                                                
-                                            
-                                            
-                                                
-                                                    
+												
+											
+											
+												
+													
-                                                
-                                            
-                                        
-                                    
-                                
-                            
-                            
-                                
-                                    
+											
+										
+									
+								
+							
+							
+								
+									
-                                
-                                
-                                    
-                                        
-                                            
-                                        
-                                    
-                                
-                            
-                        
-                        
-                            
-                                
+								
+									
+										
+											
+										
+									
+								
+							
+						
+						
+							
+								
-                            
-                            
-                                
-                                    
-                                        
-                                            
-                                                
+							
+								
+									
+										
+											
+												
-                                            
-                                        
-                                    
-                                
-                            
-                        
-                    
-                    
-                        
-                            
+										
+									
+								
+							
+						
+					
+					
+						
+							
-                        
-                        
-                            
-                                
-                                
-                            
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                    
-                    
-                        
-                            
+					
+					
+						
+							
-                        
-                        
-                            
-                                
-                                
-                                
-                                
-                                
-                                
-                                
-                                
-                                
-                            
-                        
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
+						
+							
+								
+								
+								
+								
+								
+								
+								
+								
+								
+							
+						
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-            
-                
-            
-        
-    
-    
-    
-        
-            
-                
+			
+				
+			
+		
+	
+	
+	
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-            
-                
-                    
-                    
-                    
-                
-            
-        
-        
-            
-                
+			
+				
+					
+					
+					
+				
+			
+		
+		
+			
+				
-            
-        
-    
-    
-    
-        
-            
+		
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                
-            
-            
-                
-                    
+				
+					
+				
+			
+		
+		
+			
+				
+				
+			
+			
+				
+					
-                
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-        
-    
-    
-    
-        
-            
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                    
-                        
+				
+					
+				
+			
+		
+		
+			
+				
+					
+						
-                    
-                    
-                        
-                            
-                                
-                                    
-                                    
-                                    
-                                
-                            
-                        
-                        
-                        
-                    
-                
-            
-            
-                
-                    
-                
-            
-            
-            
-            
-                
-                    
-                
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-            
-                
-                    
+					
+						
+							
+								
+									
+									
+									
+								
+							
+						
+						
+						
+					
+				
+			
+			
+				
+					
+				
+			
+			
+			
+			
+				
+					
+				
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+				
+					
-                
-            
-            
-                
-                    
-                
-            
-            
-                
-                    
-                
-            
-        
-    
-    
-    
-        
-            
+			
+			
+				
+					
+				
+			
+			
+				
+					
+				
+			
+		
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-            
-            
-                
-                    
+				
+					
+				
+			
+		
+		
+			
+				
+			
+			
+				
+					
-                    
-                        
-                            
-                        
-                    
-                
-            
-            
-                
-                    
+						
+							
+						
+					
+				
+			
+			
+				
+					
-                    
-                        
-                            
-                        
-                    
-                
-            
-            
-                
-                    
+						
+							
+						
+					
+				
+			
+			
+				
+					
-                
-            
-            
-                
-                    
+			
+			
+				
+					
-                
-            
-        
-    
-    
-    
-        
-            
-                
+			
+		
+	
+	
+	
+		
+			
+				
-                
-                    
-                
-            
-        
-        
-            
-                
+					
+				
+			
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-        
-            
-                
+		
+		
+			
+				
-            
-        
-    
-    
-    
-        
-            
+		
+	
+	
+	
+		
+			
-            
-                
-                    
-                
-            
-        
-        
-            
-                
-                    
-                
-            
-            
-                
-                    
-                        
-                        
-                    
-                
-            
-            
-                
-                    
+				
+					
+				
+			
+		
+		
+			
+				
+					
+				
+			
+			
+				
+					
+						
+						
+					
+				
+			
+			
+				
+					
-                
-            
-            
-            
-            
-            
-                
-                    
+			
+			
+			
+			
+			
+				
+					
-                
-            
-            
-                
-                    
+			
+			
+				
+					
-                
-            
-            
-                
-                    
+			
+			
+				
+					
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                    
-                        
-                    
-                    
-                    
-                
-            
-        
-    
-    
-    
-        
-            
-                
-                
-            
-        
-    
-    
-    
-        
-            
-                
+				
+			
+		
+	
+	
+	
+		
+			
+				
+					
+						
+					
+					
+					
+				
+			
+		
+	
+	
+	
+		
+			
+				
+				
+			
+		
+	
+	
+	
+		
+			
+				
                     The reference to a GemfireTemplate.
                     Will default to 'gemfireTemplate'.
                 
-            
-        
-    
-    
-    
-        
-            
-                
-                    
-                
-            
-        
-        
-    
-    
-    
-        
-            
-        
-        
-        
-            
-                
-                    
-                    
-                    
-                    
-                
-            
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-    
-    
-    
-        
-            
-            
-            
-        
-    
+			
+		
+	
+	
+	
+		
+			
+				
+					
+				
+			
+		
+		
+	
+	
+	
+		
+			
+		
+		
+		
+			
+				
+					
+					
+					
+					
+				
+			
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	
+	
+	
+		
+			
+			
+			
+		
+	
+	
+	
+		
+			
+			
+			
+			
+		
+	
 
diff --git a/src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java
new file mode 100644
index 00000000..dff269dc
--- /dev/null
+++ b/src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010-2012 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 static org.junit.Assert.assertEquals;
+
+import java.io.File;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.gemstone.gemfire.cache.DiskStore;
+import com.gemstone.gemfire.cache.DiskStoreFactory;
+
+/**
+ * @author David Turanski
+ * 
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("diskstore-ns-new.xml")
+public class DiskStoreNamespaceTest {
+	private static File diskStoreDir;
+
+	@Autowired
+	DiskStore diskStore1;
+
+	@Test
+	public void testDiskStore() {
+		assertEquals("diskStore1", diskStore1.getName());
+		assertEquals(50, diskStore1.getQueueSize());
+		assertEquals(true, diskStore1.getAutoCompact());
+		assertEquals(DiskStoreFactory.DEFAULT_COMPACTION_THRESHOLD, diskStore1.getCompactionThreshold());
+		assertEquals(9999, diskStore1.getTimeInterval());
+		assertEquals(10, diskStore1.getMaxOplogSize());
+		assertEquals(diskStoreDir, diskStore1.getDiskDirs()[0]);
+	}
+
+	@BeforeClass
+	public static void setUp() {
+		String path = "./build/tmp";
+		diskStoreDir = new File(path);
+		if (!diskStoreDir.exists()) {
+			diskStoreDir.mkdir();
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() {
+		for (File file : diskStoreDir.listFiles()) {
+			file.delete();
+		}
+		diskStoreDir.delete();
+	}
+}
diff --git a/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java
new file mode 100644
index 00000000..3d93d42f
--- /dev/null
+++ b/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2010-2012 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+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.RegionFactoryBean;
+import org.springframework.data.gemfire.RegionLookupFactoryBean;
+import org.springframework.data.gemfire.TestUtils;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.util.ObjectUtils;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.CacheListener;
+import com.gemstone.gemfire.cache.DataPolicy;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionAttributes;
+import com.gemstone.gemfire.cache.Scope;
+
+/**
+ * @author Costin Leau
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("local-ns.xml")
+public class LocalRegionNamespaceTest {
+
+	@Autowired
+	private ApplicationContext context;
+
+	@Test
+	public void testBasicReplica() throws Exception {
+		assertTrue(context.containsBean("simple"));
+	}
+
+	@Test
+	public void testPublishingReplica() throws Exception {
+		assertTrue(context.containsBean("pub"));
+		RegionFactoryBean fb = context.getBean("&pub", RegionFactoryBean.class);
+		assertEquals(DataPolicy.NORMAL, TestUtils.readField("dataPolicy", fb));
+		assertEquals(Scope.LOCAL, TestUtils.readField("scope", fb));
+		assertEquals("publisher", TestUtils.readField("name", fb));
+		RegionAttributes attrs = TestUtils.readField("attributes", fb);
+		assertFalse(attrs.getPublisher());
+	}
+
+	@Test
+	public void testComplexReplica() throws Exception {
+		assertTrue(context.containsBean("complex"));
+		RegionFactoryBean fb = context.getBean("&complex", RegionFactoryBean.class);
+		CacheListener[] listeners = TestUtils.readField("cacheListeners", fb);
+		assertFalse(ObjectUtils.isEmpty(listeners));
+		assertEquals(2, listeners.length);
+		assertSame(listeners[0], context.getBean("c-listener"));
+
+		assertSame(context.getBean("c-loader"), TestUtils.readField("cacheLoader", fb));
+		assertSame(context.getBean("c-writer"), TestUtils.readField("cacheWriter", fb));
+	}
+
+	@Test
+	public void testRegionLookup() throws Exception {
+		Cache cache = context.getBean(Cache.class);
+		Region existing = cache.createRegionFactory().create("existing");
+		assertTrue(context.containsBean("lookup"));
+		RegionLookupFactoryBean lfb = context.getBean("&lookup", RegionLookupFactoryBean.class);
+		assertEquals("existing", TestUtils.readField("name", lfb));
+		assertEquals(existing, context.getBean("lookup"));
+	}
+}
\ No newline at end of file
diff --git a/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml
index f2a229e8..bce2ec77 100644
--- a/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml
+++ b/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml
@@ -33,13 +33,13 @@
 	
 
 	
-		
+		
 			
 		
 	
 	
 	
-		
+		
 			
 		
 
diff --git a/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml b/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml
new file mode 100644
index 00000000..0ce704d0
--- /dev/null
+++ b/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml
@@ -0,0 +1,29 @@
+
+
+
+	
+    
+        ./build/tmp
+        50
+        true
+        10
+        9999
+        1
+    
+    
+    
+
+	
+		
+	
+
\ No newline at end of file
diff --git a/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml
index a91f7f85..ba11cf0c 100644
--- a/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml
+++ b/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml
@@ -24,7 +24,7 @@
     
 	
 	
-		
+		
 			
 		
 
@@ -39,7 +39,7 @@
  	
  	
 	
-		
+		
 			
 		 
 
diff --git a/src/test/resources/org/springframework/data/gemfire/config/local-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/local-ns.xml
new file mode 100644
index 00000000..7fc7f302
--- /dev/null
+++ b/src/test/resources/org/springframework/data/gemfire/config/local-ns.xml
@@ -0,0 +1,31 @@
+
+
+
+	
+	
+	
+	
+	
+	
+	
+		
+			
+			
+		
+		
+		
+	
+	
+	
+	
+	
+	
+	
+
\ No newline at end of file
diff --git a/src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml
index d8cf4560..d0803639 100644
--- a/src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml
+++ b/src/test/resources/org/springframework/data/gemfire/config/subregion-ns.xml
@@ -18,7 +18,7 @@
     
      
         
-                        
+            
         
     
     

From 7efa90800fdf2720c240bfa03dbe989909d7742a Mon Sep 17 00:00:00 2001
From: David Turanski 
Date: Wed, 27 Jun 2012 07:18:47 -0400
Subject: [PATCH 06/17] Complete disk store refactoring and added region
 attributes

---
 .../data/gemfire/DiskStoreFactoryBean.java    |    2 -
 .../gemfire/RegionAttributesFactoryBean.java  |   39 +-
 .../data/gemfire/RegionFactoryBean.java       |   49 +-
 .../client/ClientRegionFactoryBean.java       |   84 +-
 .../gemfire/config/AbstractRegionParser.java  |   61 +
 .../AliasReplacingBeanDefinitionParser.java   |    3 +-
 .../gemfire/config/ClientRegionParser.java    |   17 +-
 .../gemfire/config/LocalRegionParser.java     |   79 +-
 .../data/gemfire/config/ParsingUtils.java     |   89 +-
 .../config/PartitionedRegionParser.java       |   66 +-
 .../config/ReplicatedRegionParser.java        |   68 +-
 .../gemfire/config/spring-gemfire-1.2.xsd     | 2883 +++++++++--------
 .../config/ClientRegionNamespaceTest.java     |   30 +-
 ...DiskStoreAndEvictionRegionParsingTest.java |   61 +-
 .../config/DiskStoreNamespaceTest.java        |   72 -
 .../config/LocalRegionNamespaceTest.java      |   22 +-
 .../PartitionedRegionNamespaceTest.java       |    2 +-
 .../config/ReplicatedRegionNamespaceTest.java |   19 +
 .../data/gemfire/config/client-ns.xml         |   18 +-
 .../data/gemfire/config/diskstore-ns-new.xml  |   29 -
 .../data/gemfire/config/diskstore-ns.xml      |   52 +-
 .../data/gemfire/config/local-ns.xml          |   10 +
 .../data/gemfire/config/replicated-ns.xml     |   15 +
 23 files changed, 1968 insertions(+), 1802 deletions(-)
 delete mode 100644 src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java
 delete mode 100644 src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml

diff --git a/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java b/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java
index 6684727b..da37c01d 100644
--- a/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java
+++ b/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java
@@ -109,7 +109,6 @@ public class DiskStoreFactoryBean implements FactoryBean, Initializin
 			}
 			diskStoreFactory.setDiskDirsAndSizes(diskDirFiles, diskDirSizes);
 		}
-
 	}
 
 	public void setCache(GemFireCache cache) {
@@ -168,5 +167,4 @@ public class DiskStoreFactoryBean implements FactoryBean, Initializin
 			this.maxSize = null;
 		}
 	}
-
 }
diff --git a/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java
index 23febbc9..27b1c194 100644
--- a/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java
+++ b/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java
@@ -16,67 +16,40 @@
 
 package org.springframework.data.gemfire;
 
-import java.io.File;
-
 import org.springframework.beans.factory.FactoryBean;
 import org.springframework.beans.factory.InitializingBean;
-import org.springframework.util.ObjectUtils;
 
 import com.gemstone.gemfire.cache.AttributesFactory;
 import com.gemstone.gemfire.cache.RegionAttributes;
 
 /**
- * Spring-friendly bean for creating {@link RegionAttributes}. Eliminates the need of using
- * a XML 'factory-method' tag. 
+ * Spring-friendly bean for creating {@link RegionAttributes}. Eliminates the
+ * need of using a XML 'factory-method' tag.
  * 
  * @author Costin Leau
  */
 public class RegionAttributesFactoryBean extends AttributesFactory implements FactoryBean,
 		InitializingBean {
 
-	private int[] diskSizes;
-	private File[] diskDirs;
-
 	private RegionAttributes attributes;
 
+	@Override
 	public void afterPropertiesSet() throws Exception {
-		if (diskSizes!= null){
-			super.setDiskDirsAndSizes(diskDirs, diskSizes);
-		}
-		else{
-			if (!ObjectUtils.isEmpty(diskDirs)) {
-				super.setDiskDirs(diskDirs);
-			}
-		}
-
 		attributes = super.create();
 	}
 
+	@Override
 	public RegionAttributes getObject() throws Exception {
 		return attributes;
 	}
 
+	@Override
 	public Class getObjectType() {
 		return (attributes != null ? attributes.getClass() : RegionAttributes.class);
 	}
 
+	@Override
 	public boolean isSingleton() {
 		return true;
 	}
-
-
-	@Override
-	public void setDiskDirs(File[] diskDirs) {
-		this.diskDirs = diskDirs;
-	}
-
-	/**
-	 * Sets the sizes (in megabytes) for each disk directory.
-	 * Used only disk directories are specified.
-	 * 
-	 * @param sizes
-	 */
-	public void setDiskSizes(int[] sizes) {
-		this.diskSizes = sizes;
-	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java
index 51a4438b..87e62529 100644
--- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java
+++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -52,6 +52,7 @@ import com.gemstone.gemfire.cache.Scope;
  * defaults.
  * 
  * @author Costin Leau
+ * @author David Turanski
  */
 public class RegionFactoryBean extends RegionLookupFactoryBean implements DisposableBean {
 
@@ -73,8 +74,12 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple
 
 	private Scope scope;
 
+	private String diskStoreName;
+
 	private DataPolicy dataPolicy;
 
+	private String dataPolicyName;
+
 	private Region region;
 
 	private List> subRegions;
@@ -116,10 +121,31 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple
 			regionFactory.setDataPolicy(dataPolicy);
 		}
 
+		if (dataPolicyName != null) {
+			Assert.isNull(dataPolicy, "'dataPolicy' and 'dataPolicyName' are mutually exclusive.");
+			if ("NORMAL".equals(dataPolicyName)) {
+				regionFactory.setDataPolicy(DataPolicy.NORMAL);
+			}
+			else if ("PRELOADED".equals(dataPolicyName)) {
+				regionFactory.setDataPolicy(DataPolicy.PRELOADED);
+			}
+			else {
+				throw new IllegalArgumentException("Data policy '" + dataPolicyName + "' is unsupported or invalid.");
+			}
+
+		}
+
 		if (scope != null) {
 			regionFactory.setScope(scope);
 		}
 
+		if (diskStoreName != null) {
+			regionFactory.setDiskStoreName(diskStoreName);
+		}
+
+		Assert.state(!attributes.isLockGrantor() || scope.isGlobal(),
+				"Lock grantor only applies to a global scoped region");
+
 		// get underlying AttributesFactory
 		postProcess(findAttrFactory(regionFactory));
 
@@ -129,8 +155,8 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple
 			reg.loadSnapshot(snapshot.getInputStream());
 		}
 
-		if (subRegions != null) {
-			System.out.println("**********************************************" + subRegions.get(0));
+		if (attributes.isLockGrantor()) {
+			reg.becomeLockGrantor();
 		}
 
 		return reg;
@@ -291,6 +317,23 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple
 		this.scope = scope;
 	}
 
+	/**
+	 * Sets the dataPolicy as a String. Required to support property
+	 * placeholders
+	 * @param dataPolicyName the dataPolicy name (NORMAL, PRELOADED, etc)
+	 */
+	public void setDataPolicyName(String dataPolicyName) {
+		this.dataPolicyName = dataPolicyName;
+	}
+
+	/**
+	 * Sets the name of disk store to use for overflow and persistence
+	 * @param diskStoreName
+	 */
+	public void setDiskStoreName(String diskStoreName) {
+		this.diskStoreName = diskStoreName;
+	}
+
 	/**
 	 * Sets the region attributes used for the region used by this factory.
 	 * Allows maximum control in specifying the region settings. Used only when
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 705d7b84..5271cac8 100644
--- a/src/main/java/org/springframework/data/gemfire/client/ClientRegionFactoryBean.java
+++ b/src/main/java/org/springframework/data/gemfire/client/ClientRegionFactoryBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -44,6 +44,7 @@ import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
  * Client extension for GemFire regions.
  * 
  * @author Costin Leau
+ * @author David Turanski
  */
 public class ClientRegionFactoryBean extends RegionLookupFactoryBean implements BeanFactoryAware,
 		DisposableBean {
@@ -51,19 +52,28 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 	private static final Log log = LogFactory.getLog(ClientRegionFactoryBean.class);
 
 	private boolean destroy = false;
+
 	private boolean close = true;
+
 	private Resource snapshot;
 
 	private CacheListener cacheListeners[];
+
 	private Interest[] interests;
+
 	private String poolName;
+
 	private BeanFactory beanFactory;
+
 	private ClientRegionShortcut shortcut = null;
+
 	private DataPolicy dataPolicy;
 
 	private RegionAttributes attributes;
+
 	private Region region;
 
+	private String diskStoreName;
 
 	@Override
 	public void afterPropertiesSet() throws Exception {
@@ -76,12 +86,11 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 	protected Region lookupFallback(GemFireCache cache, String regionName) throws Exception {
 		Assert.isTrue(cache instanceof ClientCache, "Unable to create regions from " + cache);
 		ClientCache c = (ClientCache) cache;
-		
+
 		if (cache instanceof GemFireCacheImpl) {
 			Assert.isTrue(((GemFireCacheImpl) cache).isClient(), "A client-cache instance is required");
 		}
 
-
 		// first look at shortcut
 		ClientRegionShortcut s = null;
 
@@ -103,7 +112,8 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 			else {
 				s = ClientRegionShortcut.LOCAL;
 			}
-		} else {
+		}
+		else {
 			s = shortcut;
 		}
 
@@ -154,6 +164,10 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 			factory.setPoolName(poolName);
 		}
 
+		if (diskStoreName != null) {
+			factory.setDiskStoreName(diskStoreName);
+		}
+
 		Region reg = factory.create(regionName);
 		log.info("Created new cache region [" + regionName + "]");
 		if (snapshot != null) {
@@ -179,6 +193,7 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 		}
 	}
 
+	@Override
 	public void destroy() throws Exception {
 		Region region = getObject();
 		// unregister interests
@@ -193,8 +208,10 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 					}
 				}
 			}
-			// should not really happen since interests are validated at start/registration
-		} catch (UnsupportedOperationException ex) {
+			// should not really happen since interests are validated at
+			// start/registration
+		}
+		catch (UnsupportedOperationException ex) {
 			log.warn("Cannot unregister cache interests", ex);
 		}
 
@@ -203,7 +220,8 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 				if (!region.getCache().isClosed()) {
 					try {
 						region.close();
-					} catch (CacheClosedException cce) {
+					}
+					catch (CacheClosedException cce) {
 						// nothing to see folks, move on.
 					}
 				}
@@ -215,13 +233,14 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 		region = null;
 	}
 
+	@Override
 	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
 		this.beanFactory = beanFactory;
 	}
 
-
 	/**
-	 * Set the interests for this client region. Both key and regex interest are supported.
+	 * Set the interests for this client region. Both key and regex interest are
+	 * supported.
 	 * 
 	 * @param interests the interests to set
 	 */
@@ -257,9 +276,9 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 	}
 
 	/**
-	 * Initializes the client using a GemFire {@link ClientRegionShortcut}.
-	 * The recommended way for creating clients since it covers all the major scenarios with minimal
-	 * configuration. 
+	 * Initializes the client using a GemFire {@link ClientRegionShortcut}. The
+	 * recommended way for creating clients since it covers all the major
+	 * scenarios with minimal configuration.
 	 * 
 	 * @param shortcut
 	 */
@@ -268,9 +287,9 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 	}
 
 	/**
-	 * Indicates whether the region referred by this factory bean,
-	 * will be destroyed on shutdown (default false).
-	 * Note: destroy and close are mutually exclusive. Enabling one will automatically disable the other.
+	 * Indicates whether the region referred by this factory bean, will be
+	 * destroyed on shutdown (default false). Note: destroy and close are
+	 * mutually exclusive. Enabling one will automatically disable the other.
 	 * 
 	 * @param destroy whether or not to destroy the region
 	 * 
@@ -285,9 +304,9 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 	}
 
 	/**
-	 * Indicates whether the region referred by this factory bean,
-	 * will be closed on shutdown (default true).
-	 * Note: destroy and close are mutually exclusive. Enabling one will automatically disable the other.
+	 * Indicates whether the region referred by this factory bean, will be
+	 * closed on shutdown (default true). Note: destroy and close are mutually
+	 * exclusive. Enabling one will automatically disable the other.
 	 * 
 	 * @param close whether to close or not the region
 	 * @see #setDestroy(boolean)
@@ -300,9 +319,9 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 	}
 
 	/**
-	 * Sets the snapshots used for loading a newly created region.
-	 * That is, the snapshot will be used only when a new region is created - if the region
-	 * already exists, no loading will be performed.
+	 * Sets the snapshots used for loading a newly created region. That
+	 * is, the snapshot will be used only when a new region is created -
+	 * if the region already exists, no loading will be performed.
 	 * 
 	 * @see #setName(String)
 	 * @param snapshot the snapshot to set
@@ -312,9 +331,9 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 	}
 
 	/**
-	 * Sets the cache listeners used for the region used by this factory.
-	 * Used only when a new region is created.Overrides the settings
-	 * specified through {@link #setAttributes(RegionAttributes)}.
+	 * Sets the cache listeners used for the region used by this factory. Used
+	 * only when a new region is created.Overrides the settings specified
+	 * through {@link #setAttributes(RegionAttributes)}.
 	 * 
 	 * @param cacheListeners the cacheListeners to set on a newly created region
 	 */
@@ -331,12 +350,21 @@ public class ClientRegionFactoryBean extends RegionLookupFactoryBean
 		this.dataPolicy = dataPolicy;
 	}
 
+	/**
+	 * Sets the name of disk store to use for overflow and persistence
+	 * @param diskStoreName
+	 */
+	public void setDiskStoreName(String diskStoreName) {
+		this.diskStoreName = diskStoreName;
+	}
+
 	/**
 	 * Sets the region attributes used for the region used by this factory.
-	 * Allows maximum control in specifying the region settings.
-	 * Used only when a new region is created.
-	 * Note that using this method allows for advanced customization of the region - while it provides a lot of flexibility,
-	 * note that it's quite easy to create misconfigured regions (especially in a client/server scenario).
+	 * Allows maximum control in specifying the region settings. Used only when
+	 * a new region is created. Note that using this method allows for advanced
+	 * customization of the region - while it provides a lot of flexibility,
+	 * note that it's quite easy to create misconfigured regions (especially in
+	 * a client/server scenario).
 	 * 
 	 * @param attributes the attributes to set on a newly created region
 	 */
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 877edc85..12e54aa5 100644
--- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java
@@ -16,6 +16,8 @@
 
 package org.springframework.data.gemfire.config;
 
+import java.util.List;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
@@ -23,6 +25,7 @@ import org.springframework.beans.factory.config.BeanDefinitionHolder;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.springframework.util.StringUtils;
+import org.springframework.util.xml.DomUtils;
 import org.w3c.dom.Element;
 
 /**
@@ -86,6 +89,52 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser {
 		this.registerBeanDefinition(new BeanDefinitionHolder(subRegionDef, regionPath), parserContext.getRegistry());
 	}
 
+	protected void doParseRegionCommon(Element element, ParserContext parserContext, BeanDefinitionBuilder builder,
+			BeanDefinitionBuilder attrBuilder, boolean subRegion) {
+
+		if (!subRegion) {
+			String cacheRef = element.getAttribute("cache-ref");
+			// add cache reference (fallback to default if nothing is specified)
+			builder.addPropertyReference("cache", (StringUtils.hasText(cacheRef) ? cacheRef : "gemfire-cache"));
+		}
+		// add attributes
+		ParsingUtils.setPropertyValue(element, builder, "name");
+		ParsingUtils.parseOptionalRegionAttributes(parserContext, element, attrBuilder);
+		ParsingUtils.parseStatistics(element, attrBuilder);
+		ParsingUtils.setPropertyValue(element, attrBuilder, "publisher");
+
+		if (StringUtils.hasText(element.getAttribute("disk-store-ref"))) {
+			ParsingUtils.setPropertyValue(element, builder, "disk-store-ref", "diskStoreName");
+			builder.addDependsOn(element.getAttribute("disk-store-ref"));
+		}
+
+		ParsingUtils.parseExpiration(parserContext, element, attrBuilder);
+		ParsingUtils.parseEviction(parserContext, element, attrBuilder);
+
+		List subElements = DomUtils.getChildElements(element);
+
+		// parse nested elements
+		for (Element subElement : subElements) {
+			String name = subElement.getLocalName();
+
+			if ("cache-listener".equals(name)) {
+				builder.addPropertyValue("cacheListeners", 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));
+			}
+			// subregion
+			else if (name.endsWith("region")) {
+				doParseSubRegion(element, subElement, parserContext, builder, subRegion);
+			}
+		}
+	}
+
 	private BeanDefinition parseSubRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
 		BeanDefinition beanDefinition = parserContext.getDelegate().parseCustomElement(element,
 				builder.getBeanDefinition());
@@ -96,4 +145,16 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser {
 		String name = element.getAttribute(NAME_ATTRIBUTE);
 		return StringUtils.hasText(name) ? name : element.getAttribute(ID_ATTRIBUTE);
 	}
+
+	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
diff --git a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java
index e8d2f951..b744507a 100644
--- a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 the original author or authors.
+ * Copyright 2012 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.
@@ -32,6 +32,7 @@ import org.w3c.dom.Element;
  * parsing method is final).
  * 
  * @author Costin Leau
+ * @author David Turanski
  */
 abstract class AliasReplacingBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
 
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 65270ac7..fd4f6774 100644
--- a/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -34,12 +34,15 @@ import com.gemstone.gemfire.cache.DataPolicy;
 /**
  * Parser for <client-region;gt; definitions.
  * 
- * To avoid eager evaluations, the region interests are declared as nested definition.
+ * To avoid eager evaluations, the region interests are declared as nested
+ * definition.
  * 
  * @author Costin Leau
+ * @author David Turanski
  */
 class ClientRegionParser extends AliasReplacingBeanDefinitionParser {
 
+	@Override
 	protected Class getBeanClass(Element element) {
 		return ClientRegionFactoryBean.class;
 	}
@@ -58,7 +61,6 @@ class ClientRegionParser extends AliasReplacingBeanDefinitionParser {
 		ParsingUtils.setPropertyValue(element, builder, "pool-name", "poolName");
 		ParsingUtils.setPropertyValue(element, builder, "shortcut", "shortcut");
 
-
 		// set the persistent policy
 		String attr = element.getAttribute("persistent");
 
@@ -76,14 +78,19 @@ class ClientRegionParser extends AliasReplacingBeanDefinitionParser {
 
 		// eviction + overflow attributes
 		// client attributes
-		BeanDefinitionBuilder attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class);
+		BeanDefinitionBuilder attrBuilder = BeanDefinitionBuilder
+				.genericBeanDefinition(RegionAttributesFactoryBean.class);
 
 		ParsingUtils.parseStatistics(element, attrBuilder);
 
+		if (StringUtils.hasText(element.getAttribute("disk-store-ref"))) {
+			ParsingUtils.setPropertyValue(element, builder, "disk-store-ref", "diskStoreName");
+			builder.addDependsOn(element.getAttribute("disk-store-ref"));
+		}
+
 		boolean overwriteDataPolicy = false;
 
 		overwriteDataPolicy |= ParsingUtils.parseEviction(parserContext, element, attrBuilder);
-		overwriteDataPolicy |= ParsingUtils.parseDiskStorage(element, attrBuilder);
 
 		if (!frozenDataPolicy && overwriteDataPolicy) {
 			builder.addPropertyValue("dataPolicy", DataPolicy.NORMAL);
diff --git a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java
index 0111be65..c5bfbb31 100644
--- a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java
@@ -16,15 +16,13 @@
 
 package org.springframework.data.gemfire.config;
 
-import java.util.List;
-
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.springframework.data.gemfire.RegionAttributesFactoryBean;
 import org.springframework.util.StringUtils;
-import org.springframework.util.xml.DomUtils;
 import org.w3c.dom.Element;
 
+import com.gemstone.gemfire.cache.DataPolicy;
 import com.gemstone.gemfire.cache.Scope;
 
 /**
@@ -39,78 +37,23 @@ class LocalRegionParser extends AbstractRegionParser {
 			boolean subRegion) {
 
 		// set the data policy
-		String attr = element.getAttribute("persistent");
-		// if (Boolean.parseBoolean(attr)) {
-		// builder.addPropertyValue("dataPolicy",
-		// DataPolicy.PERSISTENT_REPLICATE);
-		// }
-		// else {
-		// builder.addPropertyValue("dataPolicy", DataPolicy.REPLICATE);
-		// }
+		String attr = element.getAttribute("data-policy");
+		if (StringUtils.hasText(attr)) {
+			builder.addPropertyValue("dataPolicyName", attr.toUpperCase());
+		}
+		else {
+			builder.addPropertyValue("dataPolicy", DataPolicy.NORMAL);
+		}
 
 		builder.addPropertyValue("scope", Scope.LOCAL);
 
-		ParsingUtils.setPropertyValue(element, builder, "name", "name");
-
-		BeanDefinitionBuilder attrBuilder = builder;
-
-		if (!subRegion) {
-			attr = element.getAttribute("cache-ref");
-			// add cache reference (fallback to default if nothing is specified)
-			builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache"));
-			attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class);
-		}
-		// add attributes
-
-		ParsingUtils.parseStatistics(element, attrBuilder);
-
-		attr = element.getAttribute("publisher");
-		if (StringUtils.hasText(attr)) {
-			attrBuilder.addPropertyValue("publisher", Boolean.valueOf(attr));
-		}
-
-		ParsingUtils.parseExpiration(parserContext, element, attrBuilder);
-		ParsingUtils.parseEviction(parserContext, element, attrBuilder);
-		ParsingUtils.parseDiskStorage(element, attrBuilder);
+		BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder
+				.genericBeanDefinition(RegionAttributesFactoryBean.class);
 
+		super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion);
 		if (!subRegion) {
 			builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition());
 		}
-
-		List subElements = DomUtils.getChildElements(element);
-
-		// parse nested elements
-		for (Element subElement : subElements) {
-			String name = subElement.getLocalName();
-
-			if ("cache-listener".equals(name)) {
-				builder.addPropertyValue("cacheListeners", 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));
-			}
-			// subregion
-			else if (name.endsWith("region")) {
-				doParseSubRegion(element, subElement, parserContext, builder, subRegion);
-			}
-		}
-	}
-
-	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
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 ad809893..59e5eb5a 100644
--- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java
+++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -28,19 +28,19 @@ import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
 import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.springframework.core.Conventions;
-import org.springframework.data.gemfire.DiskStoreFactoryBean;
 import org.springframework.util.StringUtils;
 import org.springframework.util.xml.DomUtils;
 import org.w3c.dom.Element;
 
-import com.gemstone.gemfire.cache.DiskStoreFactory;
 import com.gemstone.gemfire.cache.ExpirationAction;
 import com.gemstone.gemfire.cache.ExpirationAttributes;
+import com.gemstone.gemfire.cache.Scope;
 
 /**
  * Various minor utility used by the parser.
  * 
  * @author Costin Leau
+ * @author David Turanski
  */
 abstract class ParsingUtils {
 
@@ -156,54 +156,6 @@ abstract class ParsingUtils {
 		return list;
 	}
 
-	/**
-	 * Parses disk store sub-element. Populates the given attribute factory with
-	 * the proper attributes.
-	 * 
-	 * @param element - element enclosing the disk-store definition
-	 * @param beanBuilder - beanbuilder for a RegionAttributesFactoryBean
-	 * instance
-	 * @return true if parsing actually occured, false otherwise
-	 */
-	static boolean parseDiskStorage(Element element, BeanDefinitionBuilder beanBuilder) {
-		Element diskStoreElement = DomUtils.getChildElementByTagName(element, "disk-store");
-
-		if (diskStoreElement == null)
-			return false;
-
-		if (diskStoreElement.getParentNode().getLocalName().endsWith("region")) {
-			System.out.println("This is a nested disk-store");
-		}
-
-		BeanDefinitionBuilder diskDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(DiskStoreFactory.class);
-		setPropertyValue(diskStoreElement, diskDefBuilder, "auto-compact", "rollOplogs");
-		setPropertyValue(diskStoreElement, diskDefBuilder, "max-oplog-size", "maxOplogSize");
-		setPropertyValue(diskStoreElement, diskDefBuilder, "time-interval", "timeInterval");
-		setPropertyValue(diskStoreElement, diskDefBuilder, "queue-size", "bytesThreshold");
-
-		// parse nested disk-dir
-		List list = DomUtils.getChildElementsByTagName(diskStoreElement, "disk-dir");
-		ManagedList locations = new ManagedList(list.size());
-		ManagedList sizes = new ManagedList(list.size());
-
-		for (Element diskDirElement : list) {
-			locations.add(diskDirElement.getAttribute("location"));
-
-			String attr = diskDirElement.getAttribute("max-size");
-			sizes.add(StringUtils.hasText(attr) ? attr : "10240");
-		}
-
-		// wrap up the disk attributes factory to call 'create'
-
-		BeanDefinitionBuilder factoryWrapper = BeanDefinitionBuilder.genericBeanDefinition(DiskStoreFactoryBean.class);
-		factoryWrapper.addPropertyValue("diskAttributesFactory", diskDefBuilder.getBeanDefinition());
-		beanBuilder.addPropertyValue("diskWriteAttributes", factoryWrapper.getBeanDefinition());
-		beanBuilder.addPropertyValue("diskDirs", locations);
-		beanBuilder.addPropertyValue("diskSizes", sizes);
-
-		return true;
-	}
-
 	/**
 	 * Parses the eviction sub-element. Populates the given attribute factory
 	 * with the proper attributes.
@@ -228,8 +180,8 @@ abstract class ParsingUtils {
 			evictionDefBuilder.addPropertyValue("type", EvictionType.valueOf(attr.toUpperCase()));
 		}
 
-		setPropertyValue(evictionElement, evictionDefBuilder, "threshold", "threshold");
-		setPropertyValue(evictionElement, evictionDefBuilder, "action", "action");
+		setPropertyValue(evictionElement, evictionDefBuilder, "threshold");
+		setPropertyValue(evictionElement, evictionDefBuilder, "action");
 
 		// get object sizer (if declared)
 		Element objectSizerElement = DomUtils.getChildElementByTagName(evictionElement, "object-sizer");
@@ -270,16 +222,21 @@ abstract class ParsingUtils {
 		return result;
 	}
 
-	static void parseAdditionalAttributes(ParserContext parserContext, Element element,
+	static void parseOptionalRegionAttributes(ParserContext parserContext, Element element,
 			BeanDefinitionBuilder attrBuilder) {
-		setPropertyValue(element, attrBuilder, "persistent", "persistBackup");
+		if (!("partitioned-region".equals(element.getLocalName()))) {
+			setPropertyValue(element, attrBuilder, "persistent", "persistBackup");
+		}
 		setPropertyValue(element, attrBuilder, "ignore-jta", "ignoreJTA");
-		setPropertyValue(element, attrBuilder, "key-constraint", "keyConstraint");
-		setPropertyValue(element, attrBuilder, "value-constraint", "valueConstraint");
-		setPropertyValue(element, attrBuilder, "lock-grantor", "lockGrantor");
-		setPropertyValue(element, attrBuilder, "enable-subscription-conflation", "enableSubscriptionConflation");
-		setPropertyValue(element, attrBuilder, "enable-async-conflation", "enableAsyncConflation");
-		setPropertyValue(element, attrBuilder, "initial-capacity", "initialCapacity");
+		setPropertyValue(element, attrBuilder, "key-constraint");
+		setPropertyValue(element, attrBuilder, "value-constraint");
+		setPropertyValue(element, attrBuilder, "is-lock-grantor", "lockGrantor");
+		setPropertyValue(element, attrBuilder, "enable-subscription-conflation");
+		setPropertyValue(element, attrBuilder, "enable-async-conflation");
+		setPropertyValue(element, attrBuilder, "initial-capacity");
+		setPropertyValue(element, attrBuilder, "load-factor");
+		setPropertyValue(element, attrBuilder, "cloning-enabled");
+
 		String indexUpdateType = element.getAttribute("index-update-type");
 		if (StringUtils.hasText(indexUpdateType)) {
 			attrBuilder.addPropertyValue("indexMaintenanceSynchronous", "synchronous".equals(indexUpdateType));
@@ -287,6 +244,16 @@ abstract class ParsingUtils {
 
 	}
 
+	static void parseScope(Element element, BeanDefinitionBuilder builder) {
+		String scope = element.getAttribute("scope");
+		if (StringUtils.hasText(scope)) {
+			builder.addPropertyValue("scope", Scope.fromString(scope.toUpperCase().replace("-", "_")));
+		}
+		else {
+			builder.addPropertyValue("scope", Scope.DISTRIBUTED_ACK);
+		}
+	}
+
 	private static boolean parseExpiration(Element rootElement, String elementName, String propertyName,
 			BeanDefinitionBuilder attrBuilder) {
 		Element expirationElement = DomUtils.getChildElementByTagName(rootElement, elementName);
diff --git a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
index 78e504c3..9acbe69b 100644
--- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
@@ -65,21 +65,13 @@ class PartitionedRegionParser extends AbstractRegionParser {
 			builder.addPropertyValue("dataPolicy", DataPolicy.PARTITION);
 		}
 
-		BeanDefinitionBuilder attrBuilder = builder;
+		ParsingUtils.parseScope(element, builder);
 
-		if (!subRegion) {
-			attr = element.getAttribute("cache-ref");
-			// add cache reference (fallback to default if nothing is specified)
-			builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache"));
-			attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class);
-		}
-		ParsingUtils.setPropertyValue(element, builder, "name", "name");
-
-		ParsingUtils.parseStatistics(element, attrBuilder);
-		ParsingUtils.parseExpiration(parserContext, element, attrBuilder);
-		ParsingUtils.parseEviction(parserContext, element, attrBuilder);
-		ParsingUtils.parseDiskStorage(element, attrBuilder);
+		BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder
+				.genericBeanDefinition(RegionAttributesFactoryBean.class);
 
+		super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion);
+		//
 		// partition attributes
 		BeanDefinitionBuilder parAttrBuilder = BeanDefinitionBuilder
 				.genericBeanDefinition(PartitionAttributesFactoryBean.class);
@@ -120,36 +112,16 @@ class PartitionedRegionParser extends AbstractRegionParser {
 		if (StringUtils.hasText(attr)) {
 			parAttrBuilder.addPropertyValue("totalNumBuckets", Integer.valueOf(attr));
 		}
-
-		List subElements = DomUtils.getChildElements(element);
-
-		// parse nested cache-listener elements
+		//
+		List subElements = DomUtils.getChildElementsByTagName(element, "partition-resolver");
+		//
+		// // parse nested cache-listener elements
 		for (Element subElement : subElements) {
-			String name = subElement.getLocalName();
-
-			if ("cache-listener".equals(name)) {
-				builder.addPropertyValue("cacheListeners", 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));
-			}
-
-			else if ("partition-resolver".equals(name)) {
-				parAttrBuilder.addPropertyValue("partitionResolver",
-						parsePartitionResolver(parserContext, subElement, builder));
-			}
-			// subregion
-			else if (name.endsWith("region")) {
-				doParseSubRegion(element, subElement, parserContext, builder, subRegion);
-			}
+			parAttrBuilder.addPropertyValue("partitionResolver",
+					parsePartitionResolver(parserContext, subElement, builder));
 		}
-
-		// add partition attributes attributes
+		//
+		// // add partition attributes attributes
 		attrBuilder.addPropertyValue("partitionAttributes", parAttrBuilder.getBeanDefinition());
 		// add partition/overflow settings as attributes
 		if (!subRegion) {
@@ -157,18 +129,6 @@ class PartitionedRegionParser extends AbstractRegionParser {
 		}
 	}
 
-	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);
-	}
-
 	private Object parsePartitionResolver(ParserContext parserContext, Element subElement, BeanDefinitionBuilder builder) {
 		return ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, subElement, builder);
 	}
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 bb40f29a..1dba8a8f 100644
--- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java
@@ -16,17 +16,12 @@
 
 package org.springframework.data.gemfire.config;
 
-import java.util.List;
-
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.springframework.data.gemfire.RegionAttributesFactoryBean;
-import org.springframework.util.StringUtils;
-import org.springframework.util.xml.DomUtils;
 import org.w3c.dom.Element;
 
 import com.gemstone.gemfire.cache.DataPolicy;
-import com.gemstone.gemfire.cache.Scope;
 
 /**
  * Parser for <replicated-region;gt; definitions.
@@ -48,69 +43,14 @@ class ReplicatedRegionParser extends AbstractRegionParser {
 			builder.addPropertyValue("dataPolicy", DataPolicy.REPLICATE);
 		}
 
-		builder.addPropertyValue("scope", Scope.DISTRIBUTED_ACK);
+		ParsingUtils.parseScope(element, builder);
 
-		ParsingUtils.setPropertyValue(element, builder, "name", "name");
-
-		BeanDefinitionBuilder attrBuilder = builder;
-
-		if (!subRegion) {
-			attr = element.getAttribute("cache-ref");
-			// add cache reference (fallback to default if nothing is specified)
-			builder.addPropertyReference("cache", (StringUtils.hasText(attr) ? attr : "gemfire-cache"));
-			attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class);
-		}
-		// add attributes
-		ParsingUtils.parseAdditionalAttributes(parserContext, element, attrBuilder);
-		ParsingUtils.parseStatistics(element, attrBuilder);
-
-		attr = element.getAttribute("publisher");
-		if (StringUtils.hasText(attr)) {
-			attrBuilder.addPropertyValue("publisher", Boolean.valueOf(attr));
-		}
-
-		ParsingUtils.parseExpiration(parserContext, element, attrBuilder);
-		ParsingUtils.parseEviction(parserContext, element, attrBuilder);
-		ParsingUtils.parseDiskStorage(element, attrBuilder);
+		BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder
+				.genericBeanDefinition(RegionAttributesFactoryBean.class);
 
+		super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion);
 		if (!subRegion) {
 			builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition());
 		}
-
-		List subElements = DomUtils.getChildElements(element);
-
-		// parse nested elements
-		for (Element subElement : subElements) {
-			String name = subElement.getLocalName();
-
-			if ("cache-listener".equals(name)) {
-				builder.addPropertyValue("cacheListeners", 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));
-			}
-			// subregion
-			else if (name.endsWith("region")) {
-				doParseSubRegion(element, subElement, parserContext, builder, subRegion);
-			}
-		}
 	}
-
-	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
diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd
index 0f351362..85f4a2b6 100644
--- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd
+++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd
@@ -1,76 +1,92 @@
 
-
-
-	
-	
-	
-	
-	
-		
+
+    
+    
+    
+    
+    
+        
-	
-	
-	
-		
-			
-				
+    
+    
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                 namespace and its 'properties' element.
 				]]>
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-	
-	
-	
-		
-			
+        
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
-						
-							
-								
-									
-								
-							
-						
-					
-					
-						
-							
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
+                            
+                                
+                                    
+                                
+                            
+                        
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-				
-			
-		
-	
-	
-	
-		
-			
+                    
+                
+            
+        
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
-						
-							
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
+                            
-						
-					
-				
-			
-		
-	
-	
-	
-		
-			
+                    
+                
+            
+        
+    
+    
+    
+        
+            
-		
-		
-			
-				
-					
+        
+            
+                
+                    
-				
-			
-			
-				
-					
+            
+            
+                
+                    
-				
-			
-			
-				
-					
+            
+            
+                
+                    
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
+            
+        
+    
+    
+    
+        
+            
+                
+                    
-				
-			
-		
-		
-			
-				
+            
+        
+        
+            
+                
-			
-		
-	
-	
-	
-		
-			
+        
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-			
-		
-	
-	
-		
-			
-				
-					
-						
+                
+                    
+                
+            
+        
+        
+            
+                
+            
+        
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			
-		
-	
-	
-		
-			
-				
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
-							
+                
+            
+        
+    
+    
+        
+            
+                
+                    
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
+                            
-							
-								
-									
-								
-							
-						
-						
-							
-								
-									
-										
+                                
+                                    
+                                
+                            
+                        
+                        
+                            
+                                
+                                    
+                                        
-									
-								
-							
-							
-								
-									
+                                
+                            
+                            
+                                
+                                    
-								
-							
-						
-					
-					
-						
-							
-						
-					
-				
-				
-					
-						
+                            
+                        
+                    
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-					
-						
-							
-							
-						
-					
-				
-				
-					
-						
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
+                    
+                        
+                            
+                            
+                        
+                    
+                
+            
+        
+    
+    
+    
+        
+            
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
-							
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
+                            
-							
-								
-									
-								
-							
-						
-					
-					
-						
-							
+                                
+                                    
+                                
+                            
+                        
+                    
+                    
+                        
+                            
-							
-								
-									
-								
-							
-						
-					
-					
-						
-							
+                                
+                                    
+                                
+                            
+                        
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-			
-		
-	
-	
-		
-			
-				
-					
-						
+                    
+                
+                
+                         
+                            
+                        
+                
+                
+                        
+                            
+                                        
+                
+            
+        
+    
+    
+    
+        
+            
+                
+            
+        
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-			
-		
-	
-	
-		
-			
-				
-					
-						
+                
+            
+        
+    
+    
+    
+        
+            
+                
+            
+        
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			
-		
-	
-	
-	
-		
-			
-			
-			
-			
-		
-	
-	
-	
-		
-			
-				
+                
+            
+        
+    
+    
+    
+        
+            
+            
+            
+            
+        
+    
+    
+    
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-	
-	
-	
-	
-	
-		
-			
+        
+    
+    
+    
+              
+                
+                    
+                        
+                    
+                
+                
+                  
+                        
+                                    
+                
+                
+                                  
+                        
+                    
+                
+    
+    
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
-						
-							
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
+                            
-						
-						
-							
-								
-									
-										
-											
+                        
+                            
+                                
+                                    
+                                        
+                                            
-										
-									
-								
-							
-						
-					
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
+                                    
+                                
+                            
+                        
+                    
+                    
+                
+				  
+            
+        
+    
+    
+    
+        
+            
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			
-		
-	
-	
-	
-	
-	
-		
-			
+                
+            
+        
+    
+    
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
-						
-							
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
+                            
-						
-						
-							
-								
-									
-										
-											
+                        
+                            
+                                
+                                    
+                                        
+                                            
-										
-									
-								
-							
-						
-					
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-			
-		
-	
-	
-	
-		
-			
-				
+                                        
+                                    
+                                
+                            
+                        
+                    
+                    
+                
+                
 					
 						
+								
+                
+            
+        
+    
+    
+    
+        
+            
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			
-		
-	
-	
-	
-	
-	
-		
-			
+                
+            
+        
+    
+    
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
-						
-							
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
+                            
-							
-								
-									
-								
-							
-						
-					
-					
-						
-							
+                                
+                                    
+                                
+                            
+                        
+                    
+                    
+                        
+                            
-						
-						
-							
-								
-									
-										
-											
+                        
+                            
+                                
+                                    
+                                        
+                                            
-										
-									
-								
-							
-						
-					
-				
-				
-					
-						
-					
-					
-						
-							
-							
-							
-						
-					
-				
-				
-					
-						
+                                    
+                                
+                            
+                        
+                    
+                
+                
+                
+                    
+                        
-					
-					
-						
-							
-							
-						
-					
-				
-				
-					
-						
+                    
+                        
+                            
+                            
+                        
+                    
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-				
-					
-						
+                
+                
+                    
+                        
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-			
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
+                
+            
+        
+    
+    
+    
+        
+            
+                
+            
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			
-			
-		
-	
-	
-	
-	
-	
-		
-			
-				
+                
+            
+            
+        
+    
+    
+    
+    
+    
+        
+            
+                
-			
-		
-		
-			
-				
-					
-						
-							
+        
+        
+            
+                
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
+                    
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                    
-					
-						
-							
-						
-					
-				
-			
-		
-		
-			
-				
-					
-						
-							
+                        
+                            
+                        
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-				
-			
-		
-		
-			
-				
+                    
+                
+            
+        
+        
+            
+                
-			
-		
-	
-	
-	
-		
-			
-				
-					
+        
+    
+    
+    
+        
+            
+                
+                    
-				
-			
-			
-				
-					
+            
+            
+                
+                    
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
-							
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                                
+                                    
+                                
+                            
+                        
+
+                    
+                    
+                        
+                            
-						
-					
-				
-			
-		
-		
-			
-				
+                    
+                
+            
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-			
-				
-					
-					
-				
-			
-		
-		
-			
-				
+            
+                
+                    
+                    
+                
+            
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
-					
-				
-			    
-				  
-					 
-				 
-							
-			
-		
-	
-	
-	
-	
-	
-		
-			
+                
+                
+                    
+                        
+                    
+                
+            
+        
+    
+    
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
-						
-							
-								
-									
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
+                            
+                                
+                                    
-								
-								
-									
-										
-											
-												
-													
-														
+                                
+                                    
+                                        
+                                            
+                                                
+                                                    
+                                                        
-													
-												
-											
-											
-												
-													
+                                                
+                                            
+                                            
+                                                
+                                                    
-												
-											
-										
-									
-								
-							
-							
-								
-									
+                                            
+                                        
+                                    
+                                
+                            
+                            
+                                
+                                    
-								
-								
-									
-										
-											
-										
-									
-								
-							
-						
-						
-							
-								
+                                
+                                    
+                                        
+                                            
+                                        
+                                    
+                                
+                            
+                        
+                        
+                            
+                                
-							
-							
-								
-									
-										
-											
-												
+                            
+                                
+                                    
+                                        
+                                            
+                                                
-											
-										
-									
-								
-							
-						
-					
-					
-						
-							
+                                        
+                                    
+                                
+                            
+                        
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-					
-					
-						
-							
+                    
+                    
+                        
+                            
-						
-						
-							
-								
-								
-								
-								
-								
-								
-								
-								
-								
-							
-						
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
+                        
+                            
+                                
+                                
+                                
+                                
+                                
+                                
+                                
+                                
+                                
+                            
+                        
+                    
+                
+            
+        
+    
+    
+    
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-			
-				
-			
-		
-	
-	
-	
-		
-			
-				
+            
+                
+            
+        
+    
+    
+    
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-			
-				
-					
-					
-					
-				
-			
-		
-		
-			
-				
+            
+                
+                    
+                    
+                    
+                
+            
+        
+        
+            
+                
-			
-		
-	
-	
-	
-		
-			
+        
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-				
-			
-			
-				
-					
+                
+                    
+                
+            
+        
+        
+            
+                
+                
+            
+            
+                
+                    
-				
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-		
-	
-	
-	
-		
-			
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+        
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
-						
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
+                        
-					
-					
-						
-							
-								
-									
-									
-									
-								
-							
-						
-						
-						
-					
-				
-			
-			
-				
-					
-				
-			
-			
-			
-			
-				
-					
-				
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-			
-				
-					
+                    
+                        
+                            
+                                
+                                    
+                                    
+                                    
+                                
+                            
+                        
+                        
+                        
+                    
+                
+            
+            
+                
+                    
+                
+            
+            
+            
+            
+                
+                    
+                
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+                
+                    
-				
-			
-			
-				
-					
-				
-			
-			
-				
-					
-				
-			
-		
-	
-	
-	
-		
-			
+            
+            
+                
+                    
+                
+            
+            
+                
+                    
+                
+            
+        
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-			
-			
-				
-					
+                
+                    
+                
+            
+        
+        
+            
+                
+            
+            
+                
+                    
-					
-						
-							
-						
-					
-				
-			
-			
-				
-					
+                        
+                            
+                        
+                    
+                
+            
+            
+                
+                    
-					
-						
-							
-						
-					
-				
-			
-			
-				
-					
+                        
+                            
+                        
+                    
+                
+            
+            
+                
+                    
-				
-			
-			
-				
-					
+            
+            
+                
+                    
-				
-			
-		
-	
-	
-	
-		
-			
-				
+            
+        
+    
+    
+    
+        
+            
+                
-				
-					
-				
-			
-		
-		
-			
-				
+                    
+                
+            
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-		
-			
-				
+        
+        
+            
+                
-			
-		
-	
-	
-	
-		
-			
+        
+    
+    
+    
+        
+            
-			
-				
-					
-				
-			
-		
-		
-			
-				
-					
+                
+                    
+                
+            
+        
+        
+            
+                
+                    
-				
-			
-			
-				
-					
-						
-						
-					
-				
-			
-			
-				
-					
+            
+            
+                
+                    
+                        
+                        
+                    
+                
+            
+            
+                
+                    
-				
-			
-			
-			
-			
-			
-				
-					
+            
+            
+            
+            
+            
+                
+                    
-				
-			
-			
-				
-					
+            
+            
+                
+                    
-				
-			
-			
-				
-					
+            
+            
+                
+                    
-				
-			
-		
-	
-	
-	
-		
-			
-				
-					
-						
-					
-					
-					
-				
-			
-		
-	
-	
-	
-		
-			
-				
-				
-			
-		
-	
-	
-	
-		
-			
-				
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                        
+                    
+                    
+                    
+                
+            
+        
+    
+    
+    
+        
+            
+                
+                
+            
+        
+    
+    
+    
+        
+            
+                
                     The reference to a GemfireTemplate.
                     Will default to 'gemfireTemplate'.
                 
-			
-		
-	
-	
-	
-		
-			
-				
-					
-				
-			
-		
-		
-	
-	
-	
-		
-			
-		
-		
-		
-			
-				
-					
-					
-					
-					
-				
-			
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-		
-	
-	
-	
-		
-			
-			
-			
-		
-	
-	
-	
-		
-			
-			
-			
-			
-		
-	
+            
+        
+    
+    
+    
+        
+            
+                
+                    
+                
+            
+        
+        
+    
+    
+    
+        
+            
+        
+        
+        
+            
+                
+                    
+                    
+                    
+                    
+                
+            
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+    
+    
+    
+        
+            
+            
+            
+        
+    
+    
+    
+        
+            
+            
+            
+            
+        
+    
+    
+    
+        
+            
+        
+        
+                
+                
+                
+         
+    
 
diff --git a/src/test/java/org/springframework/data/gemfire/config/ClientRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/ClientRegionNamespaceTest.java
index e7e4ae7e..57fac6a3 100644
--- a/src/test/java/org/springframework/data/gemfire/config/ClientRegionNamespaceTest.java
+++ b/src/test/java/org/springframework/data/gemfire/config/ClientRegionNamespaceTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -21,8 +21,6 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import java.io.File;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,11 +40,13 @@ import com.gemstone.gemfire.cache.EvictionAction;
 import com.gemstone.gemfire.cache.EvictionAlgorithm;
 import com.gemstone.gemfire.cache.EvictionAttributes;
 import com.gemstone.gemfire.cache.InterestResultPolicy;
+import com.gemstone.gemfire.cache.Region;
 import com.gemstone.gemfire.cache.RegionAttributes;
 import com.gemstone.gemfire.cache.util.ObjectSizer;
 
 /**
  * @author Costin Leau
+ * @author David Turanski
  */
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration("client-ns.xml")
@@ -72,7 +72,7 @@ public class ClientRegionNamespaceTest {
 		assertEquals(DataPolicy.EMPTY, TestUtils.readField("dataPolicy", fb));
 	}
 
-	//@Test
+	// @Test
 	public void testComplexClient() throws Exception {
 		assertTrue(context.containsBean("complex"));
 		ClientRegionFactoryBean fb = context.getBean("&complex", ClientRegionFactoryBean.class);
@@ -87,7 +87,8 @@ public class ClientRegionNamespaceTest {
 		Interest keyInt = ints[0];
 		assertTrue((Boolean) TestUtils.readField("durable", keyInt));
 		assertEquals(InterestResultPolicy.KEYS, TestUtils.readField("policy", keyInt));
-		//assertEquals(Object.class, TestUtils.readField("key", keyInt).getClass());
+		// assertEquals(Object.class, TestUtils.readField("key",
+		// keyInt).getClass());
 
 		// regex interest
 		RegexInterest regexInt = (RegexInterest) ints[1];
@@ -99,14 +100,10 @@ public class ClientRegionNamespaceTest {
 	@Test
 	public void testPersistent() throws Exception {
 		assertTrue(context.containsBean("persistent"));
-		ClientRegionFactoryBean fb = context.getBean("&persistent", ClientRegionFactoryBean.class);
-		assertEquals(DataPolicy.PERSISTENT_REPLICATE, TestUtils.readField("dataPolicy", fb));
-		RegionAttributes attrs = TestUtils.readField("attributes", fb);
-		File[] diskDirs = attrs.getDiskDirs();
-		assertEquals(1, diskDirs.length);
-		int[] diskDirSizes = attrs.getDiskDirSizes();
-		assertEquals(1, diskDirSizes.length);
-		assertEquals(1, diskDirSizes[0]);
+		Region region = context.getBean("persistent", Region.class);
+		RegionAttributes attrs = region.getAttributes();
+		assertEquals("diskStore", attrs.getDiskStoreName());
+		assertEquals(1, attrs.getDiskDirSizes()[0]);
 	}
 
 	@Test
@@ -116,10 +113,11 @@ public class ClientRegionNamespaceTest {
 		assertEquals(DataPolicy.NORMAL, TestUtils.readField("dataPolicy", fb));
 		RegionAttributes attrs = TestUtils.readField("attributes", fb);
 		EvictionAttributes evicAttr = attrs.getEvictionAttributes();
-		assertEquals(EvictionAction.LOCAL_DESTROY, evicAttr.getAction());
+		assertEquals(EvictionAction.OVERFLOW_TO_DISK, evicAttr.getAction());
 		assertEquals(EvictionAlgorithm.LRU_MEMORY, evicAttr.getAlgorithm());
-		// for some reason GemFire resets this to 56 on my machine (not sure why)
-		//assertEquals(10, evicAttr.getMaximum());
+		// for some reason GemFire resets this to 56 on my machine (not sure
+		// why)
+		// assertEquals(10, evicAttr.getMaximum());
 		ObjectSizer sizer = evicAttr.getObjectSizer();
 		assertEquals(SimpleObjectSizer.class, sizer.getClass());
 	}
diff --git a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java
index c4e0bec8..cf262d2c 100644
--- a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java
+++ b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java
@@ -18,10 +18,13 @@ package org.springframework.data.gemfire.config;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,12 +35,16 @@ import org.springframework.data.gemfire.TestUtils;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
+import com.gemstone.gemfire.cache.Cache;
 import com.gemstone.gemfire.cache.DataPolicy;
+import com.gemstone.gemfire.cache.DiskStore;
+import com.gemstone.gemfire.cache.DiskStoreFactory;
 import com.gemstone.gemfire.cache.EvictionAction;
 import com.gemstone.gemfire.cache.EvictionAlgorithm;
 import com.gemstone.gemfire.cache.EvictionAttributes;
 import com.gemstone.gemfire.cache.ExpirationAction;
 import com.gemstone.gemfire.cache.ExpirationAttributes;
+import com.gemstone.gemfire.cache.Region;
 import com.gemstone.gemfire.cache.RegionAttributes;
 import com.gemstone.gemfire.cache.Scope;
 import com.gemstone.gemfire.cache.util.ObjectSizer;
@@ -52,20 +59,50 @@ public class DiskStoreAndEvictionRegionParsingTest {
 	@Autowired
 	private ApplicationContext context;
 
+	@Autowired
+	DiskStore diskStore1;
+
+	private static File diskStoreDir;
+
+	@BeforeClass
+	public static void setUp() {
+		String path = "./build/tmp";
+		diskStoreDir = new File(path);
+		if (!diskStoreDir.exists()) {
+			diskStoreDir.mkdir();
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() {
+		for (File file : diskStoreDir.listFiles()) {
+			file.delete();
+		}
+		diskStoreDir.delete();
+	}
+
+	@Test
+	public void testDiskStore() {
+		assertEquals("diskStore1", diskStore1.getName());
+		assertEquals(50, diskStore1.getQueueSize());
+		assertEquals(true, diskStore1.getAutoCompact());
+		assertEquals(DiskStoreFactory.DEFAULT_COMPACTION_THRESHOLD, diskStore1.getCompactionThreshold());
+		assertEquals(9999, diskStore1.getTimeInterval());
+		assertEquals(10, diskStore1.getMaxOplogSize());
+		assertEquals(diskStoreDir, diskStore1.getDiskDirs()[0]);
+		Cache cache = context.getBean("gemfire-cache", Cache.class);
+		assertSame(diskStore1, cache.findDiskStore("diskStore1"));
+	}
+
 	@Test
 	public void testReplicaDataOptions() throws Exception {
 		assertTrue(context.containsBean("replicated-data"));
 		RegionFactoryBean fb = context.getBean("&replicated-data", RegionFactoryBean.class);
-		assertEquals(DataPolicy.PERSISTENT_REPLICATE, TestUtils.readField("dataPolicy", fb));
+		assertEquals(DataPolicy.REPLICATE, TestUtils.readField("dataPolicy", fb));
 		assertEquals(Scope.DISTRIBUTED_ACK, TestUtils.readField("scope", fb));
-		RegionAttributes attrs = TestUtils.readField("attributes", fb);
-		File[] diskDirs = attrs.getDiskDirs();
-		assertEquals(1, diskDirs.length);
-		int[] diskDirSizes = attrs.getDiskDirSizes();
-		assertEquals(1, diskDirSizes.length);
-		assertEquals(1, diskDirSizes[0]);
-
+		Region region = context.getBean("replicated-data", Region.class);
 		// eviction tests
+		RegionAttributes attrs = TestUtils.readField("attributes", fb);
 		EvictionAttributes evicAttr = attrs.getEvictionAttributes();
 		assertEquals(EvictionAction.OVERFLOW_TO_DISK, evicAttr.getAction());
 		assertEquals(EvictionAlgorithm.LRU_ENTRY, evicAttr.getAlgorithm());
@@ -77,13 +114,14 @@ public class DiskStoreAndEvictionRegionParsingTest {
 	public void testPartitionDataOptions() throws Exception {
 		assertTrue(context.containsBean("partition-data"));
 		RegionFactoryBean fb = context.getBean("&partition-data", RegionFactoryBean.class);
-		assertEquals(DataPolicy.PARTITION, TestUtils.readField("dataPolicy", fb));
+		assertEquals(DataPolicy.PERSISTENT_PARTITION, TestUtils.readField("dataPolicy", fb));
 		RegionAttributes attrs = TestUtils.readField("attributes", fb);
 		EvictionAttributes evicAttr = attrs.getEvictionAttributes();
 		assertEquals(EvictionAction.LOCAL_DESTROY, evicAttr.getAction());
 		assertEquals(EvictionAlgorithm.LRU_MEMORY, evicAttr.getAlgorithm());
-		// for some reason GemFire resets this to 56 on my machine (not sure why)
-		//assertEquals(10, evicAttr.getMaximum());
+		// for some reason GemFire resets this to 56 on my machine (not sure
+		// why)
+		// assertEquals(10, evicAttr.getMaximum());
 		ObjectSizer sizer = evicAttr.getObjectSizer();
 		assertEquals(SimpleObjectSizer.class, sizer.getClass());
 	}
@@ -109,6 +147,5 @@ public class DiskStoreAndEvictionRegionParsingTest {
 		ExpirationAttributes regionTTI = attrs.getRegionIdleTimeout();
 		assertEquals(400, regionTTI.getTimeout());
 		assertEquals(ExpirationAction.INVALIDATE, regionTTI.getAction());
-
 	}
 }
\ No newline at end of file
diff --git a/src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java
deleted file mode 100644
index dff269dc..00000000
--- a/src/test/java/org/springframework/data/gemfire/config/DiskStoreNamespaceTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2010-2012 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 static org.junit.Assert.assertEquals;
-
-import java.io.File;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.gemstone.gemfire.cache.DiskStore;
-import com.gemstone.gemfire.cache.DiskStoreFactory;
-
-/**
- * @author David Turanski
- * 
- */
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("diskstore-ns-new.xml")
-public class DiskStoreNamespaceTest {
-	private static File diskStoreDir;
-
-	@Autowired
-	DiskStore diskStore1;
-
-	@Test
-	public void testDiskStore() {
-		assertEquals("diskStore1", diskStore1.getName());
-		assertEquals(50, diskStore1.getQueueSize());
-		assertEquals(true, diskStore1.getAutoCompact());
-		assertEquals(DiskStoreFactory.DEFAULT_COMPACTION_THRESHOLD, diskStore1.getCompactionThreshold());
-		assertEquals(9999, diskStore1.getTimeInterval());
-		assertEquals(10, diskStore1.getMaxOplogSize());
-		assertEquals(diskStoreDir, diskStore1.getDiskDirs()[0]);
-	}
-
-	@BeforeClass
-	public static void setUp() {
-		String path = "./build/tmp";
-		diskStoreDir = new File(path);
-		if (!diskStoreDir.exists()) {
-			diskStoreDir.mkdir();
-		}
-	}
-
-	@AfterClass
-	public static void tearDown() {
-		for (File file : diskStoreDir.listFiles()) {
-			file.delete();
-		}
-		diskStoreDir.delete();
-	}
-}
diff --git a/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java
index 3d93d42f..d646e752 100644
--- a/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java
+++ b/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java
@@ -34,7 +34,6 @@ import org.springframework.util.ObjectUtils;
 
 import com.gemstone.gemfire.cache.Cache;
 import com.gemstone.gemfire.cache.CacheListener;
-import com.gemstone.gemfire.cache.DataPolicy;
 import com.gemstone.gemfire.cache.Region;
 import com.gemstone.gemfire.cache.RegionAttributes;
 import com.gemstone.gemfire.cache.Scope;
@@ -50,15 +49,15 @@ public class LocalRegionNamespaceTest {
 	private ApplicationContext context;
 
 	@Test
-	public void testBasicReplica() throws Exception {
+	public void testBasicLocal() throws Exception {
 		assertTrue(context.containsBean("simple"));
 	}
 
 	@Test
-	public void testPublishingReplica() throws Exception {
+	public void testPublishingLocal() throws Exception {
 		assertTrue(context.containsBean("pub"));
 		RegionFactoryBean fb = context.getBean("&pub", RegionFactoryBean.class);
-		assertEquals(DataPolicy.NORMAL, TestUtils.readField("dataPolicy", fb));
+		assertEquals("NORMAL", TestUtils.readField("dataPolicyName", fb));
 		assertEquals(Scope.LOCAL, TestUtils.readField("scope", fb));
 		assertEquals("publisher", TestUtils.readField("name", fb));
 		RegionAttributes attrs = TestUtils.readField("attributes", fb);
@@ -66,7 +65,7 @@ public class LocalRegionNamespaceTest {
 	}
 
 	@Test
-	public void testComplexReplica() throws Exception {
+	public void testComplexLocal() throws Exception {
 		assertTrue(context.containsBean("complex"));
 		RegionFactoryBean fb = context.getBean("&complex", RegionFactoryBean.class);
 		CacheListener[] listeners = TestUtils.readField("cacheListeners", fb);
@@ -78,6 +77,19 @@ public class LocalRegionNamespaceTest {
 		assertSame(context.getBean("c-writer"), TestUtils.readField("cacheWriter", fb));
 	}
 
+	@Test
+	public void testLocalWithAttributes() throws Exception {
+		assertTrue(context.containsBean("local-with-attributes"));
+		Region region = context.getBean("local-with-attributes", Region.class);
+		RegionAttributes attrs = region.getAttributes();
+		assertEquals(10, attrs.getInitialCapacity());
+		assertEquals(true, attrs.getIgnoreJTA());
+		assertEquals(false, attrs.getIndexMaintenanceSynchronous());
+		assertEquals(String.class, attrs.getKeyConstraint());
+		assertEquals(String.class, attrs.getValueConstraint());
+		assertEquals(true, attrs.isDiskSynchronous());
+	}
+
 	@Test
 	public void testRegionLookup() throws Exception {
 		Cache cache = context.getBean(Cache.class);
diff --git a/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java
index 15b6624b..d04d0527 100644
--- a/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java
+++ b/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java
@@ -48,7 +48,7 @@ public class PartitionedRegionNamespaceTest {
 	private ApplicationContext context;
 
 	@Test
-	public void testBasicReplica() throws Exception {
+	public void testBasicPartition() throws Exception {
 		assertTrue(context.containsBean("simple"));
 	}
 
diff --git a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java
index 415dc7ea..2d08792c 100644
--- a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java
+++ b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java
@@ -78,6 +78,25 @@ public class ReplicatedRegionNamespaceTest {
 		assertSame(context.getBean("c-writer"), TestUtils.readField("cacheWriter", fb));
 	}
 
+	@Test
+	public void testReplicaWithAttributes() throws Exception {
+		assertTrue(context.containsBean("replicated-with-attributes"));
+		Region region = context.getBean("replicated-with-attributes", Region.class);
+		RegionAttributes attrs = region.getAttributes();
+		assertEquals(10, attrs.getInitialCapacity());
+		assertEquals(true, attrs.getIgnoreJTA());
+		assertEquals(false, attrs.getIndexMaintenanceSynchronous());
+		assertEquals(String.class, attrs.getKeyConstraint());
+		assertEquals(String.class, attrs.getValueConstraint());
+		assertEquals(true, attrs.isDiskSynchronous());
+		assertEquals(Scope.GLOBAL, attrs.getScope());
+		assertEquals(true, attrs.isLockGrantor());
+		assertEquals(true, attrs.getEnableAsyncConflation());
+		assertEquals(true, attrs.getEnableSubscriptionConflation());
+		assertEquals(0.50, attrs.getLoadFactor(), 0.001);
+		assertEquals(false, attrs.getCloningEnabled());
+	}
+
 	@Test
 	public void testRegionLookup() throws Exception {
 		Cache cache = context.getBean(Cache.class);
diff --git a/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml
index bce2ec77..e8b675c9 100644
--- a/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml
+++ b/src/test/resources/org/springframework/data/gemfire/config/client-ns.xml
@@ -32,18 +32,14 @@
 		
 	
 
-	
-		
-			
-		
-	
+	
+ 
+     
+            
+     
 	
-	
-		
-			
-		
-
-		
+	
+		
 			
 				
 			
diff --git a/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml b/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml
deleted file mode 100644
index 0ce704d0..00000000
--- a/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns-new.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-	
-    
-        ./build/tmp
-        50
-        true
-        10
-        9999
-        1
-    
-    
-    
-
-	
-		
-	
-
\ No newline at end of file
diff --git a/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml
index ba11cf0c..b9941aae 100644
--- a/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml
+++ b/src/test/resources/org/springframework/data/gemfire/config/diskstore-ns.xml
@@ -10,44 +10,48 @@
 		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
 
-	 
-       300
-     
-
+    
+    
+        ./build/tmp
+        50
+        true
+        10
+        9999
+        1
+        300
+    
+    
     
-    
-		
-	
-    
-    
-        
-    
-	
-	
-		
-			
-		
 
+    
+        
+    
+ 
+
+
+
+	
+	
 		
 		
 
 		
 		
 		
-		
+		
 	
  	
- 	
-	
-		
-			
-		 
-
+	
 		
 			
 				
 			
 		
 	
-	
+    
+        
+            
+    
+ 
 
\ No newline at end of file
diff --git a/src/test/resources/org/springframework/data/gemfire/config/local-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/local-ns.xml
index 7fc7f302..e3656389 100644
--- a/src/test/resources/org/springframework/data/gemfire/config/local-ns.xml
+++ b/src/test/resources/org/springframework/data/gemfire/config/local-ns.xml
@@ -22,6 +22,16 @@
 		
 		
 	
+    
+    
 	
 	
 	
diff --git a/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml
index 3fe3436a..855beec5 100644
--- a/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml
+++ b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml
@@ -23,6 +23,21 @@
 		
 	
 	
+    
+    
 	
 	
 	

From 1467ec0668ec5fdf10cd31cf1ad9aa01ca03f08d Mon Sep 17 00:00:00 2001
From: David Turanski 
Date: Thu, 28 Jun 2012 13:32:05 -0400
Subject: [PATCH 07/17] Updated copyright, fixed support for transaction
 handlers, added initializers

---
 .../data/gemfire/CacheFactoryBean.java        |   60 +-
 .../data/gemfire/DeclarableSupport.java       |   25 +-
 .../data/gemfire/DiskStoreFactoryBean.java    |    2 +-
 .../data/gemfire/GemfireAccessor.java         |    2 +-
 .../gemfire/GemfireBeanFactoryLocator.java    |    2 +-
 .../data/gemfire/GemfireCacheUtils.java       |    2 +-
 .../data/gemfire/GemfireCallback.java         |    2 +-
 .../gemfire/GemfireCancellationException.java |    2 +-
 .../data/gemfire/GemfireIndexException.java   |    2 +-
 .../data/gemfire/GemfireQueryException.java   |    2 +-
 .../data/gemfire/GemfireSystemException.java  |    2 +-
 .../data/gemfire/GemfireTemplate.java         |    2 +-
 .../GemfireTransactionCommitException.java    |    2 +-
 .../gemfire/GemfireTransactionManager.java    |   80 +-
 .../data/gemfire/IndexFactoryBean.java        |    2 +-
 .../PartitionAttributesFactoryBean.java       |    2 +-
 .../gemfire/RegionAttributesFactoryBean.java  |    2 +-
 .../data/gemfire/RegionFactoryBean.java       |    9 +-
 .../data/gemfire/RegionLookupFactoryBean.java |    2 +-
 .../data/gemfire/WiringDeclarableSupport.java |    2 +-
 .../client/ClientCacheFactoryBean.java        |    2 +-
 .../data/gemfire/client/Interest.java         |    2 +-
 .../data/gemfire/client/PoolConnection.java   |    2 +-
 .../data/gemfire/client/PoolFactoryBean.java  |    2 +-
 .../data/gemfire/client/RegexInterest.java    |    2 +-
 .../data/gemfire/config/CacheParser.java      |   33 +-
 .../gemfire/config/CacheServerParser.java     |    2 +-
 .../gemfire/config/ClientCacheParser.java     |    7 +-
 .../data/gemfire/config/DiskStoreParser.java  |    1 +
 .../DiskWriteAttributesFactoryBean.java       |    2 +-
 .../config/EvictionAttributesFactoryBean.java |    2 +-
 .../data/gemfire/config/EvictionType.java     |    2 +-
 .../GemfireListenerContainerParser.java       |    2 +-
 .../config/GemfireNamespaceHandler.java       |    2 +-
 .../data/gemfire/config/IndexParser.java      |    2 +-
 .../data/gemfire/config/ParsingUtils.java     |    2 +
 .../config/PartitionedRegionParser.java       |    2 -
 .../data/gemfire/config/PoolParser.java       |    2 +-
 .../config/TransactionManagerParser.java      |    3 +-
 .../listener/ContinuousQueryDefinition.java   |    2 +-
 .../listener/ContinuousQueryListener.java     |    2 +-
 .../ContinuousQueryListenerContainer.java     |    2 +-
 ...mfireListenerExecutionFailedException.java |    2 +-
 .../ContinuousQueryListenerAdapter.java       |    2 +-
 .../AsmInstantiatorGenerator.java             |    2 +-
 .../gemfire/serialization/EnumSerializer.java |    2 +-
 .../InstantiatorFactoryBean.java              |    2 +-
 .../serialization/InstantiatorGenerator.java  |    2 +-
 .../serialization/WiringInstantiator.java     |    2 +-
 .../server/CacheServerFactoryBean.java        |    2 +-
 .../server/SubscriptionEvictionPolicy.java    |    2 +-
 .../data/gemfire/support/GemfireCache.java    |    2 +-
 .../gemfire/support/GemfireCacheManager.java  |    2 +-
 .../gemfire/support/GemfireDaoSupport.java    |    2 +-
 .../gemfire/config/spring-gemfire-1.2.xsd     | 2939 ++++++++---------
 .../data/gemfire/CacheIntegrationTest.java    |    2 +-
 .../data/gemfire/DeclarableSupportTest.java   |    2 +-
 .../data/gemfire/ForkUtil.java                |    2 +-
 .../GemfireBeanFactoryLocatorTest.java        |    2 +-
 .../data/gemfire/GemfireTemplateTest.java     |    2 +-
 .../springframework/data/gemfire/Init.java    |    2 +-
 .../data/gemfire/RecreatingContextTest.java   |    2 +-
 .../data/gemfire/SimpleCacheListener.java     |    2 +-
 .../data/gemfire/SimpleCacheLoader.java       |    2 +-
 .../data/gemfire/SimpleCacheWriter.java       |    2 +-
 .../data/gemfire/SimpleObjectSizer.java       |    2 +-
 .../data/gemfire/SimplePartitionResolver.java |    2 +-
 .../data/gemfire/TestUtils.java               |    2 +-
 .../data/gemfire/TxIntegrationTest.java       |    2 +-
 .../data/gemfire/UserObject.java              |    2 +-
 .../gemfire/client/RegionIntegrationTest.java |    2 +-
 .../gemfire/config/CacheInitializerTest.java  |   94 +
 .../gemfire/config/CacheNamespaceTest.java    |    2 +-
 .../config/CacheServerNamespaceTest.java      |    2 +-
 ...DiskStoreAndEvictionRegionParsingTest.java |    2 +-
 .../gemfire/config/IndexNamespaceTest.java    |    2 +-
 .../PartitionedRegionNamespaceTest.java       |    2 +-
 .../gemfire/config/PoolNamespaceTest.java     |    2 +-
 .../config/ReplicatedRegionNamespaceTest.java |    2 +
 .../gemfire/config/TxEventHandlersTest.java   |  133 +
 .../config/TxManagerNamespaceTest.java        |    2 +-
 .../data/gemfire/fork/CacheServerProcess.java |    2 +-
 .../data/gemfire/listener/GemfireMDP.java     |    2 +-
 .../listener/ListenerContainerTests.java      |    2 +-
 .../gemfire/listener/StubErrorHandler.java    |    2 +-
 .../listener/ThrowableEventListener.java      |    2 +-
 .../adapter/ContainerXmlSetupTest.java        |    2 +-
 .../adapter/QueryListenerAdapterTest.java     |    2 +-
 .../AsmInstantiatorFactoryTest.java           |    2 +-
 .../serialization/WiringInstantiatorTest.java |    2 +-
 .../support/GemfireDaoSupportTests.java       |    2 +-
 .../gemfire/config/cache-with-initializer.xml |   25 +
 .../data/gemfire/config/replicated-ns.xml     |    2 +
 .../config/tx-listeners-and-writers.xml       |   33 +
 94 files changed, 1911 insertions(+), 1693 deletions(-)
 create mode 100644 src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java
 create mode 100644 src/test/java/org/springframework/data/gemfire/config/TxEventHandlersTest.java
 create mode 100644 src/test/resources/org/springframework/data/gemfire/config/cache-with-initializer.xml
 create mode 100644 src/test/resources/org/springframework/data/gemfire/config/tx-listeners-and-writers.xml

diff --git a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java
index d44e138c..e5366e0b 100644
--- a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java
+++ b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -16,6 +16,7 @@
 
 package org.springframework.data.gemfire;
 
+import java.util.List;
 import java.util.Properties;
 
 import org.apache.commons.logging.Log;
@@ -33,12 +34,17 @@ import org.springframework.dao.DataAccessException;
 import org.springframework.dao.support.PersistenceExceptionTranslator;
 import org.springframework.util.Assert;
 import org.springframework.util.ClassUtils;
+import org.springframework.util.CollectionUtils;
 
 import com.gemstone.gemfire.GemFireException;
 import com.gemstone.gemfire.cache.Cache;
 import com.gemstone.gemfire.cache.CacheClosedException;
 import com.gemstone.gemfire.cache.CacheFactory;
+import com.gemstone.gemfire.cache.CacheTransactionManager;
+import com.gemstone.gemfire.cache.Declarable;
 import com.gemstone.gemfire.cache.GemFireCache;
+import com.gemstone.gemfire.cache.TransactionListener;
+import com.gemstone.gemfire.cache.TransactionWriter;
 import com.gemstone.gemfire.distributed.DistributedMember;
 import com.gemstone.gemfire.distributed.DistributedSystem;
 import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
@@ -64,7 +70,6 @@ import com.gemstone.gemfire.pdx.PdxSerializer;
  */
 public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware, DisposableBean,
 		InitializingBean, FactoryBean, PersistenceExceptionTranslator {
-
 	/**
 	 * Inner class to avoid a hard dependency on the GemFire 6.6 API.
 	 * 
@@ -120,6 +125,12 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl
 			if (messageSyncInterval != null) {
 				cacheImpl.setMessageSyncInterval(messageSyncInterval);
 			}
+
+			if (initializer != null) {
+				// Props are null because already configured in Spring
+				cacheImpl.setInitializer(initializer, null);
+			}
+
 		}
 	}
 
@@ -162,6 +173,12 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl
 
 	protected Integer searchTimeout;
 
+	protected List transactionListeners;
+
+	protected TransactionWriter transactionWriter;
+
+	protected Declarable initializer;
+
 	@Override
 	public void afterPropertiesSet() throws Exception {
 		// initialize locator
@@ -217,16 +234,41 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl
 			if (cacheXml != null) {
 				cache.loadCacheXml(cacheXml.getInputStream());
 
-				if (log.isDebugEnabled())
+				if (log.isDebugEnabled()) {
 					log.debug("Initialized cache from " + cacheXml);
+				}
 			}
 
+			registerTransactionListeners();
+			registerTransactionWriter();
+
 		}
 		finally {
 			th.setContextClassLoader(oldTCCL);
 		}
 	}
 
+	/**
+	 * Register a transaction writer if declared
+	 */
+	protected void registerTransactionWriter() {
+		if (transactionWriter != null) {
+			cache.getCacheTransactionManager().setWriter(transactionWriter);
+		}
+	}
+
+	/**
+	 * Register all declared transaction listeners
+	 */
+	protected void registerTransactionListeners() {
+		if (!CollectionUtils.isEmpty(transactionListeners)) {
+			CacheTransactionManager txManager = cache.getCacheTransactionManager();
+			for (TransactionListener transactionListener : transactionListeners) {
+				txManager.addListener(transactionListener);
+			}
+		}
+	}
+
 	/**
 	 * Sets the PDX properties for the given object. Note this is implementation
 	 * specific as it depends on the type of the factory passed in.
@@ -429,4 +471,16 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl
 		this.searchTimeout = searchTimeout;
 	}
 
+	public void setTransactionListeners(List transactionListeners) {
+		this.transactionListeners = transactionListeners;
+	}
+
+	public void setTransactionWriter(TransactionWriter transactionWriter) {
+		this.transactionWriter = transactionWriter;
+	}
+
+	public void setInitializer(Declarable initializer) {
+		this.initializer = initializer;
+	}
+
 }
\ No newline at end of file
diff --git a/src/main/java/org/springframework/data/gemfire/DeclarableSupport.java b/src/main/java/org/springframework/data/gemfire/DeclarableSupport.java
index 7fd60b62..e93ec3e7 100644
--- a/src/main/java/org/springframework/data/gemfire/DeclarableSupport.java
+++ b/src/main/java/org/springframework/data/gemfire/DeclarableSupport.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -25,18 +25,21 @@ import com.gemstone.gemfire.cache.CacheCallback;
 import com.gemstone.gemfire.cache.Declarable;
 
 /**
- * Convenience class for Spring-aware GemFire Declarable components.
- * Provides a reference to the current Spring application context, e.g. for bean lookup or resource loading.
+ * Convenience class for Spring-aware GemFire Declarable components. Provides a
+ * reference to the current Spring application context, e.g. for bean lookup or
+ * resource loading.
  * 
- * Note that in most cases, one can just declare the same components as Spring beans, through 
- * {@link RegionFactoryBean} which gives access to the full container capabilities and does not enforce the 
- * {@link Declarable} interface to be implemented.
+ * Note that in most cases, one can just declare the same components as Spring
+ * beans, through {@link RegionFactoryBean} which gives access to the full
+ * container capabilities and does not enforce the {@link Declarable} interface
+ * to be implemented.
  * 
  * @author Costin Leau
  */
 public abstract class DeclarableSupport implements CacheCallback, Declarable {
 
 	private String factoryKey = null;
+
 	private BeanFactoryReference bfReference = null;
 
 	public DeclarableSupport() {
@@ -48,8 +51,9 @@ public abstract class DeclarableSupport implements CacheCallback, Declarable {
 	 * 
 	 * {@inheritDoc}
 	 * 
-	 * @see #setFactoryKey(String) 
+	 * @see #setFactoryKey(String)
 	 */
+	@Override
 	public final void init(Properties props) {
 		bfReference = new GemfireBeanFactoryLocator().useBeanFactory(factoryKey);
 		initInstance(props);
@@ -67,15 +71,16 @@ public abstract class DeclarableSupport implements CacheCallback, Declarable {
 		return bfReference.getFactory();
 	}
 
+	@Override
 	public void close() {
 		bfReference.release();
 		bfReference = null;
 	}
 
 	/**
-	 * Sets the key under which the enclosing beanFactory can be found.
-	 * Needed only if multiple beanFactories are used with GemFire inside
-	 * the same class loader / class space.
+	 * Sets the key under which the enclosing beanFactory can be found. Needed
+	 * only if multiple beanFactories are used with GemFire inside the same
+	 * class loader / class space.
 	 * 
 	 * @see GemfireBeanFactoryLocator
 	 * @param key
diff --git a/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java b/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java
index da37c01d..bf1236ad 100644
--- a/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java
+++ b/src/main/java/org/springframework/data/gemfire/DiskStoreFactoryBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireAccessor.java b/src/main/java/org/springframework/data/gemfire/GemfireAccessor.java
index fa847eb6..ebe738ab 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireAccessor.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireAccessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireBeanFactoryLocator.java b/src/main/java/org/springframework/data/gemfire/GemfireBeanFactoryLocator.java
index 2b0eeca2..2f724f82 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireBeanFactoryLocator.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireBeanFactoryLocator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireCacheUtils.java b/src/main/java/org/springframework/data/gemfire/GemfireCacheUtils.java
index cc444b80..e299f379 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireCacheUtils.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireCacheUtils.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireCallback.java b/src/main/java/org/springframework/data/gemfire/GemfireCallback.java
index f20f767e..a8c1a3d7 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireCallback.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireCallback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireCancellationException.java b/src/main/java/org/springframework/data/gemfire/GemfireCancellationException.java
index 44d1eebd..66975a08 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireCancellationException.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireCancellationException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireIndexException.java b/src/main/java/org/springframework/data/gemfire/GemfireIndexException.java
index 937e824b..50a07a84 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireIndexException.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireIndexException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireQueryException.java b/src/main/java/org/springframework/data/gemfire/GemfireQueryException.java
index 600d1dbc..b0a1c483 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireQueryException.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireQueryException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireSystemException.java b/src/main/java/org/springframework/data/gemfire/GemfireSystemException.java
index 5c7e5823..3611db75 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireSystemException.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireSystemException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireTemplate.java b/src/main/java/org/springframework/data/gemfire/GemfireTemplate.java
index 28c6a42b..7f9b0e71 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireTemplate.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireTemplate.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireTransactionCommitException.java b/src/main/java/org/springframework/data/gemfire/GemfireTransactionCommitException.java
index d1545cde..ddc5a470 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireTransactionCommitException.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireTransactionCommitException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 the original author or authors.
+ * Copyright 2011-2012 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.
diff --git a/src/main/java/org/springframework/data/gemfire/GemfireTransactionManager.java b/src/main/java/org/springframework/data/gemfire/GemfireTransactionManager.java
index d7c17f9f..d6207184 100644
--- a/src/main/java/org/springframework/data/gemfire/GemfireTransactionManager.java
+++ b/src/main/java/org/springframework/data/gemfire/GemfireTransactionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2010-2011 the original author or authors.
+ * Copyright 2010-2012 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.
@@ -33,22 +33,26 @@ import com.gemstone.gemfire.cache.CacheTransactionManager;
 import com.gemstone.gemfire.cache.Region;
 
 /**
- * Local transaction manager for GemFire Enterprise Fabric (GEF). Provides a {@link PlatformTransactionManager}
- * implementation for a single GemFire {@link CacheTransactionManager}.
+ * Local transaction manager for GemFire Enterprise Fabric (GEF). Provides a
+ * {@link PlatformTransactionManager} implementation for a single GemFire
+ * {@link CacheTransactionManager}.
  * 
- * Binds one or multiple GemFire regions for the specified {@link Cache} to the thread, potentially allowing for one
- * region per cache model.
+ * Binds one or multiple GemFire regions for the specified {@link Cache} to the
+ * thread, potentially allowing for one region per cache model.
  * 
  * 

- * This local strategy is an alternative to executing cache operations within JTA transactions. Its advantage is that - * is able to work in any environment, for example a stand-alone application or a test suite. It is not able to - * provide XA transactions, for example to share transactions with data access. + * This local strategy is an alternative to executing cache operations within + * JTA transactions. Its advantage is that is able to work in any environment, + * for example a stand-alone application or a test suite. It is not able + * to provide XA transactions, for example to share transactions with data + * access. * *

- * To prevent dirty reads, by default, the cache is configured to return copies rather then direct references for - * get operations. As a workaround, one could use explicitly deep copy objects before making changes + * To prevent dirty reads, by default, the cache is configured to return copies + * rather then direct references for get operations. As a + * workaround, one could use explicitly deep copy objects before making changes * to them to avoid unnecessary copying on every fetch. - * + * * @see com.gemstone.gemfire.cache.CacheTransactionManager * @see com.gemstone.gemfire.cache.Cache#setCopyOnRead(boolean) * @see com.gemstone.gemfire.cache.Region#get(Object) @@ -58,11 +62,13 @@ import com.gemstone.gemfire.cache.Region; * * @author Costin Leau */ -// TODO add lenient behavior if a transaction is already started on the current thread (what should happen then) +// TODO add lenient behavior if a transaction is already started on the current +// thread (what should happen then) public class GemfireTransactionManager extends AbstractPlatformTransactionManager implements InitializingBean, ResourceTransactionManager { private Cache cache; + private boolean copyOnRead = true; /** @@ -81,6 +87,7 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage afterPropertiesSet(); } + @Override public void afterPropertiesSet() { Assert.notNull(cache, "Cache property is required"); cache.setCopyOnRead(copyOnRead); @@ -94,6 +101,7 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage return txObject; } + @Override protected boolean isExistingTransaction(Object transaction) throws TransactionException { CacheTransactionObject txObject = (CacheTransactionObject) transaction; // Consider a pre-bound cache as transaction. @@ -126,29 +134,34 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage @Override protected void doCommit(DefaultTransactionStatus status) throws TransactionException { - //CacheTransactionObject txObject = (CacheTransactionObject) status.getTransaction(); + // CacheTransactionObject txObject = (CacheTransactionObject) + // status.getTransaction(); if (status.isDebug()) { logger.debug("Committing Gemfire local transaction on Cache [" + cache + "]"); } try { cache.getCacheTransactionManager().commit(); - } catch (IllegalStateException ex) { + } + catch (IllegalStateException ex) { throw new NoTransactionException( "No transaction associated with the current thread; are there multiple transaction managers ?", ex); - } catch (TransactionException ex) { + } + catch (TransactionException ex) { throw new GemfireTransactionCommitException("Unexpected failure on commit of Cache local transaction", ex); } } @Override protected void doRollback(DefaultTransactionStatus status) throws TransactionException { - //CacheTransactionObject txObject = (CacheTransactionObject) status.getTransaction(); + // CacheTransactionObject txObject = (CacheTransactionObject) + // status.getTransaction(); if (status.isDebug()) { logger.debug("Rolling back Cache local transaction for [" + cache + "]"); } try { cache.getCacheTransactionManager().rollback(); - } catch (IllegalStateException ex) { + } + catch (IllegalStateException ex) { throw new NoTransactionException( "No transaction associated with the current thread; are there multiple transaction managers ?", ex); } @@ -163,6 +176,7 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage txObject.getHolder().setRollbackOnly(); } + @Override protected void doCleanupAfterCompletion(Object transaction) { // Remove the cache holder from the thread. TransactionSynchronizationManager.unbindResource(cache); @@ -183,7 +197,7 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage } /** - * Sets the Cache that this instance manages local transactions for. + * Sets the Cache that this instance manages local transactions for. * * @param cache Gemfire cache */ @@ -191,12 +205,14 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage this.cache = cache; } + @Override public Object getResourceFactory() { return getCache(); } /** - * Sets the Gemfire {@link Region} (as an alternative in setting in the cache directly). + * Sets the Gemfire {@link Region} (as an alternative in setting in the + * cache directly). * * @param region Gemfire region */ @@ -206,22 +222,24 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage } /** - * Indicates whether the cache returns direct references or copies of the objects (default) it manages. - * While copies imply additional work for every fetch operation, direct references can cause dirty reads - * across concurrent threads in the same VM, whether or not transactions are used. - *

- * One could explicitly deep copy objects before making changes (for example by using {@link com.gemstone.gemfire.CopyHelper#copy(Object)} - * in which case this setting can be set to false. However, unless there is a measurable - * performance penalty, the recommendation is to keep this setting to true - * - * @param copyOnRead whether copies (default) rather then direct references will be returned on - * fetch operations + * Indicates whether the cache returns direct references or copies of the + * objects (default) it manages. While copies imply additional work for + * every fetch operation, direct references can cause dirty reads across + * concurrent threads in the same VM, whether or not transactions are used. + *

+ * One could explicitly deep copy objects before making changes (for example + * by using {@link com.gemstone.gemfire.CopyHelper#copy(Object)} in which + * case this setting can be set to false. However, unless there + * is a measurable performance penalty, the recommendation is to keep this + * setting to true + * + * @param copyOnRead whether copies (default) rather then direct references + * will be returned on fetch operations */ public void setCopyOnRead(boolean copyOnRead) { this.copyOnRead = copyOnRead; } - /** * Indicates whether copy on read is set or not on the transaction manager. * @@ -232,7 +250,6 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage return copyOnRead; } - /** * GemfireTM local transaction object. * @@ -254,7 +271,6 @@ public class GemfireTransactionManager extends AbstractPlatformTransactionManage private boolean rollbackOnly = false; - public boolean isRollbackOnly() { return rollbackOnly; } diff --git a/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java b/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java index fb66051b..4b804a68 100644 --- a/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/IndexFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java index f2826ea7..d294e47a 100644 --- a/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java index 27b1c194..cae9685a 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionAttributesFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java index 87e62529..d8958ab9 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java @@ -143,9 +143,10 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple regionFactory.setDiskStoreName(diskStoreName); } - Assert.state(!attributes.isLockGrantor() || scope.isGlobal(), - "Lock grantor only applies to a global scoped region"); - + if (attributes != null) { + Assert.state(!attributes.isLockGrantor() || scope.isGlobal(), + "Lock grantor only applies to a global scoped region"); + } // get underlying AttributesFactory postProcess(findAttrFactory(regionFactory)); @@ -155,7 +156,7 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple reg.loadSnapshot(snapshot.getInputStream()); } - if (attributes.isLockGrantor()) { + if (attributes != null && attributes.isLockGrantor()) { reg.becomeLockGrantor(); } diff --git a/src/main/java/org/springframework/data/gemfire/RegionLookupFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionLookupFactoryBean.java index 3333203c..86d0dc04 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionLookupFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionLookupFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/WiringDeclarableSupport.java b/src/main/java/org/springframework/data/gemfire/WiringDeclarableSupport.java index fe64c4f4..f44233d6 100644 --- a/src/main/java/org/springframework/data/gemfire/WiringDeclarableSupport.java +++ b/src/main/java/org/springframework/data/gemfire/WiringDeclarableSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. 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 6b0a180c..e9d5441d 100644 --- a/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. 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 0bce0a0f..1fb1a425 100644 --- a/src/main/java/org/springframework/data/gemfire/client/Interest.java +++ b/src/main/java/org/springframework/data/gemfire/client/Interest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/client/PoolConnection.java b/src/main/java/org/springframework/data/gemfire/client/PoolConnection.java index 7a72e0fe..15c6e971 100644 --- a/src/main/java/org/springframework/data/gemfire/client/PoolConnection.java +++ b/src/main/java/org/springframework/data/gemfire/client/PoolConnection.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java b/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java index 74c95361..4b296192 100644 --- a/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/client/RegexInterest.java b/src/main/java/org/springframework/data/gemfire/client/RegexInterest.java index ea14184f..d80afbc6 100644 --- a/src/main/java/org/springframework/data/gemfire/client/RegexInterest.java +++ b/src/main/java/org/springframework/data/gemfire/client/RegexInterest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. 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 1b22964d..4420d919 100644 --- a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java @@ -16,13 +16,18 @@ package org.springframework.data.gemfire.config; +import java.util.List; + import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.support.ManagedList; +import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.CacheFactoryBean; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; /** @@ -30,8 +35,9 @@ import org.w3c.dom.Element; * * @author Costin Leau * @author Oliver Gierke + * @author David Turanski */ -class CacheParser extends AbstractSingleBeanDefinitionParser { +class CacheParser extends AbstractSimpleBeanDefinitionParser { @Override protected Class getBeanClass(Element element) { @@ -39,7 +45,7 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { } @Override - protected void doParse(Element element, BeanDefinitionBuilder builder) { + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { super.doParse(element, builder); ParsingUtils.setPropertyValue(element, builder, "cache-xml-location", "cacheXml"); @@ -55,6 +61,26 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { ParsingUtils.setPropertyValue(element, builder, "lock-lease", "lockLease"); ParsingUtils.setPropertyValue(element, builder, "message-sync-interval", "messageSyncInterval"); ParsingUtils.setPropertyValue(element, builder, "search-timeout", "searchTimeout"); + List txListeners = DomUtils.getChildElementsByTagName(element, "transaction-listener"); + if (!CollectionUtils.isEmpty(txListeners)) { + ManagedList transactionListeners = new ManagedList(); + for (Element txListener : txListeners) { + transactionListeners.add(ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, txListener, + builder)); + } + builder.addPropertyValue("transactionListeners", transactionListeners); + } + Element txWriter = DomUtils.getChildElementByTagName(element, "transaction-writer"); + if (txWriter != null) { + builder.addPropertyValue("transactionWriter", + ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, txWriter, builder)); + } + + Element initializer = DomUtils.getChildElementByTagName(element, "initializer"); + if (initializer != null) { + builder.addPropertyValue("initializer", + ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, initializer, builder)); + } } @Override @@ -66,4 +92,5 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { } return name; } + } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/CacheServerParser.java b/src/main/java/org/springframework/data/gemfire/config/CacheServerParser.java index b2bcafdc..2f1231b3 100644 --- a/src/main/java/org/springframework/data/gemfire/config/CacheServerParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/CacheServerParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. 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 01683e71..bc35bd9e 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. @@ -17,6 +17,7 @@ package org.springframework.data.gemfire.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.client.ClientCacheFactoryBean; import org.w3c.dom.Element; @@ -33,8 +34,8 @@ class ClientCacheParser extends CacheParser { } @Override - protected void doParse(Element element, BeanDefinitionBuilder builder) { - super.doParse(element, builder); + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + super.doParse(element, parserContext, builder); ParsingUtils.setPropertyValue(element, builder, "pool-name", "poolName"); } diff --git a/src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java b/src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java index 7444b28d..9feaf707 100644 --- a/src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/DiskStoreParser.java @@ -29,6 +29,7 @@ import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; /** + * Parser for the <disk-store> definitions. * @author David Turanski * */ diff --git a/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java index 493dc356..95b8c823 100644 --- a/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/config/DiskWriteAttributesFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/config/EvictionAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/config/EvictionAttributesFactoryBean.java index 415343dc..2469863b 100644 --- a/src/main/java/org/springframework/data/gemfire/config/EvictionAttributesFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/config/EvictionAttributesFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/config/EvictionType.java b/src/main/java/org/springframework/data/gemfire/config/EvictionType.java index 880bbf98..79d17efd 100644 --- a/src/main/java/org/springframework/data/gemfire/config/EvictionType.java +++ b/src/main/java/org/springframework/data/gemfire/config/EvictionType.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/config/GemfireListenerContainerParser.java b/src/main/java/org/springframework/data/gemfire/config/GemfireListenerContainerParser.java index 1b58c77f..0139eeaf 100644 --- a/src/main/java/org/springframework/data/gemfire/config/GemfireListenerContainerParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/GemfireListenerContainerParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java b/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java index ca69e83a..80ffcdfa 100644 --- a/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java +++ b/src/main/java/org/springframework/data/gemfire/config/GemfireNamespaceHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/config/IndexParser.java b/src/main/java/org/springframework/data/gemfire/config/IndexParser.java index b97f428c..77296e16 100644 --- a/src/main/java/org/springframework/data/gemfire/config/IndexParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/IndexParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. 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 59e5eb5a..3b7b97a0 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java @@ -236,6 +236,8 @@ abstract class ParsingUtils { setPropertyValue(element, attrBuilder, "initial-capacity"); setPropertyValue(element, attrBuilder, "load-factor"); setPropertyValue(element, attrBuilder, "cloning-enabled"); + setPropertyValue(element, attrBuilder, "concurrency-level"); + setPropertyValue(element, attrBuilder, "multicast-enabled"); String indexUpdateType = element.getAttribute("index-update-type"); if (StringUtils.hasText(indexUpdateType)) { diff --git a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java index 9acbe69b..36a53cf1 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java @@ -65,8 +65,6 @@ class PartitionedRegionParser extends AbstractRegionParser { builder.addPropertyValue("dataPolicy", DataPolicy.PARTITION); } - ParsingUtils.parseScope(element, builder); - BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); diff --git a/src/main/java/org/springframework/data/gemfire/config/PoolParser.java b/src/main/java/org/springframework/data/gemfire/config/PoolParser.java index 968dad4f..27c882dd 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PoolParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PoolParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/config/TransactionManagerParser.java b/src/main/java/org/springframework/data/gemfire/config/TransactionManagerParser.java index b5cf6c65..7143ef44 100644 --- a/src/main/java/org/springframework/data/gemfire/config/TransactionManagerParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/TransactionManagerParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012the 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. @@ -32,6 +32,7 @@ import org.w3c.dom.Element; */ class TransactionManagerParser extends AbstractSingleBeanDefinitionParser { + @Override protected Class getBeanClass(Element element) { return GemfireTransactionManager.class; } diff --git a/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryDefinition.java b/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryDefinition.java index d9fd0934..75daf0fd 100644 --- a/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryDefinition.java +++ b/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryDefinition.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListener.java b/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListener.java index c96581c5..23d75298 100644 --- a/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListener.java +++ b/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListenerContainer.java b/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListenerContainer.java index c4a4db4d..540ae713 100644 --- a/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListenerContainer.java +++ b/src/main/java/org/springframework/data/gemfire/listener/ContinuousQueryListenerContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/listener/GemfireListenerExecutionFailedException.java b/src/main/java/org/springframework/data/gemfire/listener/GemfireListenerExecutionFailedException.java index 63540f6c..36e4cad4 100644 --- a/src/main/java/org/springframework/data/gemfire/listener/GemfireListenerExecutionFailedException.java +++ b/src/main/java/org/springframework/data/gemfire/listener/GemfireListenerExecutionFailedException.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/listener/adapter/ContinuousQueryListenerAdapter.java b/src/main/java/org/springframework/data/gemfire/listener/adapter/ContinuousQueryListenerAdapter.java index 406ff2af..1c32a3eb 100644 --- a/src/main/java/org/springframework/data/gemfire/listener/adapter/ContinuousQueryListenerAdapter.java +++ b/src/main/java/org/springframework/data/gemfire/listener/adapter/ContinuousQueryListenerAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2012 the original author or authors. + * Copyright 2011-2012-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/serialization/AsmInstantiatorGenerator.java b/src/main/java/org/springframework/data/gemfire/serialization/AsmInstantiatorGenerator.java index 3cd71ae5..4530ad92 100644 --- a/src/main/java/org/springframework/data/gemfire/serialization/AsmInstantiatorGenerator.java +++ b/src/main/java/org/springframework/data/gemfire/serialization/AsmInstantiatorGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/serialization/EnumSerializer.java b/src/main/java/org/springframework/data/gemfire/serialization/EnumSerializer.java index 54f5f0f0..80b739ec 100644 --- a/src/main/java/org/springframework/data/gemfire/serialization/EnumSerializer.java +++ b/src/main/java/org/springframework/data/gemfire/serialization/EnumSerializer.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorFactoryBean.java b/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorFactoryBean.java index 83bbafce..5505f9c6 100644 --- a/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorGenerator.java b/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorGenerator.java index 4c05a9eb..df61fb71 100644 --- a/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorGenerator.java +++ b/src/main/java/org/springframework/data/gemfire/serialization/InstantiatorGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/serialization/WiringInstantiator.java b/src/main/java/org/springframework/data/gemfire/serialization/WiringInstantiator.java index 33472f1b..57a93846 100644 --- a/src/main/java/org/springframework/data/gemfire/serialization/WiringInstantiator.java +++ b/src/main/java/org/springframework/data/gemfire/serialization/WiringInstantiator.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/server/CacheServerFactoryBean.java b/src/main/java/org/springframework/data/gemfire/server/CacheServerFactoryBean.java index ea800a54..9a8ae8dc 100644 --- a/src/main/java/org/springframework/data/gemfire/server/CacheServerFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/server/CacheServerFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/server/SubscriptionEvictionPolicy.java b/src/main/java/org/springframework/data/gemfire/server/SubscriptionEvictionPolicy.java index d7c1efda..b46a24ea 100644 --- a/src/main/java/org/springframework/data/gemfire/server/SubscriptionEvictionPolicy.java +++ b/src/main/java/org/springframework/data/gemfire/server/SubscriptionEvictionPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/support/GemfireCache.java b/src/main/java/org/springframework/data/gemfire/support/GemfireCache.java index f6a1282c..390b308b 100644 --- a/src/main/java/org/springframework/data/gemfire/support/GemfireCache.java +++ b/src/main/java/org/springframework/data/gemfire/support/GemfireCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/support/GemfireCacheManager.java b/src/main/java/org/springframework/data/gemfire/support/GemfireCacheManager.java index a94e9495..17fd981a 100644 --- a/src/main/java/org/springframework/data/gemfire/support/GemfireCacheManager.java +++ b/src/main/java/org/springframework/data/gemfire/support/GemfireCacheManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/main/java/org/springframework/data/gemfire/support/GemfireDaoSupport.java b/src/main/java/org/springframework/data/gemfire/support/GemfireDaoSupport.java index 97a652d3..b287b768 100644 --- a/src/main/java/org/springframework/data/gemfire/support/GemfireDaoSupport.java +++ b/src/main/java/org/springframework/data/gemfire/support/GemfireDaoSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd index 85f4a2b6..20d5b2b9 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd @@ -1,92 +1,112 @@ - - - - - - - + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - + + + + namespace and its 'properties' element. ]]> - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - + + + + + + + + + - - - - - - + + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - + + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - + + + + + + + - - - - - + + + + - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - - + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - + + + + - - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - + + + + + + + - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The reference to a GemfireTemplate. Will default to 'gemfireTemplate'. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java b/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java index dd197edf..ab9da468 100644 --- a/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java +++ b/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/DeclarableSupportTest.java b/src/test/java/org/springframework/data/gemfire/DeclarableSupportTest.java index 618932e7..3997fd9c 100644 --- a/src/test/java/org/springframework/data/gemfire/DeclarableSupportTest.java +++ b/src/test/java/org/springframework/data/gemfire/DeclarableSupportTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/ForkUtil.java b/src/test/java/org/springframework/data/gemfire/ForkUtil.java index d00007a2..350d767e 100644 --- a/src/test/java/org/springframework/data/gemfire/ForkUtil.java +++ b/src/test/java/org/springframework/data/gemfire/ForkUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/GemfireBeanFactoryLocatorTest.java b/src/test/java/org/springframework/data/gemfire/GemfireBeanFactoryLocatorTest.java index 9e319e07..8629bb35 100644 --- a/src/test/java/org/springframework/data/gemfire/GemfireBeanFactoryLocatorTest.java +++ b/src/test/java/org/springframework/data/gemfire/GemfireBeanFactoryLocatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/GemfireTemplateTest.java b/src/test/java/org/springframework/data/gemfire/GemfireTemplateTest.java index 69f2665e..762e4a22 100644 --- a/src/test/java/org/springframework/data/gemfire/GemfireTemplateTest.java +++ b/src/test/java/org/springframework/data/gemfire/GemfireTemplateTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/Init.java b/src/test/java/org/springframework/data/gemfire/Init.java index 7c873d6a..2d9c69ca 100644 --- a/src/test/java/org/springframework/data/gemfire/Init.java +++ b/src/test/java/org/springframework/data/gemfire/Init.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/RecreatingContextTest.java b/src/test/java/org/springframework/data/gemfire/RecreatingContextTest.java index f2282dc1..8ffd4a61 100644 --- a/src/test/java/org/springframework/data/gemfire/RecreatingContextTest.java +++ b/src/test/java/org/springframework/data/gemfire/RecreatingContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/SimpleCacheListener.java b/src/test/java/org/springframework/data/gemfire/SimpleCacheListener.java index 76e6220d..c6c923d4 100644 --- a/src/test/java/org/springframework/data/gemfire/SimpleCacheListener.java +++ b/src/test/java/org/springframework/data/gemfire/SimpleCacheListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/SimpleCacheLoader.java b/src/test/java/org/springframework/data/gemfire/SimpleCacheLoader.java index 40df9573..0e174d0a 100644 --- a/src/test/java/org/springframework/data/gemfire/SimpleCacheLoader.java +++ b/src/test/java/org/springframework/data/gemfire/SimpleCacheLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/SimpleCacheWriter.java b/src/test/java/org/springframework/data/gemfire/SimpleCacheWriter.java index 486af831..89642282 100644 --- a/src/test/java/org/springframework/data/gemfire/SimpleCacheWriter.java +++ b/src/test/java/org/springframework/data/gemfire/SimpleCacheWriter.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/SimpleObjectSizer.java b/src/test/java/org/springframework/data/gemfire/SimpleObjectSizer.java index d8c140e4..b1149704 100644 --- a/src/test/java/org/springframework/data/gemfire/SimpleObjectSizer.java +++ b/src/test/java/org/springframework/data/gemfire/SimpleObjectSizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/SimplePartitionResolver.java b/src/test/java/org/springframework/data/gemfire/SimplePartitionResolver.java index cf46a0c3..284a0dc8 100644 --- a/src/test/java/org/springframework/data/gemfire/SimplePartitionResolver.java +++ b/src/test/java/org/springframework/data/gemfire/SimplePartitionResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/TestUtils.java b/src/test/java/org/springframework/data/gemfire/TestUtils.java index 39e615b9..25dbbde5 100644 --- a/src/test/java/org/springframework/data/gemfire/TestUtils.java +++ b/src/test/java/org/springframework/data/gemfire/TestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/TxIntegrationTest.java b/src/test/java/org/springframework/data/gemfire/TxIntegrationTest.java index 755eeae0..e6b8e3b6 100644 --- a/src/test/java/org/springframework/data/gemfire/TxIntegrationTest.java +++ b/src/test/java/org/springframework/data/gemfire/TxIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/UserObject.java b/src/test/java/org/springframework/data/gemfire/UserObject.java index 59311c60..8f84a309 100644 --- a/src/test/java/org/springframework/data/gemfire/UserObject.java +++ b/src/test/java/org/springframework/data/gemfire/UserObject.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/client/RegionIntegrationTest.java b/src/test/java/org/springframework/data/gemfire/client/RegionIntegrationTest.java index 68e59c6e..97fb1adc 100644 --- a/src/test/java/org/springframework/data/gemfire/client/RegionIntegrationTest.java +++ b/src/test/java/org/springframework/data/gemfire/client/RegionIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java b/src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java new file mode 100644 index 00000000..307a8c56 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2010-2012 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 static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +import java.util.Properties; + +import javax.annotation.Resource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.BeanNameAware; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.Declarable; + +/** + * @author David Turanski + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("cache-with-initializer.xml") +public class CacheInitializerTest { + @Autowired + TestInitializer cacheInitializer; + + @Resource(name = "gemfire-cache") + Cache cache; + + @Test + public void test() throws Exception { + assertNotNull(cache.getInitializer()); + assertSame(cacheInitializer, cache.getInitializer()); + // assertEquals("cacheInitializer", cacheInitializer.value); + + } + + public static class TestInitializer implements Declarable, BeanNameAware { + + private String name; + + public String value; + + private String first; + + private String last; + + @Override + public void setBeanName(String name) { + this.name = name; + } + + public String getFirst() { + return first; + } + + public void setFirst(String first) { + this.first = first; + } + + public String getLast() { + return last; + } + + public void setLast(String last) { + this.last = last; + } + + @Override + public void init(Properties props) { + this.value = this.name; + }; + } + +} diff --git a/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java index 8b5b2ec5..c9194ced 100644 --- a/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/config/CacheServerNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/CacheServerNamespaceTest.java index 023d5750..13b12113 100644 --- a/src/test/java/org/springframework/data/gemfire/config/CacheServerNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/CacheServerNamespaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java index cf262d2c..026cc4d9 100644 --- a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/config/IndexNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/IndexNamespaceTest.java index ecd60028..012c92bd 100644 --- a/src/test/java/org/springframework/data/gemfire/config/IndexNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/IndexNamespaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java index d04d0527..237bb1ad 100644 --- a/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java index f0719580..cd11c51a 100644 --- a/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java index 2d08792c..218f603a 100644 --- a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java @@ -95,6 +95,8 @@ public class ReplicatedRegionNamespaceTest { assertEquals(true, attrs.getEnableSubscriptionConflation()); assertEquals(0.50, attrs.getLoadFactor(), 0.001); assertEquals(false, attrs.getCloningEnabled()); + assertEquals(10, attrs.getConcurrencyLevel()); + assertEquals(true, attrs.getMulticastEnabled()); } @Test diff --git a/src/test/java/org/springframework/data/gemfire/config/TxEventHandlersTest.java b/src/test/java/org/springframework/data/gemfire/config/TxEventHandlersTest.java new file mode 100644 index 00000000..618c5cf1 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/TxEventHandlersTest.java @@ -0,0 +1,133 @@ +/* + * Copyright 2010-2012 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 static org.junit.Assert.assertEquals; + +import javax.annotation.Resource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.BeanNameAware; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.TransactionEvent; +import com.gemstone.gemfire.cache.TransactionListener; +import com.gemstone.gemfire.cache.TransactionWriter; +import com.gemstone.gemfire.cache.TransactionWriterException; + +/** + * @author David Turanski + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("tx-listeners-and-writers.xml") +public class TxEventHandlersTest { + @Autowired + TestListener txListener1; + + @Autowired + TestListener txListener2; + + @Autowired + TestWriter txWriter; + + @Resource(name = "gemfire-cache") + Cache cache; + + @Resource(name = "local") + Region local; + + @Test + public void test() throws Exception { + cache.getCacheTransactionManager().begin(); + local.put("hello", "world"); + cache.getCacheTransactionManager().commit(); + assertEquals("txListener1", txListener1.value); + assertEquals("txListener2", txListener2.value); + assertEquals("txWriter", txWriter.value); + + } + + public static class TestListener implements TransactionListener, BeanNameAware { + + private String name; + + public String value; + + public boolean closed; + + public boolean afterCommit; + + @Override + public void close() { + closed = true; + + } + + @Override + public void afterCommit(TransactionEvent arg0) { + afterCommit = true; + value = name; + } + + @Override + public void afterFailedCommit(TransactionEvent arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void afterRollback(TransactionEvent arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void setBeanName(String name) { + this.name = name; + }; + } + + public static class TestWriter implements TransactionWriter, BeanNameAware { + + private String name; + + public String value; + + @Override + public void close() { + // TODO Auto-generated method stub + + } + + @Override + public void beforeCommit(TransactionEvent arg0) throws TransactionWriterException { + this.value = name; + + } + + @Override + public void setBeanName(String name) { + this.name = name; + }; + + } +} diff --git a/src/test/java/org/springframework/data/gemfire/config/TxManagerNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/TxManagerNamespaceTest.java index f6d1e4a6..babb5c3f 100644 --- a/src/test/java/org/springframework/data/gemfire/config/TxManagerNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/TxManagerNamespaceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/fork/CacheServerProcess.java b/src/test/java/org/springframework/data/gemfire/fork/CacheServerProcess.java index 76ff596b..3f5bfbc7 100644 --- a/src/test/java/org/springframework/data/gemfire/fork/CacheServerProcess.java +++ b/src/test/java/org/springframework/data/gemfire/fork/CacheServerProcess.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/listener/GemfireMDP.java b/src/test/java/org/springframework/data/gemfire/listener/GemfireMDP.java index f64cec97..0dbf6372 100644 --- a/src/test/java/org/springframework/data/gemfire/listener/GemfireMDP.java +++ b/src/test/java/org/springframework/data/gemfire/listener/GemfireMDP.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/listener/ListenerContainerTests.java b/src/test/java/org/springframework/data/gemfire/listener/ListenerContainerTests.java index 5344de04..24969471 100644 --- a/src/test/java/org/springframework/data/gemfire/listener/ListenerContainerTests.java +++ b/src/test/java/org/springframework/data/gemfire/listener/ListenerContainerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/listener/StubErrorHandler.java b/src/test/java/org/springframework/data/gemfire/listener/StubErrorHandler.java index 7aad6baf..65bbe67c 100644 --- a/src/test/java/org/springframework/data/gemfire/listener/StubErrorHandler.java +++ b/src/test/java/org/springframework/data/gemfire/listener/StubErrorHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/listener/ThrowableEventListener.java b/src/test/java/org/springframework/data/gemfire/listener/ThrowableEventListener.java index 19e8f405..3c4daf50 100644 --- a/src/test/java/org/springframework/data/gemfire/listener/ThrowableEventListener.java +++ b/src/test/java/org/springframework/data/gemfire/listener/ThrowableEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/listener/adapter/ContainerXmlSetupTest.java b/src/test/java/org/springframework/data/gemfire/listener/adapter/ContainerXmlSetupTest.java index 8fee892d..e9743c4b 100644 --- a/src/test/java/org/springframework/data/gemfire/listener/adapter/ContainerXmlSetupTest.java +++ b/src/test/java/org/springframework/data/gemfire/listener/adapter/ContainerXmlSetupTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/listener/adapter/QueryListenerAdapterTest.java b/src/test/java/org/springframework/data/gemfire/listener/adapter/QueryListenerAdapterTest.java index a3126ce4..b5d5c964 100644 --- a/src/test/java/org/springframework/data/gemfire/listener/adapter/QueryListenerAdapterTest.java +++ b/src/test/java/org/springframework/data/gemfire/listener/adapter/QueryListenerAdapterTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2012 the original author or authors. + * Copyright 2011-2012-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/serialization/AsmInstantiatorFactoryTest.java b/src/test/java/org/springframework/data/gemfire/serialization/AsmInstantiatorFactoryTest.java index aac59925..0e7c80aa 100644 --- a/src/test/java/org/springframework/data/gemfire/serialization/AsmInstantiatorFactoryTest.java +++ b/src/test/java/org/springframework/data/gemfire/serialization/AsmInstantiatorFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/serialization/WiringInstantiatorTest.java b/src/test/java/org/springframework/data/gemfire/serialization/WiringInstantiatorTest.java index 8d09482c..cf1ce7db 100644 --- a/src/test/java/org/springframework/data/gemfire/serialization/WiringInstantiatorTest.java +++ b/src/test/java/org/springframework/data/gemfire/serialization/WiringInstantiatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 the original author or authors. + * Copyright 2010-2012 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. diff --git a/src/test/java/org/springframework/data/gemfire/support/GemfireDaoSupportTests.java b/src/test/java/org/springframework/data/gemfire/support/GemfireDaoSupportTests.java index 5b369dda..2a7b8537 100644 --- a/src/test/java/org/springframework/data/gemfire/support/GemfireDaoSupportTests.java +++ b/src/test/java/org/springframework/data/gemfire/support/GemfireDaoSupportTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 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. diff --git a/src/test/resources/org/springframework/data/gemfire/config/cache-with-initializer.xml b/src/test/resources/org/springframework/data/gemfire/config/cache-with-initializer.xml new file mode 100644 index 00000000..142f129e --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/cache-with-initializer.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml index 855beec5..e8c5ce65 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/replicated-ns.xml @@ -36,6 +36,8 @@ enable-subscription-conflation="true" load-factor="0.5" cloning-enabled="false" + concurrency-level="10" + multicast-enabled="true" /> diff --git a/src/test/resources/org/springframework/data/gemfire/config/tx-listeners-and-writers.xml b/src/test/resources/org/springframework/data/gemfire/config/tx-listeners-and-writers.xml new file mode 100644 index 00000000..91a8d41c --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/tx-listeners-and-writers.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From bb34beb224530d80c562f66dd1b877b3b8e36d93 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Tue, 3 Jul 2012 10:01:49 -0400 Subject: [PATCH 08/17] added dynamic region and jndi binding support --- build.gradle | 2 + .../data/gemfire/CacheFactoryBean.java | 147 ++++++++++++++++-- .../data/gemfire/config/CacheParser.java | 104 +++++++++++-- .../gemfire/config/ClientCacheParser.java | 10 ++ .../gemfire/config/spring-gemfire-1.2.xsd | 119 +++++++++++--- .../data/gemfire/CacheIntegrationTest.java | 6 +- .../gemfire/config/CacheInitializerTest.java | 94 ----------- .../gemfire/config/CacheNamespaceTest.java | 22 ++- .../config/DynamicRegionNamespaceTest.java | 52 +++++++ .../data/gemfire/config/JndiBindingsTest.java | 46 ++++++ .../data/gemfire/config/cache-ns.xml | 2 + ...-initializer.xml => dynamic-region-ns.xml} | 14 +- .../data/gemfire/config/jndi-binding-ns.xml | 29 ++++ 13 files changed, 490 insertions(+), 157 deletions(-) delete mode 100644 src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java create mode 100644 src/test/java/org/springframework/data/gemfire/config/DynamicRegionNamespaceTest.java create mode 100644 src/test/java/org/springframework/data/gemfire/config/JndiBindingsTest.java rename src/test/resources/org/springframework/data/gemfire/config/{cache-with-initializer.xml => dynamic-region-ns.xml} (60%) create mode 100644 src/test/resources/org/springframework/data/gemfire/config/jndi-binding-ns.xml diff --git a/build.gradle b/build.gradle index cf091d31..a71bf38e 100644 --- a/build.gradle +++ b/build.gradle @@ -97,6 +97,8 @@ dependencies { // Spring Data compile "org.springframework.data:spring-data-commons-core:${springDataCommonsVersion}" + // + testCompile "org.apache.derby:derbyLocale_zh_TW:10.9.1.0" } javaprojects = rootProject diff --git a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java index e5366e0b..d0922b23 100644 --- a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java @@ -16,7 +16,9 @@ package org.springframework.data.gemfire; +import java.io.File; import java.util.List; +import java.util.Map; import java.util.Properties; import org.apache.commons.logging.Log; @@ -41,13 +43,15 @@ import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheClosedException; import com.gemstone.gemfire.cache.CacheFactory; import com.gemstone.gemfire.cache.CacheTransactionManager; -import com.gemstone.gemfire.cache.Declarable; +import com.gemstone.gemfire.cache.DynamicRegionFactory; import com.gemstone.gemfire.cache.GemFireCache; import com.gemstone.gemfire.cache.TransactionListener; import com.gemstone.gemfire.cache.TransactionWriter; import com.gemstone.gemfire.distributed.DistributedMember; import com.gemstone.gemfire.distributed.DistributedSystem; import com.gemstone.gemfire.internal.cache.GemFireCacheImpl; +import com.gemstone.gemfire.internal.datasource.ConfigProperty; +import com.gemstone.gemfire.internal.jndi.JNDIInvoker; import com.gemstone.gemfire.pdx.PdxSerializable; import com.gemstone.gemfire.pdx.PdxSerializer; @@ -125,12 +129,81 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl if (messageSyncInterval != null) { cacheImpl.setMessageSyncInterval(messageSyncInterval); } + } + } - if (initializer != null) { - // Props are null because already configured in Spring - cacheImpl.setInitializer(initializer, null); + public static class DynamicRegionSupport { + private String diskDir; + + private String poolName; + + private Boolean persistent = Boolean.TRUE; + + private Boolean registerInterest = Boolean.TRUE; + + public String getDiskDir() { + return diskDir; + } + + public void setDiskDir(String diskDir) { + this.diskDir = diskDir; + } + + public Boolean getPersistent() { + return persistent; + } + + public void setPersistent(Boolean persistent) { + this.persistent = persistent; + } + + public Boolean getRegisterInterest() { + return registerInterest; + } + + public void setRegisterInterest(Boolean registerInterest) { + this.registerInterest = registerInterest; + } + + public String getPoolName() { + return poolName; + } + + public void setPoolName(String poolName) { + this.poolName = poolName; + } + + public void initializeDynamicRegionFactory() { + DynamicRegionFactory.Config config = null; + if (diskDir == null) { + config = new DynamicRegionFactory.Config(null, poolName, persistent, registerInterest); } + else { + config = new DynamicRegionFactory.Config(new File(diskDir), poolName, persistent, registerInterest); + } + DynamicRegionFactory.get().open(config); + } + } + public static class JndiDataSource { + private Map attributes; + + private List props; + + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + public List getProps() { + return props; + } + + public void setProps(List props) { + this.props = props; } } @@ -177,7 +250,13 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl protected TransactionWriter transactionWriter; - protected Declarable initializer; + protected Float evictionHeapPercentage; + + protected Float criticalHeapPercentage; + + protected DynamicRegionSupport dynamicRegionSupport; + + protected List jndiDataSources; @Override public void afterPropertiesSet() throws Exception { @@ -203,6 +282,9 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl msg = "Retrieved existing"; } catch (CacheClosedException ex) { + + initializeDynamicRegionFactory(); + Object factory = createFactory(cfgProps); // GemFire 6.6 specific options @@ -238,16 +320,52 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl log.debug("Initialized cache from " + cacheXml); } } - + setHeapPercentages(); registerTransactionListeners(); registerTransactionWriter(); - + registerJndiDataSources(); } finally { th.setContextClassLoader(oldTCCL); } } + private void registerJndiDataSources() { + if (jndiDataSources != null) { + for (JndiDataSource jndiDataSource : jndiDataSources) { + JNDIInvoker.mapDatasource(jndiDataSource.getAttributes(), jndiDataSource.getProps()); + } + } + } + + /** + * If dynamic regions are enabled, create a DynamicRegionFactory before + * creating the cache + */ + private void initializeDynamicRegionFactory() { + if (dynamicRegionSupport != null) { + dynamicRegionSupport.initializeDynamicRegionFactory(); + } + } + + private void setHeapPercentages() { + if (criticalHeapPercentage != null) { + Assert.isTrue(criticalHeapPercentage > 0.0 && criticalHeapPercentage <= 100.0, + "invalid value specified for criticalHeapPercentage :" + criticalHeapPercentage + + ". Must be > 0.0 and <= 100.0"); + cache.getResourceManager().setCriticalHeapPercentage(criticalHeapPercentage); + + } + + if (evictionHeapPercentage != null) { + Assert.isTrue(evictionHeapPercentage > 0.0 && evictionHeapPercentage <= 100.0, + "invalid value specified for evictionHeapPercentage :" + evictionHeapPercentage + + ". Must be > 0.0 and <= 100.0"); + cache.getResourceManager().setEvictionHeapPercentage(evictionHeapPercentage); + } + + } + /** * Register a transaction writer if declared */ @@ -471,6 +589,14 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl this.searchTimeout = searchTimeout; } + public void setEvictionHeapPercentage(Float evictionHeapPercentage) { + this.evictionHeapPercentage = evictionHeapPercentage; + } + + public void setCriticalHeapPercentage(Float criticalHeapPercentage) { + this.criticalHeapPercentage = criticalHeapPercentage; + } + public void setTransactionListeners(List transactionListeners) { this.transactionListeners = transactionListeners; } @@ -479,8 +605,11 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl this.transactionWriter = transactionWriter; } - public void setInitializer(Declarable initializer) { - this.initializer = initializer; + public void setDynamicRegionSupport(DynamicRegionSupport dynamicRegionSupport) { + this.dynamicRegionSupport = dynamicRegionSupport; } + public void setJndiDataSources(List jndiDataSources) { + this.jndiDataSources = jndiDataSources; + } } \ No newline at end of file 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 4420d919..d8cd9755 100644 --- a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java @@ -22,13 +22,18 @@ import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; +import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.CacheFactoryBean; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Attr; import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; + +import com.gemstone.gemfire.internal.datasource.ConfigProperty; /** * Parser for <cache;gt; definitions. @@ -52,15 +57,18 @@ class CacheParser extends AbstractSimpleBeanDefinitionParser { ParsingUtils.setPropertyReference(element, builder, "properties-ref", "properties"); ParsingUtils.setPropertyReference(element, builder, "pdx-serializer", "pdxSerializer"); ParsingUtils.setPropertyValue(element, builder, "pdx-disk-store", "pdxDiskStoreName"); - ParsingUtils.setPropertyValue(element, builder, "pdx-persistent", "pdxPersistent"); - ParsingUtils.setPropertyValue(element, builder, "pdx-read-serialized", "pdxReadSerialized"); - ParsingUtils.setPropertyValue(element, builder, "pdx-ignore-unread-fields", "pdxIgnoreUnreadFields"); - ParsingUtils.setPropertyValue(element, builder, "use-bean-factory-locator", "useBeanFactoryLocator"); - ParsingUtils.setPropertyValue(element, builder, "copy-on-read", "copyOnRead"); - ParsingUtils.setPropertyValue(element, builder, "lock-timeout", "lockTimeout"); - ParsingUtils.setPropertyValue(element, builder, "lock-lease", "lockLease"); - ParsingUtils.setPropertyValue(element, builder, "message-sync-interval", "messageSyncInterval"); - ParsingUtils.setPropertyValue(element, builder, "search-timeout", "searchTimeout"); + ParsingUtils.setPropertyValue(element, builder, "pdx-persistent"); + ParsingUtils.setPropertyValue(element, builder, "pdx-read-serialized"); + ParsingUtils.setPropertyValue(element, builder, "pdx-ignore-unread-fields"); + ParsingUtils.setPropertyValue(element, builder, "use-bean-factory-locator"); + ParsingUtils.setPropertyValue(element, builder, "copy-on-read"); + ParsingUtils.setPropertyValue(element, builder, "lock-timeout"); + ParsingUtils.setPropertyValue(element, builder, "lock-lease"); + ParsingUtils.setPropertyValue(element, builder, "message-sync-interval"); + ParsingUtils.setPropertyValue(element, builder, "search-timeout"); + ParsingUtils.setPropertyValue(element, builder, "critical-heap-percentage"); + ParsingUtils.setPropertyValue(element, builder, "eviction-heap-percentage"); + List txListeners = DomUtils.getChildElementsByTagName(element, "transaction-listener"); if (!CollectionUtils.isEmpty(txListeners)) { ManagedList transactionListeners = new ManagedList(); @@ -76,10 +84,80 @@ class CacheParser extends AbstractSimpleBeanDefinitionParser { ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, txWriter, builder)); } - Element initializer = DomUtils.getChildElementByTagName(element, "initializer"); - if (initializer != null) { - builder.addPropertyValue("initializer", - ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, initializer, builder)); + parseDynamicRegionFactory(element, builder); + parseJndiBindings(element, builder); + } + + private void parseDynamicRegionFactory(Element element, BeanDefinitionBuilder builder) { + Element dynamicRegionFactory = DomUtils.getChildElementByTagName(element, "dynamic-region-factory"); + if (dynamicRegionFactory != null) { + BeanDefinitionBuilder dynamicRegionSupport = buildDynamicRegionSupport(dynamicRegionFactory); + postProcessDynamicRegionSupport(element, dynamicRegionSupport); + builder.addPropertyValue("dynamicRegionSupport", dynamicRegionSupport.getBeanDefinition()); + } + } + + /** + * @param dynamicRegionSupport BDB for <dynamic-region-factory> + * element + */ + protected void postProcessDynamicRegionSupport(Element element, BeanDefinitionBuilder dynamicRegionSupport) { + + } + + private BeanDefinitionBuilder buildDynamicRegionSupport(Element dynamicRegionFactory) { + BeanDefinitionBuilder result = null; + if (dynamicRegionFactory != null) { + BeanDefinitionBuilder dynamicRegionSupport = BeanDefinitionBuilder + .genericBeanDefinition(CacheFactoryBean.DynamicRegionSupport.class); + String diskDir = dynamicRegionFactory.getAttribute("disk-dir"); + if (StringUtils.hasText(diskDir)) { + dynamicRegionSupport.addPropertyValue("diskDir", diskDir); + } + String persistent = dynamicRegionFactory.getAttribute("persistent"); + if (StringUtils.hasText(persistent)) { + dynamicRegionSupport.addPropertyValue("persistent", persistent); + } + + String registerInterest = dynamicRegionFactory.getAttribute("register-interest"); + if (StringUtils.hasText(registerInterest)) { + dynamicRegionSupport.addPropertyValue("registerInterest", registerInterest); + } + result = dynamicRegionSupport; + } + return result; + } + + private void parseJndiBindings(Element element, BeanDefinitionBuilder builder) { + List jndiBindings = DomUtils.getChildElementsByTagName(element, "jndi-binding"); + if (!CollectionUtils.isEmpty(jndiBindings)) { + ManagedList jndiDataSources = new ManagedList(); + ManagedMap jndiAttributes = new ManagedMap(); + for (Element jndiBinding : jndiBindings) { + BeanDefinitionBuilder jndiDataSource = BeanDefinitionBuilder + .genericBeanDefinition(CacheFactoryBean.JndiDataSource.class); + NamedNodeMap nnm = jndiBinding.getAttributes(); + for (int i = 0; i < nnm.getLength(); i++) { + Attr attr = (Attr) nnm.item(i); + jndiAttributes.put(attr.getLocalName(), attr.getValue()); + } + jndiDataSource.addPropertyValue("attributes", jndiAttributes); + + List jndiProps = DomUtils.getChildElementsByTagName(element, "jndi-prop"); + if (!CollectionUtils.isEmpty(jndiProps)) { + ManagedList props = new ManagedList(); + for (Element jndiProp : jndiProps) { + String key = jndiProp.getAttribute("key"); + String value = jndiProp.getNodeValue(); + String type = StringUtils.hasText(jndiProp.getAttribute("type")) ? jndiProp + .getAttribute("type") : String.class.getName(); + props.add(new ConfigProperty(key, value, type)); + } + jndiDataSource.addPropertyValue("props", props); + } + jndiDataSources.add(jndiDataSource.getBeanDefinition()); + } + builder.addPropertyValue("jndiDataSources", jndiDataSources); } } 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 bc35bd9e..c38ec67c 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ClientCacheParser.java @@ -19,12 +19,14 @@ package org.springframework.data.gemfire.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.client.ClientCacheFactoryBean; +import org.springframework.util.StringUtils; import org.w3c.dom.Element; /** * Parser for <client-cache;gt; definitions. * * @author Costin Leau + * @author David Turanski */ class ClientCacheParser extends CacheParser { @@ -39,4 +41,12 @@ class ClientCacheParser extends CacheParser { ParsingUtils.setPropertyValue(element, builder, "pool-name", "poolName"); } + + @Override + protected void postProcessDynamicRegionSupport(Element element, BeanDefinitionBuilder dynamicRegionSupport) { + String poolName = element.getAttribute("pool-name"); + if (StringUtils.hasText(poolName)) { + dynamicRegionSupport.addPropertyValue("poolName", poolName); + } + } } \ No newline at end of file diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd index 20d5b2b9..a75ac655 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd @@ -30,15 +30,43 @@ and may be nested or referenced. ]]> - + + + + + + + + + + + + + + + + + + + + + + + - @@ -82,15 +110,15 @@ when the same cache is used in multiple application context/bean factories insid @@ -99,7 +127,7 @@ If not set, the metadata will go in the default disk store. @@ -110,11 +138,11 @@ If you are using a WAN gateway, or persistent regions, you should leave this set Sets the object preference to PdxInstance type. When a cached object that was serialized as a PDX is read from the cache a PdxInstance will be returned instead of the actual domain class. The PdxInstance is an interface that provides run time access to the fields of a PDX without deserializing the entire PDX. The PdxInstance implementation is a light weight wrapper -that simply refers to the raw bytes of the PDX that are kept in the cache. Using this method applications can choose to +that simply refers to the raw bytes of the PDX that are kept in the cache. Using this method applications can choose to access PdxInstance instead of Java object. -Note that a PdxInstance is only returned if a serialized PDX is found in the cache. If the cache contains a deserialized PDX, -then a domain class instance is returned instead of a PdxInstance. +Note that a PdxInstance is only returned if a serialized PDX is found in the cache. If the cache contains a deserialized PDX, +then a domain class instance is returned instead of a PdxInstance. ]]> @@ -122,14 +150,33 @@ then a domain class instance is returned instead of a PdxInstance. + + + + + + + + + + @@ -1713,14 +1760,31 @@ The name of the pool used by the index. Used usually in client scenarios. - + + + + + - + + + + + + + + - + @@ -1741,12 +1805,21 @@ The name of the pool used by the index. Used usually in client scenarios. - - - - - - + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java b/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java index ab9da468..e43169d2 100644 --- a/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java +++ b/src/test/java/org/springframework/data/gemfire/CacheIntegrationTest.java @@ -16,7 +16,6 @@ package org.springframework.data.gemfire; - import junit.framework.Assert; import org.junit.Test; @@ -24,9 +23,10 @@ import org.junit.Test; import com.gemstone.gemfire.cache.Cache; /** - * Integration test trying various basic configurations of GemFire through Spring. + * Integration test trying various basic configurations of GemFire through + * Spring. * - * Made abstract to avoid multiple caches running at the same time. + * Made abstract to avoid multiple caches running at the same time. * * @author Costin Leau */ diff --git a/src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java b/src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java deleted file mode 100644 index 307a8c56..00000000 --- a/src/test/java/org/springframework/data/gemfire/config/CacheInitializerTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2010-2012 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 static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; - -import java.util.Properties; - -import javax.annotation.Resource; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.BeanNameAware; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.Declarable; - -/** - * @author David Turanski - * - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("cache-with-initializer.xml") -public class CacheInitializerTest { - @Autowired - TestInitializer cacheInitializer; - - @Resource(name = "gemfire-cache") - Cache cache; - - @Test - public void test() throws Exception { - assertNotNull(cache.getInitializer()); - assertSame(cacheInitializer, cache.getInitializer()); - // assertEquals("cacheInitializer", cacheInitializer.value); - - } - - public static class TestInitializer implements Declarable, BeanNameAware { - - private String name; - - public String value; - - private String first; - - private String last; - - @Override - public void setBeanName(String name) { - this.name = name; - } - - public String getFirst() { - return first; - } - - public void setFirst(String first) { - this.first = first; - } - - public String getLast() { - return last; - } - - public void setLast(String last) { - this.last = last; - } - - @Override - public void init(Properties props) { - this.value = this.name; - }; - } - -} diff --git a/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java index c9194ced..5e75f95a 100644 --- a/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/CacheNamespaceTest.java @@ -16,8 +16,13 @@ package org.springframework.data.gemfire.config; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import org.junit.Test; import org.springframework.core.io.Resource; @@ -79,7 +84,8 @@ public class CacheNamespaceTest extends RecreatingContextTest { try { assertNotNull(locator.useBeanFactory("cache-with-name")); locator.useBeanFactory("no-bl"); - } finally { + } + finally { locator.destroy(); } } @@ -99,4 +105,14 @@ public class CacheNamespaceTest extends RecreatingContextTest { Resource res = TestUtils.readField("cacheXml", cfb); assertEquals("gemfire-client-cache.xml", res.getFilename()); } + + @Test + public void testHeapTunedCache() throws Exception { + assertTrue(ctx.containsBean("heap-tuned-cache")); + CacheFactoryBean cfb = (CacheFactoryBean) ctx.getBean("&heap-tuned-cache"); + Float chp = (Float) TestUtils.readField("criticalHeapPercentage", cfb); + Float ehp = (Float) TestUtils.readField("evictionHeapPercentage", cfb); + assertEquals(70, chp, 0.0001); + assertEquals(60, ehp, 0.0001); + } } \ No newline at end of file diff --git a/src/test/java/org/springframework/data/gemfire/config/DynamicRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/DynamicRegionNamespaceTest.java new file mode 100644 index 00000000..9eee572c --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/DynamicRegionNamespaceTest.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2012 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.springframework.data.gemfire.RecreatingContextTest; + +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.DynamicRegionFactory; + +/** + * @author David Turanski + */ +public class DynamicRegionNamespaceTest extends RecreatingContextTest { + + @Override + protected String location() { + return "org/springframework/data/gemfire/config/dynamic-region-ns.xml"; + } + + @Test + public void testBasicCache() throws Exception { + DynamicRegionFactory drf = DynamicRegionFactory.get(); + assertFalse(drf.isOpen()); + assertNull(drf.getConfig()); + ctx.getBean("gemfire-cache", Cache.class); + assertTrue(drf.isOpen()); + DynamicRegionFactory.Config config = drf.getConfig(); + assertFalse(config.persistBackup); + assertFalse(config.registerInterest); + assertEquals("/foo", config.diskDir.getAbsolutePath()); + } +} \ No newline at end of file diff --git a/src/test/java/org/springframework/data/gemfire/config/JndiBindingsTest.java b/src/test/java/org/springframework/data/gemfire/config/JndiBindingsTest.java new file mode 100644 index 00000000..153bc962 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/JndiBindingsTest.java @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2012 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.springframework.data.gemfire.RecreatingContextTest; + +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.internal.datasource.GemFireBasicDataSource; + +/** + * @author David Turanski + * + */ +public class JndiBindingsTest extends RecreatingContextTest { + + @Override + protected String location() { + return "org/springframework/data/gemfire/config/jndi-binding-ns.xml"; + } + + @Test + public void testJndiBindings() throws Exception { + Cache cache = ctx.getBean("gemfire-cache", Cache.class); + assertNotNull(cache.getJNDIContext().lookup("java:/SimpleDataSource")); + GemFireBasicDataSource ds = (GemFireBasicDataSource) cache.getJNDIContext().lookup("java:/SimpleDataSource"); + assertEquals("org.apache.derby.jdbc.EmbeddedDriver", ds.getJDBCDriver()); + assertEquals(60, ds.getLoginTimeout()); + } +} diff --git a/src/test/resources/org/springframework/data/gemfire/config/cache-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/cache-ns.xml index 75700484..fbe5d6ce 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/cache-ns.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/cache-ns.xml @@ -27,4 +27,6 @@ + + \ No newline at end of file diff --git a/src/test/resources/org/springframework/data/gemfire/config/cache-with-initializer.xml b/src/test/resources/org/springframework/data/gemfire/config/dynamic-region-ns.xml similarity index 60% rename from src/test/resources/org/springframework/data/gemfire/config/cache-with-initializer.xml rename to src/test/resources/org/springframework/data/gemfire/config/dynamic-region-ns.xml index 142f129e..7e343493 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/cache-with-initializer.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/dynamic-region-ns.xml @@ -9,17 +9,7 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> - - - - - - - - - - - - + + \ No newline at end of file diff --git a/src/test/resources/org/springframework/data/gemfire/config/jndi-binding-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/jndi-binding-ns.xml new file mode 100644 index 00000000..547bbac5 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/jndi-binding-ns.xml @@ -0,0 +1,29 @@ + + + + + + hi + newDB + + + \ No newline at end of file From e9d1173b053971ba7229d14b0a720b192664ac5f Mon Sep 17 00:00:00 2001 From: David Turanski Date: Tue, 3 Jul 2012 12:18:33 -0400 Subject: [PATCH 09/17] added membership attributes support --- .../gemfire/config/AbstractRegionParser.java | 5 +- .../gemfire/config/LocalRegionParser.java | 2 +- .../data/gemfire/config/ParsingUtils.java | 30 ++++++++++ .../config/PartitionedRegionParser.java | 2 +- .../config/ReplicatedRegionParser.java | 2 +- .../gemfire/config/spring-gemfire-1.2.xsd | 32 +++++++++++ .../config/MembershipAttributesTest.java | 57 +++++++++++++++++++ .../config/membership-attributes-ns.xml | 21 +++++++ 8 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 src/test/java/org/springframework/data/gemfire/config/MembershipAttributesTest.java create mode 100644 src/test/resources/org/springframework/data/gemfire/config/membership-attributes-ns.xml 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 12e54aa5..dd8618bb 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -89,8 +89,8 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { this.registerBeanDefinition(new BeanDefinitionHolder(subRegionDef, regionPath), parserContext.getRegistry()); } - protected void doParseRegionCommon(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, - BeanDefinitionBuilder attrBuilder, boolean subRegion) { + protected void doParseCommonRegionConfiguration(Element element, ParserContext parserContext, + BeanDefinitionBuilder builder, BeanDefinitionBuilder attrBuilder, boolean subRegion) { if (!subRegion) { String cacheRef = element.getAttribute("cache-ref"); @@ -110,6 +110,7 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { ParsingUtils.parseExpiration(parserContext, element, attrBuilder); ParsingUtils.parseEviction(parserContext, element, attrBuilder); + ParsingUtils.parseMembershipAttributes(parserContext, element, attrBuilder); List subElements = DomUtils.getChildElements(element); diff --git a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java index c5bfbb31..28de5f16 100644 --- a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java @@ -50,7 +50,7 @@ class LocalRegionParser extends AbstractRegionParser { BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); - super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion); + super.doParseCommonRegionConfiguration(element, parserContext, builder, attrBuilder, subRegion); if (!subRegion) { builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); } 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 3b7b97a0..f47c1d60 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.ManagedArray; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; @@ -34,6 +35,9 @@ import org.w3c.dom.Element; import com.gemstone.gemfire.cache.ExpirationAction; import com.gemstone.gemfire.cache.ExpirationAttributes; +import com.gemstone.gemfire.cache.LossAction; +import com.gemstone.gemfire.cache.MembershipAttributes; +import com.gemstone.gemfire.cache.ResumptionAction; import com.gemstone.gemfire.cache.Scope; /** @@ -243,7 +247,33 @@ abstract class ParsingUtils { if (StringUtils.hasText(indexUpdateType)) { attrBuilder.addPropertyValue("indexMaintenanceSynchronous", "synchronous".equals(indexUpdateType)); } + } + static void parseMembershipAttributes(ParserContext parserContext, Element element, + BeanDefinitionBuilder attrBuilder) { + Element membershipAttributes = DomUtils.getChildElementByTagName(element, "membership-attributes"); + if (membershipAttributes != null) { + String requiredRoles[] = StringUtils.commaDelimitedListToStringArray(membershipAttributes + .getAttribute("required-roles")); + String lossActionAttr = membershipAttributes.getAttribute("loss-action"); + LossAction lossAction = StringUtils.hasText(lossActionAttr) ? LossAction.fromName(lossActionAttr + .toUpperCase().replace("-", "_")) : null; + String resumptionActionAttr = membershipAttributes.getAttribute("resumption-action"); + ResumptionAction resumptionAction = StringUtils.hasText(resumptionActionAttr) ? ResumptionAction + .fromName(resumptionActionAttr.toUpperCase().replace("-", "_")) : null; + + ManagedArray requiredRolesArray = new ManagedArray("java.lang.String", requiredRoles.length); + for (int i = 0; i < requiredRoles.length; i++) { + requiredRolesArray.add(requiredRoles[i]); + } + BeanDefinitionBuilder membershipAttributesBuilder = BeanDefinitionBuilder + .genericBeanDefinition(MembershipAttributes.class); + membershipAttributesBuilder.addConstructorArgValue(requiredRolesArray); + membershipAttributesBuilder.addConstructorArgValue(lossAction); + membershipAttributesBuilder.addConstructorArgValue(resumptionAction); + + attrBuilder.addPropertyValue("membershipAttributes", membershipAttributesBuilder.getRawBeanDefinition()); + } } static void parseScope(Element element, BeanDefinitionBuilder builder) { diff --git a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java index 36a53cf1..ed59a4c1 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java @@ -68,7 +68,7 @@ class PartitionedRegionParser extends AbstractRegionParser { BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); - super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion); + super.doParseCommonRegionConfiguration(element, parserContext, builder, attrBuilder, subRegion); // // partition attributes BeanDefinitionBuilder parAttrBuilder = BeanDefinitionBuilder 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 1dba8a8f..f87c99a5 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java @@ -48,7 +48,7 @@ class ReplicatedRegionParser extends AbstractRegionParser { BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); - super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion); + super.doParseCommonRegionConfiguration(element, parserContext, builder, attrBuilder, subRegion); if (!subRegion) { builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); } diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd index a75ac655..6a6adf09 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd @@ -389,6 +389,38 @@ use inner bean declarations. + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/config/MembershipAttributesTest.java b/src/test/java/org/springframework/data/gemfire/config/MembershipAttributesTest.java new file mode 100644 index 00000000..240340a8 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/MembershipAttributesTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2010-2012 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.springframework.data.gemfire.RecreatingContextTest; + +import com.gemstone.gemfire.cache.LossAction; +import com.gemstone.gemfire.cache.MembershipAttributes; +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.ResumptionAction; +import com.gemstone.gemfire.distributed.Role; + +/** + * @author David Turanski + * + */ +public class MembershipAttributesTest extends RecreatingContextTest { + + @Override + protected String location() { + return "org/springframework/data/gemfire/config/membership-attributes-ns.xml"; + } + + @Test + public void testMembershipAttributes() { + Region simple = ctx.getBean("simple", Region.class); + MembershipAttributes ma = simple.getAttributes().getMembershipAttributes(); + assertFalse(ma.hasRequiredRoles()); + + Region secure = ctx.getBean("secure", Region.class); + ma = secure.getAttributes().getMembershipAttributes(); + assertTrue(ma.hasRequiredRoles()); + assertEquals(ResumptionAction.REINITIALIZE, ma.getResumptionAction()); + assertEquals(LossAction.LIMITED_ACCESS, ma.getLossAction()); + for (Role role : ma.getRequiredRoles()) { + assertTrue("ROLE1".equals(role.getName()) || "ROLE2".equals(role.getName())); + } + } +} diff --git a/src/test/resources/org/springframework/data/gemfire/config/membership-attributes-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/membership-attributes-ns.xml new file mode 100644 index 00000000..3eba8ee3 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/membership-attributes-ns.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file From 8e6e43b96e0cae40cef50492a12dc7bd46461554 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Wed, 4 Jul 2012 10:37:44 -0400 Subject: [PATCH 10/17] Refactored region factories --- docs/src/info/changelog.txt | 10 ++-- gradle.properties | 4 +- .../data/gemfire/LocalRegionFactoryBean.java | 46 +++++++++++++++++ .../gemfire/PartitionedRegionFactoryBean.java | 49 +++++++++++++++++++ .../data/gemfire/RegionFactoryBean.java | 42 +++++----------- .../gemfire/ReplicatedRegionFactoryBean.java | 47 ++++++++++++++++++ .../gemfire/config/AbstractRegionParser.java | 5 ++ .../AliasReplacingBeanDefinitionParser.java | 5 +- .../gemfire/config/ClientRegionParser.java | 3 +- .../gemfire/config/LocalRegionParser.java | 17 +++---- .../gemfire/config/LookupRegionParser.java | 16 ++---- .../config/PartitionedRegionParser.java | 30 +++--------- .../config/ReplicatedRegionParser.java | 17 +++---- .../gemfire/config/spring-gemfire-1.2.xsd | 2 +- .../data/gemfire/SubRegionTest.java | 30 ++++++------ ...DiskStoreAndEvictionRegionParsingTest.java | 9 ++-- .../PartitionedRegionNamespaceTest.java | 4 +- .../config/ReplicatedRegionNamespaceTest.java | 4 +- .../data/gemfire/basic-tx-config.xml | 4 +- .../data/gemfire/client/basic-region.xml | 8 +-- 20 files changed, 226 insertions(+), 126 deletions(-) create mode 100644 src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java create mode 100644 src/main/java/org/springframework/data/gemfire/PartitionedRegionFactoryBean.java create mode 100644 src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java diff --git a/docs/src/info/changelog.txt b/docs/src/info/changelog.txt index fcd8e745..4c582513 100644 --- a/docs/src/info/changelog.txt +++ b/docs/src/info/changelog.txt @@ -2,12 +2,14 @@ SPRING DATA GEMFIRE CHANGELOG ============================= http://www.springsource.org/spring-gemfire -Changes in version 1.2.0.M1 (2012-03-20) ----------------------------------------- +Changes in version 1.1.2.RELEASE (2012-07-04) +--------------------------------------------- General -* Introduced support for annotation-based entity mapping (@Id, @PersistenceConstructor, @Id) -* Introduced support for Spring Data Repositories (query exception & derivation) +* Upgraded to GemFire 6.6.3 + +Package org.springframework.data.gemfire.config +* Fixed incorrect parsing of pdx-disk-store attribute Changes in version 1.1.1.RELEASE (2012-03-20) diff --git a/gradle.properties b/gradle.properties index fc45ddf2..d3ceb21a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ slf4jVersion = 1.6.4 # Common libraries springVersion = 3.1.1.RELEASE springDataCommonsVersion = 1.3.0.BUILD-SNAPSHOT -gemfireVersion = 6.6.2 +gemfireVersion = 6.6.3 # Testing junitVersion = 4.8.1 @@ -23,4 +23,4 @@ gemfire.range = "[6.5, 7.0)" # -------------------- # Project wide version # -------------------- -springGemfireVersion=1.1.1.BUILD-SNAPSHOT +springGemfireVersion=1.2.0.BUILD-SNAPSHOT diff --git a/src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java new file mode 100644 index 00000000..e5db8f69 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2012 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; + +import com.gemstone.gemfire.cache.DataPolicy; +import com.gemstone.gemfire.cache.RegionFactory; + +/** + * @author David Turanski + * + */ +public class LocalRegionFactoryBean extends RegionFactoryBean { + + @Override + protected void resolveDataPolicy(RegionFactory regionFactory, boolean persistent, String dataPolicyName) { + if (dataPolicyName != null) { + if ("NORMAL".equals(dataPolicyName) || dataPolicyName == null) { + regionFactory.setDataPolicy(DataPolicy.NORMAL); + } + else if ("PRELOADED".equals(dataPolicyName)) { + regionFactory.setDataPolicy(DataPolicy.PRELOADED); + } + else if ("EMPTY".equals(dataPolicyName)) { + regionFactory.setDataPolicy(DataPolicy.EMPTY); + } + else { + throw new IllegalArgumentException("Data policy '" + dataPolicyName + + "' is unsupported or invalid for local regions."); + } + } + } + +} diff --git a/src/main/java/org/springframework/data/gemfire/PartitionedRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/PartitionedRegionFactoryBean.java new file mode 100644 index 00000000..00764171 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/PartitionedRegionFactoryBean.java @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2012 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; + +import java.util.concurrent.ConcurrentMap; + +import com.gemstone.gemfire.cache.CacheFactory; +import com.gemstone.gemfire.cache.DataPolicy; +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.RegionFactory; + +/** + * @author David Turanski + * + */ +public class PartitionedRegionFactoryBean extends RegionFactoryBean { + + @Override + protected void resolveDataPolicy(RegionFactory regionFactory, boolean persistent, String dataPolicyName) { + if (persistent) { + // check first for GemFire 6.5 + if (ConcurrentMap.class.isAssignableFrom(Region.class)) { + regionFactory.setDataPolicy(DataPolicy.PERSISTENT_PARTITION); + } + else { + throw new IllegalArgumentException( + "Can define persistent partitions only from GemFire 6.5 onwards - current version is [" + + CacheFactory.getVersion() + "]"); + } + } + else { + regionFactory.setDataPolicy(DataPolicy.PARTITION); + } + } + +} diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java index d8958ab9..bafab68a 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java @@ -34,7 +34,6 @@ import com.gemstone.gemfire.cache.CacheClosedException; import com.gemstone.gemfire.cache.CacheListener; import com.gemstone.gemfire.cache.CacheLoader; import com.gemstone.gemfire.cache.CacheWriter; -import com.gemstone.gemfire.cache.DataPolicy; import com.gemstone.gemfire.cache.GemFireCache; import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.RegionAttributes; @@ -54,7 +53,7 @@ import com.gemstone.gemfire.cache.Scope; * @author Costin Leau * @author David Turanski */ -public class RegionFactoryBean extends RegionLookupFactoryBean implements DisposableBean { +public abstract class RegionFactoryBean extends RegionLookupFactoryBean implements DisposableBean { protected final Log log = LogFactory.getLog(getClass()); @@ -74,9 +73,9 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple private Scope scope; - private String diskStoreName; + private boolean persistent; - private DataPolicy dataPolicy; + private String diskStoreName; private String dataPolicyName; @@ -117,23 +116,7 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple regionFactory.setCacheWriter(cacheWriter); } - if (dataPolicy != null) { - regionFactory.setDataPolicy(dataPolicy); - } - - if (dataPolicyName != null) { - Assert.isNull(dataPolicy, "'dataPolicy' and 'dataPolicyName' are mutually exclusive."); - if ("NORMAL".equals(dataPolicyName)) { - regionFactory.setDataPolicy(DataPolicy.NORMAL); - } - else if ("PRELOADED".equals(dataPolicyName)) { - regionFactory.setDataPolicy(DataPolicy.PRELOADED); - } - else { - throw new IllegalArgumentException("Data policy '" + dataPolicyName + "' is unsupported or invalid."); - } - - } + resolveDataPolicy(regionFactory, persistent, dataPolicyName); if (scope != null) { regionFactory.setScope(scope); @@ -163,6 +146,9 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple return reg; } + protected abstract void resolveDataPolicy(RegionFactory regionFactory, boolean persistent, + String dataPolicyName); + @SuppressWarnings("unchecked") private AttributesFactory findAttrFactory(RegionFactory regionFactory) { Field attrField = ReflectionUtils.findField(RegionFactory.class, "attrsFactory", AttributesFactory.class); @@ -297,16 +283,6 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple this.cacheWriter = cacheWriter; } - /** - * Sets the data policy. Used only when a new region is created. Overrides - * the settings specified through {@link #setAttributes(RegionAttributes)}. - * - * @param dataPolicy the region data policy - */ - public void setDataPolicy(DataPolicy dataPolicy) { - this.dataPolicy = dataPolicy; - } - /** * Sets the region scope. Used only when a new region is created. Overrides * the settings specified through {@link #setAttributes(RegionAttributes)}. @@ -318,6 +294,10 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple this.scope = scope; } + public void setPersistent(boolean persistent) { + this.persistent = persistent; + } + /** * Sets the dataPolicy as a String. Required to support property * placeholders diff --git a/src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java new file mode 100644 index 00000000..5d50c439 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2012 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; + +import org.springframework.util.Assert; + +import com.gemstone.gemfire.cache.DataPolicy; +import com.gemstone.gemfire.cache.RegionFactory; + +/** + * @author David Turanski + * + */ +public class ReplicatedRegionFactoryBean extends RegionFactoryBean { + @Override + protected void resolveDataPolicy(RegionFactory regionFactory, boolean persistent, String dataPolicyName) { + + DataPolicy dataPolicy = null; + if (dataPolicyName != null) { + if ("EMPTY".equals(dataPolicyName)) { + Assert.isTrue(!persistent, "Cannot have persistence on an empty region"); + dataPolicy = DataPolicy.EMPTY; + } + else { + throw new IllegalArgumentException("Data policy '" + dataPolicyName + + "' is unsupported or invalid for replicated regions."); + } + } + else { + dataPolicy = persistent ? DataPolicy.PERSISTENT_REPLICATE : DataPolicy.REPLICATE; + } + regionFactory.setDataPolicy(dataPolicy); + } +} 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 dd8618bb..601465fb 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -102,6 +102,11 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { ParsingUtils.parseOptionalRegionAttributes(parserContext, element, attrBuilder); ParsingUtils.parseStatistics(element, attrBuilder); ParsingUtils.setPropertyValue(element, attrBuilder, "publisher"); + if (!isSubRegion(element)) { + ParsingUtils.setPropertyValue(element, builder, "persistent"); + } + // set the data policy + ParsingUtils.setPropertyValue(element, builder, "data-policy", "dataPolicyName"); if (StringUtils.hasText(element.getAttribute("disk-store-ref"))) { ParsingUtils.setPropertyValue(element, builder, "disk-store-ref", "diskStoreName"); diff --git a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java index b744507a..c06b9f19 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AliasReplacingBeanDefinitionParser.java @@ -21,7 +21,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.gemfire.RegionFactoryBean; import org.springframework.data.gemfire.SubRegionFactoryBean; import org.w3c.dom.Element; @@ -43,10 +42,12 @@ abstract class AliasReplacingBeanDefinitionParser extends AbstractSingleBeanDefi return SubRegionFactoryBean.class; } else { - return RegionFactoryBean.class; + return getRegionFactoryClass(); } } + protected abstract Class getRegionFactoryClass(); + @Override protected final void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { 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 fd4f6774..769a9d7e 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ClientRegionParser.java @@ -41,9 +41,8 @@ import com.gemstone.gemfire.cache.DataPolicy; * @author David Turanski */ class ClientRegionParser extends AliasReplacingBeanDefinitionParser { - @Override - protected Class getBeanClass(Element element) { + protected Class getRegionFactoryClass() { return ClientRegionFactoryBean.class; } diff --git a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java index 28de5f16..e948cc58 100644 --- a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java @@ -18,11 +18,10 @@ package org.springframework.data.gemfire.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.gemfire.LocalRegionFactoryBean; import org.springframework.data.gemfire.RegionAttributesFactoryBean; -import org.springframework.util.StringUtils; import org.w3c.dom.Element; -import com.gemstone.gemfire.cache.DataPolicy; import com.gemstone.gemfire.cache.Scope; /** @@ -36,15 +35,6 @@ class LocalRegionParser extends AbstractRegionParser { protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, boolean subRegion) { - // set the data policy - String attr = element.getAttribute("data-policy"); - if (StringUtils.hasText(attr)) { - builder.addPropertyValue("dataPolicyName", attr.toUpperCase()); - } - else { - builder.addPropertyValue("dataPolicy", DataPolicy.NORMAL); - } - builder.addPropertyValue("scope", Scope.LOCAL); BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder @@ -56,4 +46,9 @@ class LocalRegionParser extends AbstractRegionParser { } } + @Override + protected Class getRegionFactoryClass() { + return LocalRegionFactoryBean.class; + } + } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java index 00affd19..b322d155 100644 --- a/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/LookupRegionParser.java @@ -21,7 +21,6 @@ import java.util.List; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.RegionLookupFactoryBean; -import org.springframework.data.gemfire.SubRegionFactoryBean; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; @@ -34,16 +33,6 @@ import org.w3c.dom.Element; */ class LookupRegionParser extends AbstractRegionParser { - @Override - protected Class getBeanClass(Element element) { - if (isSubRegion(element)) { - return SubRegionFactoryBean.class; - } - else { - return RegionLookupFactoryBean.class; - } - } - @Override protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, boolean subRegion) { @@ -69,4 +58,9 @@ class LookupRegionParser extends AbstractRegionParser { } } } + + @Override + protected Class getRegionFactoryClass() { + return RegionLookupFactoryBean.class; + } } diff --git a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java index ed59a4c1..65bdec6d 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java @@ -17,20 +17,16 @@ package org.springframework.data.gemfire.config; import java.util.List; -import java.util.concurrent.ConcurrentMap; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.PartitionAttributesFactoryBean; +import org.springframework.data.gemfire.PartitionedRegionFactoryBean; import org.springframework.data.gemfire.RegionAttributesFactoryBean; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.cache.DataPolicy; -import com.gemstone.gemfire.cache.Region; - /** * Parser for <partitioned-region;gt; definitions. * @@ -41,30 +37,16 @@ import com.gemstone.gemfire.cache.Region; * @author David Turanski */ class PartitionedRegionParser extends AbstractRegionParser { + @Override + protected Class getRegionFactoryClass() { + return PartitionedRegionFactoryBean.class; + } @Override protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, boolean subRegion) { super.doParse(element, builder); - // set the data policy - String attr = element.getAttribute("persistent"); - - if (Boolean.parseBoolean(attr)) { - // check first for GemFire 6.5 - if (ConcurrentMap.class.isAssignableFrom(Region.class)) { - builder.addPropertyValue("dataPolicy", "PERSISTENT_PARTITION"); - } - else { - parserContext.getReaderContext().error( - "Can define persistent partitions only from GemFire 6.5 onwards - current version is [" - + CacheFactory.getVersion() + "]", element); - } - } - else { - builder.addPropertyValue("dataPolicy", DataPolicy.PARTITION); - } - BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); @@ -74,7 +56,7 @@ class PartitionedRegionParser extends AbstractRegionParser { BeanDefinitionBuilder parAttrBuilder = BeanDefinitionBuilder .genericBeanDefinition(PartitionAttributesFactoryBean.class); - attr = element.getAttribute("colocated-with"); + String attr = element.getAttribute("colocated-with"); if (StringUtils.hasText(attr)) { parAttrBuilder.addPropertyValue("colocatedWith", attr); 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 f87c99a5..408f20e2 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java @@ -19,10 +19,9 @@ package org.springframework.data.gemfire.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.data.gemfire.RegionAttributesFactoryBean; +import org.springframework.data.gemfire.ReplicatedRegionFactoryBean; import org.w3c.dom.Element; -import com.gemstone.gemfire.cache.DataPolicy; - /** * Parser for <replicated-region;gt; definitions. * @@ -34,15 +33,6 @@ class ReplicatedRegionParser extends AbstractRegionParser { protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, boolean subRegion) { - // set the data policy - String attr = element.getAttribute("persistent"); - if (Boolean.parseBoolean(attr)) { - builder.addPropertyValue("dataPolicy", DataPolicy.PERSISTENT_REPLICATE); - } - else { - builder.addPropertyValue("dataPolicy", DataPolicy.REPLICATE); - } - ParsingUtils.parseScope(element, builder); BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder @@ -53,4 +43,9 @@ class ReplicatedRegionParser extends AbstractRegionParser { builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); } } + + @Override + protected Class getRegionFactoryClass() { + return ReplicatedRegionFactoryBean.class; + } } \ No newline at end of file diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd index 6a6adf09..543041a9 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.2.xsd @@ -781,6 +781,7 @@ Provides an estimate of the maximum number of application threads that will conc + - diff --git a/src/test/java/org/springframework/data/gemfire/SubRegionTest.java b/src/test/java/org/springframework/data/gemfire/SubRegionTest.java index 86177257..c8d4e10c 100644 --- a/src/test/java/org/springframework/data/gemfire/SubRegionTest.java +++ b/src/test/java/org/springframework/data/gemfire/SubRegionTest.java @@ -27,52 +27,54 @@ import com.gemstone.gemfire.cache.Region; /** * * @author David Turanski - * + * */ public class SubRegionTest extends RecreatingContextTest { @Override protected String location() { - return "org/springframework/data/gemfire/basic-subregion.xml"; + return "org/springframework/data/gemfire/basic-subregion.xml"; } + @SuppressWarnings({ "rawtypes", "unchecked" }) - @Test + @Test public void testBasic() throws Exception { CacheFactoryBean cfb = new CacheFactoryBean(); cfb.setUseBeanFactoryLocator(false); cfb.afterPropertiesSet(); GemFireCache cache = cfb.getObject(); - RegionFactoryBean rfb = new RegionFactoryBean(); + RegionFactoryBean rfb = new ReplicatedRegionFactoryBean(); rfb.setCache(cache); rfb.setName("parent"); rfb.afterPropertiesSet(); Region parent = rfb.getObject(); - + SubRegionFactoryBean srfb = new SubRegionFactoryBean(); srfb.setParent(parent); srfb.setName("/parent/child"); srfb.setRegionName("child"); srfb.afterPropertiesSet(); Region child = srfb.getObject(); - + assertNotNull(parent.getSubregion("child")); - assertSame(child,parent.getSubregion("child")); - + assertSame(child, parent.getSubregion("child")); + cache.close(); } + @SuppressWarnings("rawtypes") - @Test + @Test public void testContext() throws Exception { Region parent = ctx.getBean("parent", Region.class); Region child = ctx.getBean("/parent/child", Region.class); assertNotNull(parent.getSubregion("child")); - assertSame(child,parent.getSubregion("child")); - assertEquals("/parent/child",child.getFullPath()); + assertSame(child, parent.getSubregion("child")); + assertEquals("/parent/child", child.getFullPath()); } - + @SuppressWarnings("rawtypes") - @Test + @Test public void testChildOnly() throws Exception { Region child = ctx.getBean("/parent/child", Region.class); - assertEquals("/parent/child",child.getFullPath()); + assertEquals("/parent/child", child.getFullPath()); } } diff --git a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java index 026cc4d9..df572f52 100644 --- a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java @@ -29,14 +29,15 @@ 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.PartitionedRegionFactoryBean; import org.springframework.data.gemfire.RegionFactoryBean; +import org.springframework.data.gemfire.ReplicatedRegionFactoryBean; import org.springframework.data.gemfire.SimpleObjectSizer; import org.springframework.data.gemfire.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.DataPolicy; import com.gemstone.gemfire.cache.DiskStore; import com.gemstone.gemfire.cache.DiskStoreFactory; import com.gemstone.gemfire.cache.EvictionAction; @@ -98,7 +99,7 @@ public class DiskStoreAndEvictionRegionParsingTest { public void testReplicaDataOptions() throws Exception { assertTrue(context.containsBean("replicated-data")); RegionFactoryBean fb = context.getBean("&replicated-data", RegionFactoryBean.class); - assertEquals(DataPolicy.REPLICATE, TestUtils.readField("dataPolicy", fb)); + assertTrue(fb instanceof ReplicatedRegionFactoryBean); assertEquals(Scope.DISTRIBUTED_ACK, TestUtils.readField("scope", fb)); Region region = context.getBean("replicated-data", Region.class); // eviction tests @@ -114,8 +115,10 @@ public class DiskStoreAndEvictionRegionParsingTest { public void testPartitionDataOptions() throws Exception { assertTrue(context.containsBean("partition-data")); RegionFactoryBean fb = context.getBean("&partition-data", RegionFactoryBean.class); - assertEquals(DataPolicy.PERSISTENT_PARTITION, TestUtils.readField("dataPolicy", fb)); + assertTrue(fb instanceof PartitionedRegionFactoryBean); + assertTrue((Boolean) TestUtils.readField("persistent", fb)); RegionAttributes attrs = TestUtils.readField("attributes", fb); + EvictionAttributes evicAttr = attrs.getEvictionAttributes(); assertEquals(EvictionAction.LOCAL_DESTROY, evicAttr.getAction()); assertEquals(EvictionAlgorithm.LRU_MEMORY, evicAttr.getAlgorithm()); diff --git a/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java index 237bb1ad..e4056f79 100644 --- a/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java @@ -25,6 +25,7 @@ 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.PartitionedRegionFactoryBean; import org.springframework.data.gemfire.RegionFactoryBean; import org.springframework.data.gemfire.SimplePartitionResolver; import org.springframework.data.gemfire.TestUtils; @@ -33,7 +34,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.util.ObjectUtils; import com.gemstone.gemfire.cache.CacheListener; -import com.gemstone.gemfire.cache.DataPolicy; import com.gemstone.gemfire.cache.PartitionAttributes; import com.gemstone.gemfire.cache.RegionAttributes; @@ -56,7 +56,7 @@ public class PartitionedRegionNamespaceTest { public void testPartitionOptions() throws Exception { assertTrue(context.containsBean("options")); RegionFactoryBean fb = context.getBean("&options", RegionFactoryBean.class); - assertEquals(DataPolicy.PARTITION, TestUtils.readField("dataPolicy", fb)); + assertTrue(fb instanceof PartitionedRegionFactoryBean); assertEquals(null, TestUtils.readField("scope", fb)); assertEquals("redundant", TestUtils.readField("name", fb)); diff --git a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java index 218f603a..0184f1d9 100644 --- a/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/ReplicatedRegionNamespaceTest.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.gemfire.RegionFactoryBean; import org.springframework.data.gemfire.RegionLookupFactoryBean; +import org.springframework.data.gemfire.ReplicatedRegionFactoryBean; import org.springframework.data.gemfire.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -34,7 +35,6 @@ import org.springframework.util.ObjectUtils; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheListener; -import com.gemstone.gemfire.cache.DataPolicy; import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.RegionAttributes; import com.gemstone.gemfire.cache.Scope; @@ -58,7 +58,7 @@ public class ReplicatedRegionNamespaceTest { public void testPublishingReplica() throws Exception { assertTrue(context.containsBean("pub")); RegionFactoryBean fb = context.getBean("&pub", RegionFactoryBean.class); - assertEquals(DataPolicy.REPLICATE, TestUtils.readField("dataPolicy", fb)); + assertTrue(fb instanceof ReplicatedRegionFactoryBean); assertEquals(Scope.DISTRIBUTED_ACK, TestUtils.readField("scope", fb)); assertEquals("publisher", TestUtils.readField("name", fb)); RegionAttributes attrs = TestUtils.readField("attributes", fb); diff --git a/src/test/resources/org/springframework/data/gemfire/basic-tx-config.xml b/src/test/resources/org/springframework/data/gemfire/basic-tx-config.xml index 467e5aba..c7ed983f 100644 --- a/src/test/resources/org/springframework/data/gemfire/basic-tx-config.xml +++ b/src/test/resources/org/springframework/data/gemfire/basic-tx-config.xml @@ -8,7 +8,7 @@ - - + + 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 11ad80ed..367acbcb 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 @@ -14,12 +14,12 @@ - + - + - + @@ -48,7 +48,7 @@ - + From 6097749af4e54e68b99371a7472e5094a73e5045 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Sun, 1 Jul 2012 21:33:55 +0300 Subject: [PATCH 11/17] merged first draft build --- build.gradle | 242 ++++---- docs/build.gradle | 101 ---- .../docbook/appendix/appendix-schema.xml | 2 +- docs/src/reference/docbook/index.xml | 5 +- .../src/reference/resources/css/highlight.css | 35 -- docs/src/reference/resources/css/manual.css | 99 ---- .../resources/images/admon/blank.png | Bin 374 -> 0 bytes .../resources/images/admon/caution.gif | Bin 743 -> 0 bytes .../resources/images/admon/caution.png | Bin 1250 -> 0 bytes .../resources/images/admon/caution.tif | Bin 1978 -> 0 bytes .../resources/images/admon/draft.png | Bin 17454 -> 0 bytes .../reference/resources/images/admon/home.gif | Bin 321 -> 0 bytes .../reference/resources/images/admon/home.png | Bin 1156 -> 0 bytes .../resources/images/admon/important.gif | Bin 1003 -> 0 bytes .../resources/images/admon/important.png | Bin 1178 -> 0 bytes .../resources/images/admon/important.tif | Bin 2020 -> 0 bytes .../reference/resources/images/admon/next.gif | Bin 1083 -> 0 bytes .../reference/resources/images/admon/next.png | Bin 1150 -> 0 bytes .../reference/resources/images/admon/note.gif | Bin 580 -> 0 bytes .../reference/resources/images/admon/note.png | Bin 1178 -> 0 bytes .../reference/resources/images/admon/note.tif | Bin 460 -> 0 bytes .../reference/resources/images/admon/prev.gif | Bin 1118 -> 0 bytes .../reference/resources/images/admon/prev.png | Bin 1132 -> 0 bytes .../reference/resources/images/admon/tip.gif | Bin 598 -> 0 bytes .../reference/resources/images/admon/tip.png | Bin 1178 -> 0 bytes .../reference/resources/images/admon/tip.tif | Bin 420 -> 0 bytes .../resources/images/admon/toc-blank.png | Bin 318 -> 0 bytes .../resources/images/admon/toc-minus.png | Bin 259 -> 0 bytes .../resources/images/admon/toc-plus.png | Bin 264 -> 0 bytes .../reference/resources/images/admon/up.gif | Bin 1089 -> 0 bytes .../reference/resources/images/admon/up.png | Bin 1111 -> 0 bytes .../resources/images/admon/warning.gif | Bin 613 -> 0 bytes .../resources/images/admon/warning.png | Bin 3993 -> 0 bytes .../resources/images/admon/warning.tif | Bin 1990 -> 0 bytes .../reference/resources/images/callouts/1.png | Bin 329 -> 0 bytes .../resources/images/callouts/10.png | Bin 361 -> 0 bytes .../resources/images/callouts/11.png | Bin 565 -> 0 bytes .../resources/images/callouts/12.png | Bin 617 -> 0 bytes .../resources/images/callouts/13.png | Bin 623 -> 0 bytes .../resources/images/callouts/14.png | Bin 411 -> 0 bytes .../resources/images/callouts/15.png | Bin 640 -> 0 bytes .../reference/resources/images/callouts/2.png | Bin 353 -> 0 bytes .../reference/resources/images/callouts/3.png | Bin 350 -> 0 bytes .../reference/resources/images/callouts/4.png | Bin 345 -> 0 bytes .../reference/resources/images/callouts/5.png | Bin 348 -> 0 bytes .../reference/resources/images/callouts/6.png | Bin 355 -> 0 bytes .../reference/resources/images/callouts/7.png | Bin 344 -> 0 bytes .../reference/resources/images/callouts/8.png | Bin 357 -> 0 bytes .../reference/resources/images/callouts/9.png | Bin 357 -> 0 bytes docs/src/reference/resources/images/logo.png | Bin 9627 -> 0 bytes .../resources/images/xdev-spring_logo.jpg | Bin 37376 -> 0 bytes docs/src/reference/resources/xsl/fopdf.xsl | 449 --------------- .../reference/resources/xsl/highlight-fo.xsl | 44 -- .../src/reference/resources/xsl/highlight.xsl | 42 -- .../reference/resources/xsl/html-custom.xsl | 145 ----- .../resources/xsl/html-single-custom.xsl | 142 ----- docs/src/reference/resources/xsl/html.xsl | 107 ---- .../reference/resources/xsl/html_chunk.xsl | 221 -------- .../reference/resources/xsl/pdf-custom.xsl | 522 ------------------ gradle/wrapper/gradle-wrapper.jar | Bin 13031 -> 39860 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 110 ++-- gradlew.bat | 54 +- maven.gradle | 172 ++---- settings.gradle | 4 - template.mf | 23 +- 66 files changed, 270 insertions(+), 2253 deletions(-) delete mode 100644 docs/build.gradle delete mode 100644 docs/src/reference/resources/css/highlight.css delete mode 100644 docs/src/reference/resources/css/manual.css delete mode 100644 docs/src/reference/resources/images/admon/blank.png delete mode 100644 docs/src/reference/resources/images/admon/caution.gif delete mode 100644 docs/src/reference/resources/images/admon/caution.png delete mode 100644 docs/src/reference/resources/images/admon/caution.tif delete mode 100644 docs/src/reference/resources/images/admon/draft.png delete mode 100644 docs/src/reference/resources/images/admon/home.gif delete mode 100644 docs/src/reference/resources/images/admon/home.png delete mode 100644 docs/src/reference/resources/images/admon/important.gif delete mode 100644 docs/src/reference/resources/images/admon/important.png delete mode 100644 docs/src/reference/resources/images/admon/important.tif delete mode 100644 docs/src/reference/resources/images/admon/next.gif delete mode 100644 docs/src/reference/resources/images/admon/next.png delete mode 100644 docs/src/reference/resources/images/admon/note.gif delete mode 100644 docs/src/reference/resources/images/admon/note.png delete mode 100644 docs/src/reference/resources/images/admon/note.tif delete mode 100644 docs/src/reference/resources/images/admon/prev.gif delete mode 100644 docs/src/reference/resources/images/admon/prev.png delete mode 100644 docs/src/reference/resources/images/admon/tip.gif delete mode 100644 docs/src/reference/resources/images/admon/tip.png delete mode 100644 docs/src/reference/resources/images/admon/tip.tif delete mode 100644 docs/src/reference/resources/images/admon/toc-blank.png delete mode 100644 docs/src/reference/resources/images/admon/toc-minus.png delete mode 100644 docs/src/reference/resources/images/admon/toc-plus.png delete mode 100644 docs/src/reference/resources/images/admon/up.gif delete mode 100644 docs/src/reference/resources/images/admon/up.png delete mode 100644 docs/src/reference/resources/images/admon/warning.gif delete mode 100644 docs/src/reference/resources/images/admon/warning.png delete mode 100644 docs/src/reference/resources/images/admon/warning.tif delete mode 100644 docs/src/reference/resources/images/callouts/1.png delete mode 100644 docs/src/reference/resources/images/callouts/10.png delete mode 100644 docs/src/reference/resources/images/callouts/11.png delete mode 100644 docs/src/reference/resources/images/callouts/12.png delete mode 100644 docs/src/reference/resources/images/callouts/13.png delete mode 100644 docs/src/reference/resources/images/callouts/14.png delete mode 100644 docs/src/reference/resources/images/callouts/15.png delete mode 100644 docs/src/reference/resources/images/callouts/2.png delete mode 100644 docs/src/reference/resources/images/callouts/3.png delete mode 100644 docs/src/reference/resources/images/callouts/4.png delete mode 100644 docs/src/reference/resources/images/callouts/5.png delete mode 100644 docs/src/reference/resources/images/callouts/6.png delete mode 100644 docs/src/reference/resources/images/callouts/7.png delete mode 100644 docs/src/reference/resources/images/callouts/8.png delete mode 100644 docs/src/reference/resources/images/callouts/9.png delete mode 100644 docs/src/reference/resources/images/logo.png delete mode 100644 docs/src/reference/resources/images/xdev-spring_logo.jpg delete mode 100644 docs/src/reference/resources/xsl/fopdf.xsl delete mode 100644 docs/src/reference/resources/xsl/highlight-fo.xsl delete mode 100644 docs/src/reference/resources/xsl/highlight.xsl delete mode 100644 docs/src/reference/resources/xsl/html-custom.xsl delete mode 100644 docs/src/reference/resources/xsl/html-single-custom.xsl delete mode 100644 docs/src/reference/resources/xsl/html.xsl delete mode 100644 docs/src/reference/resources/xsl/html_chunk.xsl delete mode 100644 docs/src/reference/resources/xsl/pdf-custom.xsl diff --git a/build.gradle b/build.gradle index a71bf38e..0222e8d3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,67 +1,29 @@ -// used for artifact names, building doc upload urls, etc. -description = 'Spring Data GemFire' -abbreviation = 'SGF' - -apply plugin: 'base' - buildscript { repositories { -// add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) { -// name = "local" -// addIvyPattern "e:/work/i21/gradle-plugins/build/repo/[organisation].[module]-ivy-[revision].xml" -// addArtifactPattern "e:/work/i21/gradle-plugins/build/repo/[organisation].[module]-[revision](-[classifier]).[ext]" -// } - - add(new org.apache.ivy.plugins.resolver.URLResolver()) { - name = "GitHub" - addIvyPattern 'http://cloud.github.com/downloads/costin/gradle-stuff/[organization].[module]-[artifact]-[revision].[ext]' - addArtifactPattern 'http://cloud.github.com/downloads/costin/gradle-stuff/[organization].[module]-[revision].[ext]' - } - mavenCentral() - mavenLocal() - mavenRepo name: "springsource-org-release", urls: "http://repository.springsource.com/maven/bundles/release" - mavenRepo name: "springsource-org-external", urls: "http://repository.springsource.com/maven/bundles/external" + maven { url 'http://repo.springsource.org/plugins-release' } } - dependencies { - classpath 'org.springframework:gradle-stuff:0.1-20110421' - classpath 'net.sf.docbook:docbook-xsl:1.75.2:ns-resources@zip' + classpath 'org.springframework.build.gradle:bundlor-plugin:0.1.2' + classpath 'org.springframework.build.gradle:docbook-reference-plugin:0.1.5' } } -allprojects { - group = 'org.springframework.data.gemfire' - version = "$springGemfireVersion" - - releaseBuild = version.endsWith('RELEASE') - snapshotBuild = version.endsWith('SNAPSHOT') - - - repositories { - mavenLocal() - mavenCentral() - // Public Spring artefacts - mavenRepo name: "springsource-org-release", urls: "http://repository.springsource.com/maven/bundles/release" - mavenRepo name: "spring-release", urls: "http://maven.springframework.org/release" - mavenRepo name: "spring-milestone", urls: "http://maven.springframework.org/milestone" - mavenRepo name: "spring-snapshot", urls: "http://maven.springframework.org/snapshot" - mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots" - mavenRepo name: "ext-snapshots", urls: "http://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/" - mavenRepo name: "gemstone-com-release", urls: "http://dist.gemstone.com/maven/release" - //mavenRepo name: "gemstone-com-release", urls: "http://repo.springsource.org/gemstone-release" - } +description = 'Spring Data GemFire' +group = 'org.springframework.data' +repositories { + maven { url "http://repo.springsource.org/libs-snapshot" } + maven { url "http://repo.springsource.org/plugins-release" } } apply plugin: "java" -apply plugin: "maven" -apply plugin: 'eclipse' // `gradle eclipse` to generate .classpath/.project -apply plugin: 'idea' // `gradle idea` to generate .ipr/.iml -apply plugin: 'docbook' -apply plugin: 'bundlor' // all core projects should be OSGi-compliant +apply plugin: 'eclipse' +apply plugin: 'idea' +apply from: "$rootDir/maven.gradle" +apply plugin: 'docbook-reference' +apply plugin: 'bundlor' -bundlor.useProjectProps = true [compileJava, compileTestJava]*.options*.compilerArgs = ["-Xlint:-serial"] test { @@ -93,7 +55,7 @@ dependencies { testCompile "org.hamcrest:hamcrest-core:$hamcrestVersion" testCompile "org.hamcrest:hamcrest-library:$hamcrestVersion" testCompile "org.springframework:spring-test:$springVersion" - testCompile("javax.annotation:jsr250-api:1.0") { optional = true } + testCompile("javax.annotation:jsr250-api:1.0", optional) // Spring Data compile "org.springframework.data:spring-data-commons-core:${springDataCommonsVersion}" @@ -101,15 +63,13 @@ dependencies { testCompile "org.apache.derby:derbyLocale_zh_TW:10.9.1.0" } -javaprojects = rootProject - sourceCompatibility = 1.5 targetCompatibility = 1.5 javadoc { - srcDir = file("${projectDir}/docs/src/api") + ext.srcDir = file("${projectDir}/docs/src/api") destinationDir = file("${buildDir}/api") - tmpDir = file("${buildDir}/api-work") + ext.tmpDir = file("${buildDir}/api-work") configure(options) { stylesheetFile = file("${srcDir}/spring-javadoc.css") @@ -135,63 +95,104 @@ javadoc { } title = "${rootProject.description} ${version} API" - - // collect all the sources that will be included in the javadoc output - source javaprojects.collect {project -> - project.sourceSets.main.allJava - } - - // collect all main classpaths to be able to resolve @see refs, etc. - // this collection also determines the set of projects that this - // task dependsOn, thus the runtimeClasspath is used to ensure all - // projects are included, not just *dependencies* of all classes. - // this is awkward and took me a while to figure out. - classpath = files(javaprojects.collect {project -> - project.sourceSets.main.runtimeClasspath - }) - - // copy the images from the doc-files dir over to the target - doLast { task -> - copy { - from file("${task.srcDir}/doc-files") - into file("${task.destinationDir}/doc-files") - } - } } -ideaProject { - withXml { provider -> - provider.node.component.find { it.@name == 'VcsDirectoryMappings' }.mapping.@vcs = 'Git' - } +bundlor { + manifestTemplate = file("${projectDir}/template.mf").text } -task wrapper(type: Wrapper) { - gradleVersion = '1.0-milestone-3' - description = "Generate the Gradle wrapper" - group = "Distribution" +jar { + manifest.attributes['Implementation-Title'] = 'spring-data-gemfire' + manifest.attributes['Implementation-Version'] = project.version + + from("$rootDir/docs/src/info") { + include "license.txt" + include "notice.txt" + into "META-INF" + expand(copyright: new Date().format('yyyy'), version: project.version) + } } -apply from: "$rootDir/maven.gradle" -assemble.dependsOn = ['jar', 'sourceJar', 'javadocJar'] +task sourcesJar(type: Jar, dependsOn:classes) { + classifier = 'sources' + from sourceSets.main.allJava +} -// Distribution tasks -task dist(type: Zip) { - description = "Generate the ZIP Distribution" - group = "Distribution" - dependsOn assemble, subprojects*.tasks*.matching { task -> task.name == 'assemble' } +task javadocJar(type: Jar) { + classifier = 'javadoc' + from javadoc +} - evaluationDependsOn(':docs') +reference { + sourceDir = file('docs/src/reference/docbook') +} - def zipRootDir = "${project.name}-$version" - into(zipRootDir) { - from('/docs/src/info') { - include '*.txt' +task docsZip(type: Zip) { + group = 'Distribution' + classifier = 'docs' + description = "Builds -${classifier} archive containing api and reference for deployment" + + from('docs/src/info') { + include 'changelog.txt' + } + + from (javadoc) { + into 'api' + } + + from (reference) { + into 'reference' + } +} + +task schemaZip(type: Zip) { + group = 'Distribution' + classifier = 'schema' + description = "Builds -${classifier} archive containing all XSDs for deployment" + + def Properties schemas = new Properties(); + + sourceSets.main.resources.find { + it.path.endsWith('META-INF' + File.separator + 'spring.schemas') + }?.withInputStream { schemas.load(it) } + + ext.paths = [] as Set + + for (def key : schemas.keySet()) { + def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') + assert shortName != key + File xsdFile = sourceSets.main.resources.find { + it.path.replace('\\', '/').endsWith(schemas.get(key)) } - from('/docs/build/') { - into 'docs' - include 'reference/**/*' + assert xsdFile != null + def input = xsdFile.path + + if (!paths.contains(input)) { + paths.add(input) + into (shortName) { + from input + } } + } +} + +task distZip(type: Zip, dependsOn: [jar, docsZip, schemaZip, sourcesJar, javadocJar]) { + group = 'Distribution' + classifier = 'dist' + description = "Builds -${classifier} archive, containing all jars and docs, " + + "suitable for community download page." + + ext.zipRootDir = "${project.name}-${project.version}" + + into (zipRootDir) { + from('docs/src/info') { + include 'readme.txt' + include 'license.txt' + include 'notice.txt' + expand(copyright: new Date().format('yyyy'), version: project.version) + } + from('samples/') { into 'samples' exclude '**/build/**' @@ -200,25 +201,34 @@ task dist(type: Zip) { exclude '**/vf*.*' exclude '**/vf*.txt' } - from('build/') { - into 'docs' - include 'api/**/*' + + from(zipTree(docsZip.archivePath)) { + into "docs" } - into('dist') { - from javaprojects.collect {project -> project.libsDir } + + from(zipTree(schemaZip.archivePath)) { + into "schema" + } + into ("dist") { + from rootProject.collect { project -> project.libsDir } } - } - doLast { - ant.checksum(file: archivePath, algorithm: 'SHA1', fileext: '.sha1') } } -task uploadDist(type: org.springframework.gradle.tasks.S3DistroUpload, dependsOn: dist) { - description = "Upload the ZIP Distribution" - group = "Distribution" - archiveFile = dist.archivePath - projectKey = 'SGF' - projectName = 'Spring GemFire' +artifacts { + archives sourcesJar + archives javadocJar + + archives docsZip + archives schemaZip + archives distZip } -defaultTasks 'clean', 'build' \ No newline at end of file +task wrapper(type: Wrapper) { + description = 'Generates gradlew[.bat] scripts' + gradleVersion = '1.0' +} + +assemble.dependsOn = ['jar', 'sourcesJar'] +defaultTasks 'build' + diff --git a/docs/build.gradle b/docs/build.gradle deleted file mode 100644 index 1c63b32e..00000000 --- a/docs/build.gradle +++ /dev/null @@ -1,101 +0,0 @@ -import org.apache.tools.ant.filters.ReplaceTokens - -// ----------------------------------------------------------------------------- -// Configuration for the docs subproject -// ----------------------------------------------------------------------------- - -apply plugin: 'base' -apply plugin: 'docbook' - -assemble.dependsOn = [rootProject.javadoc, 'reference'] - -[docbookHtml, docbookFoPdf, docbookHtmlSingle]*.group = 'Documentation' -[docbookHtml, docbookFoPdf, docbookHtmlSingle]*.sourceFileName = 'index.xml' -[docbookHtml, docbookFoPdf, docbookHtmlSingle]*.sourceDirectory = new File(projectDir, 'src/reference/docbook') - -docbookHtml.stylesheet = new File(projectDir, 'src/reference/resources/xsl/html-custom.xsl') -docbookHtmlSingle.stylesheet = new File(projectDir, 'src/reference/resources/xsl/html-single-custom.xsl') -docbookFoPdf.stylesheet = new File(projectDir, 'src/reference/resources/xsl/pdf-custom.xsl') - -def imagesDir = new File(projectDir, 'src/reference/resources/images'); -[docbookHtml, docbookFoPdf, docbookHtmlSingle]*.admonGraphicsPath = "./images/admon/" -[docbookHtml, docbookFoPdf, docbookHtmlSingle]*.imgSrcPath = "${imagesDir}" - -// defined separately to prevent the replacement from taking place (seems to affect the images) -imgSpec = copySpec { - into ('reference') { - from("$projectDir/src/reference/resources") { - include 'css/**/*' - } - from("$buildDir/docs") { - include '*.pdf' - } - } - - into ('reference/images') { - from (imagesDir) - } -} - - -refSpec = copySpec { - into ('reference') { - from("$buildDir/docs") { - exclude '*.fo' - exclude '*.pdf' - } - } - - p = new Properties() - - for (e in project.properties) { - if (e.key != null && e.value != null) - p.setProperty(e.key, e.value.toString()) - } - - filter(ReplaceTokens, tokens: p) - - with(imgSpec) -} - -task reference (type: Copy) { - dependsOn 'docbook' - description = "Builds aggregated DocBook" - group = "Documentation" - destinationDir = buildDir - with(refSpec) -} - - -apiSpec = copySpec { - into('api') { - from(rootProject.javadoc.destinationDir) - } -} - -task docSiteLogin(type: org.springframework.gradle.tasks.Login) { - if (project.hasProperty('sshHost')) { - host = project.property('sshHost') - username = project.property('sshUsername') - key = project.property('sshPrivateKey') - } -} - -infoSpec = copySpec { - from("$projectDir/src/info") { - include 'changelog.txt' - } -} - -// upload task -task uploadDocs(type: org.springframework.gradle.tasks.ScpUpload) { - dependsOn rootProject.javadoc, reference - description = "Upload API Distribution" - group = "Distribution" - remoteDir = "/opt/www/domains/springframework.org/www/htdocs/spring-gemfire/docs/${project.version}" - login = docSiteLogin - - with(apiSpec) - with(refSpec) - with(infoSpec) -} \ No newline at end of file diff --git a/docs/src/reference/docbook/appendix/appendix-schema.xml b/docs/src/reference/docbook/appendix/appendix-schema.xml index 6014d702..f0735c13 100644 --- a/docs/src/reference/docbook/appendix/appendix-schema.xml +++ b/docs/src/reference/docbook/appendix/appendix-schema.xml @@ -3,7 +3,7 @@ Spring GemFire Integration Schema Spring GemFire Schema - + FIXME: SGF SCHEMA LOCATION/NAME CHANGED diff --git a/docs/src/reference/docbook/index.xml b/docs/src/reference/docbook/index.xml index ec0600d1..04f0d61a 100644 --- a/docs/src/reference/docbook/index.xml +++ b/docs/src/reference/docbook/index.xml @@ -5,7 +5,10 @@ xmlns:xlink="http://www.w3.org/1999/xlink"> Spring Gemfire Integration Reference Guide - @version@ + ${version} + Spring GemFire ${version} + Spring GemFire + diff --git a/docs/src/reference/resources/css/highlight.css b/docs/src/reference/resources/css/highlight.css deleted file mode 100644 index ffefef72..00000000 --- a/docs/src/reference/resources/css/highlight.css +++ /dev/null @@ -1,35 +0,0 @@ -/* - code highlight CSS resemblign the Eclipse IDE default color schema - @author Costin Leau -*/ - -.hl-keyword { - color: #7F0055; - font-weight: bold; -} - -.hl-comment { - color: #3F5F5F; - font-style: italic; -} - -.hl-multiline-comment { - color: #3F5FBF; - font-style: italic; -} - -.hl-tag { - color: #3F7F7F; -} - -.hl-attribute { - color: #7F007F; -} - -.hl-value { - color: #2A00FF; -} - -.hl-string { - color: #2A00FF; -} \ No newline at end of file diff --git a/docs/src/reference/resources/css/manual.css b/docs/src/reference/resources/css/manual.css deleted file mode 100644 index 77569070..00000000 --- a/docs/src/reference/resources/css/manual.css +++ /dev/null @@ -1,99 +0,0 @@ -@IMPORT url("highlight.css"); - -html { - padding: 0pt; - margin: 0pt; -} - -body { - margin-left: 10%; - margin-right: 10%; - font-family: Arial, Sans-serif; -} - -div { - margin: 0pt; -} - -p { - text-align: justify; -} - -hr { - border: 1px solid gray; - background: gray; -} - -h1,h2,h3,h4 { - color: #234623; - font-family: Arial, Sans-serif; -} - -pre { - line-height: 1.0; - color: black; -} - -pre.programlisting { - font-size: 10pt; - padding: 7pt 3pt; - border: 1pt solid black; - background: #eeeeee; - clear: both; -} - -div.table { - margin: 1em; - padding: 0.5em; - text-align: center; -} - -div.table table { - display: table; - width: 100%; -} - -div.table td { - padding-left: 7px; - padding-right: 7px; -} - -.sidebar { - float: right; - margin: 10px 0 10px 30px; - padding: 10px 20px 20px 20px; - width: 33%; - border: 1px solid black; - background-color: #F4F4F4; - font-size: 14px; -} - -.mediaobject { - padding-top: 30px; - padding-bottom: 30px; -} - -.legalnotice { - font-family: Verdana, Arial, helvetica, sans-serif; - font-size: 12px; - font-style: italic; -} - -p.releaseinfo { - font-size: 100%; - font-weight: bold; - font-family: Verdana, Arial, helvetica, sans-serif; - padding-top: 10px; -} - -p.pubdate { - font-size: 120%; - font-weight: bold; - font-family: Verdana, Arial, helvetica, sans-serif; -} - -span.productname { - font-size: 200%; - font-weight: bold; - font-family: Verdana, Arial, helvetica, sans-serif; -} diff --git a/docs/src/reference/resources/images/admon/blank.png b/docs/src/reference/resources/images/admon/blank.png deleted file mode 100644 index 764bf4f0c3bb4a09960b04b6fa9c9024bca703bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRdwrEa{HEjtmSN`?>!lvNA9*>Uz33 zhE&XXd(lylL4oIh!GZnHecj|txT>yO8>^qY%(y?B;Tppl#t7yOYze#vq#8^aMzDZb YLK^d5CO(feU_df>y85}Sb4q9e0Be`**{8_ndlqdgjcTGH1@5rAvWm>DH}V&z(E>{Q2|u@89nQ znoBxR{K>+|z@W#V1JVle69d~nhv}!E7VV7D!$l=+#gyARX+eW7x`wT@Cg?1ihH6;1 zs$!+xj1Yt%W31lvY*ooh8##Wqt4P*f&)W2{!b0}^@kv>5x2zLQef-gZgT0SEg>hLF z)Pd`+x;*(#oF^Yc1wYmptOPqEY|_Nz%wH;O`WPI6ayD{2tAO4N zo7{UG#GByI2%_fo|5LqMv{6N+A1o@_2o{w)&t4I@GfML`SWvEy;UY+Xf4Xzz&KO;h zV_?(HH9iCh`e$qcdSYD|*JluqH{jv}kl>0fV4tmS-PB+scb>_h18CFP6lf@4^@?vqT-$&hMpcE*)wGd!;~q-Q>IkUnZqz=PVt;M zK*p3gbLK2v%CK~4^3tV1#?q}@8MbbX+PXD)>(;G%_cH9=n|$sZ!?|yxmE{-7;w@N47?rU=3X_NkV zU|o{PnRTZ;lXp4>+)hZU_|Lw%*va*6=<@jI@BP^`_OsZ?pZg-2AaGf|;i2L0<>du@ zeRrO4er03}pLSxdREd>pap^;~&E+}=JYKy#vHnLI=Z$}pPyA_`zG;G~<$`Br2do;7 z$Heivv0AeyJYVI({@6?X6r+V~XS2Cs!|bddDqJz@2lKf$~4dA1c%lfOT+5KMUSWi#X5(9ePxx_W1Bsf2+N)z4*}Q$iB}K{RAP diff --git a/docs/src/reference/resources/images/admon/caution.tif b/docs/src/reference/resources/images/admon/caution.tif deleted file mode 100644 index 4a282948c4c7ed53a2cab4132152c9923f7eb363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1978 zcmebD)MDUaXJBaHTM%HOBF4+!!hOu3BSpZ2m-o=a4UGyOVRGC@78N*Fn1mTgu^*ne z;*L$0(G;HMj}kXtX=zR2W)oug(x;}vd4|pLf`&qbk&JK3goqWpg18tM4sYt>NNQ*5 zJO1L!te8d4X6?)=pC(QSU||)yt{QYgWZzM1M#kk|4=&{>4cy$*l3-xF?uL{AUz_5A z50}pAFgB%?DF*m>GD)-@{{F$i>YOfT;)C)He}4t3vbN+MR?Ki#WjWH`E;J#5fkSah z*CvDRdtCvNOpI%k6$_&6*{?lq*|st4mU-vV>qgQQdBM7KAGv%{?hRM3li^KVy1S9x zik*=G2sju77$g`J84MYm7@`=G8L}CQ8LAmtfUpM)r!auv95`Ic0D)T>AaF0kUWRi( zcnu8iF+kvR1_*r5@Sfp29R6n*g@Y>uM&o~Q#Rt7z11bTqgJPg?F|Y&xk=0NVR1Poz z%ZNF^GJpYGT5JXL8G!j8gs%ZfLk3G=Ndlpt1L^lb3@Tv^fu#V1MQ=Zj+J`d)yn#^y zss&&)AHzQe7O)6V5GchAW=nvWNNgr3n*%7$3}v$d*=$fYGmtIF2r&nwMieRzvPldo p4l+|5%Ki*wOEI#7?fS#Uz#t7}vjA&lTO_>>KsEyq{Q;^60RYt05`+K% diff --git a/docs/src/reference/resources/images/admon/draft.png b/docs/src/reference/resources/images/admon/draft.png deleted file mode 100644 index 0084708c9b8287c51efa6b40b8d492854191455e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17454 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 diff --git a/docs/src/reference/resources/images/admon/home.gif b/docs/src/reference/resources/images/admon/home.gif deleted file mode 100644 index 6784f5bb01e0104c60e006a2ed525163a380135c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl6Nk%v~VJHA70KxzO;Nak3U|_JYumAu6&;S7N@bCZt@Bjb+EC2ui04M+` z000C22)f+N_DFSAmXsV{#*oJWIwOJ|OFii&dHVi$1?u8o=2teG> zb~7H4%2JKz`Tcy)XEL^=cAP+G_P7moKVb2g%$4rYhp9PeRzLz zfrD6ufORfRiHeIHgKCh5l6Fj1nwy-RR)UybJ_V$url+TLhynwsuCA(~Rj;(Av5lgv zwwtvDw^OsE0|vwftp&x&!i>OQw#ml^r_#R6Z_dKdq|~Li{txWV+q;;-NCjLKH8RzODs`x)zXFqfx?o2&^85@jF7AWJN0jDQd6 TqQ?;{LW&$ovZP522><{)rIw!r diff --git a/docs/src/reference/resources/images/admon/home.png b/docs/src/reference/resources/images/admon/home.png deleted file mode 100644 index cbb711de712dcf06597a3a8a3d95f6fefda1f245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1156 zcmeAS@N?(olHy`uVBq!ia0vp^%0SG|!3-oLGuzY{7?>FXd_r6WdIS`E6g8)48qP6v zn&afP)GK*ya`E2cmc1=K$9krmo3ixW(yjNl9=mt!-1BqS-d}tE{`vdw@Bfd2(GVCG zA@J$l5_e#hU`+CMcVXyYmGuB}CVRR#hE&{I8+eiLumVSprtq8v761QlTpYPgC-&05 zDJ{&8o?4V1EYqU7+)vOI#yLg7ec#$`gxH85}f}H9d0^ z(^GvD(=(H^6-@Mu^ehxCE%gm7^bHIZl8Z8nODY|5D~n4qll4-I^-@X;^7BgclJj#X z?o!+VG)@a_TxNP+Vo52`JVR3xV`HP#G)t4DL{lRpBV!ZeBojj;vlKG}W79NC!#D3= nHUM?;fpi4`tz|GatuQpzHqbT@s&o4Ulwt66^>bP0l+XkK0lack diff --git a/docs/src/reference/resources/images/admon/important.gif b/docs/src/reference/resources/images/admon/important.gif deleted file mode 100644 index 6795d9a819874ca8b833c4d4993988721489070f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1003 zcmd5)v2xQu5Iutd0|w+k5&Zs3?l2X}aDS zjTF}vbzOHH$Mba8b;e`IbzRT%eBTcOF$gq_YY0gQX<;}D0zVAhF!bZtiem@kQ53ld zc?kJw3X()jQz=b5X{r%YqZCjoWEse^T9yffD1>wGXnD2O6PLX4*vhfx$E#2ysKF~)d4pDz}RBuUaVC4^8)m&+y7^CACN zNWZET0BmraH<<4P+`FFGYnVCKQ9;ZBR3T)qVf|%U7d>simE()pGuDQwHb2TG+MBQ_ zvDDA4Qf1%Pj=rj3vOLN4H;wu(_qSJ$@rtK60JzIpt9fbL=6P}WBLJ%VyrBKnwv9gL z@+koKj|(oEHhf+1r)*HA;C;h{WiuO<>j@AFLq1UdID5A%&u-GCYUTM&`rF#A&P{r^ z_xRIVhqhjHEgv=NdwEBz@%x57)QYSpY=k4uyJx0tows>V2jGshqK7Z@I~q3m5W5c^ zZt#o~c$MEO+~MK7@*>Lh!0mEumT-7-ns3eG+lQO)ySz&7zEB7GF&sm<)jwePAZ~s8 Q_s=i~Dg!i1^#?fn4NukiE&u=k diff --git a/docs/src/reference/resources/images/admon/important.png b/docs/src/reference/resources/images/admon/important.png deleted file mode 100644 index ad57f6f72e2c4ecf45f1443887956132174516b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1178 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 diff --git a/docs/src/reference/resources/images/admon/note.gif b/docs/src/reference/resources/images/admon/note.gif deleted file mode 100644 index f329d359e55c7ed753170a6f04fbc0cba1e1e565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmZ?wbhEHblwgox_`=Ho1YTZVK|w)LQBlds$=TW2#l^+d)zvL6Ej>LwQ>IK=x^(H* zty}l*-FxiVv2*9nUAuPe-o1OzpFe;9{{8>||AFElBX9%7pDc_F45AD=ASEC>8Cd@% zghGJlBo$966GSzJUe!6ZN$1q35SXB^-zJAkEPj)pXq*a$h_ zXQ+sXsjhEmXhNv37hJ?OaLOg1X|~+1jSyWR(o`3y(c1;Ai!}%$em*Glyc1BwlJ~NK zuZpLThNs9@k1ImH0$Wth2s`>W>73rA(RIXT!4{9MLpCC+wq2hkd_`O*d~)g9;?U*N zC}OI4M1Z6Hl7Y`-pGiWx6O;l)uFCkcxOF@EUU3NwS>oY6#RI6O?U2byr$d1v9)TjN znwNw$j~n?OWwbpf2zH99Zo*Lqk)s;^7gg9U27sNV>(8nyV%m64QG)9cM8x-WNa$(j zzz`MJAQq_8eSmmjy7}|Lu@zf kf(CKug-JSrEM6BktMtGlBGk2ik;bV{KB5sIO^OWG0Fd3m^#A|> diff --git a/docs/src/reference/resources/images/admon/note.png b/docs/src/reference/resources/images/admon/note.png deleted file mode 100644 index ad57f6f72e2c4ecf45f1443887956132174516b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1178 zcmV;L1ZDe)P)moeK~^j3|1ZFhpMb?+WF}Ff9N7 zmErhobEp9j5E&T>5I`t;kO9cfTd$9u{p)!4mdSYr_oELMKxO`8fExuu`}Xa_X%s*J z;k5%RU^)9_1HbrEAnW_@&$?VY5IT%y0zUnF^O@-#d^ z;BG^A?vn+{PTFEX1{PN_GJ*uLxC){aAb@cC1E)8D`1jwRbIx0;O9}pC`Tg?kSGIp< zKB_&OY}`0CurjlYiG39lllaN_k5hz2i0S#$-wFT!|K4`;dcMU?>>(H|ck|bajPDf_+bTg z9%3_tgdnDq97;?KBm#f{qP-0yYXC*uuG?Mj|F0AjX8-!(|L1QU8UmSSvSIlAu=cKj zft)Ik{gLSn|38s`tUu4+xosx6OhMQHyOWrHdNZ*8{mAqd7%Lx{-+cQ2*+^dNDRk(nWU|nV9%kgwK6Q#22j7&lq?ctN;4*_ZRE0Uz={R|6yke zQkMELkC#ILdnjd^T)1_|=EBpfoPXH_ef2r?CH`jZX8HMLU>HeX6b8fym`sd4= z%V{i6<|iS`5=eaieto~1!*jh@!qUoy*wp&!-sMH10>A)SzI-{csg;q5nc@GxKY#u( zGcymu#0L;yBs+=bE+QxUz*ETMkC*SgJMtHp!dZa9&iL);Pf0#K32t>EE_rqq4)QF3 z2GNN}%g?_pcF{3rW8nk}{ABp~mFd0ke+i)MufM+@e|`A;&DUR_6;uTxO=TiDSh+~H z;N$nVt8RH1>2fgsXJP)&%EG|P@}K=H(+5TdM*e@opP4=~{%7Q2;A3HCeEi|*@!L;b zWv1y%d6E{%pMSnzbivnLlTDOI{O{kt{}}%LVfgif`TMuO9|i7mewF;q%`Xbfvfmg! zv9d6K`tbGKZI*b04V{+d%EvDF`_CUx+%WwA%le<`)en|+&lrFG z|K=yiq#(%6!2SO7>udMKWAv5*>raxC>7(~ow%@7b=f9<RrvN?@N=6_W$>fXUp?HoLmA7B{mTyQNIQz6=yDPUS?({d<7(_ z;Lo>@5Bl65mWsTpk!*AZH8Uh6B%VEcMnY{)5PbdqOG-`|ly8}!5q{vn0f-be%c31S scAPwUQdCqlK0cnCn|rtvb~LvD06A7<`Vr(<>Hq)$07*qoM6N<$fWSj8)*j_s0*s+gA3;Sh&ja)bx!VF_Sf>*se@&+kCgO zr+R@?&ik*cqgb|1nDsf`Smu_<(#~sYRz=fNIgWLC7l}#=|C@V!^7^u?J-&S9hp(U4 z$p4Zq##20*5QGIHvwJ-nxqBD;h diff --git a/docs/src/reference/resources/images/admon/prev.gif b/docs/src/reference/resources/images/admon/prev.gif deleted file mode 100644 index 64ca8f3c7c6856d17625615c7845d9adf8b35e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmZ?wbh9u|RAW$Q_|5jIb=LGEI8QAA*>a1V#C72?E=btEDjqN9qpDd4zl5RF#mYJf^(P5PkwoZW(JQ{ zF_D*4y!wR%9~DOmG#sD7{_&y;#{p%(<{xE#Uw&*>uv^H)Skbd{qJrHLc7}?c9UtQz zYXTT6YHoZvu)pcYrmCD9p$~wJBmbf!%0P@OYB}B?fNF{YnIe9ySJ<~ln9<}1LcYr;@((b@HMtAlPLh^PsKR!G>+|CbXxWHL3#->LwIhe?U cW`4ULC`3qLrpm*X4$b9ricTFB5n!+e06MwKH~;_u diff --git a/docs/src/reference/resources/images/admon/prev.png b/docs/src/reference/resources/images/admon/prev.png deleted file mode 100644 index cf24654f8a9d6826bf5ee3f6b640d0b34f44d2ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmeAS@N?(olHy`uVBq!ia0vp^%0SG|!3-oLGuzY{7?>FXd_r6qS{MX+1QdG|HK%AA z&M|bFA9tAudO|H@7THL=dQiK_Wb?x_ut?D z9|fZ!FvLS(&zmEwfLVeu$=lt9p@UV{1IVfNba4!+xV3fSLB2x#g-7SkiDHi<0%5c709k4@>c%U5PUn6XiNrQ7+$BX-K(BEj>;XDjvwZcIF~ zikDl%a$|T|&B@5M-I14sdv^1r*gkp|z3k=crb$1i`yH45`zBpRc(KYI-u^rPzjiy@ zGH(5%+Qq}Yvm59P=MvY5lHmNblJdl&R0anPWlhiA#Pn3(#PrPMYy}fNBRvZROG|wN z3w;Aah2)~l;*v^-+{)sT%w)aPV!f2og8aM^z2yAdiMtec0FBcE8<&}$msnB?G|wQ- z!aOlC%^=CZB-O|yDbdi(G|ec{Bq=S?EGaqB)I9sbjHy6fd>~x`Kx-L{O)CsdwGFfl UgzDTr0c99GUHx3vIVCg!0Q2->tpET3 diff --git a/docs/src/reference/resources/images/admon/tip.gif b/docs/src/reference/resources/images/admon/tip.gif deleted file mode 100644 index 823f2b417c797bcc5b5af0d86034bbbe68a9c5d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmaKpzfZzI6vwMTVkAa>9EomJF@dB^cAyaw8YzNW>;V&-Ax?~pOgK0Qkwp3j7=?eJ zp(Bd}iDHPQ&cwK|BZjz$_padR<(hoox1W3W-n*l8G9sLBGh57bgCWc1aD#QQmI@nS1Ofyy{@WiyWQ4xz1!{fdcDD5FdB`<y3!k zEzMQ}>2XNH@2x$azJrio4y76u%{aaSQ8iI0-$_v{WV^70wC+frSXf@6n4D`V#?Bj* zZt`izA4lq-+})D%wiNUU4VVF+%2sLK@TMg8DV7ztp%Z(?@L;tQU1CsK&Qwqezj{Cq zSwCP?&P}GNbF_4EK-+twGeQq!I#zP|Y+{WP*FI?V_Kf=>vV0rySc_v6yVepU`O=gc N_rd2$!U|dD;1^e0&sYEe diff --git a/docs/src/reference/resources/images/admon/tip.png b/docs/src/reference/resources/images/admon/tip.png deleted file mode 100644 index ad57f6f72e2c4ecf45f1443887956132174516b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1178 zcmV;L1ZDe)P)moeK~^j3|1ZFhpMb?+WF}Ff9N7 zmErhobEp9j5E&T>5I`t;kO9cfTd$9u{p)!4mdSYr_oELMKxO`8fExuu`}Xa_X%s*J z;k5%RU^)9_1HbrEAnW_@&$?VY5IT%y0zUnF^O@-#d^ z;BG^A?vn+{PTFEX1{PN_GJ*uLxC){aAb@cC1E)8D`1jwRbIx0;O9}pC`Tg?kSGIp< zKB_&OY}`0CurjlYiG39lllaN_k5hz2i0S#$-wFT!|K4`;dcMU?>>(H|ck|bajPDf_+bTg z9%3_tgdnDq97;?KBm#f{qP-0yYXC*uuG?Mj|F0AjX8-!(|L1QU8UmSSvSIlAu=cKj zft)Ik{gLSn|38s`tUu4+xosx6OhMQHyOWrHdNZ*8{mAqd7%Lx{-+cQ2*+^dNDRk(nWU|nV9%kgwK6Q#22j7&lq?ctN;4*_ZRE0Uz={R|6yke zQkMELkC#ILdnjd^T)1_|=EBpfoPXH_ef2r?CH`jZX8HMLU>HeX6b8fym`sd4= z%V{i6<|iS`5=eaieto~1!*jh@!qUoy*wp&!-sMH10>A)SzI-{csg;q5nc@GxKY#u( zGcymu#0L;yBs+=bE+QxUz*ETMkC*SgJMtHp!dZa9&iL);Pf0#K32t>EE_rqq4)QF3 z2GNN}%g?_pcF{3rW8nk}{ABp~mFd0ke+i)MufM+@e|`A;&DUR_6;uTxO=TiDSh+~H z;N$nVt8RH1>2fgsXJP)&%EG|P@}K=H(+5TdM*e@opP4=~{%7Q2;A3HCeEi|*@!L;b zWv1y%d6E{%pMSnzbivnLlTDOI{O{kt{}}%LVfgif`TMuO9|i7mewF;q%`Xbfvfmg! zv9d6K`tbGKZI*b04V{+d%EvDF`_CUx+%WwA%le<`)en|+&lrFG z|K=yiq#(%6!2SO7>udMKWAv5*>raxC>7(~ow%@7b=f9<RrvN?@N=6_W$>fXUp?HoLmA7B{mTyQNIQz6=yDPUS?({d<7(_ z;Lo>@5Bl65mWsTpk!*AZH8Uh6B%VEcMnY{)5PbdqOG-`|ly8}!5q{vn0f-be%c31S scAPwUQdCqlK0cnCn|rtvb~LvD06A7<`Vr(<>Hq)$07*qoM6N<$fZTZTei3kDV32yV!Q3h+-nMlqyV>lRzWV|5XS|!R zJ9po!|JC=_hMz9Ex3Ove_O<7Ki^+ZG3OW)0HK&YExa~knT17|Dw`}IsahgrSch^-` zbR3#}CTEJE3FpcFHhEeT>m*%ClD6O_#XWHUqAtUxv!lnpXbkP%`INR23xxENF% fWR5tL{SwHQVq^u|^$Ez9hO&PF*|tb}fm{Xvme+K0 diff --git a/docs/src/reference/resources/images/admon/toc-blank.png b/docs/src/reference/resources/images/admon/toc-blank.png deleted file mode 100644 index 6ffad17a0c7a78deaae58716e8071cc40cb0b8e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngf!VDzk7iOmbDT4r?5LY1G0LBeqssYGrXgF}- zKtn^rf1vn(hW}s+NCR0w;4iG^2^42c@^*J&=wOxg0CMC!T^vIyZYBTtzyH6zKuy9A zentg0F+qV0g#~P97#OBpaJrNsxA6f`rE`gEL`iUdT1k0gQ7VIjhO(w-Zen_>Z(@38 za<+nro{^q~f~BRtfrY+-p+a&|W^qZSLvCepNoKNMYO!8QX+eHoiC%Jk?!;Y+JAlS% zfsM;d&r2*R1)7&;o@#7ik&>8{Vv?F>U|?x(ZfKHZYGz`bmXczeoR*Z-Hs=yh7cWRx f0MJ?nL(>XNZ3Ars^Rf>h;}|?${an^LB{Ts5OHX0g diff --git a/docs/src/reference/resources/images/admon/toc-minus.png b/docs/src/reference/resources/images/admon/toc-minus.png deleted file mode 100644 index abbb020c8e2d6705ebc2f0fc17deed30f2977a46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngf0VEhsJkjh1QcOwS?k)@rt9q4-G!sMP)HD-wQzH`-1CumMgJctv6pLi@6hos# qqtv?{|7HPo@q%;(0Ig*(G_A1IHqbUOFZ%#8j=|H_&t;ucLK6V~f=xvL diff --git a/docs/src/reference/resources/images/admon/toc-plus.png b/docs/src/reference/resources/images/admon/toc-plus.png deleted file mode 100644 index 941312ce0dab168e0efcc5b572e387259880e541..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngf0VEhsJkjh1QcOwS?k)@rt9q49T#T`K7w7|w?rspM=lmg95OfodLFfd9rOi4*hH8wIdOfpPPHA_l1 vPBO4aOiebg{jIb=LGEI8QAA*>a1V#C72?E=bjEDjqN9qpDd4szjmF#mYJf^(P5Pk#A^PL<$Q zI+;RG?K?R>ZZ+XJpnRtJN17PRgOAG`Ypgh#KAaFZVBhwmiI3&M#ti2gFIJ`xI|LdI z)N_AywPiSv9NPY48`Fms0t^T1xjuG&jrgXxZ|i>{CW9aPigr7S6dxV77JO*m^5e&) zo(}&F0j>Y}9vSZmQL;N0Bl*v`gWrf@#t#YRf*HM~)&2b!mjeThEhE5z G!5RR%al9%3 diff --git a/docs/src/reference/resources/images/admon/up.png b/docs/src/reference/resources/images/admon/up.png deleted file mode 100644 index 07634de26b325b09b6686543e3743ec58426e64b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1111 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 Q|4LwNc=22{#`)I&0Kw?pcK`qY diff --git a/docs/src/reference/resources/images/admon/warning.tif b/docs/src/reference/resources/images/admon/warning.tif deleted file mode 100644 index 7b6611ec7a1980022c11ad6877fedf32f41b3df0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1990 zcmebD)MAieXJBaHR|qhCa3Ybt#fe?OBZVhOke}_5p}~zDOYXJdOmf$P_Zjir-v(f(n1LVCeE22NskqJ)$I5g z8XP9S{LzviJ+sf*L4iXe*;u-Tjq%lq8EgzJ!Hcg+?M+EyWoUYBc3S038aqStx-zY! zDFTdKac@c|p3q>CIvAgpWRM#aTC%3+U_*~obs9PKLA zwdWf7S{m)1m+z3c?Wmx@z`-EEAipvhp!;Kbm?5X2D0kj+rcP|eW7(8DkV2Fki5IhEj=NKUH8UqO41H$KE_?`g-zXRd_Q8-9KfPnz02B(N>pejpX z>SzI`howNaA&_POrkNgK+E@xq2Mpl!zyMB5$ACOgn$iTTxCSKe0kI-51uy_p+j}7S z9f(I$z~Bf0U{v4*qwzmD;)zDC@CHUcBM`%AK8Ak`EMO6Es$gUWvn4>Pkl0L6HV06g z8Omk_ve}?)W*}RT5n>KVjVM$cWRnC}X^4DKU-G|w_t}fLBA)Suv#nrW z!^h2QnY_`l!BOq-UXEX{m2up>JTQkX)2m zTvF+fTUlI^nXH#utd~++ke^qgmzgTe~DWM4ffP81J diff --git a/docs/src/reference/resources/images/callouts/10.png b/docs/src/reference/resources/images/callouts/10.png deleted file mode 100644 index 997bbc8246a316e040e0804174ba260e219d7d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}^nQWtZ~+OvdJMW|Y+^UT?O-M{rKJsmzxdayJ{ zDCQA!%%@7Jj$q%-wf8e0_jRx8Dqi$}^?K=?6FriQFLv>>oc^CE+aVHhW3=nZ+fQ4!M=ZC7H>3sl|FJr3LwU zC3?yExf6FO?f@F61vV}-Juk7O6lk8Yg;}bFaZ-|HQc7Azopr01?u8M*si- diff --git a/docs/src/reference/resources/images/callouts/11.png b/docs/src/reference/resources/images/callouts/11.png deleted file mode 100644 index ce47dac3f52ac49017749a3fea53db57d006993c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZI14-?iy0V%N{XE z)7O>#600DeuDZ?5tOl@ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=9KoYUDZ+`aP)jU z&ny=ErrK^#Gw!AcR}pdfMERuV^@&0$@(#^6b8c@rn^6RWX3pUb z4*6@PZ+H0#u=rjsXzS?6n6*sBGbHqGTU%mCsH?n#%j;eD^2}qe=iX*J@VQ3BRpz+u z{PX#N(^9X${`$90+;!pWs>o@z_n8G)7Uo7PJz`jrS+)QE@=PWHmc~UIw=WmUe73o7 z>^bR(M752aYoNg~ozu7U7&{(U>{s!;bn#f?ItjL^o`e{*EOQHqO;ccnz9hLK5@2cAyw@AaPFL~Cp#02|E|4xeQteNtB7waMs QVCXP-y85}Sb4q9e0GRUFb^rhX diff --git a/docs/src/reference/resources/images/callouts/12.png b/docs/src/reference/resources/images/callouts/12.png deleted file mode 100644 index 31daf4e2f25b6712499ee32de9c2e3b050b691ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZI14-?iy0V%N{XE z)7O>#600De9$%>2LVd81Yeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=Cn>wTzx1(qV@bS z0hYvspf(--lM>otrqbK$7p{3DzJ|+KN8%5ows)AI?zWk_n>jwEHXrTJecpEW_0xL= z?}N`*R`T~d2{AN${y8T#GEn4hUb&52^}Op@TW4{oc)A6)%$5=G}h# z?O{QLj@aRcAIf&y&OiUN=H2gq=_}V|pWfuReDV|{jwXw~>#w)I|9${XE z)7O>#600Dep5bGK9wD%hYeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=Cn>w>~AWNX^a2R zbkveVY|45D7UnZ&JtjPwvdCCscZp0EA*0()#GOw)UH4-^&)y^E*4%UC)*|J}q_Ss;tN`nd8$>x9$_Xb^O2EpX&@C ZI46EzbLxq-voTO7gQu&X%Q~loCIF_C`w;*D diff --git a/docs/src/reference/resources/images/callouts/14.png b/docs/src/reference/resources/images/callouts/14.png deleted file mode 100644 index 64014b75fe2e84d45ed861974c72462727979360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmV;M0c8G(P)!ax*-PXaQ9e~6^e1gu=a6a&KSz}bR`+prYG9ayB$BDjWGfIE;t#wl!+ zR3S(jA%y#i_@eOOedXoc%RQe%L;wH~k+s%ZI~)!<=dD%?4MaplaU9QPGski2q3`>r z(}{j@0a$CLl+)={2vLWml*i-oa5#J}DW$gCZB~Z!(!M#)2St|1_V^0qpmCrBof=Y&NUas@LmfSw=)4B4f;8Fu)(eFsv24 zJzXxBrayquXcR?J{XE z)7O>#600De0j~t#c`vY#Yeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=9Eq_Jl&Ka(%QdX zh{H8O%#_7)Tc@t$mM`p4(Ne7omR*~(>gd8_8AZH{=3ms$Fmzm^yL@_+(#aQQ5>7QW z>3g2fIsH(ugM)!V$x4Rr_+!J_XU%4xbz0aE;^N{m@42Z|@0S@TQ=WbP`TMV5Ok;<| z^Ihv+@6tQ{sciRF9dD7Nr=KobwJJ68zJK$<1Pd9rz%4O)*;}Jzj&~nTGMecz>B%lV zK|`fmIc8mp-h8iSXiGFW=C(L+XH4DRxZQX87^-dLuD>odo6YLT@Sw)dfBEIG)v2@6 zR)%mL7GRj1x-&v&+2q@A%a&h0`Lw7|#(w_!tgT!PoJ|+re`lxaY7e*=hH)_rZeB4|imU1$R#1`!P>&$poQl;nzm}mD5ZFopaX|GsS%q*{P~< z;WtmO%lhToBL0i}yfkaOt?EN=nkLNGuU`ywhI5H)L`iUdT1k0gQ7VIjhO(w-Zen_> zZ(@38a<+nro{^q~f~BRtfrY+-p+a&|W^qZSLvCepNoKNMYO!8QX+eHoiC%Jk?!;Y+ zJAlS%fsM;d&r2*R1)67JkeZlkYGj#gX_9E3W@4U_nw*@Ln38B@k(iuhnUeN2eF0kK0(Y1u|9Rc(19XFPiEBhjaDG}zd16s2gM)^$re|(qda7?? zdS-IAf{C7yo`r&?rM`iMzJZ}aa#3b+Nu@(>WpPPnvR-PjUP@^}eqM=Qa(?c_U5Yz^ z#%Y0#%S_KpEGY$=XJL?(l#*ybuErX#^g`ttQfwn3r>K)tuC)r#2`iJ>Prt42#Ndx#Uc~1)>aw z3jE@Q4|!9Z%lVv}- zc=48cF7H)t`(Ck`^+mtha~Np7bBSw2NpOBzNqJ&XDuaWDvZiNlVtT4?VtQtBwt|VC zk)DNurKP@sg}#BILUK`NaY>~^Ze?*vX0l#tv0h4PL4IC|UUGi!#9fLzfW~Qojmu2W zODrh`nrE42VU(7fm~5G9U~HM3l#*m_WNcxOXkuzEX4g z+-vfUhb0A>b04=Im{6XiQd1v%r%>h0$G8U7E1If8OQ!N~xOYY5h0NDT$p9(iZ?Q&e z18-(+l~J8O`)kc}e&uL$eW&>P-#`~Qm$*ih1m~xflqVLYGB{``YkKA;rl!p+yCFkc(+@-h!Xq*<< zxXkpt#FA2=d1VEBsYynrsitN|Y01eJ$;p;U#>wWX2KP5v&I9V=1L+C? fTFYQ)RAFeOZJ=$?lDoSWD8u0C>gTe~DWM4f^}upZ diff --git a/docs/src/reference/resources/images/callouts/6.png b/docs/src/reference/resources/images/callouts/6.png deleted file mode 100644 index 0ba694af6c07d947d219b45a629bd32c60a0f5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}^nQ*)Bra@SU# zmiz#bR~{$s2si{S(aY|Z}Vd7tb ouUmn-_&~Y>fYve?8dVq?X&Y!8wB+ut1u%w%U~xZhnMEEs6JbBSw2NpOBzNqJ&XDuaWDvZiNlVtT4?VtQtBwt|VC zk)DNurKP@sg}#BILUK`NaY>~^Ze?*vX0l#tv0h4PL4IC|UUGi!#9fLzfW~Qojmu2W zODrh`nrCEbVQgk$XkwI@Y+{_8nv`N>YGIaQkz#0QY@Te9lBQ<)awbq0A4pdK&{_sV bqY6VKZ3AtCmfYR7Kp6&4S3j3^P6u&S`V$cAh@R~F=4@V4jxkzlaQrcFYWK{)(`o5XZnut z=nE4SU2g1ZW%;@@I$>_e3F8a=8WK~|CVXt1DqisQxtIX|`YW_n&?Nh#1gQ}d)$LrYTw(_{nVG)tp2V+#}WG*e^KRLdkoLz7g? qn(IA84Qgo42`r6v<+Hvch>@C7(8A5T-G@yGywn*$#_oy diff --git a/docs/src/reference/resources/images/callouts/9.png b/docs/src/reference/resources/images/callouts/9.png deleted file mode 100644 index a0676d26cc2ff1de12c4ecdeefb44a0d71bc6bde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}^nQNRqa;^5&H%t0&v*|C|wdb9$wI zR@+N9#RIowg@Uqn&z-__Tzhhz!sG|vTxA7?=O|Y?u(d4T{!RM9c7chr6d%1?R=i16 z?@Ic{f32YJFJnVhX)qGzOMplv!L->5yAlT#}irms+fsQd*FoSE84k zpF44v;trs3T43Wc)AJHbN`dAXo0u6Hr<$gkq?lM38ycjV7+5A5Sr{ayr5c%-n;95g pF*H#D>f!_G3IJNmU}#ifXryhRZP1dtyA~+J;OXk;vd$@?2>@J{cB%jX diff --git a/docs/src/reference/resources/images/logo.png b/docs/src/reference/resources/images/logo.png deleted file mode 100644 index a9f6d959e77f14eed6bdb750190ff83289279793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9627 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 diff --git a/docs/src/reference/resources/xsl/fopdf.xsl b/docs/src/reference/resources/xsl/fopdf.xsl deleted file mode 100644 index 8582406d..00000000 --- a/docs/src/reference/resources/xsl/fopdf.xsl +++ /dev/null @@ -1,449 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - , - - - - - ( - - ) - - - - Copyright © 2010-2011 - - - - - - - - - - - - - - - - - - - - - - - - - - - - -5em - -5em - - - - - - - - - - - Spring Data Redis () - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - 1 - 1 - 0 - - - - - - book toc - - - - 2 - - - - - - - - - - 0 - 0 - 0 - - - 5mm - 10mm - 10mm - - 15mm - 10mm - 0mm - - 18mm - 18mm - - - 0pc - - - - - justify - false - - - 11 - 8 - - - 1.4 - - - - - - - 0.8em - - - - - - 17.4cm - - - - 4pt - 4pt - 4pt - 4pt - - - - 0.1pt - 0.1pt - - - - - 1 - - - - - - - - left - bold - - - pt - - - - - - - - - - - - - - - 0.8em - 0.8em - 0.8em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.6em - 0.6em - 0.6em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.4em - 0.4em - 0.4em - - - pt - - 0.1em - 0.1em - 0.1em - - - - - bold - - - pt - - false - 0.4em - 0.6em - 0.8em - - - - - - - - - pt - - - - - 1em - 1em - 1em - #444444 - solid - 0.1pt - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - - - - 1 - - #F0F0F0 - - - - - - 0 - 1 - - - 90 - - - - - '1' - src/docbkx/resources/images/admons/ - - - - - - figure after - example before - equation before - table before - procedure before - - - - 1 - - - - 0.8em - 0.8em - 0.8em - 0.1em - 0.1em - 0.1em - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/reference/resources/xsl/highlight-fo.xsl b/docs/src/reference/resources/xsl/highlight-fo.xsl deleted file mode 100644 index f0b5dd94..00000000 --- a/docs/src/reference/resources/xsl/highlight-fo.xsl +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/src/reference/resources/xsl/highlight.xsl b/docs/src/reference/resources/xsl/highlight.xsl deleted file mode 100644 index c63c4765..00000000 --- a/docs/src/reference/resources/xsl/highlight.xsl +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/src/reference/resources/xsl/html-custom.xsl b/docs/src/reference/resources/xsl/html-custom.xsl deleted file mode 100644 index a6330843..00000000 --- a/docs/src/reference/resources/xsl/html-custom.xsl +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - '5' - '1' - - - 1 - - - 1 - - - 0 - 0 - 1 - - - - images/admon/ - .png - - 120 - images/callouts/ - .png - - - css/manual.css - text/css - book toc,title - - text-align: left - - - - - - - - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Begin Google Analytics code - - - End Google Analytics code - - - - - Begin LoopFuse code - - - End LoopFuse code - - - \ No newline at end of file diff --git a/docs/src/reference/resources/xsl/html-single-custom.xsl b/docs/src/reference/resources/xsl/html-single-custom.xsl deleted file mode 100644 index c37095bb..00000000 --- a/docs/src/reference/resources/xsl/html-single-custom.xsl +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - 1 - - - 1 - - - 0 - 0 - 1 - - - - images/admon/ - .png - - 120 - images/callouts/ - .png - - - css/manual.css - text/css - book toc,title - - text-align: left - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Begin Google Analytics code - - -End Google Analytics code - - - - -Begin LoopFuse code - - -End LoopFuse code - - - \ No newline at end of file diff --git a/docs/src/reference/resources/xsl/html.xsl b/docs/src/reference/resources/xsl/html.xsl deleted file mode 100644 index 2b0f8d6e..00000000 --- a/docs/src/reference/resources/xsl/html.xsl +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - 0 - 0 - 1 - - - - - - book toc - - - - 3 - - - - - 1 - - - - - - - 1 - - - 90 - - - - - 1 - images/admons/ - - - - figure after - example before - equation before - table before - procedure before - - - - , - - - - () - - - - -
-

Authors

-

- -

-
- - - -
- - - - diff --git a/docs/src/reference/resources/xsl/html_chunk.xsl b/docs/src/reference/resources/xsl/html_chunk.xsl deleted file mode 100644 index 29b35d28..00000000 --- a/docs/src/reference/resources/xsl/html_chunk.xsl +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - '5' - '1' - 0 - 0 - 1 - - - - book toc - qandaset toc - - - 3 - - - 1 - - - - - 1 - 90 - - - - - 1 - images/admons/ - - - - figure after - example before - equation before - table before - procedure before - - - - , - - - - () - - - - - -
-

Authors

-

- -

-
- - - - - - - - 1 - - - - - - - - - - - - - -
diff --git a/docs/src/reference/resources/xsl/pdf-custom.xsl b/docs/src/reference/resources/xsl/pdf-custom.xsl deleted file mode 100644 index 9b94a030..00000000 --- a/docs/src/reference/resources/xsl/pdf-custom.xsl +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - - - - - '1' - images/admon/ - .png - - - - - 24pt - - - - - - - - - - - - - - - - - - - - -5em - -5em - - - - - - book toc,title - - - - - - - - - - - - - - - - - Spring GemFire - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - 0 - 0 - 1 - - - - - 0 - 0 - 0 - - - - false - - - 11 - 8 - - - 1.4 - - - - left - bold - - - pt - - - - - - - - - - - - - - - 0.8em - 0.8em - 0.8em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.6em - 0.6em - 0.6em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.4em - 0.4em - 0.4em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.3em - 0.3em - 0.3em - - - pt - - 0.1em - 0.1em - 0.1em - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4pt - 4pt - 4pt - 4pt - - - - 0.1pt - 0.1pt - - - - - - - - - - - - - - - - - - pt - - - - - 1em - 1em - 1em - 0.1em - 0.1em - 0.1em - - #444444 - solid - 0.1pt - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - - - - 1 - - #F0F0F0 - - - - 0.1em - 0.1em - 0.1em - 0.1em - 0.1em - 0.1em - - - - 0.5em - 0.5em - 0.5em - 0.1em - 0.1em - 0.1em - always - - - - - - normal - italic - - - pt - - false - 0.1em - 0.1em - 0.1em - - - - - - 0 - 1 - - - 90 - - - - - - figure after - example after - equation before - table before - procedure before - - - - 1 - - 0pt - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 45bfb5c85ea4b9b0d02616718f2637b2075acb1c..e3b3376e6002f9d44543761c8d3dcd199eff1d82 100644 GIT binary patch literal 39860 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%0A3!wsG4uToG`VrIW5Id|4fPyx?=aMz8G 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" else - JAVACMD="java" + PRG=`dirname "$PRG"`"/$link" fi -fi -if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" +APP_HOME="`pwd -P`" +cd "$SAVED" + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." -fi -if [ -z "$JAVA_HOME" ] ; then - warn "JAVA_HOME environment variable is not set" fi # Increase the maximum file descriptors if we can. @@ -108,15 +105,14 @@ if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then fi fi -# For Darwin, add GRADLE_APP_NAME to the JAVA_OPTS as -Xdock:name +# For Darwin, add options to specify how the application appears in the dock if $darwin; then - JAVA_OPTS="$JAVA_OPTS -Xdock:name=$GRADLE_APP_NAME" -# we may also want to set -Xdock:image + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin, switch paths to Windows format before running java if $cygwin ; then - JAVA_HOME=`cygpath --path --mixed "$JAVA_HOME"` + APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` # We build the pattern for arguments to be converted via cygpath @@ -143,7 +139,7 @@ if $cygwin ; then eval `echo args$i`="\"$arg\"" fi i=$((i+1)) - done + done case $i in (0) set -- ;; (1) set -- "$args0" ;; @@ -158,11 +154,11 @@ if $cygwin ; then esac fi -GRADLE_APP_BASE_NAME=`basename "$0"` +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" -exec "$JAVACMD" $JAVA_OPTS $GRADLE_OPTS \ - -classpath "$CLASSPATH" \ - -Dorg.gradle.appname="$GRADLE_APP_BASE_NAME" \ - -Dorg.gradle.wrapper.properties="$WRAPPER_PROPERTIES" \ - $STARTER_MAIN_CLASS \ - "$@" +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat index 479fdddb..8a0b282a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,24 +1,37 @@ @if "%DEBUG%" == "" @echo off @rem ########################################################################## -@rem ## -@rem Gradle startup script for Windows ## -@rem ## +@rem +@rem Gradle startup script for Windows +@rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Uncomment those lines to set JVM options. GRADLE_OPTS and JAVA_OPTS can be used together. -@rem set GRADLE_OPTS=%GRADLE_OPTS% -Xmx512m -@rem set JAVA_OPTS=%JAVA_OPTS% -Xmx512m +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=.\ +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% @rem Find java.exe -set JAVA_EXE=java.exe -if not defined JAVA_HOME goto init +if defined JAVA_HOME goto findJavaFromJavaHome +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe @@ -29,14 +42,14 @@ echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. -echo. -goto end + +goto fail :init @rem Get command-line arguments, handling Windowz variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%eval[2+2]" == "4" goto 4NT_args +if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -56,27 +69,22 @@ set CMD_LINE_ARGS=%$ :execute @rem Setup the command line -set STARTER_MAIN_CLASS=org.gradle.wrapper.GradleWrapperMain -set CLASSPATH=%DIRNAME%\gradle\wrapper\gradle-wrapper.jar -set WRAPPER_PROPERTIES=%DIRNAME%\gradle\wrapper\gradle-wrapper.properties - -set GRADLE_OPTS=%JAVA_OPTS% %GRADLE_OPTS% -Dorg.gradle.wrapper.properties="%WRAPPER_PROPERTIES%" +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %GRADLE_OPTS% -classpath "%CLASSPATH%" %STARTER_MAIN_CLASS% %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd -if not "%OS%"=="Windows_NT" echo 1 > nul | choice /n /c:1 - +:fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit "%ERRORLEVEL%" -exit /b "%ERRORLEVEL%" +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal -:omega \ No newline at end of file +:omega diff --git a/maven.gradle b/maven.gradle index 4c5d933f..b71fa257 100644 --- a/maven.gradle +++ b/maven.gradle @@ -1,145 +1,59 @@ apply plugin: 'maven' -// Create a source jar for uploading -task sourceJar(type: Jar, dependsOn: jar) { - classifier = 'sources' - from sourceSets.main.allSource -} +ext.optionalDeps = [] +ext.providedDeps = [] -// Create a javadoc jar for uploading -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives sourceJar - archives javadocJar -} - -// Configuration for SpringSource s3 maven deployer -configurations { - deployerJars -} -dependencies { - deployerJars "org.springframework.build.aws:org.springframework.build.aws.maven:3.0.0.RELEASE" -} - -// Remove the archive configuration from the runtime configuration, so that anything added to archives -// (such as the source jar) is no longer included in the runtime classpath -configurations.default.extendsFrom = [configurations.runtime] as Set -// Add the main jar into the default configuration -artifacts { 'default' jar } - -gradle.taskGraph.whenReady {graph -> - if (graph.hasTask(uploadArchives)) { - // check properties defined and fail early - s3AccessKey - s3SecretAccessKey - } -} - -def deployer = null - -uploadArchives { - description = "Maven deploy of archives artifacts to SpringSource Maven repos" // url appended below - group = "Distribution" - // Maven deployment - def releaseRepositoryUrl = "file://${project.properties.mavenSyncRepoDir}" - def milestoneRepositoryUrl = 's3://maven.springframework.org/milestone' - def snapshotRepositoryUrl = 's3://maven.springframework.org/snapshot' - - // add a configuration with a classpath that includes our s3 maven deployer - configurations { deployerJars } - dependencies { - deployerJars "org.springframework.build.aws:org.springframework.build.aws.maven:3.0.0.RELEASE" - } - - deployer = repositories.mavenDeployer { - configuration = configurations.deployerJars - // releaseBuild - if (releaseBuild) { - logger.info("Deploying to local Maven repo " + releaseRepositoryUrl) - // "mavenSyncRepoDir" should be set in properties - repository(url: releaseRepositoryUrl) - } else { - s3credentials = [userName: project.properties.s3AccessKey, passphrase: project.properties.s3SecretAccessKey] - repository(url: milestoneRepositoryUrl) { - authentication(s3credentials) - } - snapshotRepository(url: snapshotRepositoryUrl) { - authentication(s3credentials) - } - } - } - - customizePom(deployer.pom) -} +ext.optional = { optionalDeps << it } +ext.provided = { providedDeps << it } install { - customizePom(repositories.mavenInstaller.pom) + repositories.mavenInstaller { + customizePom(pom, project) + } } -def customizePom(pom) { - def optionalDeps = ['log4j','jsr250-api'] - - //pom.scopeMappings.addMapping(10, configurations.provided, 'provided') - pom.whenConfigured { p -> - // Remove test scope dependencies from published poms - p.dependencies = p.dependencies.findAll {it.scope != 'test'} - - // Flag optional deps - def opDeps = configurations.testRuntime.allDependencies.findAll { gradleDep -> - gradleDep.asDynamicObject.hasProperty('optional') && gradleDep.optional +def customizePom(pom, gradleProject) { + pom.whenConfigured { generatedPom -> + // respect 'optional' and 'provided' dependencies + gradleProject.optionalDeps.each { dep -> + generatedPom.dependencies.find { it.artifactId == dep.name }?.optional = true + } + gradleProject.providedDeps.each { dep -> + generatedPom.dependencies.find { it.artifactId == dep.name }?.scope = 'provided' } - p.dependencies.findAll { dep -> - optionalDeps.contains(dep.artifactId) || - dep.groupId.startsWith('org.slf4j') || - opDeps.any { op -> - (dep.groupId == op.group && dep.artifactId == op.name) - } - }*.optional = true - - p.groupId = "org.springframework.data" - } - - pom.project { - name = project.description - description = project.description - url = 'http://github.com/SpringSource/spring-gemfire' - organization { - name = 'SpringSource' - url = 'http://www.springsource.org/spring-gemfire' + // eliminate test-scoped dependencies (no need in maven central poms) + generatedPom.dependencies.removeAll { dep -> + dep.scope == 'test' } - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - scm { + // add all items necessary for maven central publication + generatedPom.project { + name = gradleProject.description + description = gradleProject.description url = 'http://github.com/SpringSource/spring-gemfire' - connection = 'scm:git:git://github.com/SpringSource/spring-gemfire' - developerConnection = 'scm:git:git://github.com/SpringSource/spring-gemfire' - } - developers { - developer { - id = 'costin' - name = 'Costin Leau' - email = 'cleau@vmware.com' + organization { + name = 'SpringSource' + url = 'http://www.springsource.org/spring-gemfire' } - } - - // similar to Spring's configuration - dependencies { - dependency { - artifactId = groupId = 'commons-logging' - scope = 'compile' - optional = 'true' - version = '1.1.1' + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + distribution 'repo' + } + } + scm { + url = 'http://github.com/SpringSource/spring-gemfire' + connection = 'scm:git:git://github.com/SpringSource/spring-gemfire' + developerConnection = 'scm:git:git://github.com/SpringSource/spring-gemfire' + } + developers { + developer { + id = 'costin' + name = 'Costin Leau' + email = 'cleau@vmware.com' + } } } } diff --git a/settings.gradle b/settings.gradle index c493e64a..f79b008d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1 @@ rootProject.name = 'spring-data-gemfire' - -include 'docs' - -docs = findProject(':docs') \ No newline at end of file diff --git a/template.mf b/template.mf index d29cfb28..91c0e4f0 100644 --- a/template.mf +++ b/template.mf @@ -2,21 +2,18 @@ Bundle-SymbolicName: org.springframework.data.gemfire Bundle-Name: Spring Data GemFire Bundle-Vendor: SpringSource Bundle-ManifestVersion: 2 -Export-Template: org.springframework.data.gemfire.*;version=${version} Import-Package: sun.reflect;version="0";resolution:=optional Import-Template: - org.springframework.asm.*;version=${spring.range}, - org.springframework.beans.*;version=${spring.range}, - org.springframework.cache.*;version=${spring.range}, - org.springframework.context.*;version=${spring.range}, - org.springframework.core.*;version=${spring.range}, - org.springframework.dao.*;version=${spring.range}, - org.springframework.data.*;version="${springDataCommonsVersion:[=.=.=.=,+1.0.0)}", - org.springframework.expression.*;version="${springVersion:[=.=.=,+1.0.0)}", - org.springframework.util.*;version=${spring.range}, - org.springframework.transaction.*;version=${spring.range}, - com.gemstone.gemfire.*;version=${gemfire.range}, + org.springframework.asm.*;version="[3.0.0, 4.0.0)", + org.springframework.beans.*;version="[3.0.0, 4.0.0)", + org.springframework.cache.*;version="[3.0.0, 4.0.0)", + org.springframework.context.*;version="[3.0.0, 4.0.0)", + org.springframework.core.*;version="[3.0.0, 4.0.0)", + org.springframework.dao.*;version="[3.0.0, 4.0.0)", + org.springframework.util.*;version="[3.0.0, 4.0.0)", + org.springframework.transaction.*;version="[3.0.0, 4.0.0)", + com.gemstone.gemfire.*;version="[6.5, 7.0)", org.aopalliance.*;version="[1.0.0, 2.0.0)";resolution:=optional, org.apache.commons.logging.*;version="[1.1.1, 2.0.0)", - org.w3c.dom.*;version="0" \ No newline at end of file + org.w3c.dom.*;version="0" From 00fbc930700b84ff2ee6e985f852ac0bea514a3d Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Sun, 1 Jul 2012 21:45:47 +0300 Subject: [PATCH 12/17] fix docs --- .../reference/docbook/reference/bootstrap.xml | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/docs/src/reference/docbook/reference/bootstrap.xml b/docs/src/reference/docbook/reference/bootstrap.xml index bff74519..80a3fca1 100644 --- a/docs/src/reference/docbook/reference/bootstrap.xml +++ b/docs/src/reference/docbook/reference/bootstrap.xml @@ -20,23 +20,16 @@ To use the SGF namespace, one just needs to import it inside the configuration: - - - - - - - + ]]> - + ]]> ]]> @@ -54,30 +47,22 @@ Declaration example for the GemFire namespace. Notice the prefix usage. - Once declared, the namespace elements can be declared simply by appending the aforementioned prefix. Note that is possible to change the default namespace, for example from <beans> to <gfe>. This is useful for configuration composed mainly of GemFire components as it avoids declaring the prefix. To achieve this, simply swap the namespace prefix declaration above: - - - - - - - - - + ]]> - + ]]> ]]> @@ -94,7 +79,6 @@ Bean declaration using the <gfe> namespace. Notice the lack of prefix (as the default namespace is used). - For the remainder of this doc, to improve readability, the XML examples will simply refer to the <gfe> namespace without the namespace declaration, where possible. From 1cac0c5d7d094896580db364077ac4897cd07f4a Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Sun, 1 Jul 2012 22:01:40 +0300 Subject: [PATCH 13/17] update sample build --- samples/hello-world/build.gradle | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/samples/hello-world/build.gradle b/samples/hello-world/build.gradle index 7fab5087..789093dc 100644 --- a/samples/hello-world/build.gradle +++ b/samples/hello-world/build.gradle @@ -3,43 +3,35 @@ description = 'Spring Data GemFire Samples - Hello World' apply plugin: 'base' apply plugin: 'idea' apply plugin: 'java' -apply plugin: 'eclipse' // `gradle eclipse` to generate .classpath/.project +apply plugin: 'eclipse' +apply plugin: 'application' [compileJava, compileTestJava]*.options*.compilerArgs = ["-Xlint:-serial"] - repositories { - mavenLocal() - mavenCentral() // Public Spring artefacts - mavenRepo name: "springsource-org-release", urls: "http://repository.springsource.com/maven/bundles/release" - mavenRepo name: "spring-release", urls: "http://maven.springframework.org/release" - mavenRepo name: "spring-milestone", urls: "http://maven.springframework.org/milestone" - mavenRepo name: "spring-snapshot", urls: "http://maven.springframework.org/snapshot" - mavenRepo name: "sonatype-snapshot", urls: "http://oss.sonatype.org/content/repositories/snapshots" - mavenRepo name: "ext-snapshots", urls: "http://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/" - mavenRepo name: "gemfire-release-repo", urls: "http://dist.gemstone.com/maven/release" + maven { url "http://repo.springsource.org/libs-snapshot" } + mavenLocal() } dependencies { compile "org.springframework.data:spring-data-gemfire:$version" compile "javax.inject:javax.inject:1" compile "javax.annotation:jsr250-api:1.0" + + runtime "log4j:log4j:$log4jVersion" + runtime "org.slf4j:slf4j-log4j12:$slf4jVersion" testCompile "junit:junit:$junitVersion" testCompile "org.springframework:spring-test:$springVersion" } -sourceCompatibility = 1.5 -targetCompatibility = 1.5 - -task run(type: JavaExec) { - description = 'Runs the application' - main = "org.springframework.data.gemfire.samples.helloworld.Main" - classpath = sourceSets.main.runtimeClasspath - standardInput = System.in - systemProperties['java.net.preferIPv4Stack'] = 'true' +run { + main = "org.springframework.data.gemfire.samples.helloworld.Main" + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + systemProperties['java.net.preferIPv4Stack'] = 'true' } defaultTasks 'run' \ No newline at end of file From c199468ab551f1ad0828c260e9fa319f927a6c8f Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Wed, 4 Jul 2012 10:20:32 +0300 Subject: [PATCH 14/17] update schema task --- build.gradle | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 0222e8d3..cd6bf88c 100644 --- a/build.gradle +++ b/build.gradle @@ -157,22 +157,18 @@ task schemaZip(type: Zip) { it.path.endsWith('META-INF' + File.separator + 'spring.schemas') }?.withInputStream { schemas.load(it) } - ext.paths = [] as Set - for (def key : schemas.keySet()) { def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') + def alias = key.replaceAll(/http.*schema.(.*).(spring-.*)/, '$2') assert shortName != key File xsdFile = sourceSets.main.resources.find { it.path.replace('\\', '/').endsWith(schemas.get(key)) } assert xsdFile != null - def input = xsdFile.path - - if (!paths.contains(input)) { - paths.add(input) - into (shortName) { - from input - } + + into (shortName) { + from xsdFile.path + rename { String fileName -> alias } } } } From 1e6d4060a620f042df274addf9ffdf1ec4663106 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Wed, 4 Jul 2012 13:28:01 -0400 Subject: [PATCH 15/17] clean up build --- build.gradle | 1 + template.mf | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index cd6bf88c..000c99b9 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ group = 'org.springframework.data' repositories { maven { url "http://repo.springsource.org/libs-snapshot" } maven { url "http://repo.springsource.org/plugins-release" } + maven { url "http://repo1.maven.org/maven2" } } diff --git a/template.mf b/template.mf index 91c0e4f0..69e19047 100644 --- a/template.mf +++ b/template.mf @@ -11,9 +11,11 @@ Import-Template: org.springframework.context.*;version="[3.0.0, 4.0.0)", org.springframework.core.*;version="[3.0.0, 4.0.0)", org.springframework.dao.*;version="[3.0.0, 4.0.0)", + org.springframework.data.*;version="[1.2.0,2.0.0)", + org.springframework.expression.*;version="[3.0.0, 4.0.0)", org.springframework.util.*;version="[3.0.0, 4.0.0)", org.springframework.transaction.*;version="[3.0.0, 4.0.0)", - com.gemstone.gemfire.*;version="[6.5, 7.0)", + com.gemstone.*;version="[6.5, 7.0)", org.aopalliance.*;version="[1.0.0, 2.0.0)";resolution:=optional, org.apache.commons.logging.*;version="[1.1.1, 2.0.0)", org.w3c.dom.*;version="0" From fb10fe337bdba7ca3cd1825b9e6400fd5af8f5e2 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Wed, 4 Jul 2012 13:54:26 -0400 Subject: [PATCH 16/17] updating docs --- docs/src/reference/docbook/index.xml | 5 +++++ docs/src/reference/docbook/reference/repositories.xml | 2 +- maven.gradle | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/src/reference/docbook/index.xml b/docs/src/reference/docbook/index.xml index 04f0d61a..db252cb8 100644 --- a/docs/src/reference/docbook/index.xml +++ b/docs/src/reference/docbook/index.xml @@ -21,6 +21,11 @@ Gierke SpringSource, a division of VMware
+ + David + Turanski + SpringSource, a division of VMware +
diff --git a/docs/src/reference/docbook/reference/repositories.xml b/docs/src/reference/docbook/reference/repositories.xml index 1e4c0cbe..557adae3 100644 --- a/docs/src/reference/docbook/reference/repositories.xml +++ b/docs/src/reference/docbook/reference/repositories.xml @@ -14,7 +14,7 @@ Spring Data Gemfire provides support to use the Spring Data repository abstraction to easily persist entities into Gemfire and execute - queries. A general introduction into the repository programmin model has + queries. A general introduction into the repository programming model has been provided in . diff --git a/maven.gradle b/maven.gradle index b71fa257..fbf2ac92 100644 --- a/maven.gradle +++ b/maven.gradle @@ -54,6 +54,11 @@ def customizePom(pom, gradleProject) { name = 'Costin Leau' email = 'cleau@vmware.com' } + developer { + id = 'dturanski' + name = 'David Turanski' + email = 'dturanski@vmware.com' + } } } } From f7bc4ca95c37dc10c50fd1115dc97549c07b2cd1 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Tue, 10 Jul 2012 07:48:58 -0400 Subject: [PATCH 17/17] doc update:temporarily removed link to spring data chapter in index.xml and fixed a typo in mapping.xml --- docs/src/reference/docbook/index.xml | 4 +++- docs/src/reference/docbook/reference/mapping.xml | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/src/reference/docbook/index.xml b/docs/src/reference/docbook/index.xml index db252cb8..f0182cb1 100644 --- a/docs/src/reference/docbook/index.xml +++ b/docs/src/reference/docbook/index.xml @@ -55,9 +55,11 @@ + @@ -67,7 +69,7 @@ In addition to this reference documentation, there are a number of - other resources that may help you learn how to use GemFire and Spring framework. + other resources that may help you learn how to use GemFire and Spring framework. These additional, third-party resources are enumerated in this section. diff --git a/docs/src/reference/docbook/reference/mapping.xml b/docs/src/reference/docbook/reference/mapping.xml index 03409452..266d7b48 100644 --- a/docs/src/reference/docbook/reference/mapping.xml +++ b/docs/src/reference/docbook/reference/mapping.xml @@ -32,6 +32,7 @@ public class Person { … }
+ The first thing you see here is the @@ -71,8 +72,8 @@ public class Person { // … } - … }
+ The entity annotated as such will get the field foo