Fix for JIRA issues SGF-195 concerning colocated Regions.
This commit is contained in:
@@ -16,9 +16,7 @@
|
||||
|
||||
package org.springframework.data.gemfire.config;
|
||||
|
||||
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
|
||||
import org.springframework.beans.factory.xml.ParserContext;
|
||||
import org.springframework.data.gemfire.SubRegionFactoryBean;
|
||||
@@ -29,9 +27,10 @@ import org.w3c.dom.Element;
|
||||
* region name to be considered a bean alias. Overrides the automatic alias
|
||||
* detection and replaces it with its own using meta attributes (since the
|
||||
* parsing method is final).
|
||||
*
|
||||
*
|
||||
* @author Costin Leau
|
||||
* @author David Turanski
|
||||
* @author John Blum
|
||||
*/
|
||||
abstract class AliasReplacingBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
|
||||
|
||||
@@ -50,21 +49,13 @@ abstract class AliasReplacingBeanDefinitionParser extends AbstractSingleBeanDefi
|
||||
|
||||
@Override
|
||||
protected final void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
|
||||
|
||||
ParsingUtils.addBeanAliasAsMetadata(element, builder);
|
||||
|
||||
doParseInternal(element, parserContext, builder);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerBeanDefinition(BeanDefinitionHolder definition, BeanDefinitionRegistry registry) {
|
||||
// add the aliases from the metadata
|
||||
super.registerBeanDefinition(ParsingUtils.replaceBeanAliasAsMetadata(definition), registry);
|
||||
}
|
||||
|
||||
protected boolean isSubRegion(Element element) {
|
||||
return element.getParentNode().getLocalName().endsWith("region");
|
||||
}
|
||||
|
||||
protected abstract void doParseInternal(Element element, ParserContext parserContext, BeanDefinitionBuilder builder);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,23 +25,23 @@ import org.springframework.data.gemfire.FixedPartitionAttributesFactoryBean;
|
||||
import org.springframework.data.gemfire.PartitionAttributesFactoryBean;
|
||||
import org.springframework.data.gemfire.PartitionedRegionFactoryBean;
|
||||
import org.springframework.data.gemfire.RegionAttributesFactoryBean;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.util.xml.DomUtils;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import com.gemstone.gemfire.management.internal.cli.parser.ParserUtils;
|
||||
|
||||
/**
|
||||
* Parser for <partitioned-region;gt; definitions.
|
||||
*
|
||||
*
|
||||
* To avoid eager evaluations, the region attributes are declared as a nested
|
||||
* definition.
|
||||
*
|
||||
*
|
||||
* @author Costin Leau
|
||||
* @author David Turanski
|
||||
* @author John Blum
|
||||
*/
|
||||
class PartitionedRegionParser extends AbstractRegionParser {
|
||||
|
||||
@Override
|
||||
protected Class<?> getRegionFactoryClass() {
|
||||
return PartitionedRegionFactoryBean.class;
|
||||
@@ -53,41 +53,40 @@ class PartitionedRegionParser extends AbstractRegionParser {
|
||||
boolean subRegion) {
|
||||
super.doParse(element, builder);
|
||||
|
||||
BeanDefinitionBuilder attrBuilder = subRegion ? builder : BeanDefinitionBuilder
|
||||
.genericBeanDefinition(RegionAttributesFactoryBean.class);
|
||||
BeanDefinitionBuilder regionAttributesBuilder = (subRegion ? builder
|
||||
: BeanDefinitionBuilder.genericBeanDefinition(RegionAttributesFactoryBean.class));
|
||||
|
||||
super.doParseCommonRegionConfiguration(element, parserContext, builder, regionAttributesBuilder, subRegion);
|
||||
|
||||
BeanDefinitionBuilder partitionAttributesBuilder = BeanDefinitionBuilder.genericBeanDefinition(
|
||||
PartitionAttributesFactoryBean.class);
|
||||
|
||||
parseColocatedWith(element, builder, partitionAttributesBuilder, "colocated-with");
|
||||
ParsingUtils.setPropertyValue(element, partitionAttributesBuilder, "local-max-memory");
|
||||
ParsingUtils.setPropertyValue(element, partitionAttributesBuilder, "copies","redundantCopies");
|
||||
ParsingUtils.setPropertyValue(element, partitionAttributesBuilder, "recovery-delay");
|
||||
ParsingUtils.setPropertyValue(element, partitionAttributesBuilder, "startup-recovery-delay");
|
||||
ParsingUtils.setPropertyValue(element, partitionAttributesBuilder, "total-max-memory");
|
||||
ParsingUtils.setPropertyValue(element, partitionAttributesBuilder, "total-buckets","totalNumBuckets");
|
||||
|
||||
super.doParseCommonRegionConfiguration(element, parserContext, builder, attrBuilder, subRegion);
|
||||
//
|
||||
// partition attributes
|
||||
BeanDefinitionBuilder parAttrBuilder = BeanDefinitionBuilder
|
||||
.genericBeanDefinition(PartitionAttributesFactoryBean.class);
|
||||
|
||||
ParsingUtils.setPropertyValue(element, parAttrBuilder, "colocated-with");
|
||||
ParsingUtils.setPropertyValue(element, parAttrBuilder, "local-max-memory");
|
||||
ParsingUtils.setPropertyValue(element, parAttrBuilder, "copies","redundantCopies");
|
||||
ParsingUtils.setPropertyValue(element, parAttrBuilder, "recovery-delay");
|
||||
ParsingUtils.setPropertyValue(element, parAttrBuilder, "startup-recovery-delay");
|
||||
ParsingUtils.setPropertyValue(element, parAttrBuilder, "total-max-memory");
|
||||
ParsingUtils.setPropertyValue(element, parAttrBuilder, "total-buckets","totalNumBuckets");
|
||||
//
|
||||
Element subElement = DomUtils.getChildElementByTagName(element, "partition-resolver");
|
||||
// parse nested partition resolver element
|
||||
if (subElement != null) {
|
||||
parAttrBuilder.addPropertyValue("partitionResolver",
|
||||
parsePartitionResolver(parserContext, subElement, builder));
|
||||
partitionAttributesBuilder.addPropertyValue("partitionResolver",
|
||||
parsePartitionResolver(parserContext, subElement, builder));
|
||||
}
|
||||
|
||||
subElement = DomUtils.getChildElementByTagName(element, "partition-listener");
|
||||
// parse nested partition resolver element
|
||||
// parse nested partition listener element
|
||||
if (subElement != null) {
|
||||
parAttrBuilder.addPropertyValue("partitionListeners",
|
||||
parsePartitionListeners(parserContext, subElement, builder));
|
||||
partitionAttributesBuilder.addPropertyValue("partitionListeners",
|
||||
parsePartitionListeners(parserContext, subElement, builder));
|
||||
}
|
||||
|
||||
|
||||
List<Element> fixedPartitions = DomUtils.getChildElementsByTagName(element, "fixed-partition");
|
||||
if (! CollectionUtils.isEmpty(fixedPartitions)){
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
|
||||
if (!CollectionUtils.isEmpty(fixedPartitions)){
|
||||
@SuppressWarnings("rawtypes")
|
||||
ManagedList fixedPartitionAttributes = new ManagedList();
|
||||
for (Element fp: fixedPartitions) {
|
||||
BeanDefinitionBuilder fpaBuilder = BeanDefinitionBuilder.genericBeanDefinition(FixedPartitionAttributesFactoryBean.class);
|
||||
@@ -96,14 +95,31 @@ class PartitionedRegionParser extends AbstractRegionParser {
|
||||
ParsingUtils.setPropertyValue(fp, fpaBuilder, "primary");
|
||||
fixedPartitionAttributes.add(fpaBuilder.getBeanDefinition());
|
||||
}
|
||||
parAttrBuilder.addPropertyValue("fixedPartitionAttributes", fixedPartitionAttributes);
|
||||
partitionAttributesBuilder.addPropertyValue("fixedPartitionAttributes", fixedPartitionAttributes);
|
||||
}
|
||||
|
||||
// // add partition attributes attributes
|
||||
attrBuilder.addPropertyValue("partitionAttributes", parAttrBuilder.getBeanDefinition());
|
||||
// add partition/overflow settings as attributes
|
||||
// add partition attributes to region attributes
|
||||
regionAttributesBuilder.addPropertyValue("partitionAttributes", partitionAttributesBuilder.getBeanDefinition());
|
||||
// add partition/overflow settings as attributes to Region (via PartitionRegionFactoryBean -> RegionFactoryBean)
|
||||
if (!subRegion) {
|
||||
builder.addPropertyValue("attributes", attrBuilder.getBeanDefinition());
|
||||
builder.addPropertyValue("attributes", regionAttributesBuilder.getBeanDefinition());
|
||||
}
|
||||
}
|
||||
|
||||
private void parseColocatedWith(Element element, BeanDefinitionBuilder regionBuilder,
|
||||
BeanDefinitionBuilder partitionAttributesBuilder, String attributeName) {
|
||||
// NOTE rather than using a dependency (with depends-on) we could also set the colocatedWith property of the
|
||||
// PartitionAttributesFactoryBean with a reference to the Region "this" Partitioned Region will be colocated
|
||||
// with, where the colocated-with attribute refers to the the bean name/alias of the other, depended on Region
|
||||
// providing that the Region's name is also a bean alias of the bean definition.
|
||||
//ParsingUtils.setPropertyReference(element, partitionAttributesBuilder, attributeName, "colocatedWith");
|
||||
|
||||
ParsingUtils.setPropertyValue(element, partitionAttributesBuilder, attributeName);
|
||||
|
||||
String colocatedWithBeanAlias = element.getAttribute(attributeName);
|
||||
|
||||
if (StringUtils.hasText(colocatedWithBeanAlias)) {
|
||||
regionBuilder.addDependsOn(colocatedWithBeanAlias);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,4 +131,5 @@ class PartitionedRegionParser extends AbstractRegionParser {
|
||||
BeanDefinitionBuilder builder) {
|
||||
return ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, subElement, builder);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user