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 fe65f1b3..69b58c42 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -142,10 +142,10 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { // Parse child elements + parseCollectionOfCustomSubElements(parserContext, element, builder, + "com.gemstone.gemfire.cache.wan.GatewaySender", "gateway-sender","gatewaySenders"); parseCollectionOfCustomSubElements(parserContext, element, builder, - "com.gemstone.gemfire.cache.wan.GatewaySender", "gateway-sender", "gatewaySenders"); - parseCollectionOfCustomSubElements(parserContext, element, builder, - "com.gemstone.gemfire.cache.wan.AsyncEventQueue", "async-event-queue", "asyncEventQueues"); + "com.gemstone.gemfire.cache.asyncqueue.AsyncEventQueue", "async-event-queue", "asyncEventQueues"); List subElements = DomUtils.getChildElements(element); for (Element subElement : subElements) { 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 216b8b27..27f8c934 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java @@ -284,6 +284,8 @@ abstract class ParsingUtils { result |= parseExpiration(element, "region-tti", "regionIdleTimeout", attrBuilder); result |= parseExpiration(element, "entry-ttl", "entryTimeToLive", attrBuilder); result |= parseExpiration(element, "entry-tti", "entryIdleTimeout", attrBuilder); + result |= parseCustomExpiration(parserContext, element,"custom-entry-ttl","customEntryTimeToLive",attrBuilder); + result |= parseCustomExpiration(parserContext, element,"custom-entry-tti","customEntryIdleTimeout",attrBuilder); if (result) { // turn on statistics @@ -422,4 +424,18 @@ abstract class ParsingUtils { return true; } + + private static boolean parseCustomExpiration(ParserContext parserContext, Element rootElement, String elementName, String propertyName, + BeanDefinitionBuilder attrBuilder) { + Element expirationElement = DomUtils.getChildElementByTagName(rootElement, elementName); + + if (expirationElement == null) + return false; + + Object customExpiry = parseRefOrSingleNestedBeanDeclaration(parserContext, expirationElement, attrBuilder); + + attrBuilder.addPropertyValue(propertyName, customExpiry); + + return true; + } } \ No newline at end of file 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 408f20e2..cc5b3d9e 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java @@ -37,7 +37,7 @@ class ReplicatedRegionParser extends AbstractRegionParser { BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); - + 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 455c9205..fb6a3fc6 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 @@ -756,22 +756,57 @@ Time to idle (or idle timeout) configuration for the region itself. Default: no ]]> - + - + - - - + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + @@ -1361,6 +1396,28 @@ When the region or cached object expires, it is destroyed locally only. Not supp + + + + + + + + + + + + + + + + @@ -2258,6 +2315,13 @@ Inner bean definition of the event filter minOccurs="0" maxOccurs="1" /> + + + + + @@ -2506,6 +2570,13 @@ use inner bean declarations. + + + + + diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd index 06ec47bb..31e13b1f 100755 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.3.xsd @@ -758,22 +758,58 @@ Time to idle (or idle timeout) configuration for the region itself. Default: no ]]> - + - + - - - + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + @@ -1308,9 +1344,10 @@ The name of the region definition. - + + - + + + + + + + + + + + + + + + + + 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 d318008d..c56d571d 100644 --- a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java @@ -18,6 +18,7 @@ package org.springframework.data.gemfire.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @@ -39,6 +40,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.CustomExpiry; import com.gemstone.gemfire.cache.DiskStore; import com.gemstone.gemfire.cache.DiskStoreFactory; import com.gemstone.gemfire.cache.EvictionAction; @@ -47,6 +49,7 @@ 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.Region.Entry; import com.gemstone.gemfire.cache.RegionAttributes; import com.gemstone.gemfire.cache.Scope; import com.gemstone.gemfire.cache.util.ObjectSizer; @@ -99,6 +102,7 @@ public class DiskStoreAndEvictionRegionParsingTest { testReplicaDataOptions(); testPartitionDataOptions(); testEntryTtl(); + testCustomExpiry(); } private void testDiskStore() { @@ -170,4 +174,39 @@ public class DiskStoreAndEvictionRegionParsingTest { assertEquals(400, regionTTI.getTimeout()); assertEquals(ExpirationAction.INVALIDATE, regionTTI.getAction()); } + + + @SuppressWarnings("rawtypes") + private void testCustomExpiry() throws Exception { + assertTrue(context.containsBean("replicated-data-custom-expiry")); + RegionFactoryBean fb = context.getBean("&replicated-data-custom-expiry", RegionFactoryBean.class); + RegionAttributes attrs = TestUtils.readField("attributes", fb); + + assertNotNull(attrs.getCustomEntryIdleTimeout()); + assertNotNull(attrs.getCustomEntryTimeToLive()); + + assertTrue(attrs.getCustomEntryIdleTimeout() instanceof TestCustomExpiry); + assertTrue(attrs.getCustomEntryTimeToLive() instanceof TestCustomExpiry); + } + + public static class TestCustomExpiry implements CustomExpiry { + /* (non-Javadoc) + * @see com.gemstone.gemfire.cache.CacheCallback#close() + */ + @Override + public void close() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see com.gemstone.gemfire.cache.CustomExpiry#getExpiry(com.gemstone.gemfire.cache.Region.Entry) + */ + @Override + public ExpirationAttributes getExpiry(Entry entry) { + return null; + } + + } + } \ 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 b9941aae..08b17139 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 @@ -28,9 +28,9 @@ - - - + + + @@ -41,6 +41,13 @@ + + + + + + + @@ -50,8 +57,10 @@ - + + + \ No newline at end of file