diff --git a/build.gradle b/build.gradle index b70298a..8f80842 100644 --- a/build.gradle +++ b/build.gradle @@ -190,7 +190,9 @@ ext { "amqp12" : [springAmqpVersion: "1.2.2.RELEASE"], "amqp13" : [springAmqpVersion: "1.3.6.RELEASE"], "spring32" : [springVersion: "3.2.9.RELEASE"], - "spring40" : [springVersion: "4.0.5.RELEASE"] + "spring40" : [springVersion: "4.0.5.RELEASE"], + "tomcat7" : [tomcatVersion: "7.0.53"], + "tomcat8" : [tomcatVersion: "8.0.24"], ] } diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/TomcatDbcpPooledDataSourceCreator.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/TomcatDbcpPooledDataSourceCreator.java index 7ce9c48..0cad9df 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/TomcatDbcpPooledDataSourceCreator.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/TomcatDbcpPooledDataSourceCreator.java @@ -5,6 +5,7 @@ import static org.springframework.cloud.service.Util.hasClass; import javax.sql.DataSource; import org.springframework.cloud.service.ServiceConnectorConfig; +import org.springframework.cloud.service.ServiceConnectorCreationException; import org.springframework.cloud.service.common.RelationalServiceInfo; /** @@ -15,17 +16,32 @@ import org.springframework.cloud.service.common.RelationalServiceInfo; */ public class TomcatDbcpPooledDataSourceCreator extends DbcpLikePooledDataSourceCreator { + public static final String TOMCAT_7_DBCP = "org.apache.tomcat.dbcp.dbcp.BasicDataSource"; + public static final String TOMCAT_8_DBCP = "org.apache.tomcat.dbcp.dbcp2.BasicDataSource"; + @Override public DataSource create(RelationalServiceInfo serviceInfo, ServiceConnectorConfig serviceConnectorConfig, String driverClassName, String validationQuery) { - if (hasClass("org.apache.tomcat.dbcp.dbcp.BasicDataSource")) { - logger.info("Found Tomcat dbcp connection pool on the classpath. Using it for DataSource connection pooling."); - org.apache.tomcat.dbcp.dbcp.BasicDataSource ds = new org.apache.tomcat.dbcp.dbcp.BasicDataSource(); - setBasicDataSourceProperties(ds, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery); - return ds; + if (hasClass(TOMCAT_7_DBCP)) { + logger.info("Found Tomcat 7 dbcp connection pool on the classpath. Using it for DataSource connection pooling."); + return createDataSource(TOMCAT_7_DBCP, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery); + } else if (hasClass(TOMCAT_8_DBCP)) { + logger.info("Found Tomcat 8 dbcp connection pool on the classpath. Using it for DataSource connection pooling."); + return createDataSource(TOMCAT_8_DBCP, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery); } else { return null; } } + private DataSource createDataSource(String className, RelationalServiceInfo serviceInfo, + ServiceConnectorConfig serviceConnectorConfig, + String driverClassName, String validationQuery) { + try { + DataSource dataSource = (DataSource) Class.forName(className).newInstance(); + setBasicDataSourceProperties(dataSource, serviceInfo, serviceConnectorConfig, driverClassName, validationQuery); + return dataSource; + } catch (Throwable e) { + throw new ServiceConnectorCreationException("Error instantiating Tomcat dbcp connection pool", e); + } + } } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/PooledDataSourceCreatorsTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/PooledDataSourceCreatorsTest.java index 4456a56..09f79fa 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/PooledDataSourceCreatorsTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/PooledDataSourceCreatorsTest.java @@ -9,6 +9,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.cloud.service.common.MysqlServiceInfo; +import static org.hamcrest.core.IsInstanceOf.instanceOf; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.springframework.cloud.service.Util.hasClass; +import static org.springframework.cloud.service.relational.TomcatDbcpPooledDataSourceCreator.TOMCAT_7_DBCP; +import static org.springframework.cloud.service.relational.TomcatDbcpPooledDataSourceCreator.TOMCAT_8_DBCP; + public class PooledDataSourceCreatorsTest { @Mock private MysqlServiceInfo mockMysqlServiceInfo; @@ -26,8 +33,16 @@ public class PooledDataSourceCreatorsTest { } @Test - public void pooledDataSourceCreationTomcatDbcp() { - assertPooledDataSource(new TomcatDbcpPooledDataSourceCreator()); + public void pooledDataSourceCreationTomcatDbcp() throws Exception { + DataSource ds = assertPooledDataSource(new TomcatDbcpPooledDataSourceCreator()); + assertTrue(hasClass(TOMCAT_7_DBCP) || hasClass(TOMCAT_8_DBCP)); + + if (hasClass(TOMCAT_7_DBCP)) { + assertThat(ds, instanceOf(Class.forName(TOMCAT_7_DBCP))); + } + if (hasClass(TOMCAT_8_DBCP)) { + assertThat(ds, instanceOf(Class.forName(TOMCAT_8_DBCP))); + } } @Test @@ -40,12 +55,13 @@ public class PooledDataSourceCreatorsTest { assertPooledDataSource(new HikariCpPooledDataSourceCreator()); } - private void assertPooledDataSource(PooledDataSourceCreator testCreator) { + private DataSource assertPooledDataSource(PooledDataSourceCreator testCreator) { DataSource ds = testCreator.create(mockMysqlServiceInfo, null, mysqlDataSourceCreator.getDriverClassName(mockMysqlServiceInfo), "select 1"); Assert.assertNotNull("Failed to create datasource with " + testCreator.getClass().getSimpleName(), ds); + return ds; } }