From f0eddbd615d07f875301d9b899837979514ef32e Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Wed, 26 Aug 2015 15:47:51 -0500 Subject: [PATCH] Support XML config for customizing the order of pooled DataSource implementations in Spring connector. --- .../xml/CloudDataSourceFactoryParser.java | 19 ++++++++-- .../cloud/config/xml/spring-cloud.xsd | 30 ++++++++++++++- .../config/xml/DataSourceXmlConfigTest.java | 37 ++++++++++++++++++- .../xml/cloud-datasource-with-config.xml | 31 +++++++++++++--- 4 files changed, 106 insertions(+), 11 deletions(-) diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/config/xml/CloudDataSourceFactoryParser.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/config/xml/CloudDataSourceFactoryParser.java index 8b2b6f1..df6f3bf 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/config/xml/CloudDataSourceFactoryParser.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/config/xml/CloudDataSourceFactoryParser.java @@ -4,10 +4,13 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.cloud.service.relational.CloudDataSourceFactory; +import org.springframework.cloud.service.relational.DataSourceConfig; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; +import java.util.List; + /** * Parser for the {@code } namespace element * @@ -19,6 +22,7 @@ public class CloudDataSourceFactoryParser extends AbstractPoolingCloudServiceFac private static final String ELEMENT_CONNECTION = "connection"; private static final String ELEMENT_POOL = "pool"; + private static final String ELEMENT_DATASOURCE_NAMES = "pool-data-sources"; public CloudDataSourceFactoryParser() { super(CloudDataSourceFactory.class); @@ -28,6 +32,9 @@ public class CloudDataSourceFactoryParser extends AbstractPoolingCloudServiceFac protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { super.doParse(element, parserContext, builder); + BeanDefinitionBuilder dataSourceConfigBeanBuilder = + BeanDefinitionBuilder.genericBeanDefinition(DataSourceConfig.class.getName()); + BeanDefinition cloudConnectionConfiguration = null; Element connectionElement = DomUtils.getChildElementByTagName(element, ELEMENT_CONNECTION); if (connectionElement != null) { @@ -40,17 +47,23 @@ public class CloudDataSourceFactoryParser extends AbstractPoolingCloudServiceFac cloudPoolConfiguration = parsePoolElement(poolElement, parserContext); } - BeanDefinitionBuilder dataSourceConfigBeanBuilder = - BeanDefinitionBuilder.genericBeanDefinition("org.springframework.cloud.service.relational.DataSourceConfig"); + List dataSourceNames = null; + Element dataSourceNamesElement = DomUtils.getChildElementByTagName(element, ELEMENT_DATASOURCE_NAMES); + if (dataSourceNamesElement != null) { + dataSourceNames = parserContext.getDelegate(). + parseListElement(dataSourceNamesElement, dataSourceConfigBeanBuilder.getRawBeanDefinition()); + } + dataSourceConfigBeanBuilder.addConstructorArgValue(cloudPoolConfiguration); dataSourceConfigBeanBuilder.addConstructorArgValue(cloudConnectionConfiguration); + dataSourceConfigBeanBuilder.addConstructorArgValue(dataSourceNames); builder.addConstructorArgValue(dataSourceConfigBeanBuilder.getBeanDefinition()); } private BeanDefinition parseConnectionElement(Element element) { BeanDefinitionBuilder cloudConnectionConfigurationBeanBuilder = - BeanDefinitionBuilder.genericBeanDefinition("org.springframework.cloud.service.relational.DataSourceConfig.ConnectionConfig"); + BeanDefinitionBuilder.genericBeanDefinition(DataSourceConfig.ConnectionConfig.class.getName()); String connectionProperties = element.getAttribute("properties"); if (StringUtils.hasText(connectionProperties)) { cloudConnectionConfigurationBeanBuilder.addConstructorArgValue(connectionProperties); diff --git a/spring-cloud-spring-service-connector/src/main/resources/org/springframework/cloud/config/xml/spring-cloud.xsd b/spring-cloud-spring-service-connector/src/main/resources/org/springframework/cloud/config/xml/spring-cloud.xsd index 1098e90..28a8288 100644 --- a/spring-cloud-spring-service-connector/src/main/resources/org/springframework/cloud/config/xml/spring-cloud.xsd +++ b/spring-cloud-spring-service-connector/src/main/resources/org/springframework/cloud/config/xml/spring-cloud.xsd @@ -59,6 +59,7 @@ + @@ -248,12 +249,20 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigTest.java index ac5dd7d..8bbe1c1 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigTest.java @@ -8,7 +8,14 @@ import org.junit.Test; import org.springframework.beans.factory.BeanCreationException; import org.springframework.cloud.config.DataSourceCloudConfigTestHelper; import org.springframework.cloud.service.ServiceInfo; +import org.springframework.cloud.service.relational.BasicDbcpPooledDataSourceCreator; +import org.springframework.cloud.service.relational.HikariCpPooledDataSourceCreator; +import org.springframework.cloud.service.relational.TomcatJdbcPooledDataSourceCreator; import org.springframework.context.ApplicationContext; +import org.springframework.jdbc.datasource.SimpleDriverDataSource; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.junit.Assert.assertThat; /** * @@ -49,11 +56,12 @@ public abstract class DataSourceXmlConfigTest extends AbstractServiceXmlConfigTe } @Test - public void cloudDataSourceWithMaxPool() { + public void cloudDataSourceWithMaxPool() throws Exception { ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", createService("my-service")); DataSource ds = testContext.getBean("db-pool20-wait200", getConnectorType()); + assertThat(ds, instanceOf(Class.forName(BasicDbcpPooledDataSourceCreator.DBCP2_BASIC_DATASOURCE))); DataSourceCloudConfigTestHelper.assertPoolProperties(ds, 20, 0, 200); Properties connectionProp = new Properties(); @@ -70,4 +78,31 @@ public abstract class DataSourceXmlConfigTest extends AbstractServiceXmlConfigTe DataSource ds = testContext.getBean("db-pool5-30-wait3000", getConnectorType()); DataSourceCloudConfigTestHelper.assertPoolProperties(ds, 30, 5, 3000); } + + @Test + public void cloudDataSourceWithTomcatJdbcDataSource() throws Exception { + ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", + createService("my-service")); + + DataSource ds = testContext.getBean("db-pool-tomcat-jdbc", getConnectorType()); + assertThat(ds, instanceOf(Class.forName(TomcatJdbcPooledDataSourceCreator.TOMCAT_JDBC_DATASOURCE))); + } + + @Test + public void cloudDataSourceWithHikariCpDataSource() throws Exception { + ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", + createService("my-service")); + + DataSource ds = testContext.getBean("db-pool-hikari", getConnectorType()); + assertThat(ds, instanceOf(Class.forName(HikariCpPooledDataSourceCreator.HIKARI_DATASOURCE))); + } + + @Test + public void cloudDataSourceWithInvalidDataSource() throws Exception { + ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", + createService("my-service")); + + DataSource ds = testContext.getBean("db-pool-invalid", getConnectorType()); + assertThat(ds, instanceOf(SimpleDriverDataSource.class)); + } } diff --git a/spring-cloud-spring-service-connector/src/test/resources/org/springframework/cloud/config/xml/cloud-datasource-with-config.xml b/spring-cloud-spring-service-connector/src/test/resources/org/springframework/cloud/config/xml/cloud-datasource-with-config.xml index f92c744..cb0f7e3 100644 --- a/spring-cloud-spring-service-connector/src/test/resources/org/springframework/cloud/config/xml/cloud-datasource-with-config.xml +++ b/spring-cloud-spring-service-connector/src/test/resources/org/springframework/cloud/config/xml/cloud-datasource-with-config.xml @@ -4,15 +4,34 @@ xmlns:cloud="http://www.springframework.org/schema/cloud" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cloud http://www.springframework.org/schema/cloud/spring-cloud.xsd"> - - + - - + + - + - + + + + TomcatJdbc + TomcatDbcp + BasicDbcp + + + + + + HikariCp + + + + + + Dummy + + +