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 12e54aa5..dd8618bb 100644 --- a/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/AbstractRegionParser.java @@ -89,8 +89,8 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { this.registerBeanDefinition(new BeanDefinitionHolder(subRegionDef, regionPath), parserContext.getRegistry()); } - protected void doParseRegionCommon(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, - BeanDefinitionBuilder attrBuilder, boolean subRegion) { + protected void doParseCommonRegionConfiguration(Element element, ParserContext parserContext, + BeanDefinitionBuilder builder, BeanDefinitionBuilder attrBuilder, boolean subRegion) { if (!subRegion) { String cacheRef = element.getAttribute("cache-ref"); @@ -110,6 +110,7 @@ abstract class AbstractRegionParser extends AliasReplacingBeanDefinitionParser { ParsingUtils.parseExpiration(parserContext, element, attrBuilder); ParsingUtils.parseEviction(parserContext, element, attrBuilder); + ParsingUtils.parseMembershipAttributes(parserContext, element, attrBuilder); List subElements = DomUtils.getChildElements(element); diff --git a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java index c5bfbb31..28de5f16 100644 --- a/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/LocalRegionParser.java @@ -50,7 +50,7 @@ class LocalRegionParser extends AbstractRegionParser { BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); - super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion); + super.doParseCommonRegionConfiguration(element, parserContext, builder, attrBuilder, subRegion); if (!subRegion) { builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition()); } 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 3b7b97a0..f47c1d60 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/ParsingUtils.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.ManagedArray; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; @@ -34,6 +35,9 @@ import org.w3c.dom.Element; import com.gemstone.gemfire.cache.ExpirationAction; import com.gemstone.gemfire.cache.ExpirationAttributes; +import com.gemstone.gemfire.cache.LossAction; +import com.gemstone.gemfire.cache.MembershipAttributes; +import com.gemstone.gemfire.cache.ResumptionAction; import com.gemstone.gemfire.cache.Scope; /** @@ -243,7 +247,33 @@ abstract class ParsingUtils { if (StringUtils.hasText(indexUpdateType)) { attrBuilder.addPropertyValue("indexMaintenanceSynchronous", "synchronous".equals(indexUpdateType)); } + } + static void parseMembershipAttributes(ParserContext parserContext, Element element, + BeanDefinitionBuilder attrBuilder) { + Element membershipAttributes = DomUtils.getChildElementByTagName(element, "membership-attributes"); + if (membershipAttributes != null) { + String requiredRoles[] = StringUtils.commaDelimitedListToStringArray(membershipAttributes + .getAttribute("required-roles")); + String lossActionAttr = membershipAttributes.getAttribute("loss-action"); + LossAction lossAction = StringUtils.hasText(lossActionAttr) ? LossAction.fromName(lossActionAttr + .toUpperCase().replace("-", "_")) : null; + String resumptionActionAttr = membershipAttributes.getAttribute("resumption-action"); + ResumptionAction resumptionAction = StringUtils.hasText(resumptionActionAttr) ? ResumptionAction + .fromName(resumptionActionAttr.toUpperCase().replace("-", "_")) : null; + + ManagedArray requiredRolesArray = new ManagedArray("java.lang.String", requiredRoles.length); + for (int i = 0; i < requiredRoles.length; i++) { + requiredRolesArray.add(requiredRoles[i]); + } + BeanDefinitionBuilder membershipAttributesBuilder = BeanDefinitionBuilder + .genericBeanDefinition(MembershipAttributes.class); + membershipAttributesBuilder.addConstructorArgValue(requiredRolesArray); + membershipAttributesBuilder.addConstructorArgValue(lossAction); + membershipAttributesBuilder.addConstructorArgValue(resumptionAction); + + attrBuilder.addPropertyValue("membershipAttributes", membershipAttributesBuilder.getRawBeanDefinition()); + } } static void parseScope(Element element, BeanDefinitionBuilder builder) { 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 36a53cf1..ed59a4c1 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PartitionedRegionParser.java @@ -68,7 +68,7 @@ class PartitionedRegionParser extends AbstractRegionParser { BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); - super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion); + super.doParseCommonRegionConfiguration(element, parserContext, builder, attrBuilder, subRegion); // // partition attributes BeanDefinitionBuilder parAttrBuilder = BeanDefinitionBuilder 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 1dba8a8f..f87c99a5 100644 --- a/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/ReplicatedRegionParser.java @@ -48,7 +48,7 @@ class ReplicatedRegionParser extends AbstractRegionParser { BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder .genericBeanDefinition(RegionAttributesFactoryBean.class); - super.doParseRegionCommon(element, parserContext, builder, attrBuilder, subRegion); + 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 a75ac655..6a6adf09 100644 --- 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 @@ -389,6 +389,38 @@ use inner bean declarations. + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/gemfire/config/MembershipAttributesTest.java b/src/test/java/org/springframework/data/gemfire/config/MembershipAttributesTest.java new file mode 100644 index 00000000..240340a8 --- /dev/null +++ b/src/test/java/org/springframework/data/gemfire/config/MembershipAttributesTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2010-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.gemfire.config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.springframework.data.gemfire.RecreatingContextTest; + +import com.gemstone.gemfire.cache.LossAction; +import com.gemstone.gemfire.cache.MembershipAttributes; +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.ResumptionAction; +import com.gemstone.gemfire.distributed.Role; + +/** + * @author David Turanski + * + */ +public class MembershipAttributesTest extends RecreatingContextTest { + + @Override + protected String location() { + return "org/springframework/data/gemfire/config/membership-attributes-ns.xml"; + } + + @Test + public void testMembershipAttributes() { + Region simple = ctx.getBean("simple", Region.class); + MembershipAttributes ma = simple.getAttributes().getMembershipAttributes(); + assertFalse(ma.hasRequiredRoles()); + + Region secure = ctx.getBean("secure", Region.class); + ma = secure.getAttributes().getMembershipAttributes(); + assertTrue(ma.hasRequiredRoles()); + assertEquals(ResumptionAction.REINITIALIZE, ma.getResumptionAction()); + assertEquals(LossAction.LIMITED_ACCESS, ma.getLossAction()); + for (Role role : ma.getRequiredRoles()) { + assertTrue("ROLE1".equals(role.getName()) || "ROLE2".equals(role.getName())); + } + } +} diff --git a/src/test/resources/org/springframework/data/gemfire/config/membership-attributes-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/membership-attributes-ns.xml new file mode 100644 index 00000000..3eba8ee3 --- /dev/null +++ b/src/test/resources/org/springframework/data/gemfire/config/membership-attributes-ns.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file