diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java index 378915e20f..29b0f4155e 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java @@ -472,6 +472,7 @@ public class DatasetSQLBotManage { } else { config_json = EncryptUtils.aesDecrypt(dsConfig.toString()).toString(); config = JsonUtil.parseObject(config_json, Configuration.class); + config.convertJdbcUrl(); } DataSQLBotAssistantVO vo = new DataSQLBotAssistantVO(); vo.setDataBase(config.getDataBase()); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java index bf1e4dd08e..3f2cb7ee76 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Component; import java.net.URLDecoder; import java.util.Arrays; import java.util.List; +import java.util.regex.Pattern; @Data @Component("impala") @@ -60,4 +61,28 @@ public class Impala extends DatasourceConfiguration { } return jdbcUrl; } + + private static final Pattern DB_NAME_PATTERN = Pattern.compile("//[^/]+/([^?;]+)"); + + @Override + protected Pattern getDatabasePattern() { + return DB_NAME_PATTERN; + } + + + @Override + protected void parseParameters(String jdbcUrl) { + if (jdbcUrl.contains(";")) { + String[] parts = jdbcUrl.split(";"); + for (int i = 1; i < parts.length; i++) { + String[] keyValue = parts[i].split("=", 2); + if (keyValue.length == 2) { + getParameters().put(keyValue[0], keyValue[1]); + } + } + if (getParameters().containsKey("AuthMech")) { + getParameters().put("authentication", getParameters().get("AuthMech")); + } + } + } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java index 0085e3eb4b..0c40aa4dcc 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java @@ -6,6 +6,9 @@ import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + @Data @Component("oracle") public class Oracle extends DatasourceConfiguration { @@ -31,4 +34,19 @@ public class Oracle extends DatasourceConfiguration { .replace("DATABASE", getDataBase().trim()); } } + + private static final Pattern SERVICE_PATTERN = Pattern.compile(":@//[^/]+/([^?]+)"); + private static final Pattern SID_PATTERN = Pattern.compile(":@[^:]+:(\\d+):([^?]+)"); + @Override + protected void convertDatabase(String jdbcUrl) { + Matcher serviceMatcher = SERVICE_PATTERN.matcher(jdbcUrl); + if (serviceMatcher.find()) { + setDataBase(serviceMatcher.group(1)); + } else { + Matcher sidMatcher = SID_PATTERN.matcher(jdbcUrl); + if (sidMatcher.find()) { + setDataBase(sidMatcher.group(2)); + } + } + } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java index 247e9b8526..7fceb12cb3 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Component; import java.net.URLDecoder; import java.util.Arrays; import java.util.List; +import java.util.regex.Pattern; @Data @Component("pg") @@ -58,4 +59,10 @@ public class Pg extends DatasourceConfiguration { } return jdbcUrl; } + + private static final Pattern DB_NAME_PATTERN = Pattern.compile("//[^/]+/([^?]+)"); + @Override + protected Pattern getDatabasePattern() { + return DB_NAME_PATTERN; + } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java index bd13baa9f8..05cfe8434b 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java @@ -9,6 +9,10 @@ import org.springframework.stereotype.Component; import java.net.URLDecoder; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import static java.awt.SystemColor.info; @Data @Component("redshift") @@ -40,4 +44,22 @@ public class Redshift extends DatasourceConfiguration { } return jdbcUrl; } + + private static final Pattern DB_NAME_PATTERN = Pattern.compile("//[^/]+/([^?]+)"); + + @Override + protected Pattern getDatabasePattern() { + return DB_NAME_PATTERN; + } + + @Override + protected void convertParameters() { + Map parameters = getParameters(); + if (parameters.containsKey("UID")) { + setUsername(parameters.get("UID")); + } + if (parameters.containsKey("PWD")) { + setPassword(parameters.get("PWD")); + } + } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java index 8fa7dff68b..26eaa6a8e1 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.List; +import java.util.regex.Pattern; @Data @Component("sqlServer") @@ -37,4 +38,11 @@ public class Sqlserver extends DatasourceConfiguration { .replace("EXTRA_PARAMS", getExtraParams().trim()); } } + + private static final Pattern DB_NAME_PATTERN = Pattern.compile(";databaseName=([^;]+)"); + + @Override + protected Pattern getDatabasePattern() { + return DB_NAME_PATTERN; + } } diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/vo/Configuration.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/vo/Configuration.java index 322d9086c7..75c720bd97 100644 --- a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/vo/Configuration.java +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/vo/Configuration.java @@ -1,6 +1,12 @@ package io.dataease.extensions.datasource.vo; import lombok.Data; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Data public class Configuration { @@ -59,4 +65,65 @@ public class Configuration { } } + protected static final Pattern HOST_PORT_PATTERN = Pattern.compile("//([^:/]+)(?::(\\d+))?"); + protected static final Pattern PARAMETERS_PATTERN = Pattern.compile("([^&=]+)=([^&]*)"); + private static final Pattern DB_NAME_PATTERN = Pattern.compile("//[^/]+/([^?]+)"); + private Map parameters; + protected void parseHostAndPort(String jdbcUrl) { + Matcher matcher = HOST_PORT_PATTERN.matcher(jdbcUrl); + if (matcher.find()) { + setHost(matcher.group(1)); + if (matcher.group(2) != null) { + setPort(Integer.parseInt(matcher.group(2))); + } + } + } + + protected void parseParameters(String jdbcUrl) { + int paramStart = jdbcUrl.indexOf('?'); + if (paramStart > 0) { + String paramString = jdbcUrl.substring(paramStart + 1); + Matcher matcher = PARAMETERS_PATTERN.matcher(paramString); + while (matcher.find()) { + parameters.put(matcher.group(1), matcher.group(2)); + } + } + } + + protected void convertParameters(){ + if (ObjectUtils.isEmpty(parameters)) { + return; + } + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (StringUtils.equalsIgnoreCase(key, "user")) { + setUsername(value); + } + if (StringUtils.equalsIgnoreCase(key, "password")) { + setPassword(value); + } + } + } + + protected void convertDatabase(String jdbcUrl) { + Matcher matcher = getDatabasePattern().matcher(jdbcUrl); + if (matcher.find()) { + setDataBase(matcher.group(1)); + } + } + + protected Pattern getDatabasePattern() { + return DB_NAME_PATTERN; + } + + public void convertJdbcUrl() { + if (StringUtils.isNotBlank(urlType) && StringUtils.equalsAnyIgnoreCase(this.urlType, "jdbcUrl")) { + parseHostAndPort(jdbcUrl); + parseParameters(jdbcUrl); + convertParameters(); + convertDatabase(jdbcUrl); + } + } + }