diff --git a/docs/src/main/asciidoc/spring-cloud-heroku-connector.adoc b/docs/src/main/asciidoc/spring-cloud-heroku-connector.adoc index a8185f6..8010c37 100644 --- a/docs/src/main/asciidoc/spring-cloud-heroku-connector.adoc +++ b/docs/src/main/asciidoc/spring-cloud-heroku-connector.adoc @@ -45,7 +45,7 @@ The connector will check for: * a `CLEARDB_DATABASE_URL` config var with value using the scheme `mysql` -==== Redis (Redis To Go, Redis Cloud, RedisGreen, openredis) +==== Redis (Redis To Go, Redis Cloud, RedisGreen, openredis, Heroku Redis) The connector will check for: @@ -53,6 +53,7 @@ The connector will check for: * a `REDISCLOUD_URL` config var with value using the scheme `redis` * an `OPENREDIS_URL` config var with value using the scheme `redis` * a `REDISGREEN_URL` config var with value using the scheme `redis` +* a `REDIS_URL` config var with value using the scheme `redis` ==== MongoDB (MongoLab, MongoHQ, MongoSoup) diff --git a/gradle.properties b/gradle.properties index 892a23e..3e91be8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version=1.2.1.BUILD-SNAPSHOT +version=1.2.2.BUILD-SNAPSHOT group=org.springframework.cloud diff --git a/spring-cloud-heroku-connector/README.md b/spring-cloud-heroku-connector/README.md index 3a851e0..4c1e0ab 100644 --- a/spring-cloud-heroku-connector/README.md +++ b/spring-cloud-heroku-connector/README.md @@ -5,7 +5,7 @@ currently knows about: - PostgreSQL (Heroku) - MySQL (ClearDB) -- Redis (RedisToGo, Redis Cloud, RedisGreen, openredis) +- Redis (RedisToGo, Redis Cloud, RedisGreen, openredis, Heroku Redis) - MongoDB (MongoLab, MongoHQ, MongoSoup) - RabbitMQ (CloudAMQP) diff --git a/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java b/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java index 55d1cba..6dd5a05 100644 --- a/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java +++ b/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/HerokuConnector.java @@ -18,22 +18,21 @@ import org.springframework.cloud.util.EnvironmentAccessor; /** * Implementation of CloudConnector for Heroku - * + *

* Currently support Postgres (default provided), Mysql (Cleardb), MongoDb (MongoLab, MongoHQ, MongoSoup), * Redis (RedisToGo, RedisCloud, OpenRedis, RedisGreen), and AMQP (CloudAmqp). * * @author Ramnivas Laddad - * */ public class HerokuConnector extends AbstractCloudConnector { private EnvironmentAccessor environment = new EnvironmentAccessor(); private ApplicationInstanceInfoCreator applicationInstanceInfoCreator - = new ApplicationInstanceInfoCreator(environment); + = new ApplicationInstanceInfoCreator(environment); private List serviceEnvPrefixes; - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({"unchecked", "rawtypes"}) public HerokuConnector() { super((Class) HerokuServiceInfoCreator.class); } @@ -60,15 +59,15 @@ public class HerokuConnector extends AbstractCloudConnector @Override protected void registerServiceInfoCreator(ServiceInfoCreator serviceInfoCreator) { - super.registerServiceInfoCreator(serviceInfoCreator); - HerokuServiceInfoCreator herokuServiceInfoCreator = (HerokuServiceInfoCreator)serviceInfoCreator; - String[] envPrefixes = herokuServiceInfoCreator.getEnvPrefixes(); + super.registerServiceInfoCreator(serviceInfoCreator); + HerokuServiceInfoCreator herokuServiceInfoCreator = (HerokuServiceInfoCreator) serviceInfoCreator; + String[] envPrefixes = herokuServiceInfoCreator.getEnvPrefixes(); - // need to do this since this method gets called during construction and we cannot initialize serviceEnvPrefixes before this - if (serviceEnvPrefixes == null) { - serviceEnvPrefixes = new ArrayList(); - } - serviceEnvPrefixes.addAll(Arrays.asList(envPrefixes)); + // need to do this since this method gets called during construction and we cannot initialize serviceEnvPrefixes before this + if (serviceEnvPrefixes == null) { + serviceEnvPrefixes = new ArrayList(); + } + serviceEnvPrefixes.addAll(Arrays.asList(envPrefixes)); } /** @@ -76,26 +75,27 @@ public class HerokuConnector extends AbstractCloudConnector *

* Returns map whose key is the env key and value is the associated url *

+ * * @return information about services bound to the app */ protected List getServicesData() { List serviceData = new ArrayList(); - Map env = environment.getEnv(); + Map env = environment.getEnv(); for (Map.Entry envEntry : env.entrySet()) { - for (String envPrefix : serviceEnvPrefixes) { - if (envEntry.getKey().startsWith(envPrefix)) { - serviceData.add(new UriBasedServiceData(envEntry.getKey(), envEntry.getValue())); - } - } + for (String envPrefix : serviceEnvPrefixes) { + if (envEntry.getKey().startsWith(envPrefix)) { + serviceData.add(new UriBasedServiceData(envEntry.getKey(), envEntry.getValue())); + } + } } return serviceData; } @Override - protected FallbackServiceInfoCreator getFallbackServiceInfoCreator() { + protected FallbackServiceInfoCreator getFallbackServiceInfoCreator() { return new FallbackBaseServiceInfoCreator(); } } \ No newline at end of file diff --git a/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/PostgresqlServiceInfoCreator.java b/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/PostgresqlServiceInfoCreator.java index e6d5ab2..013e9a4 100644 --- a/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/PostgresqlServiceInfoCreator.java +++ b/spring-cloud-heroku-connector/src/main/java/org/springframework/cloud/heroku/PostgresqlServiceInfoCreator.java @@ -20,6 +20,6 @@ public class PostgresqlServiceInfoCreator extends RelationalServiceInfoCreator

env = new HashMap(); String postgresUrl = getRelationalServiceUrl("db"); - env.put("HEROKU_POSTGRESQL_YELLOW_URL", postgresUrl); + env.put(envVarName, postgresUrl); when(mockEnvironment.getEnv()).thenReturn(env); List serviceInfos = testCloudConnector.getServiceInfos(); - ServiceInfo serviceInfo = getServiceInfo(serviceInfos, "HEROKU_POSTGRESQL_YELLOW"); + ServiceInfo serviceInfo = getServiceInfo(serviceInfos, serviceInstanceName); assertNotNull(serviceInfo); assertTrue(serviceInfo instanceof PostgresqlServiceInfo); assertReleationServiceInfo((PostgresqlServiceInfo) serviceInfo, "db"); diff --git a/spring-cloud-heroku-connector/src/test/java/org/springframework/cloud/heroku/HerokuConnectorRedisServiceTest.java b/spring-cloud-heroku-connector/src/test/java/org/springframework/cloud/heroku/HerokuConnectorRedisServiceTest.java index d1ccaee..12ee250 100644 --- a/spring-cloud-heroku-connector/src/test/java/org/springframework/cloud/heroku/HerokuConnectorRedisServiceTest.java +++ b/spring-cloud-heroku-connector/src/test/java/org/springframework/cloud/heroku/HerokuConnectorRedisServiceTest.java @@ -20,7 +20,7 @@ public class HerokuConnectorRedisServiceTest extends AbstractHerokuConnectorTest @Test public void redisServiceCreation() { - for (String redisEnv : new String[]{"REDISTOGO_URL", "REDISCLOUD_URL", "OPENREDIS_URL", "REDISGREEN_URL"}) { + for (String redisEnv : new String[]{"REDISTOGO_URL", "REDISCLOUD_URL", "OPENREDIS_URL", "REDISGREEN_URL", "REDIS_URL"}) { Map env = new HashMap(); String redisUrl = getRedisServiceUrl(); env.put(redisEnv, redisUrl); 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 df6f3bf..2fc1b32 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 @@ -10,6 +10,7 @@ import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; import java.util.List; +import java.util.Map; /** * Parser for the {@code } namespace element @@ -23,6 +24,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"; + private static final String ELEMENT_CONNECTION_PROPERTIES = "connection-properties"; public CloudDataSourceFactoryParser() { super(CloudDataSourceFactory.class); @@ -54,9 +56,16 @@ public class CloudDataSourceFactoryParser extends AbstractPoolingCloudServiceFac parseListElement(dataSourceNamesElement, dataSourceConfigBeanBuilder.getRawBeanDefinition()); } + Map properties = null; + Element propertiesElement = DomUtils.getChildElementByTagName(element, ELEMENT_CONNECTION_PROPERTIES); + if (propertiesElement != null) { + properties = parserContext.getDelegate().parseMapElement(propertiesElement, builder.getRawBeanDefinition()); + } + dataSourceConfigBeanBuilder.addConstructorArgValue(cloudPoolConfiguration); dataSourceConfigBeanBuilder.addConstructorArgValue(cloudConnectionConfiguration); dataSourceConfigBeanBuilder.addConstructorArgValue(dataSourceNames); + dataSourceConfigBeanBuilder.addConstructorArgValue(properties); builder.addConstructorArgValue(dataSourceConfigBeanBuilder.getBeanDefinition()); } diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfig.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfig.java index b19d538..d2f909a 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfig.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfig.java @@ -1,8 +1,10 @@ package org.springframework.cloud.service.relational; +import org.springframework.cloud.service.MapServiceConnectorConfig; import org.springframework.cloud.service.PooledServiceConnectorConfig; import java.util.List; +import java.util.Map; /** * @@ -11,21 +13,37 @@ import java.util.List; */ public class DataSourceConfig extends PooledServiceConnectorConfig { private final ConnectionConfig connectionConfig; + private final MapServiceConnectorConfig connectionProperties; private final List pooledDataSourceNames; public DataSourceConfig(PoolConfig poolConfig, ConnectionConfig connectionConfig) { - this(poolConfig, connectionConfig, null); + this(poolConfig, connectionConfig, null, null); } public DataSourceConfig(List pooledDataSourceNames) { - this(null, null, pooledDataSourceNames); + this(null, null, pooledDataSourceNames, null); + } + + public DataSourceConfig(Map properties) { + this(null, null, null, properties); + } + + public DataSourceConfig(PoolConfig poolConfig, ConnectionConfig connectionConfig, + Map properties) { + this(poolConfig, connectionConfig, null, properties); } public DataSourceConfig(PoolConfig poolConfig, ConnectionConfig connectionConfig, List pooledDataSourceNames) { + this(poolConfig, connectionConfig, pooledDataSourceNames, null); + } + + public DataSourceConfig(PoolConfig poolConfig, ConnectionConfig connectionConfig, + List pooledDataSourceNames, Map properties) { super(poolConfig); this.connectionConfig = connectionConfig; this.pooledDataSourceNames = pooledDataSourceNames; + this.connectionProperties = new MapServiceConnectorConfig(properties); } public ConnectionConfig getConnectionConfiguration() { @@ -36,6 +54,10 @@ public class DataSourceConfig extends PooledServiceConnectorConfig { return pooledDataSourceNames; } + public MapServiceConnectorConfig getConnectionProperties() { + return connectionProperties; + } + public static class ConnectionConfig { private String prop; diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfigurer.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfigurer.java index 1b9167e..caccad8 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfigurer.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceConfigurer.java @@ -6,6 +6,8 @@ import javax.sql.DataSource; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; +import org.springframework.cloud.service.MapServiceConnectionConfigurer; +import org.springframework.cloud.service.MapServiceConnectorConfig; import org.springframework.cloud.service.PooledServiceConnectorConfigurer; /** @@ -14,17 +16,30 @@ import org.springframework.cloud.service.PooledServiceConnectorConfigurer; * */ public class DataSourceConfigurer extends PooledServiceConnectorConfigurer { + private MapServiceConnectionConfigurer mapServiceConnectionConfigurer = + new MapServiceConnectionConfigurer(); + @Override public DataSource configure(DataSource dataSource, DataSourceConfig config) { if (config != null) { - BeanWrapper target = new BeanWrapperImpl(dataSource); - - if (config.getConnectionConfiguration() != null) { - BeanWrapper connectionSource = new BeanWrapperImpl(config.getConnectionConfiguration()); - setCorrespondingProperties(target, connectionSource); - } + configureConnection(dataSource, config); + configureConnectionProperties(dataSource, config); return super.configure(dataSource, config); } return dataSource; } + + private void configureConnection(DataSource dataSource, DataSourceConfig config) { + if (config.getConnectionConfiguration() != null) { + BeanWrapper target = new BeanWrapperImpl(dataSource); + BeanWrapper connectionSource = new BeanWrapperImpl(config.getConnectionConfiguration()); + setCorrespondingProperties(target, connectionSource); + } + } + + private void configureConnectionProperties(DataSource dataSource, DataSourceConfig config) { + if (config.getConnectionProperties() != null) { + mapServiceConnectionConfigurer.configure(dataSource, config.getConnectionProperties()); + } + } } diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceCreator.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceCreator.java index b5fb936..4a36040 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceCreator.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DataSourceCreator.java @@ -40,10 +40,10 @@ public abstract class DataSourceCreator extend this.validationQuery = validationQuery; if (pooledDataSourceCreators.size() == 0) { - putPooledDataSourceCreator(new BasicDbcpPooledDataSourceCreator()); - putPooledDataSourceCreator(new TomcatDbcpPooledDataSourceCreator()); putPooledDataSourceCreator(new TomcatJdbcPooledDataSourceCreator()); putPooledDataSourceCreator(new HikariCpPooledDataSourceCreator()); + putPooledDataSourceCreator(new TomcatDbcpPooledDataSourceCreator()); + putPooledDataSourceCreator(new BasicDbcpPooledDataSourceCreator()); } } diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/MysqlDataSourceCreator.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/MysqlDataSourceCreator.java index daf14ef..f3f2587 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/MysqlDataSourceCreator.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/MysqlDataSourceCreator.java @@ -9,12 +9,12 @@ import org.springframework.cloud.service.common.MysqlServiceInfo; * */ public class MysqlDataSourceCreator extends DataSourceCreator { - private static final String[] DRIVERS = new String[]{"org.mariadb.jdbc.Driver", "com.mysql.jdbc.Driver"}; + public static final String[] DRIVERS = new String[]{"org.mariadb.jdbc.Driver", "com.mysql.jdbc.Driver"}; /** * Validation query obtained from the MySQL reference manual: * http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-j2ee.html */ - private static final String VALIDATION_QUERY = "/* ping */ SELECT 1"; + public static final String VALIDATION_QUERY = "/* ping */ SELECT 1"; public MysqlDataSourceCreator() { super("spring-cloud.mysql.driver", DRIVERS, VALIDATION_QUERY); diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/OracleDataSourceCreator.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/OracleDataSourceCreator.java index 3fc4ac2..d29bfb5 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/OracleDataSourceCreator.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/OracleDataSourceCreator.java @@ -4,8 +4,8 @@ import org.springframework.cloud.service.common.OracleServiceInfo; public class OracleDataSourceCreator extends DataSourceCreator { - private static final String[] DRIVERS = new String[]{"oracle.jdbc.OracleDriver"}; - private static final String VALIDATION_QUERY = "SELECT 'Y' from dual"; + public static final String[] DRIVERS = new String[]{"oracle.jdbc.OracleDriver"}; + public static final String VALIDATION_QUERY = "SELECT 'Y' from dual"; public OracleDataSourceCreator() { super("spring-cloud.oracle.driver", DRIVERS, VALIDATION_QUERY); diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/PostgresqlDataSourceCreator.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/PostgresqlDataSourceCreator.java index d8eb18d..40ea217 100644 --- a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/PostgresqlDataSourceCreator.java +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/PostgresqlDataSourceCreator.java @@ -10,8 +10,8 @@ import org.springframework.cloud.service.common.PostgresqlServiceInfo; */ public class PostgresqlDataSourceCreator extends DataSourceCreator { - private static final String[] DRIVERS = new String[]{"org.postgresql.Driver"}; - private static final String VALIDATION_QUERY = "SELECT 1"; + public static final String[] DRIVERS = new String[]{"org.postgresql.Driver"}; + public static final String VALIDATION_QUERY = "SELECT 1"; public PostgresqlDataSourceCreator() { super("spring-cloud.postgresql.driver", DRIVERS, VALIDATION_QUERY); 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 28a8288..b2cdb89 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 @@ -60,6 +60,7 @@ + diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/ReflectionUtils.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/ReflectionUtils.java new file mode 100644 index 0000000..3fa0211 --- /dev/null +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/ReflectionUtils.java @@ -0,0 +1,21 @@ +package org.springframework.cloud; + +import org.springframework.test.util.ReflectionTestUtils; + +public class ReflectionUtils { + @SuppressWarnings("EmptyCatchBlock") + public static Object getValue(Object target, String... fieldNames) { + for (String fieldName : fieldNames) { + try { + return ReflectionTestUtils.invokeGetterMethod(target, fieldName); + } catch (IllegalArgumentException e1) { + try { + return ReflectionTestUtils.getField(target, fieldName); + } catch (IllegalArgumentException e2) { + } + } + } + + return null; + } +} \ No newline at end of file diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/CommonPoolCloudConfigTestHelper.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/CommonPoolCloudConfigTestHelper.java index ca6f5f8..5b7b49c 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/CommonPoolCloudConfigTestHelper.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/CommonPoolCloudConfigTestHelper.java @@ -1,25 +1,13 @@ package org.springframework.cloud.config; import static org.junit.Assert.assertEquals; - -import org.springframework.test.util.ReflectionTestUtils; +import static org.springframework.cloud.ReflectionUtils.getValue; public class CommonPoolCloudConfigTestHelper { public static void assertCommonsPoolProperties(Object pool, int maxActive, int minIdle, long maxWait) { assertEquals(maxActive, getValue(pool, "maxActive", "maxTotal")); assertEquals(minIdle, getValue(pool, "minIdle")); - assertEquals(maxWait, getValue(pool, "maxWait", "maxWaitMillis")); + assertEquals(maxWait, (long) Long.valueOf(getValue(pool, "maxWait", "maxWaitMillis").toString())); } - - protected static Object getValue(Object object, String... fieldNames) { - for (String fieldName : fieldNames) { - try { - return ReflectionTestUtils.getField(object, fieldName); - } catch (IllegalArgumentException ex) { - } - } - return null; - } - } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/DataSourceCloudConfigTestHelper.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/DataSourceCloudConfigTestHelper.java index 1f70798..bb509cd 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/DataSourceCloudConfigTestHelper.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/DataSourceCloudConfigTestHelper.java @@ -6,7 +6,7 @@ import java.util.Properties; import javax.sql.DataSource; -import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.cloud.ReflectionUtils; /** * @@ -20,6 +20,10 @@ public class DataSourceCloudConfigTestHelper extends CommonPoolCloudConfigTestHe } public static void assertConnectionProperties(DataSource dataSource, Properties connectionProp) { - assertEquals(connectionProp, ReflectionTestUtils.getField(dataSource, "connectionProperties")); + assertEquals(connectionProp, ReflectionUtils.getValue(dataSource, "connectionProperties")); + } + + public static void assertConnectionProperty(DataSource dataSource, String key, Object value) { + assertEquals(value, ReflectionUtils.getValue(dataSource, key)); } } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigMysqlTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigMysqlTest.java index 86db892..f1865a9 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigMysqlTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigMysqlTest.java @@ -1,6 +1,7 @@ package org.springframework.cloud.config.java; import org.springframework.cloud.service.common.MysqlServiceInfo; +import org.springframework.cloud.service.relational.MysqlDataSourceCreator; /** * @@ -13,6 +14,15 @@ public class DataSourceJavaConfigMysqlTest extends DataSourceJavaConfigTest { return createMysqlService(id); } + @Override + protected String getDriverClassName() { + return MysqlDataSourceCreator.DRIVERS[0]; + } + + @Override + protected String getValidationQuery() { + return MysqlDataSourceCreator.VALIDATION_QUERY; + } } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigPostgesqlTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigPostgesqlTest.java index ba7e58e..00f90b0 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigPostgesqlTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigPostgesqlTest.java @@ -1,6 +1,7 @@ package org.springframework.cloud.config.java; import org.springframework.cloud.service.common.PostgresqlServiceInfo; +import org.springframework.cloud.service.relational.PostgresqlDataSourceCreator; /** * @@ -13,6 +14,15 @@ public class DataSourceJavaConfigPostgesqlTest extends DataSourceJavaConfigTest return createPostgresqlService(id); } + @Override + protected String getDriverClassName() { + return PostgresqlDataSourceCreator.DRIVERS[0]; + } + + @Override + protected String getValidationQuery() { + return PostgresqlDataSourceCreator.VALIDATION_QUERY; + } } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigTest.java index 7ce02b9..89d85d1 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/java/DataSourceJavaConfigTest.java @@ -1,18 +1,26 @@ package org.springframework.cloud.config.java; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Properties; import javax.sql.DataSource; import org.junit.Test; import org.springframework.beans.factory.BeanCreationException; -import org.springframework.cloud.config.DataSourceCloudConfigTestHelper; import org.springframework.cloud.service.PooledServiceConnectorConfig.PoolConfig; +import org.springframework.cloud.service.relational.BasicDbcpPooledDataSourceCreator; import org.springframework.cloud.service.relational.DataSourceConfig; import org.springframework.cloud.service.relational.DataSourceConfig.ConnectionConfig; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; +import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertConnectionProperties; +import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertConnectionProperty; +import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertPoolProperties; + /** * Common base class for testing datasource-related Java config * @@ -20,7 +28,9 @@ import org.springframework.context.annotation.Bean; * */ public abstract class DataSourceJavaConfigTest extends AbstractServiceJavaConfigTest { - + protected abstract String getDriverClassName(); + protected abstract String getValidationQuery(); + public DataSourceJavaConfigTest() { super(DatasourceConfigWithId.class, DatasourceConfigWithoutId.class); } @@ -46,28 +56,50 @@ public abstract class DataSourceJavaConfigTest extends AbstractServiceJavaConfig testContext.getBean(getConnectorType()); } - + @Test + public void cloudDataSourceWithNoConfig() { + ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class, + createService("my-service")); + + DataSource ds = testContext.getBean("dataSourceWithNoConfig", getConnectorType()); + + assertConnectionProperties(ds, null); + assertConnectionProperty(ds, "driverClassName", getDriverClassName()); + assertConnectionProperty(ds, "validationQuery", getValidationQuery()); + } + @Test public void cloudDataSourceWithMaxPool() { ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class, createService("my-service")); - - DataSource ds = testContext.getBean("dbPool20Wait200", getConnectorType()); - DataSourceCloudConfigTestHelper.assertPoolProperties(ds, 20, 0, 200); - + + DataSource ds = testContext.getBean("dataSourceWithPoolAndConnectionConfig", getConnectorType()); + assertPoolProperties(ds, 20, 0, 200); + Properties connectionProp = new Properties(); connectionProp.put("sessionVariables", "sql_mode='ANSI'"); connectionProp.put("characterEncoding", "UTF-8"); - DataSourceCloudConfigTestHelper.assertConnectionProperties(ds, connectionProp); + assertConnectionProperties(ds, connectionProp); } - + @Test public void cloudDataSourceWithMinMaxPool() { ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class, createService("my-service")); - DataSource ds = testContext.getBean("dbPool5_20Wait3000", getConnectorType()); - DataSourceCloudConfigTestHelper.assertPoolProperties(ds, 30, 5, 3000); + DataSource ds = testContext.getBean("dataSourceWithPoolConfig", getConnectorType()); + assertPoolProperties(ds, 30, 5, 3000); + } + + @Test + public void cloudDataSourceWithConnectionProperties() { + ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class, + createService("my-service")); + + DataSource ds = testContext.getBean("dataSourceWithConnectionPropertiesConfig", getConnectorType()); + assertConnectionProperty(ds, "driverClassName", "test.driver"); + assertConnectionProperty(ds, "validationQuery", "test validation query"); + assertConnectionProperty(ds, "testOnBorrow", false); } } @@ -87,17 +119,36 @@ class DatasourceConfigWithoutId extends AbstractCloudConfig { class DatasourceConfigWithServiceConfig extends AbstractCloudConfig { @Bean - public DataSource dbPool20Wait200() { // use this name so that we have a case with default name + public DataSource dataSourceWithNoConfig() { + return connectionFactory().dataSource("my-service"); + } + + @Bean + public DataSource dataSourceWithPoolAndConnectionConfig() { PoolConfig poolConfig = new PoolConfig(20, 200); ConnectionConfig connectionConfig = new ConnectionConfig("sessionVariables=sql_mode='ANSI';characterEncoding=UTF-8"); - DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, connectionConfig); + DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, connectionConfig, basicDbcpConnectionPool()); return connectionFactory().dataSource("my-service", serviceConfig); } @Bean - public DataSource dbPool5_20Wait3000() { // use this name so that we have a case with default name + public DataSource dataSourceWithPoolConfig() { PoolConfig poolConfig = new PoolConfig(5, 30, 3000); - DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, null); + DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, null, basicDbcpConnectionPool()); return connectionFactory().dataSource("my-service", serviceConfig); } + + @Bean + public DataSource dataSourceWithConnectionPropertiesConfig() { + Map properties = new HashMap(); + properties.put("driverClassName", "test.driver"); + properties.put("validationQuery", "test validation query"); + properties.put("testOnBorrow", false); + DataSourceConfig serviceConfig = new DataSourceConfig(null, null, basicDbcpConnectionPool(), properties); + return connectionFactory().dataSource("my-service", serviceConfig); + } + + private List basicDbcpConnectionPool() { + return Collections.singletonList(BasicDbcpPooledDataSourceCreator.class.getSimpleName()); + } } \ No newline at end of file diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigMysqlTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigMysqlTest.java index 58b6484..ba3e2f5 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigMysqlTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigMysqlTest.java @@ -1,6 +1,7 @@ package org.springframework.cloud.config.xml; import org.springframework.cloud.service.ServiceInfo; +import org.springframework.cloud.service.relational.MysqlDataSourceCreator; /** * @@ -8,10 +9,17 @@ import org.springframework.cloud.service.ServiceInfo; * */ public class DataSourceXmlConfigMysqlTest extends DataSourceXmlConfigTest { - protected ServiceInfo createService(String id) { return createMysqlService(id); } + @Override + protected String getDriverClassName() { + return MysqlDataSourceCreator.DRIVERS[0]; + } + @Override + protected String getValidationQuery() { + return MysqlDataSourceCreator.VALIDATION_QUERY; + } } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigPostgesqlTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigPostgesqlTest.java deleted file mode 100644 index 430eb82..0000000 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigPostgesqlTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.springframework.cloud.config.xml; - -import org.springframework.cloud.service.ServiceInfo; - -/** - * - * @author Ramnivas Laddad - * - */ -public class DataSourceXmlConfigPostgesqlTest extends DataSourceXmlConfigTest { - - @Override - protected ServiceInfo createService(String id) { - return createPostgresqlService(id); - } - -} diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigPostgresqlTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigPostgresqlTest.java new file mode 100644 index 0000000..58860be --- /dev/null +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/config/xml/DataSourceXmlConfigPostgresqlTest.java @@ -0,0 +1,26 @@ +package org.springframework.cloud.config.xml; + +import org.springframework.cloud.service.ServiceInfo; +import org.springframework.cloud.service.relational.PostgresqlDataSourceCreator; + +/** + * + * @author Ramnivas Laddad + * + */ +public class DataSourceXmlConfigPostgresqlTest extends DataSourceXmlConfigTest { + @Override + protected ServiceInfo createService(String id) { + return createPostgresqlService(id); + } + + @Override + protected String getDriverClassName() { + return PostgresqlDataSourceCreator.DRIVERS[0]; + } + + @Override + protected String getValidationQuery() { + return PostgresqlDataSourceCreator.VALIDATION_QUERY; + } +} 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 8bbe1c1..32703ba 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,6 @@ 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; @@ -16,6 +15,8 @@ import org.springframework.jdbc.datasource.SimpleDriverDataSource; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertThat; +import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertConnectionProperties; +import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertConnectionProperty; /** * @@ -23,6 +24,8 @@ import static org.junit.Assert.assertThat; * */ public abstract class DataSourceXmlConfigTest extends AbstractServiceXmlConfigTest { + protected abstract String getDriverClassName(); + protected abstract String getValidationQuery(); protected abstract ServiceInfo createService(String id); @@ -56,29 +59,50 @@ public abstract class DataSourceXmlConfigTest extends AbstractServiceXmlConfigTe } @Test - public void cloudDataSourceWithMaxPool() throws Exception { + public void cloudDataSourceWithNoConfig() 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))); + DataSource ds = testContext.getBean("no-config", getConnectorType()); + assertConnectionProperties(ds, null); + assertConnectionProperty(ds, "driverClassName", getDriverClassName()); + assertConnectionProperty(ds, "validationQuery", getValidationQuery()); + } + + @Test + public void cloudDataSourceWithMaxPool() throws Exception { + ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", + createService("my-service")); + + DataSource ds = testContext.getBean("pool-and-connection-config", getConnectorType()); DataSourceCloudConfigTestHelper.assertPoolProperties(ds, 20, 0, 200); - + Properties connectionProp = new Properties(); connectionProp.put("sessionVariables", "sql_mode='ANSI'"); connectionProp.put("characterEncoding", "UTF-8"); DataSourceCloudConfigTestHelper.assertConnectionProperties(ds, connectionProp); } - + @Test public void cloudDataSourceWithMinMaxPool() { ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", createService("my-service")); - DataSource ds = testContext.getBean("db-pool5-30-wait3000", getConnectorType()); + DataSource ds = testContext.getBean("pool-config", getConnectorType()); DataSourceCloudConfigTestHelper.assertPoolProperties(ds, 30, 5, 3000); } + @Test + public void cloudDataSourceWithConnectionProperties() { + ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", + createService("my-service")); + + DataSource ds = testContext.getBean("properties-config", getConnectorType()); + assertConnectionProperty(ds, "driverClassName", "test.driver"); + assertConnectionProperty(ds, "validationQuery", "test validation query"); + assertConnectionProperty(ds, "testOnBorrow", false); + } + @Test public void cloudDataSourceWithTomcatJdbcDataSource() throws Exception { ApplicationContext testContext = getTestApplicationContext("cloud-datasource-with-config.xml", diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/AbstractDataSourceCreatorTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/AbstractDataSourceCreatorTest.java index 45d4a52..51bf5e7 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/AbstractDataSourceCreatorTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/AbstractDataSourceCreatorTest.java @@ -4,11 +4,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.util.Collections; +import java.util.List; import java.util.Properties; import javax.sql.DataSource; import org.junit.Test; +import org.springframework.cloud.ReflectionUtils; import org.springframework.cloud.config.DataSourceCloudConfigTestHelper; import org.springframework.cloud.service.PooledServiceConnectorConfig.PoolConfig; import org.springframework.cloud.service.common.RelationalServiceInfo; @@ -30,7 +33,9 @@ public abstract class AbstractDataSourceCreatorTest pooledDataSource = Collections.singletonList(BasicDbcpPooledDataSourceCreator.class.getSimpleName()); + DataSourceConfig config = new DataSourceConfig(pooledDataSource); + DataSource dataSource = getCreator().create(relationalServiceInfo, config); assertDataSourceProperties(relationalServiceInfo, dataSource); } @@ -39,7 +44,10 @@ public abstract class AbstractDataSourceCreatorTest pooledDataSource = Collections.singletonList(BasicDbcpPooledDataSourceCreator.class.getSimpleName()); + DataSourceConfig config = new DataSourceConfig(poolConfig, connectionConfig, pooledDataSource); DataSource dataSource = getCreator().create(relationalServiceInfo, config); assertDataSourceProperties(relationalServiceInfo, dataSource); @@ -57,11 +65,16 @@ public abstract class AbstractDataSourceCreatorTest { + public static final String TEST_DB2_DRIVER = "com.db2.example.Driver"; + @Mock private DB2ServiceInfo mockDB2ServiceInfo; @Before public void setup() { MockitoAnnotations.initMocks(this); // set a dummy JDBC driver since we can't yet include a real DB2 driver in the project due to licensing restrictions - System.setProperty("spring-cloud.db2.driver", "com.example.Driver"); + System.setProperty("spring-cloud.db2.driver", TEST_DB2_DRIVER); } @Override @@ -26,7 +28,7 @@ public class DB2ServiceCreatorTest extends AbstractDataSourceCreatorTest { - @Mock private OracleServiceInfo mockOracleServiceInfo; + public static final String TEST_ORACLE_DRIVER = "com.oracle.example.Driver"; + + @Mock + private OracleServiceInfo mockOracleServiceInfo; @Before public void setup() { MockitoAnnotations.initMocks(this); // set a dummy JDBC driver since we can't include a real Oracle driver in the project due to licensing restrictions - System.setProperty("spring-cloud.oracle.driver", "com.example.Driver"); + System.setProperty("spring-cloud.oracle.driver", TEST_ORACLE_DRIVER); } @Override @@ -26,7 +29,7 @@ public class OracleServiceCreatorTest extends AbstractDataSourceCreatorTest { - @Mock private PostgresqlServiceInfo mockPostgresqlServiceInfo; + @Mock + private PostgresqlServiceInfo mockPostgresqlServiceInfo; @Before public void setup() { @@ -29,7 +30,7 @@ public class PostgresqlServiceCreatorTest extends AbstractDataSourceCreatorTest< @Override public String getDriverName() { - return "org.postgresql.Driver"; + return PostgresqlDataSourceCreator.DRIVERS[0]; } @Override @@ -39,6 +40,6 @@ public class PostgresqlServiceCreatorTest extends AbstractDataSourceCreatorTest< @Override public String getValidationQueryStart() { - return "SELECT 1"; + return PostgresqlDataSourceCreator.VALIDATION_QUERY; } } diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/SqlServerServiceCreatorTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/SqlServerServiceCreatorTest.java index 92ebfa1..7c9cd5f 100644 --- a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/SqlServerServiceCreatorTest.java +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/SqlServerServiceCreatorTest.java @@ -8,13 +8,16 @@ import org.mockito.MockitoAnnotations; import org.springframework.cloud.service.common.SqlServerServiceInfo; public class SqlServerServiceCreatorTest extends AbstractDataSourceCreatorTest { - @Mock private SqlServerServiceInfo mockSqlServerServiceInfo; + public static final String TEST_SQLSERVER_DRIVER = "com.sqlserver.example.Driver"; + + @Mock + private SqlServerServiceInfo mockSqlServerServiceInfo; @Before public void setup() { MockitoAnnotations.initMocks(this); // set a dummy JDBC driver since we can't include a real SQL-Server driver in the project due to licensing restrictions - System.setProperty("spring-cloud.sqlserver.driver", "com.example.Driver"); + System.setProperty("spring-cloud.sqlserver.driver", TEST_SQLSERVER_DRIVER); } @Override @@ -26,7 +29,7 @@ public class SqlServerServiceCreatorTest extends AbstractDataSourceCreatorTest - + + + + + BasicDbcp + - + + + BasicDbcp + + + + + + BasicDbcp + + + + + +