diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java index 46c3b89fc..124634ffd 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/utils/jdbc/JDBCUtils.java @@ -1,5 +1,10 @@ package com.iqser.red.service.persistence.management.v1.processor.utils.jdbc; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + import com.iqser.red.service.persistence.management.v1.processor.multitenancy.entity.DatabaseConnectionEntity; import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.DatabaseConnection; @@ -8,75 +13,98 @@ import lombok.experimental.UtilityClass; @UtilityClass public class JDBCUtils { + public String buildJdbcUrl(DatabaseConnectionEntity databaseConnectionEntity) { - public String buildJdbcUrl(DatabaseConnectionEntity databaseConnectionEntity){ - StringBuilder sb = new StringBuilder("jdbc:") - .append(databaseConnectionEntity.getDriver()) - .append("://") - .append(databaseConnectionEntity.getHost()) - .append(':') - .append(databaseConnectionEntity.getPort()) - .append('/') - .append(databaseConnectionEntity.getDatabase()); + StringBuilder sb = createJdbcConnectionStringBuilder(databaseConnectionEntity.getDriver(), + databaseConnectionEntity.getHost(), + databaseConnectionEntity.getPort(), + databaseConnectionEntity.getDatabase()); - if(databaseConnectionEntity.getParams() != null) { - sb.append('?'); - databaseConnectionEntity.getParams().forEach((k, v) -> sb.append('&').append(k).append(v)); - } + Map params = getConnectionParameters(databaseConnectionEntity); + appendParams(sb, params); return sb.toString(); } - public String buildJdbcUrl(DatabaseConnection databaseConnection){ - StringBuilder sb = new StringBuilder("jdbc:") - .append(databaseConnection.getDriver()) - .append("://") - .append(databaseConnection.getHost()) - .append(':') - .append(databaseConnection.getPort()) - .append('/') - .append(databaseConnection.getDatabase()); - if(databaseConnection.getParams() != null) { - sb.append('?'); - databaseConnection.getParams().forEach((k, v) -> sb.append('&').append(k).append(v)); - } + private StringBuilder createJdbcConnectionStringBuilder(String driver, String host, String port, String database) { + + return new StringBuilder("jdbc:").append(driver).append("://").append(host).append(':').append(port).append('/').append(database); + } + + + private Map getConnectionParameters(DatabaseConnectionEntity databaseConnectionEntity) { + + var paramsMap = Optional.ofNullable(databaseConnectionEntity.getParams()); + return getParamsWithDefaults(paramsMap); + } + + + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + private Map getParamsWithDefaults(Optional> paramsMap) { + + Map params = paramsMap.orElseGet(HashMap::new); + params.put("reWriteBatchedInserts", "true"); + return params; + } + + + public String buildJdbcUrl(DatabaseConnection databaseConnection) { + + StringBuilder sb = createJdbcConnectionStringBuilder(databaseConnection.getDriver(), + databaseConnection.getHost(), + databaseConnection.getPort(), + databaseConnection.getDatabase()); + Map params = getConnectionParameters(databaseConnection); + appendParams(sb, params); return sb.toString(); } - public String buildJdbcUrlWithSchema(DatabaseConnection databaseConnection){ - StringBuilder sb = new StringBuilder("jdbc:") - .append(databaseConnection.getDriver()) - .append("://") - .append(databaseConnection.getHost()) - .append(':') - .append(databaseConnection.getPort()) - .append('/') - .append(databaseConnection.getDatabase()) - .append('?') - .append("currentSchema=") - .append(databaseConnection.getSchema()); - if(databaseConnection.getParams() != null) { - databaseConnection.getParams().forEach((k, v) -> sb.append('&').append(k).append(v)); + private void appendParams(StringBuilder sb, Map params) { + + if (!params.isEmpty()) { + sb.append("?"); + List paramsAsStrings = params.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).toList(); + sb.append(String.join("&", paramsAsStrings)); } + } + + + public String buildJdbcUrlWithSchema(DatabaseConnection databaseConnection) { + + return createJdbcConnectionString(databaseConnection.getDriver(), + databaseConnection.getHost(), + databaseConnection.getPort(), + databaseConnection.getDatabase(), + databaseConnection.getSchema(), + getConnectionParameters(databaseConnection)); + } + + + private static String createJdbcConnectionString(String driver, String host, String port, String database, String schema, Map connectionParameters) { + + StringBuilder sb = createJdbcConnectionStringBuilder(driver, host, port, database); + connectionParameters.put("currentSchema", schema); + appendParams(sb, connectionParameters); return sb.toString(); } - public String buildJdbcUrlWithSchema(DatabaseConnectionEntity databaseConnection){ - StringBuilder sb = new StringBuilder("jdbc:") - .append(databaseConnection.getDriver()) - .append("://") - .append(databaseConnection.getHost()) - .append(':') - .append(databaseConnection.getPort()) - .append('/') - .append(databaseConnection.getDatabase()) - .append('?') - .append("currentSchema=") - .append(databaseConnection.getSchema()); - if(databaseConnection.getParams() != null) { - databaseConnection.getParams().forEach((k, v) -> sb.append('&').append(k).append(v)); - } - return sb.toString(); + + private Map getConnectionParameters(DatabaseConnection databaseConnection) { + + var params = Optional.ofNullable(databaseConnection.getParams()); + return getParamsWithDefaults(params); } + + + public String buildJdbcUrlWithSchema(DatabaseConnectionEntity databaseConnection) { + + return createJdbcConnectionString(databaseConnection.getDriver(), + databaseConnection.getHost(), + databaseConnection.getPort(), + databaseConnection.getDatabase(), + databaseConnection.getSchema(), + getConnectionParameters(databaseConnection)); + } + }