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/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 188f117d..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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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