From 86780fbc60ab5a91fc64a951dcf46b070d7aa753 Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Fri, 21 Aug 2015 12:00:01 -0500 Subject: [PATCH] Prevent errors when only a JDBC URL is given in Cloud Foundry connectors. --- .../RelationalServiceInfoCreator.java | 8 ++++- ...FoundryConnectorRelationalServiceTest.java | 10 ++++-- .../AbstractCloudFoundryConnectorTest.java | 6 ++-- ...CloudFoundryConnectorMysqlServiceTest.java | 33 +++++++++++++++++++ .../test-mysql-info-jdbc-url-only.json | 6 ++++ .../cloud/service/UriBasedServiceInfo.java | 5 +++ .../springframework/cloud/util/UriInfo.java | 6 ++++ 7 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-mysql-info-jdbc-url-only.json diff --git a/spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/RelationalServiceInfoCreator.java b/spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/RelationalServiceInfoCreator.java index 063ce42..0228bd6 100644 --- a/spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/RelationalServiceInfoCreator.java +++ b/spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/RelationalServiceInfoCreator.java @@ -62,7 +62,13 @@ public abstract class RelationalServiceInfoCreator type) { assertNotNull(serviceInfo); - assertThat(serviceInfo, new InstanceOf(type)); + assertThat(serviceInfo, instanceOf(type)); } protected static void assertServiceFoundOfType(List serviceInfos, String serviceId, Class type) { @@ -140,7 +140,7 @@ public abstract class AbstractCloudFoundryConnectorTest { protected static void assertUriBasedServiceInfoFields(ServiceInfo serviceInfo, String scheme, String host, int port, String username, String password, String path) { - assertThat(serviceInfo, new InstanceOf(UriBasedServiceInfo.class)); + assertThat(serviceInfo, instanceOf(UriBasedServiceInfo.class)); UriBasedServiceInfo info = (UriBasedServiceInfo) serviceInfo; diff --git a/spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorMysqlServiceTest.java b/spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorMysqlServiceTest.java index 1faf066..f40b2aa 100644 --- a/spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorMysqlServiceTest.java +++ b/spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorMysqlServiceTest.java @@ -127,6 +127,32 @@ public class CloudFoundryConnectorMysqlServiceTest extends AbstractCloudFoundryC assertUriBasedServiceInfoFields(info2, MYSQL_SCHEME, hostname, port, username, password, name2); } + @Test + public void mysqlServiceCreationWithJdbcUrlOnly() { + String name1 = "database-1"; + String name2 = "database-2"; + when(mockEnvironment.getEnvValue("VCAP_SERVICES")) + .thenReturn(getServicesPayload( + getMysqlServicePayloadWithJdbcUrlOnly("mysql-1", hostname, port, username, password, name1), + getMysqlServicePayloadWithJdbcUrlOnly("mysql-2", hostname, port, username, password, name2))); + List serviceInfos = testCloudConnector.getServiceInfos(); + + ServiceInfo info1 = getServiceInfo(serviceInfos, "mysql-1"); + ServiceInfo info2 = getServiceInfo(serviceInfos, "mysql-2"); + + assertServiceFoundOfType(info1, MysqlServiceInfo.class); + assertServiceFoundOfType(info2, MysqlServiceInfo.class); + + assertJdbcUrlEqual(info1, MYSQL_SCHEME, name1); + assertJdbcUrlEqual(info2, MYSQL_SCHEME, name2); + + assertUriBasedServiceInfoFields(info1, "jdbc", null, -1, null, null, null); + assertUriBasedServiceInfoFields(info2, "jdbc", null, -1, null, null, null); + + assertJdbcShemeSpecificPartEqual(info1, MYSQL_SCHEME, name1); + assertJdbcShemeSpecificPartEqual(info2, MYSQL_SCHEME, name2); + } + private String getMysqlServicePayload(String serviceName, String hostname, int port, String user, String password, String name) { @@ -161,4 +187,11 @@ public class CloudFoundryConnectorMysqlServiceTest extends AbstractCloudFoundryC return getRelationalPayload("test-mysql-info-jdbc-url.json", serviceName, hostname, port, user, password, name); } + + private String getMysqlServicePayloadWithJdbcUrlOnly(String serviceName, + String hostname, int port, + String user, String password, String name) { + return getRelationalPayload("test-mysql-info-jdbc-url-only.json", serviceName, + hostname, port, user, password, name); + } } diff --git a/spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-mysql-info-jdbc-url-only.json b/spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-mysql-info-jdbc-url-only.json new file mode 100644 index 0000000..5553ea1 --- /dev/null +++ b/spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-mysql-info-jdbc-url-only.json @@ -0,0 +1,6 @@ +{ + "name": "$serviceName", + "credentials": { + "jdbcUrl": "jdbc:mysql://$hostname:$port/$name?user=$user&password=$password" + } +} \ No newline at end of file diff --git a/spring-cloud-core/src/main/java/org/springframework/cloud/service/UriBasedServiceInfo.java b/spring-cloud-core/src/main/java/org/springframework/cloud/service/UriBasedServiceInfo.java index 0a376b3..37cab56 100644 --- a/spring-cloud-core/src/main/java/org/springframework/cloud/service/UriBasedServiceInfo.java +++ b/spring-cloud-core/src/main/java/org/springframework/cloud/service/UriBasedServiceInfo.java @@ -78,6 +78,11 @@ public abstract class UriBasedServiceInfo extends BaseServiceInfo { return uriInfo.getScheme(); } + @ServiceProperty(category = "connection") + public String getSchemeSpecificPart() { + return uriInfo.getSchemeSpecificPart(); + } + /** * Validate the URI and clean it up by using defaults for any missing information, if possible. * diff --git a/spring-cloud-core/src/main/java/org/springframework/cloud/util/UriInfo.java b/spring-cloud-core/src/main/java/org/springframework/cloud/util/UriInfo.java index 2d877c6..e119b85 100644 --- a/spring-cloud-core/src/main/java/org/springframework/cloud/util/UriInfo.java +++ b/spring-cloud-core/src/main/java/org/springframework/cloud/util/UriInfo.java @@ -18,6 +18,7 @@ public class UriInfo { private String password; private String path; private String query; + private String schemeSpecificPart; private String uriString; @@ -50,6 +51,7 @@ public class UriInfo { this.port = uri.getPort(); this.path = parsePath(uri); this.query = uri.getQuery(); + this.schemeSpecificPart = uri.getSchemeSpecificPart(); String[] userinfo = parseUserinfo(uri); this.userName = uriDecode(userinfo[0]); @@ -84,6 +86,10 @@ public class UriInfo { return query; } + public String getSchemeSpecificPart() { + return schemeSpecificPart; + } + public URI getUri() { try { return new URI(uriString);