diff --git a/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java b/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java index 4bfebdc6..e7bcaac9 100644 --- a/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java @@ -73,7 +73,7 @@ public class PoolFactoryBean implements FactoryBean, InitializingBean, Dis private int socketBufferSize = PoolFactory.DEFAULT_SOCKET_BUFFER_SIZE; private int statisticInterval = PoolFactory.DEFAULT_STATISTIC_INTERVAL; private int subscriptionAckInterval = PoolFactory.DEFAULT_SUBSCRIPTION_ACK_INTERVAL; - private boolean enableSubscription = PoolFactory.DEFAULT_SUBSCRIPTION_ENABLED; + private boolean subscriptionEnabled = PoolFactory.DEFAULT_SUBSCRIPTION_ENABLED; private int subscriptionMessageTrackingTimeout = PoolFactory.DEFAULT_SUBSCRIPTION_MESSAGE_TRACKING_TIMEOUT; private int subscriptionRedundancy = PoolFactory.DEFAULT_SUBSCRIPTION_REDUNDANCY; private boolean threadLocalConnections = PoolFactory.DEFAULT_THREAD_LOCAL_CONNECTIONS; @@ -139,7 +139,7 @@ public class PoolFactoryBean implements FactoryBean, InitializingBean, Dis poolFactory.setServerGroup(serverGroup); poolFactory.setSocketBufferSize(socketBufferSize); poolFactory.setStatisticInterval(statisticInterval); - poolFactory.setSubscriptionEnabled(enableSubscription); + poolFactory.setSubscriptionEnabled(subscriptionEnabled); poolFactory.setSubscriptionAckInterval(subscriptionAckInterval); poolFactory.setSubscriptionMessageTrackingTimeout(subscriptionMessageTrackingTimeout); poolFactory.setSubscriptionRedundancy(subscriptionRedundancy); @@ -284,10 +284,10 @@ public class PoolFactoryBean implements FactoryBean, InitializingBean, Dis } /** - * @param enableSubscription the enableSubscription to set + * @param subscriptionEnabled the subscriptionEnabled to set */ - public void setEnableSubscription(boolean enableSubscription) { - this.enableSubscription = enableSubscription; + public void setSubscriptionEnabled(boolean subscriptionEnabled) { + this.subscriptionEnabled = subscriptionEnabled; } /** diff --git a/src/main/java/org/springframework/data/gemfire/config/PoolParser.java b/src/main/java/org/springframework/data/gemfire/config/PoolParser.java index eccf66a8..6b2483bf 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PoolParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PoolParser.java @@ -16,12 +16,19 @@ package org.springframework.data.gemfire.config; +import java.util.List; + import org.springframework.beans.factory.BeanDefinitionStoreException; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.ManagedList; +import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.gemfire.client.PoolConnection; import org.springframework.data.gemfire.client.PoolFactoryBean; import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; /** @@ -29,12 +36,53 @@ import org.w3c.dom.Element; * * @author Costin Leau */ -class PoolParser extends AbstractSingleBeanDefinitionParser { +class PoolParser extends AbstractSimpleBeanDefinitionParser { protected Class getBeanClass(Element element) { return PoolFactoryBean.class; } + protected void postProcess(BeanDefinitionBuilder builder, Element element) { + List subElements = DomUtils.getChildElements(element); + ManagedList locators = new ManagedList(subElements.size()); + ManagedList servers = new ManagedList(subElements.size()); + + // parse nested locator/server elements + for (Element subElement : subElements) { + String name = subElement.getLocalName(); + + if ("locator".equals(name)) { + locators.add(parseLocator(subElement)); + } + if ("server".equals(name)) { + servers.add(parseServer(subElement)); + } + } + + if (!locators.isEmpty()) { + builder.addPropertyValue("locators", locators); + } + + if (!servers.isEmpty()) { + builder.addPropertyValue("servers", servers); + } + } + + private Object parseServer(Element subElement) { + return parseConnection(subElement); + } + + private Object parseLocator(Element subElement) { + return parseConnection(subElement); + } + + private BeanDefinition parseConnection(Element element) { + BeanDefinitionBuilder defBuilder = BeanDefinitionBuilder.genericBeanDefinition(PoolConnection.class); + ParsingUtils.setPropertyValue(element, defBuilder, "host", "host"); + ParsingUtils.setPropertyValue(element, defBuilder, "port", "port"); + return defBuilder.getBeanDefinition(); + } + @Override protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException { @@ -44,4 +92,4 @@ class PoolParser extends AbstractSingleBeanDefinitionParser { } return name; } -} +} \ No newline at end of file diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.0.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.0.xsd index 0511cdca..b6ccfeef 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.0.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.0.xsd @@ -425,7 +425,7 @@ The name of the pool used by this client. - + - - - - - - + + + + locators = TestUtils.readField("locators", pfb); + assertEquals(1, locators.size()); + PoolConnection locator = locators.iterator().next(); + assertEquals("localhost", locator.getHost()); + assertEquals(40403, locator.getPort()); } @Test public void testComplexPool() throws Exception { assertTrue(context.containsBean("complex")); PoolFactoryBean pfb = (PoolFactoryBean) context.getBean("&complex"); - assertEquals(30, TestUtils.readField("retry-attempts", pfb)); - assertEquals(6000, TestUtils.readField("free-connection-timeout", pfb)); - assertEquals(5000, TestUtils.readField("ping-interval", pfb)); + assertEquals(30, TestUtils.readField("retryAttempts", pfb)); + assertEquals(6000, TestUtils.readField("freeConnectionTimeout", pfb)); + assertEquals(5000l, TestUtils.readField("pingInterval", pfb)); + assertTrue((Boolean) TestUtils.readField("subscriptionEnabled", pfb)); + + Collection servers = TestUtils.readField("servers", pfb); + assertEquals(2, servers.size()); + Iterator iterator = servers.iterator(); + PoolConnection server = iterator.next(); + assertEquals("localhost", server.getHost()); + assertEquals(40404, server.getPort()); + + server = iterator.next(); + assertEquals("localhost", server.getHost()); + assertEquals(40405, server.getPort()); } } diff --git a/src/test/resources/org/springframework/data/gemfire/config/pool-ns.xml b/src/test/resources/org/springframework/data/gemfire/config/pool-ns.xml index ee6d273a..f5b6a3d5 100644 --- a/src/test/resources/org/springframework/data/gemfire/config/pool-ns.xml +++ b/src/test/resources/org/springframework/data/gemfire/config/pool-ns.xml @@ -3,7 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gfe="http://www.springframework.org/schema/gemfire" xmlns:p="http://www.springframework.org/schema/p" - default-lazy-init="true" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd @@ -14,16 +13,13 @@ - + + + - - - - + + + + \ No newline at end of file