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 @@ + + + + + +