diff --git a/java-cfenv-jdbc/src/main/java/io/pivotal/cfenv/jdbc/HanaJdbcUrlCreator.java b/java-cfenv-jdbc/src/main/java/io/pivotal/cfenv/jdbc/HanaJdbcUrlCreator.java new file mode 100644 index 00000000..c3e7b78d --- /dev/null +++ b/java-cfenv-jdbc/src/main/java/io/pivotal/cfenv/jdbc/HanaJdbcUrlCreator.java @@ -0,0 +1,44 @@ +package io.pivotal.cfenv.jdbc; + +import static io.pivotal.cfenv.jdbc.AbstractJdbcUrlCreator.JDBC_PREFIX; + +import io.pivotal.cfenv.core.CfCredentials; +import io.pivotal.cfenv.core.CfService; + +public class HanaJdbcUrlCreator implements JdbcUrlCreator { + @Override + public boolean isDatabaseService(CfService cfService) { + return jdbcUrlMatchesScheme(cfService, "sap"); + } + + @Override + public String createJdbcUrl(CfService cfService) { + CfCredentials credentials = cfService.getCredentials(); + String host = credentials.getHost(); + String port = credentials.getPort(); + String user = credentials.getUsername(); + + return "jdbc:sap://%s:%s?encrypt=true&validateCertificate=true¤tschema=%s".formatted(host, port, user); + } + + @Override + public String getDriverClassName() { + return "com.sap.db.jdbc.Driver"; + } + + @SuppressWarnings("SameParameterValue") + protected boolean jdbcUrlMatchesScheme(CfService cfService, String... uriSchemes) { + CfCredentials cfCredentials = cfService.getCredentials(); + String jdbcUrl = (String) cfCredentials.getMap().get("url"); + + if (jdbcUrl != null) { + for (String uriScheme : uriSchemes) { + if (jdbcUrl.startsWith(JDBC_PREFIX + uriScheme + ":")) { + return true; + } + } + } + + return false; + } +} diff --git a/java-cfenv-jdbc/src/main/resources/META-INF/services/io.pivotal.cfenv.jdbc.JdbcUrlCreator b/java-cfenv-jdbc/src/main/resources/META-INF/services/io.pivotal.cfenv.jdbc.JdbcUrlCreator index 7750b5a9..9e924e1f 100644 --- a/java-cfenv-jdbc/src/main/resources/META-INF/services/io.pivotal.cfenv.jdbc.JdbcUrlCreator +++ b/java-cfenv-jdbc/src/main/resources/META-INF/services/io.pivotal.cfenv.jdbc.JdbcUrlCreator @@ -3,3 +3,4 @@ io.pivotal.cfenv.jdbc.OracleJdbcUrlCreator io.pivotal.cfenv.jdbc.SqlServerJdbcUrlCreator io.pivotal.cfenv.jdbc.PostgresqlJdbcUrlCreator io.pivotal.cfenv.jdbc.DB2JdbcUrlCreator +io.pivotal.cfenv.jdbc.HanaJdbcUrlCreator diff --git a/java-cfenv-jdbc/src/test/java/io/pivotal/cfenv/jdbc/HanaJdbcTests.java b/java-cfenv-jdbc/src/test/java/io/pivotal/cfenv/jdbc/HanaJdbcTests.java new file mode 100644 index 00000000..6c8088ae --- /dev/null +++ b/java-cfenv-jdbc/src/test/java/io/pivotal/cfenv/jdbc/HanaJdbcTests.java @@ -0,0 +1,61 @@ +package io.pivotal.cfenv.jdbc; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.Test; + +class HanaJdbcTests extends AbstractJdbcTests { + + @Test + public void hanaOnSapBtpServiceCreation() { + String name1 = "database-1"; + String name2 = "database-2"; + + mockVcapServices( + getServicesPayload(getHanaServicePayload("hanadb-1", hostname, port, username, password, name1), + getHanaServicePayload("hanadb-2", hostname, port, username, password, name2))); + + assertJdbcServiceValues(name1, name2); + + CfJdbcEnv cfJdbcEnv = new CfJdbcEnv(); + CfJdbcService cfJdbcService = cfJdbcEnv.findJdbcServiceByName("hanadb-1"); + assertThat(cfJdbcService.getUsername()).isEqualTo(username); + assertThat(cfJdbcService.getPassword()).isEqualTo(password); + assertThat(cfJdbcService.getDriverClassName()).isEqualTo("com.sap.db.jdbc.Driver"); + } + + // Utility methods + + private void assertJdbcServiceValues(String name1, String name2) { + CfJdbcEnv cfJdbcEnv = new CfJdbcEnv(); + + CfJdbcService hanaService1 = cfJdbcEnv.findJdbcServiceByName("hanadb-1"); + CfJdbcService hanaService2 = cfJdbcEnv.findJdbcServiceByName("hanadb-2"); + + assertThat(getExpectedJdbcUrl("hana", name1)).isEqualTo(hanaService1.getJdbcUrl()); + assertThat(getExpectedJdbcUrl("hana", name2)).isEqualTo(hanaService2.getJdbcUrl()); + + List cfJdbcServices = cfJdbcEnv.findJdbcServices(); + assertThat(cfJdbcServices.size()).isEqualTo(2); + + assertThatThrownBy(() -> cfJdbcEnv.findJdbcService().getJdbcUrl()).isInstanceOf(IllegalArgumentException.class) + .hasMessage("No unique database service found. Found database service names [hanadb-1, hanadb-2]"); + + assertThat(hanaService1.getDriverClassName()).isEqualTo("com.sap.db.jdbc.Driver"); + assertThat(hanaService2.getDriverClassName()).isEqualTo("com.sap.db.jdbc.Driver"); + + } + + private String getHanaServicePayload(String serviceName, String hostname, int port, String user, String password, + String name) { + return getTemplatedPayload("test-hana-btp-info.json", serviceName, hostname, port, user, password, name); + } + + @Override + protected String getExpectedJdbcUrl(String databaseType, String name) { + return "jdbc:sap://%s:%s?encrypt=true&validateCertificate=true¤tschema=%s".formatted(hostname, port, + username); + } +} diff --git a/java-cfenv-jdbc/src/test/resources/io/pivotal/cfenv/jdbc/test-hana-btp-info.json b/java-cfenv-jdbc/src/test/resources/io/pivotal/cfenv/jdbc/test-hana-btp-info.json new file mode 100644 index 00000000..181ad740 --- /dev/null +++ b/java-cfenv-jdbc/src/test/resources/io/pivotal/cfenv/jdbc/test-hana-btp-info.json @@ -0,0 +1,27 @@ +{ + "label": "hana", + "provider": null, + "plan": "hdi-shared", + "name": "$serviceName", + "tags": [ + "hana", + "database", + "relational" + ], + "instance_name": "$serviceName", + "credentials": { + "database_id": "REDACTED", + "host": "$hostname", + "port": "$port", + "driver": "com.sap.db.jdbc.Driver", + "url": "jdbc:sap://$hostname:$port?encrypt=true&validateCertificate=true¤tschema=$user", + "schema": "$user", + "certificate": "REDACTED", + "hdi_user": "REDACTED", + "hdi_password": "REDACTED", + "user": "$user", + "password": "$password" + }, + "syslog_drain_url": null, + "volume_mounts": [] +}