diff --git a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java index 9b4c2f5e..e33b4680 100644 --- a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java @@ -134,7 +134,7 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } if (gatewayConflictResolver != null) { - cacheImpl.setGatewayConflictResolver(gatewayConflictResolver); + cacheImpl.setGatewayConflictResolver((GatewayConflictResolver) gatewayConflictResolver); } } } @@ -267,7 +267,8 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl protected List functions; - protected GatewayConflictResolver gatewayConflictResolver; + // Defined this way for backward compatibility + protected Object gatewayConflictResolver; @Override public void afterPropertiesSet() throws Exception { @@ -632,7 +633,12 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl this.functions = functions; } - public void setGatewayConflictResolver(GatewayConflictResolver gatewayConflictResolver) { + /** + * + * @param gatewayConflictResolver defined as Object for backward + * compatibility with Gemfire 6 compatibility + */ + public void setGatewayConflictResolver(Object gatewayConflictResolver) { this.gatewayConflictResolver = gatewayConflictResolver; } diff --git a/src/main/java/org/springframework/data/gemfire/DataPolicyConverter.java b/src/main/java/org/springframework/data/gemfire/DataPolicyConverter.java new file mode 100644 index 00000000..f6a426db --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/DataPolicyConverter.java @@ -0,0 +1,77 @@ +/* + * 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.core.convert.converter.Converter; + +import com.gemstone.gemfire.cache.DataPolicy; + +/** + * @author David Turanski + * + */ +public class DataPolicyConverter implements Converter { + private static enum Policy { + EMPTY, DEFAULT, NORMAL, PERSISTENT_PARTITION, PERSISTENT_REPLICATE, PRELOADED, REPLICATE; + public DataPolicy toDataPolicy() { + DataPolicy dataPolicy = null; + switch (this) { + case EMPTY: + dataPolicy = DataPolicy.EMPTY; + break; + case DEFAULT: + dataPolicy = DataPolicy.DEFAULT; + break; + case NORMAL: + dataPolicy = DataPolicy.NORMAL; + break; + case PERSISTENT_PARTITION: + dataPolicy = DataPolicy.PERSISTENT_PARTITION; + break; + case PERSISTENT_REPLICATE: + dataPolicy = DataPolicy.PERSISTENT_REPLICATE; + break; + case PRELOADED: + dataPolicy = DataPolicy.PRELOADED; + break; + case REPLICATE: + dataPolicy = DataPolicy.REPLICATE; + break; + } + return dataPolicy; + } + + public static Policy getValue(String value) { + Policy policy = null; + try { + policy = valueOf(value); + } + catch (Exception e) { + } + return policy; + } + }; + + @Override + public DataPolicy convert(String source) { + if (source == null) { + return null; + } + source = source.toUpperCase(); + return Policy.getValue(source) == null ? null : Policy.getValue(source).toDataPolicy(); + } + +} diff --git a/src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java index e5db8f69..55186439 100644 --- a/src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/LocalRegionFactoryBean.java @@ -17,27 +17,44 @@ package org.springframework.data.gemfire; import com.gemstone.gemfire.cache.DataPolicy; import com.gemstone.gemfire.cache.RegionFactory; +import com.gemstone.gemfire.cache.Scope; /** * @author David Turanski * */ public class LocalRegionFactoryBean extends RegionFactoryBean { + @Override + public void setScope(Scope scope) { + throw new UnsupportedOperationException("setScope() is not allowed for Local Regions"); + } @Override - protected void resolveDataPolicy(RegionFactory regionFactory, boolean persistent, String dataPolicyName) { - if (dataPolicyName != null) { - if ("NORMAL".equals(dataPolicyName) || dataPolicyName == null) { + public void setPersistent(boolean persistent) { + throw new UnsupportedOperationException("setPersistent() is not allowed for Local Regions"); + } + + @Override + public void afterPropertiesSet() throws Exception { + super.setScope(Scope.LOCAL); + super.afterPropertiesSet(); + } + + @Override + protected void resolveDataPolicy(RegionFactory regionFactory, Boolean persistent, String dataPolicy) { + if (dataPolicy != null) { + dataPolicy = dataPolicy.toUpperCase(); + if ("NORMAL".equals(dataPolicy) || dataPolicy == null) { regionFactory.setDataPolicy(DataPolicy.NORMAL); } - else if ("PRELOADED".equals(dataPolicyName)) { + else if ("PRELOADED".equals(dataPolicy)) { regionFactory.setDataPolicy(DataPolicy.PRELOADED); } - else if ("EMPTY".equals(dataPolicyName)) { + else if ("EMPTY".equals(dataPolicy)) { regionFactory.setDataPolicy(DataPolicy.EMPTY); } else { - throw new IllegalArgumentException("Data policy '" + dataPolicyName + throw new IllegalArgumentException("Data policy '" + dataPolicy + "' 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 index 00764171..523dfe53 100644 --- a/src/main/java/org/springframework/data/gemfire/PartitionedRegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/PartitionedRegionFactoryBean.java @@ -17,6 +17,8 @@ package org.springframework.data.gemfire; import java.util.concurrent.ConcurrentMap; +import org.springframework.util.Assert; + import com.gemstone.gemfire.cache.CacheFactory; import com.gemstone.gemfire.cache.DataPolicy; import com.gemstone.gemfire.cache.Region; @@ -29,8 +31,23 @@ import com.gemstone.gemfire.cache.RegionFactory; public class PartitionedRegionFactoryBean extends RegionFactoryBean { @Override - protected void resolveDataPolicy(RegionFactory regionFactory, boolean persistent, String dataPolicyName) { - if (persistent) { + protected void resolveDataPolicy(RegionFactory regionFactory, Boolean persistent, String dataPolicy) { + if (dataPolicy != null) { + DataPolicy dp = new DataPolicyConverter().convert(dataPolicy); + Assert.notNull(dp, "Data policy " + dataPolicy + " is invalid"); + Assert.isTrue(dp.withPartitioning(), "Data Policy " + dp.toString() + + " is not supported in partitioned regions"); + if (!isPersistent()) { + regionFactory.setDataPolicy(dp); + } + else { + Assert.isTrue(dp.withPersistence(), "Data Policy " + dp.toString() + + "is invalid when persistent is false"); + regionFactory.setDataPolicy(dp); + } + return; + } + if (isPersistent()) { // check first for GemFire 6.5 if (ConcurrentMap.class.isAssignableFrom(Region.class)) { regionFactory.setDataPolicy(DataPolicy.PERSISTENT_PARTITION); diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java index 965bc84e..daaab3aa 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java @@ -34,6 +34,7 @@ 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 +55,7 @@ import com.gemstone.gemfire.cache.wan.GatewaySender; * @author Costin Leau * @author David Turanski */ -public abstract class RegionFactoryBean extends RegionLookupFactoryBean implements DisposableBean { +public class RegionFactoryBean extends RegionLookupFactoryBean implements DisposableBean { protected final Log log = LogFactory.getLog(getClass()); @@ -70,15 +71,15 @@ public abstract class RegionFactoryBean extends RegionLookupFactoryBean cacheWriter; - private GatewaySender gatewaySenders[]; + private Object gatewaySenders[]; - private AsyncEventQueue asyncEventQueues[]; + private Object asyncEventQueues[]; private RegionAttributes attributes; private Scope scope; - private boolean persistent; + private Boolean persistent; private Boolean enableGateway; @@ -86,7 +87,7 @@ public abstract class RegionFactoryBean extends RegionLookupFactoryBean region; @@ -131,14 +132,14 @@ public abstract class RegionFactoryBean extends RegionLookupFactoryBean extends RegionLookupFactoryBean extends RegionLookupFactoryBean regionFactory, boolean persistent, - String dataPolicyName); + /** + * This validates the configured data policy and may override it, taking + * into account the persistent attribute and constraints for the region type + * @param regionFactory + * @param persistent + * @param dataPolicy requested data policy + */ + protected void resolveDataPolicy(RegionFactory regionFactory, Boolean persistent, String dataPolicy) { + if (dataPolicy == null) { + if (isPersistent()) { + regionFactory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE); + } + else { + regionFactory.setDataPolicy(DataPolicy.DEFAULT); + } + return; + } + + DataPolicy dp = new DataPolicyConverter().convert(dataPolicy); + Assert.notNull(dp, "Data policy " + dataPolicy + " is invalid"); + if (dp.withPersistence()) { + Assert.isTrue(!isNotPersistent(), "Data policy " + dataPolicy + " is invalid when persistent is false"); + } + regionFactory.setDataPolicy(dp); + } @SuppressWarnings("unchecked") private AttributesFactory findAttrFactory(RegionFactory regionFactory) { @@ -330,10 +354,10 @@ public abstract class RegionFactoryBean extends RegionLookupFactoryBean extends RegionLookupFactoryBean extends RegionLookupFactoryBean attributes) { this.attributes = attributes; } + + protected boolean isPersistent() { + return persistent != null && persistent; + } + + protected boolean isNotPersistent() { + return persistent != null && !persistent; + } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java index 5d50c439..87737957 100644 --- a/src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/ReplicatedRegionFactoryBean.java @@ -26,22 +26,28 @@ import com.gemstone.gemfire.cache.RegionFactory; */ 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; + protected void resolveDataPolicy(RegionFactory regionFactory, Boolean persistent, String dataPolicy) { + DataPolicy dp = null; + if (dataPolicy != null) { + dataPolicy = dataPolicy.toUpperCase(); + if ("EMPTY".equals(dataPolicy)) { + Assert.isTrue(persistent == null || !persistent, "Cannot have persistence on an empty region"); + dp = DataPolicy.EMPTY; } else { - throw new IllegalArgumentException("Data policy '" + dataPolicyName - + "' is unsupported or invalid for replicated regions."); + dp = new DataPolicyConverter().convert(dataPolicy); + Assert.notNull(dp, "Data policy " + dataPolicy + " is invalid"); + Assert.isTrue(dp.withReplication(), "Data policy " + dataPolicy + + " is invalid or unsupported in replicated regions"); + if (isPersistent()) { + Assert.isTrue(dp.withPersistence(), "Data policy " + dataPolicy + + " is invalid when persistent is false"); + } } } else { - dataPolicy = persistent ? DataPolicy.PERSISTENT_REPLICATE : DataPolicy.REPLICATE; + dp = (isPersistent()) ? DataPolicy.PERSISTENT_REPLICATE : DataPolicy.REPLICATE; } - regionFactory.setDataPolicy(dataPolicy); + regionFactory.setDataPolicy(dp); } } 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 ea87971d..9a298c66 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -108,7 +108,7 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { ParsingUtils.setPropertyValue(element, builder, "persistent"); } // set the data policy - ParsingUtils.setPropertyValue(element, builder, "data-policy", "dataPolicyName"); + ParsingUtils.setPropertyValue(element, builder, "data-policy"); 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/LocalRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java index e948cc58..e6bea01f 100644 --- a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java @@ -22,12 +22,9 @@ import org.springframework.data.gemfire.LocalRegionFactoryBean; import org.springframework.data.gemfire.RegionAttributesFactoryBean; import org.w3c.dom.Element; -import com.gemstone.gemfire.cache.Scope; - /** - * Parser for <replicated-region;gt; definitions. + * Parser for <local-region;gt; definitions. * - * @author Costin Leau * @author David Turanski */ class LocalRegionParser extends AbstractRegionParser { @@ -35,8 +32,6 @@ class LocalRegionParser extends AbstractRegionParser { protected void doParseRegion(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, boolean subRegion) { - builder.addPropertyValue("scope", Scope.LOCAL); - BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); 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 bf5178ed..297ff13f 100755 --- 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 @@ -541,11 +541,10 @@ use inner bean declarations. - + - - + + + + + + + + + + @@ -990,7 +1001,7 @@ Provides an estimate of the maximum number of application threads that will conc @@ -1600,7 +1611,7 @@ The action to take when performing eviction. - - - - - - - - diff --git a/src/test/java/org/springframework/data/gemfire/DataPolicyConverterTest.java b/src/test/java/org/springframework/data/gemfire/DataPolicyConverterTest.java new file mode 100644 index 00000000..1711fa27 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/DataPolicyConverterTest.java @@ -0,0 +1,38 @@ +/* + * 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.assertNull; + +import org.junit.Test; + +import com.gemstone.gemfire.cache.DataPolicy; + +/** + * @author David Turanski + * + */ +public class DataPolicyConverterTest { + DataPolicyConverter converter = new DataPolicyConverter(); + + @Test + public void test() { + assertEquals(DataPolicy.EMPTY, converter.convert("empty")); + assertNull(converter.convert("invalid")); + assertNull(converter.convert(null)); + } +} diff --git a/src/test/java/org/springframework/data/gemfire/LocalRegionFactoryBeanTest.java b/src/test/java/org/springframework/data/gemfire/LocalRegionFactoryBeanTest.java new file mode 100644 index 00000000..5d6b1111 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/LocalRegionFactoryBeanTest.java @@ -0,0 +1,88 @@ +/* + * 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 org.springframework.data.gemfire.support.AbstractRegionFactoryBeanTest; + +import com.gemstone.gemfire.cache.DataPolicy; +import com.gemstone.gemfire.cache.Region; + +/** + * @author David Turanski + * + */ +public class LocalRegionFactoryBeanTest extends AbstractRegionFactoryBeanTest { + + @SuppressWarnings("rawtypes") + private RegionFactoryBeanConfig defaultConfig() { + return new RegionFactoryBeanConfig(new LocalRegionFactoryBean(), "default") { + + @Override + public void verify() { + Region region = regionFactoryBean.getRegion(); + assertEquals(DataPolicy.DEFAULT, region.getAttributes().getDataPolicy()); + } + + @Override + public void configureRegionFactoryBean() { + // TODO Auto-generated method stub + } + }; + } + + @SuppressWarnings("rawtypes") + private RegionFactoryBeanConfig emptyConfig() { + return new RegionFactoryBeanConfig(new LocalRegionFactoryBean(), "empty") { + + @Override + public void verify() { + Region region = regionFactoryBean.getRegion(); + assertEquals(DataPolicy.EMPTY, region.getAttributes().getDataPolicy()); + } + + @Override + public void configureRegionFactoryBean() { + regionFactoryBean.setDataPolicy("empty"); + } + }; + } + + @SuppressWarnings("rawtypes") + private RegionFactoryBeanConfig invalidConfig() { + return new RegionFactoryBeanConfig(new LocalRegionFactoryBean(), "local-replicate") { + + @Override + public void verify() { + assertNotNull(this.exception); + } + + @Override + public void configureRegionFactoryBean() { + regionFactoryBean.setDataPolicy("replicate"); + } + }; + } + + @Override + protected void createRegionFactoryBeanConfigs() { + addRFBConfig(defaultConfig()); + addRFBConfig(emptyConfig()); + addRFBConfig(invalidConfig()); + } +} diff --git a/src/test/java/org/springframework/data/gemfire/RegionFactoryBeanTest.java b/src/test/java/org/springframework/data/gemfire/RegionFactoryBeanTest.java new file mode 100644 index 00000000..96620c27 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/RegionFactoryBeanTest.java @@ -0,0 +1,92 @@ +/* + * 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 org.springframework.data.gemfire.support.AbstractRegionFactoryBeanTest; + +import com.gemstone.gemfire.cache.DataPolicy; +import com.gemstone.gemfire.cache.Region; + +/** + * @author David Turanski + * + */ +public class RegionFactoryBeanTest extends AbstractRegionFactoryBeanTest { + + @SuppressWarnings("rawtypes") + private RegionFactoryBeanConfig defaultConfig() { + return new RegionFactoryBeanConfig(new RegionFactoryBean(), "default") { + + @Override + public void verify() { + Region region = regionFactoryBean.getRegion(); + assertEquals(DataPolicy.DEFAULT, region.getAttributes().getDataPolicy()); + } + + @Override + public void configureRegionFactoryBean() { + // TODO Auto-generated method stub + } + }; + + } + + @SuppressWarnings("rawtypes") + private RegionFactoryBeanConfig persistent() { + return new RegionFactoryBeanConfig(new RegionFactoryBean(), "persistent") { + + @Override + public void verify() { + Region region = regionFactoryBean.getRegion(); + assertEquals(DataPolicy.PERSISTENT_REPLICATE, region.getAttributes().getDataPolicy()); + } + + @Override + public void configureRegionFactoryBean() { + regionFactoryBean.setPersistent(true); + } + }; + } + + @SuppressWarnings("rawtypes") + private RegionFactoryBeanConfig invalidPersistence() { + return new RegionFactoryBeanConfig(new RegionFactoryBean(), "invalid-persistence") { + + @Override + public void configureRegionFactoryBean() { + regionFactoryBean.setDataPolicy("persistent_replicate"); + regionFactoryBean.setPersistent(false); + } + + @Override + public void verify() { + assertNotNull(this.exception); + assertEquals("Data policy persistent_replicate is invalid when persistent is false", + exception.getMessage()); + } + }; + } + + @Override + protected void createRegionFactoryBeanConfigs() { + addRFBConfig(defaultConfig()); + addRFBConfig(persistent()); + addRFBConfig(invalidPersistence()); + } +} 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 38109ffc..83f216ba 100644 --- a/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/LocalRegionNamespaceTest.java @@ -65,7 +65,7 @@ public class LocalRegionNamespaceTest { private void testPublishingLocal() throws Exception { assertTrue(context.containsBean("pub")); RegionFactoryBean fb = context.getBean("&pub", RegionFactoryBean.class); - assertEquals("NORMAL", TestUtils.readField("dataPolicyName", fb)); + assertEquals("NORMAL", TestUtils.readField("dataPolicy", fb)); assertEquals(Scope.LOCAL, TestUtils.readField("scope", fb)); assertEquals("publisher", TestUtils.readField("name", fb)); RegionAttributes attrs = TestUtils.readField("attributes", fb); diff --git a/src/test/java/org/springframework/data/gemfire/support/AbstractRegionFactoryBeanTest.java b/src/test/java/org/springframework/data/gemfire/support/AbstractRegionFactoryBeanTest.java new file mode 100644 index 00000000..a9684e9b --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/support/AbstractRegionFactoryBeanTest.java @@ -0,0 +1,100 @@ +/* + * 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.support; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.data.gemfire.CacheFactoryBean; +import org.springframework.data.gemfire.RegionFactoryBean; + +import com.gemstone.gemfire.cache.GemFireCache; + +/** + * @author David Turanski + * + */ +public abstract class AbstractRegionFactoryBeanTest { + protected GemFireCache cache; + + Map regionFactoryBeanConfigs = new HashMap(); + + @Before + public void setUp() throws Exception { + CacheFactoryBean cfb = new CacheFactoryBean(); + cfb.setBeanName("gemfire-cache"); + cfb.setUseBeanFactoryLocator(false); + cfb.afterPropertiesSet(); + cache = cfb.getObject(); + } + + @Test + public void testAll() throws Exception { + createRegionFactoryBeanConfigs(); + for (RegionFactoryBeanConfig rfbc : regionFactoryBeanConfigs.values()) { + rfbc.test(); + } + } + + protected void addRFBConfig(RegionFactoryBeanConfig rfbc) { + if (regionFactoryBeanConfigs.containsKey(rfbc.regionName)) { + throw new RuntimeException("duplicate region name " + rfbc.regionName); + } + regionFactoryBeanConfigs.put(rfbc.regionName, rfbc); + } + + @After + public void tearDown() { + cache.close(); + } + + public abstract class RegionFactoryBeanConfig { + @SuppressWarnings("rawtypes") + public final RegionFactoryBean regionFactoryBean; + + public final String regionName; + + public Exception exception; + + @SuppressWarnings("rawtypes") + public RegionFactoryBeanConfig(RegionFactoryBean rfb, String regionName) { + this.regionFactoryBean = rfb; + this.regionName = regionName; + rfb.setBeanName(regionName); + rfb.setCache(cache); + } + + public void test() { + configureRegionFactoryBean(); + try { + regionFactoryBean.afterPropertiesSet(); + } + catch (Exception e) { + this.exception = e; + } + verify(); + } + + public abstract void configureRegionFactoryBean(); + + public abstract void verify(); + } + + protected abstract void createRegionFactoryBeanConfigs(); +} diff --git a/src/test/resources/org/springframework/data/gemfire/basic-region.xml b/src/test/resources/org/springframework/data/gemfire/basic-region.xml new file mode 100644 index 00000000..2d447767 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/basic-region.xml @@ -0,0 +1,15 @@ + + + + + + + + +