diff --git a/.project b/.project
index e3c9b328..912ac3e5 100644
--- a/.project
+++ b/.project
@@ -1,35 +1,16 @@
- head
-
-
-
+ spring-gemfire
+ Spring GemFire
+
+
+ org.eclipse.jdt.core.javanature
+
-
- org.eclipse.wst.common.project.facet.core.builder
-
-
-
org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.maven.ide.eclipse.maven2Builder
-
-
-
-
- org.springframework.ide.eclipse.core.springbuilder
-
-
+
-
- org.springframework.ide.eclipse.core.springnature
- org.maven.ide.eclipse.maven2Nature
- org.eclipse.jdt.core.javanature
- org.eclipse.wst.common.project.facet.core.nature
-
+
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index d1e62708..59ef1ef3 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,13 +1,13 @@
-#Sun Jun 06 11:27:13 EEST 2010
+#
+#Wed Aug 17 18:25:39 EEST 2011
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
diff --git a/docs/src/reference/docbook/appendix/appendix-schema.xml b/docs/src/reference/docbook/appendix/appendix-schema.xml
index 5482826e..6014d702 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/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java
index de338990..dbbc34d8 100644
--- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java
+++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java
@@ -32,6 +32,8 @@ import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Element;
import com.gemstone.gemfire.cache.DiskWriteAttributesFactory;
+import com.gemstone.gemfire.cache.ExpirationAction;
+import com.gemstone.gemfire.cache.ExpirationAttributes;
/**
* Various minor utility used by the parser.
@@ -66,7 +68,8 @@ abstract class ParsingUtils {
*/
static void addBeanAliasAsMetadata(Element element, BeanDefinitionBuilder builder) {
String[] aliases = new String[0];
- String name = element.getAttributeNS(BeanDefinitionParserDelegate.BEANS_NAMESPACE_URI, AbstractBeanDefinitionParser.NAME_ATTRIBUTE);
+ String name = element.getAttributeNS(BeanDefinitionParserDelegate.BEANS_NAMESPACE_URI,
+ AbstractBeanDefinitionParser.NAME_ATTRIBUTE);
if (StringUtils.hasLength(name)) {
aliases = StringUtils.trimArrayElements(StringUtils.commaDelimitedListToStringArray(name));
@@ -78,7 +81,8 @@ abstract class ParsingUtils {
static BeanDefinitionHolder replaceBeanAliasAsMetadata(BeanDefinitionHolder holder) {
BeanDefinition beanDefinition = holder.getBeanDefinition();
- return new BeanDefinitionHolder(beanDefinition, holder.getBeanName(), (String[]) beanDefinition.removeAttribute(ALIASES_KEY));
+ return new BeanDefinitionHolder(beanDefinition, holder.getBeanName(),
+ (String[]) beanDefinition.removeAttribute(ALIASES_KEY));
}
/**
@@ -184,6 +188,7 @@ abstract class ParsingUtils {
/**
* Parses the eviction sub-element. Populates the given attribute factory with the proper attributes.
*
+ * @param parserContext
* @param element
* @param attrBuilder
* @return true if parsing actually occured, false otherwise
@@ -222,4 +227,64 @@ abstract class ParsingUtils {
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.
+ *
+ * @param parserContext
+ * @param element
+ * @param attrBuilder
+ * @return
+ */
+ static boolean parseExpiration(ParserContext parserContext, Element element, BeanDefinitionBuilder attrBuilder) {
+ boolean result = false;
+ result |= parseExpiration(element, "region-ttl", "regionTimeToLive", attrBuilder);
+ result |= parseExpiration(element, "region-tti", "regionIdleTimeout", attrBuilder);
+ result |= parseExpiration(element, "entry-ttl", "entryTimeToLive", attrBuilder);
+ result |= parseExpiration(element, "entry-tti", "entryIdleTimeout", attrBuilder);
+
+ if (result) {
+ // turn on statistics
+ attrBuilder.addPropertyValue("statisticsEnabled", Boolean.TRUE);
+ }
+ return result;
+ }
+
+ private static boolean parseExpiration(Element rootElement, String elementName, String propertyName, BeanDefinitionBuilder attrBuilder) {
+ Element expirationElement = DomUtils.getChildElementByTagName(rootElement, elementName);
+
+ if (expirationElement == null)
+ return false;
+
+ int expirationTime = 0;
+ ExpirationAction action = ExpirationAction.INVALIDATE;
+
+
+ // do manual conversion since the enum is not public
+ String attr = expirationElement.getAttribute("timeout");
+ if (StringUtils.hasText(attr)) {
+ expirationTime = Integer.valueOf(attr);
+ }
+
+ attr = expirationElement.getAttribute("action");
+ if (StringUtils.hasText(attr)) {
+ // figure out action based on string length
+ attr = attr.trim();
+
+ if (attr.length() == 10) {
+ action = ExpirationAction.INVALIDATE;
+ }
+ else if (attr.length() == 7) {
+ action = ExpirationAction.DESTROY;
+ }
+ else if (attr.length() == 13) {
+ action = ExpirationAction.LOCAL_DESTROY;
+ }
+ else if (attr.length() == 16) {
+ action = ExpirationAction.LOCAL_INVALIDATE;
+ }
+ }
+ attrBuilder.addPropertyValue(propertyName, new ExpirationAttributes(expirationTime, action));
+ return true;
+ }
}
\ No newline at end of file
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 b4f2bc16..36b97d4a 100644
--- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java
@@ -76,6 +76,7 @@ class PartitionedRegionParser extends AliasReplacingBeanDefinitionParser {
// region attributes
BeanDefinitionBuilder attrBuilder = BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class);
+ ParsingUtils.parseExpiration(parserContext, element, attrBuilder);
ParsingUtils.parseEviction(parserContext, element, attrBuilder);
ParsingUtils.parseDiskStorage(element, attrBuilder);
ParsingUtils.parseStatistics(element, attrBuilder);
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 b79852d4..13df6b7e 100644
--- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java
+++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java
@@ -71,6 +71,7 @@ class ReplicatedRegionParser extends AliasReplacingBeanDefinitionParser {
attrBuilder.addPropertyValue("publisher", Boolean.valueOf(attr));
}
+ ParsingUtils.parseExpiration(parserContext, element, attrBuilder);
ParsingUtils.parseEviction(parserContext, element, attrBuilder);
ParsingUtils.parseDiskStorage(element, attrBuilder);
diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd
index eb43844f..507f0c0f 100644
--- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd
+++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.1.xsd
@@ -92,7 +92,6 @@ across concurrent threads in the same VM, whether or not transactions are used.
]]>
-
@@ -281,6 +280,35 @@ arbitrarily pick one.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -317,7 +345,7 @@ up to date copy of the data.
@@ -466,6 +494,50 @@ The delay in milliseconds that new members will wait before satisfying redundanc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 6f9b2b72..c4e0bec8 100644
--- a/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java
+++ b/src/test/java/org/springframework/data/gemfire/config/DiskStoreAndEvictionRegionParsingTest.java
@@ -36,6 +36,8 @@ import com.gemstone.gemfire.cache.DataPolicy;
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.RegionAttributes;
import com.gemstone.gemfire.cache.Scope;
import com.gemstone.gemfire.cache.util.ObjectSizer;
@@ -85,4 +87,28 @@ public class DiskStoreAndEvictionRegionParsingTest {
ObjectSizer sizer = evicAttr.getObjectSizer();
assertEquals(SimpleObjectSizer.class, sizer.getClass());
}
+
+ @Test
+ public void testEntryTtl() throws Exception {
+ assertTrue(context.containsBean("replicated-data"));
+ RegionFactoryBean fb = context.getBean("&replicated-data", RegionFactoryBean.class);
+ RegionAttributes attrs = TestUtils.readField("attributes", fb);
+
+ ExpirationAttributes entryTTL = attrs.getEntryTimeToLive();
+ assertEquals(100, entryTTL.getTimeout());
+ assertEquals(ExpirationAction.DESTROY, entryTTL.getAction());
+
+ ExpirationAttributes entryTTI = attrs.getEntryIdleTimeout();
+ assertEquals(200, entryTTI.getTimeout());
+ assertEquals(ExpirationAction.INVALIDATE, entryTTI.getAction());
+
+ ExpirationAttributes regionTTL = attrs.getRegionTimeToLive();
+ assertEquals(300, regionTTL.getTimeout());
+ assertEquals(ExpirationAction.DESTROY, regionTTL.getAction());
+
+ ExpirationAttributes regionTTI = attrs.getRegionIdleTimeout();
+ assertEquals(400, regionTTI.getTimeout());
+ assertEquals(ExpirationAction.INVALIDATE, regionTTI.getAction());
+
+ }
}
\ 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 33119ffc..f89c6124 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
@@ -15,6 +15,12 @@
+
+
+
+
+
+