From 3c9d9f7065d58e6cc1681e942bf2a024e870d92f Mon Sep 17 00:00:00 2001 From: John Blum Date: Thu, 16 Apr 2015 11:06:16 -0700 Subject: [PATCH] SGF-396 - Enable support for variable Locator and Server endpoints on a SDG GFE Pool bean definition in a Spring Context. Removed the SDG XSD schema restriction requiring the use of at least 1 of sub-element on the element. Also added a default Locator endpoint on localhost listening on the Locators default port of 10334 when no Locator or Server endpoints were specified, either by way of explicit use of the 'locators' or 'servers' attribute or a corresponding or sub-element. --- .../data/gemfire/config/PoolParser.java | 6 ++ .../gemfire/config/spring-gemfire-1.6.xsd | 8 +-- .../gemfire/config/spring-gemfire-1.7.xsd | 8 +-- .../gemfire/config/PoolNamespaceTest.java | 63 +++++++++++++++++-- .../data/gemfire/config/PoolParserTest.java | 32 ++++++++++ .../data/gemfire/config/pool-ns.xml | 15 ++++- 6 files changed, 114 insertions(+), 18 deletions(-) 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 0d131126..90acd783 100644 --- a/src/main/java/org/springframework/data/gemfire/config/PoolParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/PoolParser.java @@ -81,6 +81,12 @@ class PoolParser extends AbstractSimpleBeanDefinitionParser { locators.addAll(parseLocators(element)); servers.addAll(parseServers(element)); + // NOTE if neither Locators or Servers were specified, then setup a default connection to a Locator + // running on localhost listening on the default Locator port (10334) for convenience + if (locators.isEmpty() && servers.isEmpty()) { + locators.add(buildConnection(DEFAULT_HOST, String.valueOf(DEFAULT_LOCATOR_PORT), false)); + } + if (!locators.isEmpty()) { builder.addPropertyValue("locators", locators); } diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.6.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.6.xsd index aaa939a0..ef6ec09e 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.6.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.6.xsd @@ -2052,11 +2052,9 @@ Note that in order to instantiate a pool, a GemFire cache needs to be already st - - - + + + diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.7.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.7.xsd index 46046c99..2774af09 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.7.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-gemfire-1.7.xsd @@ -2052,11 +2052,9 @@ Note that in order to instantiate a pool, a GemFire cache needs to be already st - - - + + + diff --git a/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java b/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java index 052f7425..eebfab21 100644 --- a/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/PoolNamespaceTest.java @@ -19,6 +19,7 @@ package org.springframework.data.gemfire.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.net.InetSocketAddress; @@ -71,18 +72,69 @@ public class PoolNamespaceTest { assertSocketAddress(locators.iterator().next(), "localhost", 40403); } + @Test + public void testSimplePool() throws Exception { + assertTrue(context.containsBean("simple")); + + PoolFactoryBean poolFactoryBean = context.getBean("&simple", PoolFactoryBean.class); + Collection locators = TestUtils.readField("locators", poolFactoryBean); + + assertNotNull(locators); + assertEquals(1, locators.size()); + + assertSocketAddress(locators.iterator().next(), PoolParser.DEFAULT_HOST, PoolParser.DEFAULT_LOCATOR_PORT); + + Collection servers = TestUtils.readField("servers", poolFactoryBean); + + assertNull(servers); + } + + @Test + public void testLocatorPool() throws Exception { + assertTrue(context.containsBean("locator")); + + PoolFactoryBean poolFactoryBean = context.getBean("&locator", PoolFactoryBean.class); + Collection locators = TestUtils.readField("locators", poolFactoryBean); + + assertNotNull(locators); + assertEquals(2, locators.size()); + + Iterator it = locators.iterator(); + + assertSocketAddress(it.next(), "skullbox", PoolParser.DEFAULT_LOCATOR_PORT); + assertSocketAddress(it.next(), "yorktown", 12480); + + Collection servers = TestUtils.readField("servers", poolFactoryBean); + + assertNull(servers); + } + @Test public void testComplexPool() throws Exception { assertTrue(context.containsBean("complex")); PoolFactoryBean poolFactoryBean = context.getBean("&complex", PoolFactoryBean.class); - assertEquals(30, TestUtils.readField("retryAttempts", poolFactoryBean)); - assertEquals(6000, TestUtils.readField("freeConnectionTimeout", poolFactoryBean)); - assertEquals(5000l, TestUtils.readField("pingInterval", poolFactoryBean)); - assertTrue((Boolean) TestUtils.readField("subscriptionEnabled", poolFactoryBean)); + assertEquals(2000, TestUtils.readField("freeConnectionTimeout", poolFactoryBean)); + assertEquals(20000l, TestUtils.readField("idleTimeout", poolFactoryBean)); + assertEquals(10000, TestUtils.readField("loadConditioningInterval", poolFactoryBean)); + assertEquals(false, TestUtils.readField("keepAlive", poolFactoryBean)); + assertEquals(100, TestUtils.readField("maxConnections", poolFactoryBean)); + assertEquals(5, TestUtils.readField("minConnections", poolFactoryBean)); + assertEquals(5, TestUtils.readField("minConnections", poolFactoryBean)); assertFalse((Boolean) TestUtils.readField("multiUserAuthentication", poolFactoryBean)); + assertEquals(5000l, TestUtils.readField("pingInterval", poolFactoryBean)); assertTrue((Boolean) TestUtils.readField("prSingleHopEnabled", poolFactoryBean)); + assertEquals(500, TestUtils.readField("readTimeout", poolFactoryBean)); + assertEquals(5, TestUtils.readField("retryAttempts", poolFactoryBean)); + assertEquals("TestGroup", TestUtils.readField("serverGroup", poolFactoryBean)); + assertEquals(65536, TestUtils.readField("socketBufferSize", poolFactoryBean)); + assertEquals(5000, TestUtils.readField("statisticInterval", poolFactoryBean)); + assertEquals(250, TestUtils.readField("subscriptionAckInterval", poolFactoryBean)); + assertTrue((Boolean) TestUtils.readField("subscriptionEnabled", poolFactoryBean)); + assertEquals(30000, TestUtils.readField("subscriptionMessageTrackingTimeout", poolFactoryBean)); + assertEquals(2, TestUtils.readField("subscriptionRedundancy", poolFactoryBean)); + assertTrue((Boolean) TestUtils.readField("threadLocalConnections", poolFactoryBean)); Collection servers = TestUtils.readField("servers", poolFactoryBean); @@ -122,11 +174,12 @@ public class PoolNamespaceTest { Collection servers = TestUtils.readField("servers", poolFactoryBean); assertNotNull(servers); - assertEquals(2, servers.size()); + assertEquals(3, servers.size()); Iterator serverIterator = locators.iterator(); assertSocketAddress(serverIterator.next(), "scorch", 21480); + assertSocketAddress(serverIterator.next(), "scorn", 51515); assertSocketAddress(serverIterator.next(), "skullbox", 9110); } diff --git a/src/test/java/org/springframework/data/gemfire/config/PoolParserTest.java b/src/test/java/org/springframework/data/gemfire/config/PoolParserTest.java index f681cbfb..8f2bfa76 100644 --- a/src/test/java/org/springframework/data/gemfire/config/PoolParserTest.java +++ b/src/test/java/org/springframework/data/gemfire/config/PoolParserTest.java @@ -19,6 +19,7 @@ package org.springframework.data.gemfire.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -227,6 +228,8 @@ public class PoolParserTest { BeanDefinition poolDefinition = builder.getRawBeanDefinition(); assertNotNull(poolDefinition); + assertTrue(poolDefinition.getPropertyValues().contains("locators")); + assertTrue(poolDefinition.getPropertyValues().contains("servers")); ManagedList locators = (ManagedList) poolDefinition.getPropertyValues() .getPropertyValue("locators").getValue(); @@ -249,4 +252,33 @@ public class PoolParserTest { assertBeanDefinition(servers.get(2), "backspace", String.valueOf(PoolParser.DEFAULT_SERVER_PORT)); } + @Test + @SuppressWarnings("unchecked") + public void testPostProcessWithNoLocatorsOrServersSpecified() { + BeanDefinitionBuilder poolBuilder = BeanDefinitionBuilder.genericBeanDefinition(); + Element mockPoolElement = mock(Element.class, "testPostProcessWithNoLocatorsOrServersSpecified.MockPoolElement"); + NodeList mockNodeList = mock(NodeList.class, "testPostProcessWithNoLocatorsOrServersSpecified.MockNodeList"); + + when(mockNodeList.getLength()).thenReturn(0); + when(mockPoolElement.getChildNodes()).thenReturn(mockNodeList); + when(mockPoolElement.getAttribute(eq(PoolParser.LOCATORS_ATTRIBUTE_NAME))).thenReturn(""); + when(mockPoolElement.getAttribute(eq(PoolParser.SERVERS_ATTRIBUTE_NAME))).thenReturn(""); + + parser.postProcess(poolBuilder, mockPoolElement); + + BeanDefinition poolDefinition = poolBuilder.getBeanDefinition(); + + assertNotNull(poolDefinition); + assertTrue(poolDefinition.getPropertyValues().contains("locators")); + assertFalse(poolDefinition.getPropertyValues().contains("servers")); + + ManagedList locators = (ManagedList) poolDefinition.getPropertyValues() + .getPropertyValue("locators").getValue(); + + assertNotNull(locators); + assertFalse(locators.isEmpty()); + assertEquals(1, locators.size()); + assertBeanDefinition(locators.get(0), "localhost", String.valueOf(PoolParser.DEFAULT_LOCATOR_PORT)); + } + } 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 12080355..0ee293c5 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 @@ -17,7 +17,7 @@ error - + @@ -25,8 +25,16 @@ - + + + + + @@ -37,6 +45,7 @@ +