diff --git a/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java b/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java index f9d1eebf..64bc36c1 100644 --- a/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/PartitionAttributesFactoryBean.java @@ -27,23 +27,24 @@ import com.gemstone.gemfire.cache.PartitionResolver; import com.gemstone.gemfire.cache.partition.PartitionListener; /** - * Spring-friendly bean for creating {@link PartitionAttributes}. Eliminates the - * need of using a XML 'factory-method' tag and allows the attributes properties - * to be set directly. + * Spring-friendly bean for creating {@link PartitionAttributes}. Eliminates the need of using + * a XML 'factory-method' tag and allows the attributes properties to be set directly. * * @author Costin Leau * @author David Turanski + * @author John Blum */ -@SuppressWarnings({ "unchecked", "rawtypes" }) +@SuppressWarnings({ "rawtypes", "unchecked", "unused" }) public class PartitionAttributesFactoryBean implements FactoryBean, InitializingBean { - private final com.gemstone.gemfire.cache.PartitionAttributesFactory paf = new com.gemstone.gemfire.cache.PartitionAttributesFactory(); + private final com.gemstone.gemfire.cache.PartitionAttributesFactory partitionAttributesFactory = + new com.gemstone.gemfire.cache.PartitionAttributesFactory(); private List listeners; @Override public PartitionAttributes getObject() throws Exception { - return paf.create(); + return partitionAttributesFactory.create(); } @Override @@ -57,21 +58,21 @@ public class PartitionAttributesFactoryBean implements FactoryBean fixedPartitionAttributes) { for (FixedPartitionAttributes fpa : fixedPartitionAttributes) { - paf.addFixedPartitionAttributes(fpa); + partitionAttributesFactory.addFixedPartitionAttributes(fpa); } } public void setLocalMaxMemory(int mb) { - paf.setLocalMaxMemory(mb); + partitionAttributesFactory.setLocalMaxMemory(mb); } public void setPartitionResolver(PartitionResolver resolver) { - paf.setPartitionResolver(resolver); + partitionAttributesFactory.setPartitionResolver(resolver); } public void setPartitionListeners(List listeners) { @@ -79,32 +80,33 @@ public class PartitionAttributesFactoryBean implements FactoryBean fixedPartitionSubElements = DomUtils.getChildElementsByTagName(element, "fixed-partition"); diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.5.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.5.xsd index dfa7dc1d..c1f72fca 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.5.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.5.xsd @@ -1270,21 +1270,38 @@ colocate data based on custom criterias (such as colocating trades by month and - + - + + + + + + + + + + + + + + + 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 b8ab057f..bf70017b 100644 --- a/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/PartitionedRegionNamespaceTest.java @@ -22,12 +22,16 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import java.util.Arrays; +import java.util.List; + 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.SimpleCacheListener; import org.springframework.data.gemfire.SimplePartitionResolver; import org.springframework.data.gemfire.TestUtils; import org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer; @@ -36,109 +40,181 @@ 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.FixedPartitionAttributes; import com.gemstone.gemfire.cache.PartitionAttributes; import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.RegionAttributes; import com.gemstone.gemfire.cache.partition.PartitionListener; +import com.gemstone.gemfire.cache.partition.PartitionListenerAdapter; /** + * The PartitionRegionNamespaceTest class is a test suite of test cases testing the contract and functionality + * of the GemFire Partition Region support in SDG. + * * @author Costin Leau * @author David Turanski + * @author John Blum */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "partitioned-ns.xml", initializers = GemfireTestApplicationContextInitializer.class) +@SuppressWarnings("unused") public class PartitionedRegionNamespaceTest { @Autowired private ApplicationContext context; @Test - public void testBasicPartition() throws Exception { + public void testSimplePartitionRegion() throws Exception { assertTrue(context.containsBean("simple")); + + Region simple = context.getBean("simple", Region.class); + + assertNotNull(simple); + assertEquals("simple", simple.getName()); + assertEquals(Region.SEPARATOR + "simple", simple.getFullPath()); + assertNotNull(simple.getAttributes()); + assertEquals(DataPolicy.PARTITION, simple.getAttributes().getDataPolicy()); } - @SuppressWarnings("rawtypes") @Test - public void testPartitionOptions() throws Exception { + @SuppressWarnings("rawtypes") + public void testOptionsPartitionRegion() throws Exception { assertTrue(context.containsBean("options")); - RegionFactoryBean fb = context.getBean("&options", RegionFactoryBean.class); - assertTrue(fb instanceof PartitionedRegionFactoryBean); - assertEquals(null, TestUtils.readField("scope", fb)); - assertEquals("redundant", TestUtils.readField("name", fb)); - RegionAttributes attrs = TestUtils.readField("attributes", fb); - assertTrue(attrs.getStatisticsEnabled()); + RegionFactoryBean optionsRegionFactoryBean = context.getBean("&options", RegionFactoryBean.class); - PartitionAttributes pAttr = attrs.getPartitionAttributes(); + assertTrue(optionsRegionFactoryBean instanceof PartitionedRegionFactoryBean); + assertEquals(null, TestUtils.readField("scope", optionsRegionFactoryBean)); + assertEquals("redundant", TestUtils.readField("name", optionsRegionFactoryBean)); - assertEquals(1, pAttr.getRedundantCopies()); - assertEquals(4, pAttr.getTotalNumBuckets()); - assertSame(SimplePartitionResolver.class, pAttr.getPartitionResolver().getClass()); + RegionAttributes optionsRegionAttributes = TestUtils.readField("attributes", optionsRegionFactoryBean); + + assertNotNull(optionsRegionAttributes); + assertTrue(optionsRegionAttributes.getStatisticsEnabled()); + + PartitionAttributes optionsRegionPartitionAttributes = optionsRegionAttributes.getPartitionAttributes(); + + assertNotNull(optionsRegionPartitionAttributes); + assertEquals(1, optionsRegionPartitionAttributes.getRedundantCopies()); + assertEquals(4, optionsRegionPartitionAttributes.getTotalNumBuckets()); + assertTrue(optionsRegionPartitionAttributes.getPartitionResolver() instanceof SimplePartitionResolver); } - @SuppressWarnings("rawtypes") @Test - public void testComplexPartition() throws Exception { + @SuppressWarnings("rawtypes") + public void testComplexPartitionRegion() 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)); + RegionFactoryBean complexRegionFactoryBean = context.getBean("&complex", RegionFactoryBean.class); - RegionAttributes attrs = TestUtils.readField("attributes", fb); - PartitionAttributes pAttr = attrs.getPartitionAttributes(); - assertEquals(20, pAttr.getLocalMaxMemory()); + CacheListener[] cacheListeners = TestUtils.readField("cacheListeners", complexRegionFactoryBean); - assertNotNull(pAttr.getPartitionListeners()); - assertEquals(1, pAttr.getPartitionListeners().length); - assertTrue(pAttr.getPartitionListeners()[0] instanceof TestPartitionListener); + assertFalse(ObjectUtils.isEmpty(cacheListeners)); + assertEquals(2, cacheListeners.length); + assertSame(cacheListeners[0], context.getBean("c-listener")); + assertTrue(cacheListeners[1] instanceof SimpleCacheListener); + + assertSame(context.getBean("c-loader"), TestUtils.readField("cacheLoader", complexRegionFactoryBean)); + assertSame(context.getBean("c-writer"), TestUtils.readField("cacheWriter", complexRegionFactoryBean)); + + RegionAttributes complexRegionAttributes = TestUtils.readField("attributes", complexRegionFactoryBean); + + assertNotNull(complexRegionAttributes); + + PartitionAttributes complexRegionPartitionAttributes = complexRegionAttributes.getPartitionAttributes(); + + assertNotNull(complexRegionPartitionAttributes); + assertEquals(20, complexRegionPartitionAttributes.getLocalMaxMemory()); + assertNotNull(complexRegionPartitionAttributes.getPartitionListeners()); + assertEquals(1, complexRegionPartitionAttributes.getPartitionListeners().length); + assertTrue(complexRegionPartitionAttributes.getPartitionListeners()[0] instanceof TestPartitionListener); } - @SuppressWarnings("rawtypes") @Test + @SuppressWarnings("rawtypes") public void testFixedPartition() throws Exception { - RegionFactoryBean fb = context.getBean("&fixed", RegionFactoryBean.class); - RegionAttributes attrs = TestUtils.readField("attributes", fb); - PartitionAttributes pAttr = attrs.getPartitionAttributes(); - assertNotNull(pAttr.getFixedPartitionAttributes()); - assertEquals(3, pAttr.getFixedPartitionAttributes().size()); + RegionFactoryBean fixedRegionFactoryBean = context.getBean("&fixed", RegionFactoryBean.class); - FixedPartitionAttributes fpa = (FixedPartitionAttributes) pAttr.getFixedPartitionAttributes().get(0); - assertEquals(3, fpa.getNumBuckets()); - assertTrue(fpa.isPrimary()); + assertNotNull(fixedRegionFactoryBean); + RegionAttributes fixedRegionAttributes = TestUtils.readField("attributes", fixedRegionFactoryBean); + + assertNotNull(fixedRegionAttributes); + + PartitionAttributes fixedRegionPartitionAttributes = fixedRegionAttributes.getPartitionAttributes(); + + assertNotNull(fixedRegionPartitionAttributes); + + assertNotNull(fixedRegionPartitionAttributes.getFixedPartitionAttributes()); + assertEquals(3, fixedRegionPartitionAttributes.getFixedPartitionAttributes().size()); + + FixedPartitionAttributes fixedPartitionAttributes = + (FixedPartitionAttributes) fixedRegionPartitionAttributes.getFixedPartitionAttributes().get(0); + + assertEquals(3, fixedPartitionAttributes.getNumBuckets()); + assertTrue(fixedPartitionAttributes.isPrimary()); } - public static class TestPartitionListener implements PartitionListener { + @Test + public void testMultiplePartitionListeners() { + assertTrue(context.containsBean("listeners")); - @Override - public void afterBucketCreated(int arg0, Iterable arg1) { - // TODO Auto-generated method stub + Region listeners = context.getBean("listeners", Region.class); + assertNotNull("The 'listeners' PARTITION Region was not properly configured and initialized!", listeners); + assertEquals("listeners", listeners.getName()); + assertEquals(Region.SEPARATOR + "listeners", listeners.getFullPath()); + assertNotNull(listeners.getAttributes()); + assertEquals(DataPolicy.PARTITION, listeners.getAttributes().getDataPolicy()); + + PartitionAttributes listenersPartitionAttributes = listeners.getAttributes().getPartitionAttributes(); + + assertNotNull(listenersPartitionAttributes); + assertNotNull(listenersPartitionAttributes.getPartitionListeners()); + assertEquals(4, listenersPartitionAttributes.getPartitionListeners().length); + + List expectedNames = Arrays.asList("X", "Y", "Z", "ABC"); + + for (PartitionListener listener : listenersPartitionAttributes.getPartitionListeners()) { + assertTrue(listener instanceof TestPartitionListener); + assertTrue(expectedNames.contains(listener.toString())); } - - @Override - public void afterBucketRemoved(int arg0, Iterable arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void afterPrimary(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void afterRegionCreate(Region arg0) { - // TODO Auto-generated method stub - - } - } -} \ No newline at end of file + + @Test + public void testSinglePartitionListeners() { + assertTrue(context.containsBean("listenerRef")); + + Region listeners = context.getBean("listenerRef", Region.class); + + assertNotNull("The 'listenerRef' PARTITION Region was not properly configured and initialized!", listeners); + assertEquals("listenerRef", listeners.getName()); + assertEquals(Region.SEPARATOR + "listenerRef", listeners.getFullPath()); + assertNotNull(listeners.getAttributes()); + assertEquals(DataPolicy.PARTITION, listeners.getAttributes().getDataPolicy()); + + PartitionAttributes listenersPartitionAttributes = listeners.getAttributes().getPartitionAttributes(); + + assertNotNull(listenersPartitionAttributes); + assertNotNull(listenersPartitionAttributes.getPartitionListeners()); + assertEquals(1, listenersPartitionAttributes.getPartitionListeners().length); + assertTrue(listenersPartitionAttributes.getPartitionListeners()[0] instanceof TestPartitionListener); + assertEquals("ABC", listenersPartitionAttributes.getPartitionListeners()[0].toString()); + } + + public static class TestPartitionListener extends PartitionListenerAdapter { + + private String name; + + public void setName(final String name) { + this.name = name; + } + + @Override + public String toString() { + return this.name; + } + } + +} diff --git a/src/test/resources/org/springframework/data/gemfire/config/partitioned-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/partitioned-ns.xml index bf89aa46..5b12344b 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/partitioned-ns.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/partitioned-ns.xml @@ -1,25 +1,30 @@ +"> - + + 1 + 4 + - - 4 - 1 - - - + + + + + @@ -32,9 +37,9 @@ - - - + + + @@ -43,8 +48,22 @@ + + + + + + + + + + + + + + - \ No newline at end of file +