This is an automated email from the ASF dual-hosted git repository. zhongjiajie pushed a commit to branch 3.0.4-prepare in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
commit 750cf62641483c28d388c7052370e9670abe3927 Author: Wenjun Ruan <[email protected]> AuthorDate: Mon Dec 12 11:46:40 2022 +0800 Fix datasource jdbc url param doesn't work (#13098) (cherry picked from commit ab96a3d0) --- .../api/service/DataSourceServiceTest.java | 39 ++++++---- .../datasource/AbstractDataSourceProcessor.java | 14 ++++ .../clickhouse/ClickHouseDataSourceProcessor.java | 29 +++----- .../api/datasource/db2/Db2DataSourceProcessor.java | 30 +++----- .../datasource/hive/HiveDataSourceProcessor.java | 59 +++------------ .../datasource/mysql/MySQLDataSourceProcessor.java | 29 +++----- .../oracle/OracleDataSourceProcessor.java | 28 ++----- .../postgresql/PostgreSQLDataSourceProcessor.java | 34 ++++----- .../presto/PrestoDataSourceProcessor.java | 22 ++---- .../redshift/RedshiftDataSourceProcessor.java | 25 ++----- .../datasource/spark/SparkDataSourceProcessor.java | 22 ++---- .../sqlserver/SQLServerDataSourceProcessor.java | 21 ++---- .../api/provider/JDBCDataSourceProvider.java | 9 ++- .../AbstractDataSourceProcessorTest.java | 72 ++++++++++++++++++ .../datasource/db2/Db2DataSourceProcessorTest.java | 7 +- .../oracle/OracleDataSourceProcessorTest.java | 9 ++- .../PostgreSQLDataSourceProcessorTest.java | 9 ++- .../presto/PrestoDataSourceProcessorTest.java | 3 +- .../redshift/RedshiftDataSourceProcessorTest.java | 12 ++- .../spark/SparkDataSourceProcessorTest.java | 3 +- .../spi/datasource/BaseConnectionParam.java | 87 +--------------------- .../plugin/task/dq/DataQualityTaskTest.java | 10 +-- 22 files changed, 236 insertions(+), 337 deletions(-) diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java index a3b07fa2d0..4f3e00f36a 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java @@ -381,21 +381,30 @@ public class DataSourceServiceTest { @Test public void buildParameterWithDecodePassword() { - PropertyUtils.setValue(Constants.DATASOURCE_ENCRYPTION_ENABLE, "true"); - Map<String, String> other = new HashMap<>(); - other.put("autoDeserialize", "yes"); - other.put("allowUrlInLocalInfile", "true"); - MySQLDataSourceParamDTO mysqlDatasourceParamDTO = new MySQLDataSourceParamDTO(); - mysqlDatasourceParamDTO.setHost("192.168.9.1"); - mysqlDatasourceParamDTO.setPort(1521); - mysqlDatasourceParamDTO.setDatabase("im"); - mysqlDatasourceParamDTO.setUserName("test"); - mysqlDatasourceParamDTO.setPassword("123456"); - mysqlDatasourceParamDTO.setOther(other); - ConnectionParam connectionParam = DataSourceUtils.buildConnectionParams(mysqlDatasourceParamDTO); - String expected = "{\"user\":\"test\",\"password\":\"IUAjJCVeJipNVEl6TkRVMg==\",\"address\":\"jdbc:mysql://192.168.9.1:1521\",\"database\":\"im\",\"jdbcUrl\":\"jdbc:mysql://192.168.9.1:1521/" - + "im\",\"driverClassName\":\"com.mysql.cj.jdbc.Driver\",\"validationQuery\":\"select 1\",\"props\":{\"autoDeserialize\":\"yes\",\"allowUrlInLocalInfile\":\"true\"}}"; - Assert.assertEquals(expected, JSONUtils.toJsonString(connectionParam)); + try (MockedStatic<PropertyUtils> mockedStaticPropertyUtils = Mockito.mockStatic(PropertyUtils.class)) { + mockedStaticPropertyUtils + .when(() -> PropertyUtils.getBoolean(DataSourceConstants.DATASOURCE_ENCRYPTION_ENABLE, false)) + .thenReturn(true); + Map<String, String> other = new HashMap<>(); + other.put("autoDeserialize", "yes"); + other.put("allowUrlInLocalInfile", "true"); + other.put("useSSL", "true"); + MySQLDataSourceParamDTO mysqlDatasourceParamDTO = new MySQLDataSourceParamDTO(); + mysqlDatasourceParamDTO.setHost("192.168.9.1"); + mysqlDatasourceParamDTO.setPort(1521); + mysqlDatasourceParamDTO.setDatabase("im"); + mysqlDatasourceParamDTO.setUserName("test"); + mysqlDatasourceParamDTO.setPassword("123456"); + mysqlDatasourceParamDTO.setOther(other); + ConnectionParam connectionParam = DataSourceUtils.buildConnectionParams(mysqlDatasourceParamDTO); + String expected = + "{\"user\":\"test\",\"password\":\"bnVsbE1USXpORFUy\",\"address\":\"jdbc:mysql://192.168.9.1:1521\"," + + + "\"database\":\"im\",\"jdbcUrl\":\"jdbc:mysql://192.168.9.1:1521/im\",\"driverClassName\":\"com.mysql.cj.jdbc.Driver\"," + + + "\"validationQuery\":\"select 1\",\"other\":{\"autoDeserialize\":\"yes\",\"allowUrlInLocalInfile\":\"true\",\"useSSL\":\"true\"}}"; + Assertions.assertEquals(expected, JSONUtils.toJsonString(connectionParam)); + } PropertyUtils.setValue(Constants.DATASOURCE_ENCRYPTION_ENABLE, "false"); mysqlDatasourceParamDTO = new MySQLDataSourceParamDTO(); diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessor.java index 04c619d955..2227062bda 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessor.java @@ -17,17 +17,23 @@ package org.apache.dolphinscheduler.plugin.datasource.api.datasource; +import org.apache.dolphinscheduler.common.utils.JSONUtils; import org.apache.dolphinscheduler.plugin.datasource.api.utils.PasswordUtils; import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam; import org.apache.dolphinscheduler.spi.datasource.ConnectionParam; import org.apache.dolphinscheduler.spi.enums.DbType; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import java.text.MessageFormat; +import java.util.Collections; import java.util.Map; import java.util.regex.Pattern; +import com.fasterxml.jackson.core.type.TypeReference; +import com.google.common.collect.Sets; + public abstract class AbstractDataSourceProcessor implements DataSourceProcessor { private static final Pattern IPV4_PATTERN = Pattern.compile("^[a-zA-Z0-9\\_\\-\\.\\,]+$"); @@ -82,6 +88,14 @@ public abstract class AbstractDataSourceProcessor implements DataSourceProcessor } } + protected Map<String, String> transformOtherParamToMap(String other) { + if (StringUtils.isBlank(other)) { + return Collections.emptyMap(); + } + return JSONUtils.parseObject(other, new TypeReference<Map<String, String>>() { + }); + } + @Override public String getDatasourceUniqueId(ConnectionParam connectionParam, DbType dbType) { BaseConnectionParam baseConnectionParam = (BaseConnectionParam) connectionParam; diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/clickhouse/ClickHouseDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/clickhouse/ClickHouseDataSourceProcessor.java index ea71d25a8d..44fed51109 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/clickhouse/ClickHouseDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/clickhouse/ClickHouseDataSourceProcessor.java @@ -31,7 +31,8 @@ import org.apache.commons.collections4.MapUtils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class ClickHouseDataSourceProcessor extends AbstractDataSourceProcessor { @@ -43,7 +44,7 @@ public class ClickHouseDataSourceProcessor extends AbstractDataSourceProcessor { ClickHouseDataSourceParamDTO clickHouseDatasourceParamDTO = new ClickHouseDataSourceParamDTO(); clickHouseDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); clickHouseDatasourceParamDTO.setUserName(connectionParams.getUser()); - clickHouseDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + clickHouseDatasourceParamDTO.setOther(connectionParams.getOther()); String[] hostSeperator = connectionParams.getAddress().split(Constants.DOUBLE_SLASH); String[] hostPortArray = hostSeperator[hostSeperator.length - 1].split(Constants.COMMA); @@ -67,8 +68,7 @@ public class ClickHouseDataSourceProcessor extends AbstractDataSourceProcessor { clickhouseConnectionParam.setPassword(PasswordUtils.encodePassword(clickHouseParam.getPassword())); clickhouseConnectionParam.setDriverClassName(getDatasourceDriver()); clickhouseConnectionParam.setValidationQuery(getValidationQuery()); - clickhouseConnectionParam.setOther(transformOther(clickHouseParam.getOther())); - clickhouseConnectionParam.setProps(clickHouseParam.getOther()); + clickhouseConnectionParam.setOther(clickHouseParam.getOther()); return clickhouseConnectionParam; } @@ -91,8 +91,8 @@ public class ClickHouseDataSourceProcessor extends AbstractDataSourceProcessor { public String getJdbcUrl(ConnectionParam connectionParam) { ClickHouseConnectionParam clickhouseConnectionParam = (ClickHouseConnectionParam) connectionParam; String jdbcUrl = clickhouseConnectionParam.getJdbcUrl(); - if (!StringUtils.isEmpty(clickhouseConnectionParam.getOther())) { - jdbcUrl = String.format("%s?%s", jdbcUrl, clickhouseConnectionParam.getOther()); + if (MapUtils.isNotEmpty(clickhouseConnectionParam.getOther())) { + jdbcUrl = String.format("%s?%s", jdbcUrl, transformOther(clickhouseConnectionParam.getOther())); } return jdbcUrl; } @@ -114,20 +114,9 @@ public class ClickHouseDataSourceProcessor extends AbstractDataSourceProcessor { if (MapUtils.isEmpty(otherMap)) { return null; } - StringBuilder stringBuilder = new StringBuilder(); - otherMap.forEach((key, value) -> stringBuilder.append(String.format("%s=%s%s", key, value, "&"))); - return stringBuilder.toString(); + List<String> otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join("&", otherList); } - private Map<String, String> parseOther(String other) { - if (other == null) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - String[] configs = other.split("&"); - for (String config : configs) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessor.java index 7e0548c71f..94356dcd56 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessor.java @@ -32,7 +32,8 @@ import org.apache.commons.collections4.MapUtils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class Db2DataSourceProcessor extends AbstractDataSourceProcessor { @@ -43,7 +44,7 @@ public class Db2DataSourceProcessor extends AbstractDataSourceProcessor { Db2DataSourceParamDTO db2DatasourceParamDTO = new Db2DataSourceParamDTO(); db2DatasourceParamDTO.setDatabase(connectionParams.getDatabase()); - db2DatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + db2DatasourceParamDTO.setOther(connectionParams.getOther()); db2DatasourceParamDTO.setUserName(db2DatasourceParamDTO.getUserName()); String[] hostSeperator = connectionParams.getAddress().split(Constants.DOUBLE_SLASH); @@ -68,8 +69,7 @@ public class Db2DataSourceProcessor extends AbstractDataSourceProcessor { db2ConnectionParam.setPassword(PasswordUtils.encodePassword(db2Param.getPassword())); db2ConnectionParam.setDriverClassName(getDatasourceDriver()); db2ConnectionParam.setValidationQuery(getValidationQuery()); - db2ConnectionParam.setOther(transformOther(db2Param.getOther())); - db2ConnectionParam.setProps(db2Param.getOther()); + db2ConnectionParam.setOther(db2Param.getOther()); return db2ConnectionParam; } @@ -87,8 +87,9 @@ public class Db2DataSourceProcessor extends AbstractDataSourceProcessor { @Override public String getJdbcUrl(ConnectionParam connectionParam) { Db2ConnectionParam db2ConnectionParam = (Db2ConnectionParam) connectionParam; - if (!StringUtils.isEmpty(db2ConnectionParam.getOther())) { - return String.format("%s;%s", db2ConnectionParam.getJdbcUrl(), db2ConnectionParam.getOther()); + if (MapUtils.isNotEmpty(db2ConnectionParam.getOther())) { + return String.format("%s;%s", db2ConnectionParam.getJdbcUrl(), + transformOther(db2ConnectionParam.getOther())); } return db2ConnectionParam.getJdbcUrl(); } @@ -115,20 +116,9 @@ public class Db2DataSourceProcessor extends AbstractDataSourceProcessor { if (MapUtils.isEmpty(otherMap)) { return null; } - StringBuilder stringBuilder = new StringBuilder(); - otherMap.forEach((key, value) -> stringBuilder.append(String.format("%s=%s%s", key, value, ";"))); - stringBuilder.deleteCharAt(stringBuilder.length() - 1); - return stringBuilder.toString(); + List<String> otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join(";", otherList); } - private Map<String, String> parseOther(String other) { - if (other == null) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - for (String config : other.split("&")) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/hive/HiveDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/hive/HiveDataSourceProcessor.java index 898ceb39aa..9362f89c23 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/hive/HiveDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/hive/HiveDataSourceProcessor.java @@ -34,7 +34,8 @@ import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class HiveDataSourceProcessor extends AbstractDataSourceProcessor { @@ -46,7 +47,7 @@ public class HiveDataSourceProcessor extends AbstractDataSourceProcessor { hiveDataSourceParamDTO.setDatabase(hiveConnectionParam.getDatabase()); hiveDataSourceParamDTO.setUserName(hiveConnectionParam.getUser()); - hiveDataSourceParamDTO.setOther(parseOther(hiveConnectionParam.getOther())); + hiveDataSourceParamDTO.setOther(hiveConnectionParam.getOther()); hiveDataSourceParamDTO.setLoginUserKeytabUsername(hiveConnectionParam.getLoginUserKeytabUsername()); hiveDataSourceParamDTO.setLoginUserKeytabPath(hiveConnectionParam.getLoginUserKeytabPath()); hiveDataSourceParamDTO.setJavaSecurityKrb5Conf(hiveConnectionParam.getJavaSecurityKrb5Conf()); @@ -90,8 +91,7 @@ public class HiveDataSourceProcessor extends AbstractDataSourceProcessor { hiveConnectionParam.setLoginUserKeytabPath(hiveParam.getLoginUserKeytabPath()); hiveConnectionParam.setLoginUserKeytabUsername(hiveParam.getLoginUserKeytabUsername()); } - hiveConnectionParam.setOther(transformOther(hiveParam.getOther())); - hiveConnectionParam.setProps(hiveParam.getOther()); + hiveConnectionParam.setOther(hiveParam.getOther()); return hiveConnectionParam; } @@ -114,11 +114,10 @@ public class HiveDataSourceProcessor extends AbstractDataSourceProcessor { public String getJdbcUrl(ConnectionParam connectionParam) { HiveConnectionParam hiveConnectionParam = (HiveConnectionParam) connectionParam; String jdbcUrl = hiveConnectionParam.getJdbcUrl(); - String otherParams = filterOther(hiveConnectionParam.getOther()); - if (StringUtils.isNotEmpty(otherParams) && !"?".equals(otherParams.substring(0, 1))) { - jdbcUrl += ";"; + if (MapUtils.isNotEmpty(hiveConnectionParam.getOther())) { + return jdbcUrl + "?" + transformOther(hiveConnectionParam.getOther()); } - return jdbcUrl + otherParams; + return jdbcUrl; } @Override @@ -140,47 +139,9 @@ public class HiveDataSourceProcessor extends AbstractDataSourceProcessor { if (MapUtils.isEmpty(otherMap)) { return null; } - StringBuilder stringBuilder = new StringBuilder(); - otherMap.forEach((key, value) -> stringBuilder.append(String.format("%s=%s;", key, value))); - return stringBuilder.toString(); + List<String> otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join(";", otherList); } - private String filterOther(String otherParams) { - if (StringUtils.isBlank(otherParams)) { - return ""; - } - - StringBuilder hiveConfListSb = new StringBuilder(); - hiveConfListSb.append("?"); - StringBuilder sessionVarListSb = new StringBuilder(); - - String[] otherArray = otherParams.split(";", -1); - - for (String conf : otherArray) { - sessionVarListSb.append(conf).append(";"); - } - - // remove the last ";" - if (sessionVarListSb.length() > 0) { - sessionVarListSb.deleteCharAt(sessionVarListSb.length() - 1); - } - - if (hiveConfListSb.length() > 0) { - hiveConfListSb.deleteCharAt(hiveConfListSb.length() - 1); - } - - return sessionVarListSb.toString() + hiveConfListSb.toString(); - } - - private Map<String, String> parseOther(String other) { - if (other == null) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - String[] configs = other.split(";"); - for (String config : configs) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/mysql/MySQLDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/mysql/MySQLDataSourceProcessor.java index a0c5347a7c..fb6f29ed77 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/mysql/MySQLDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/mysql/MySQLDataSourceProcessor.java @@ -32,8 +32,9 @@ import org.apache.commons.collections4.MapUtils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import org.slf4j.Logger; @@ -60,7 +61,7 @@ public class MySQLDataSourceProcessor extends AbstractDataSourceProcessor { mysqlDatasourceParamDTO.setUserName(connectionParams.getUser()); mysqlDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); - mysqlDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + mysqlDatasourceParamDTO.setOther(connectionParams.getOther()); String address = connectionParams.getAddress(); String[] hostSeperator = address.split(Constants.DOUBLE_SLASH); @@ -85,8 +86,7 @@ public class MySQLDataSourceProcessor extends AbstractDataSourceProcessor { mysqlConnectionParam.setPassword(PasswordUtils.encodePassword(mysqlDatasourceParam.getPassword())); mysqlConnectionParam.setDriverClassName(getDatasourceDriver()); mysqlConnectionParam.setValidationQuery(getValidationQuery()); - mysqlConnectionParam.setOther(transformOther(mysqlDatasourceParam.getOther())); - mysqlConnectionParam.setProps(mysqlDatasourceParam.getOther()); + mysqlConnectionParam.setOther(mysqlDatasourceParam.getOther()); return mysqlConnectionParam; } @@ -110,8 +110,8 @@ public class MySQLDataSourceProcessor extends AbstractDataSourceProcessor { public String getJdbcUrl(ConnectionParam connectionParam) { MySQLConnectionParam mysqlConnectionParam = (MySQLConnectionParam) connectionParam; String jdbcUrl = mysqlConnectionParam.getJdbcUrl(); - if (!StringUtils.isEmpty(mysqlConnectionParam.getOther())) { - return String.format("%s?%s&%s", jdbcUrl, mysqlConnectionParam.getOther(), APPEND_PARAMS); + if (MapUtils.isNotEmpty(mysqlConnectionParam.getOther())) { + return String.format("%s?%s&%s", jdbcUrl, transformOther(mysqlConnectionParam.getOther()), APPEND_PARAMS); } return String.format("%s?%s", jdbcUrl, APPEND_PARAMS); } @@ -152,9 +152,9 @@ public class MySQLDataSourceProcessor extends AbstractDataSourceProcessor { if (MapUtils.isEmpty(otherMap)) { return null; } - StringBuilder stringBuilder = new StringBuilder(); - otherMap.forEach((key, value) -> stringBuilder.append(String.format("%s=%s&", key, value))); - return stringBuilder.toString(); + List<String> otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join("&", otherList); } private static boolean checkKeyIsLegitimate(String key) { @@ -164,15 +164,4 @@ public class MySQLDataSourceProcessor extends AbstractDataSourceProcessor { && !key.contains(ALLOW_URL_IN_LOCAL_IN_FILE_NAME); } - private Map<String, String> parseOther(String other) { - if (StringUtils.isEmpty(other)) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - for (String config : other.split("&")) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } - } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessor.java index 44c4ab8a46..9a3ad3ace2 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessor.java @@ -34,7 +34,6 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -47,7 +46,7 @@ public class OracleDataSourceProcessor extends AbstractDataSourceProcessor { oracleDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); oracleDatasourceParamDTO.setUserName(connectionParams.getUser()); - oracleDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + oracleDatasourceParamDTO.setOther(connectionParams.getOther()); String hostSeperator = Constants.DOUBLE_SLASH; if (DbConnectType.ORACLE_SID.equals(connectionParams.connectType)) { @@ -85,8 +84,7 @@ public class OracleDataSourceProcessor extends AbstractDataSourceProcessor { oracleConnectionParam.setConnectType(oracleParam.getConnectType()); oracleConnectionParam.setDriverClassName(getDatasourceDriver()); oracleConnectionParam.setValidationQuery(getValidationQuery()); - oracleConnectionParam.setOther(transformOther(oracleParam.getOther())); - oracleConnectionParam.setProps(oracleParam.getOther()); + oracleConnectionParam.setOther(oracleParam.getOther()); return oracleConnectionParam; } @@ -109,8 +107,9 @@ public class OracleDataSourceProcessor extends AbstractDataSourceProcessor { @Override public String getJdbcUrl(ConnectionParam connectionParam) { OracleConnectionParam oracleConnectionParam = (OracleConnectionParam) connectionParam; - if (!StringUtils.isEmpty(oracleConnectionParam.getOther())) { - return String.format("%s?%s", oracleConnectionParam.getJdbcUrl(), oracleConnectionParam.getOther()); + if (MapUtils.isNotEmpty(oracleConnectionParam.getOther())) { + return String.format("%s?%s", oracleConnectionParam.getJdbcUrl(), + transformOther(oracleConnectionParam.getOther())); } return oracleConnectionParam.getJdbcUrl(); } @@ -132,20 +131,9 @@ public class OracleDataSourceProcessor extends AbstractDataSourceProcessor { if (MapUtils.isEmpty(otherMap)) { return null; } - List<String> list = new ArrayList<>(); - otherMap.forEach((key, value) -> list.add(String.format("%s=%s", key, value))); - return String.join("&", list); + List<String> otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join("&", otherList); } - private Map<String, String> parseOther(String other) { - if (StringUtils.isEmpty(other)) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - String[] configs = other.split("&"); - for (String config : configs) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessor.java index f14302f1e7..038ada68f1 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessor.java @@ -32,9 +32,14 @@ import org.apache.commons.lang.StringUtils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import com.google.auto.service.AutoService; +import com.google.common.base.Strings; + +@AutoService(DataSourceProcessor.class) public class PostgreSQLDataSourceProcessor extends AbstractDataSourceProcessor { @Override @@ -43,7 +48,7 @@ public class PostgreSQLDataSourceProcessor extends AbstractDataSourceProcessor { PostgreSQLDataSourceParamDTO postgreSqlDatasourceParamDTO = new PostgreSQLDataSourceParamDTO(); postgreSqlDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); postgreSqlDatasourceParamDTO.setUserName(connectionParams.getUser()); - postgreSqlDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + postgreSqlDatasourceParamDTO.setOther(connectionParams.getOther()); String address = connectionParams.getAddress(); String[] hostSeperator = address.split(Constants.DOUBLE_SLASH); @@ -68,8 +73,7 @@ public class PostgreSQLDataSourceProcessor extends AbstractDataSourceProcessor { postgreSqlConnectionParam.setPassword(PasswordUtils.encodePassword(postgreSqlParam.getPassword())); postgreSqlConnectionParam.setDriverClassName(getDatasourceDriver()); postgreSqlConnectionParam.setValidationQuery(getValidationQuery()); - postgreSqlConnectionParam.setOther(transformOther(postgreSqlParam.getOther())); - postgreSqlConnectionParam.setProps(postgreSqlParam.getOther()); + postgreSqlConnectionParam.setOther(postgreSqlParam.getOther()); return postgreSqlConnectionParam; } @@ -92,8 +96,9 @@ public class PostgreSQLDataSourceProcessor extends AbstractDataSourceProcessor { @Override public String getJdbcUrl(ConnectionParam connectionParam) { PostgreSQLConnectionParam postgreSqlConnectionParam = (PostgreSQLConnectionParam) connectionParam; - if (!StringUtils.isEmpty(postgreSqlConnectionParam.getOther())) { - return String.format("%s?%s", postgreSqlConnectionParam.getJdbcUrl(), postgreSqlConnectionParam.getOther()); + if (MapUtils.isNotEmpty(postgreSqlConnectionParam.getOther())) { + return String.format("%s?%s", postgreSqlConnectionParam.getJdbcUrl(), + transformOther(postgreSqlConnectionParam.getOther())); } return postgreSqlConnectionParam.getJdbcUrl(); } @@ -115,20 +120,9 @@ public class PostgreSQLDataSourceProcessor extends AbstractDataSourceProcessor { if (MapUtils.isEmpty(otherMap)) { return null; } - StringBuilder stringBuilder = new StringBuilder(); - otherMap.forEach((key, value) -> stringBuilder.append(String.format("%s=%s&", key, value))); - return stringBuilder.toString(); + List<String> otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join("&", otherList); } - private Map<String, String> parseOther(String other) { - if (StringUtils.isEmpty(other)) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - for (String config : other.split("&")) { - String[] split = config.split("="); - otherMap.put(split[0], split[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessor.java index 8fe1a7231c..fb1e6f3189 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessor.java @@ -33,7 +33,6 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -51,7 +50,7 @@ public class PrestoDataSourceProcessor extends AbstractDataSourceProcessor { prestoDatasourceParamDTO.setHost(hostPortArray[0].split(Constants.COLON)[0]); prestoDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); prestoDatasourceParamDTO.setUserName(connectionParams.getUser()); - prestoDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + prestoDatasourceParamDTO.setOther(connectionParams.getOther()); return prestoDatasourceParamDTO; } @@ -65,13 +64,12 @@ public class PrestoDataSourceProcessor extends AbstractDataSourceProcessor { PrestoConnectionParam prestoConnectionParam = new PrestoConnectionParam(); prestoConnectionParam.setUser(prestoParam.getUserName()); prestoConnectionParam.setPassword(PasswordUtils.encodePassword(prestoParam.getPassword())); - prestoConnectionParam.setOther(transformOther(prestoParam.getOther())); + prestoConnectionParam.setOther(prestoParam.getOther()); prestoConnectionParam.setAddress(address); prestoConnectionParam.setJdbcUrl(jdbcUrl); prestoConnectionParam.setDatabase(prestoParam.getDatabase()); prestoConnectionParam.setDriverClassName(getDatasourceDriver()); prestoConnectionParam.setValidationQuery(getValidationQuery()); - prestoConnectionParam.setProps(prestoParam.getOther()); return prestoConnectionParam; } @@ -94,8 +92,9 @@ public class PrestoDataSourceProcessor extends AbstractDataSourceProcessor { @Override public String getJdbcUrl(ConnectionParam connectionParam) { PrestoConnectionParam prestoConnectionParam = (PrestoConnectionParam) connectionParam; - if (!StringUtils.isEmpty(prestoConnectionParam.getOther())) { - return String.format("%s?%s", prestoConnectionParam.getJdbcUrl(), prestoConnectionParam.getOther()); + if (MapUtils.isNotEmpty(prestoConnectionParam.getOther())) { + return String.format("%s?%s", prestoConnectionParam.getJdbcUrl(), + transformOther(prestoConnectionParam.getOther())); } return prestoConnectionParam.getJdbcUrl(); } @@ -122,15 +121,4 @@ public class PrestoDataSourceProcessor extends AbstractDataSourceProcessor { return null; } - private Map<String, String> parseOther(String other) { - if (StringUtils.isEmpty(other)) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - String[] configs = other.split("&"); - for (String config : configs) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessor.java index 5a9c521fce..0ae5cf2476 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessor.java @@ -33,7 +33,6 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -53,7 +52,7 @@ public class RedshiftDataSourceProcessor extends AbstractDataSourceProcessor { redshiftDatasourceParamDTO.setHost(hostPortArray[0].split(Constants.COLON)[0]); redshiftDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); redshiftDatasourceParamDTO.setUserName(connectionParams.getUser()); - redshiftDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + redshiftDatasourceParamDTO.setOther(connectionParams.getOther()); return redshiftDatasourceParamDTO; } @@ -68,13 +67,12 @@ public class RedshiftDataSourceProcessor extends AbstractDataSourceProcessor { redshiftConnectionParam = new RedshiftConnectionParam(); redshiftConnectionParam.setUser(redshiftParam.getUserName()); redshiftConnectionParam.setPassword(PasswordUtils.encodePassword(redshiftParam.getPassword())); - redshiftConnectionParam.setOther(transformOther(redshiftParam.getOther())); + redshiftConnectionParam.setOther(redshiftParam.getOther()); redshiftConnectionParam.setAddress(address); redshiftConnectionParam.setJdbcUrl(jdbcUrl); redshiftConnectionParam.setDatabase(redshiftParam.getDatabase()); redshiftConnectionParam.setDriverClassName(getDatasourceDriver()); redshiftConnectionParam.setValidationQuery(getValidationQuery()); - redshiftConnectionParam.setProps(redshiftParam.getOther()); return redshiftConnectionParam; } @@ -96,10 +94,10 @@ public class RedshiftDataSourceProcessor extends AbstractDataSourceProcessor { @Override public String getJdbcUrl(ConnectionParam connectionParam) { - RedshiftConnectionParam - redshiftConnectionParam = (RedshiftConnectionParam) connectionParam; - if (!StringUtils.isEmpty(redshiftConnectionParam.getOther())) { - return String.format("%s?%s", redshiftConnectionParam.getJdbcUrl(), redshiftConnectionParam.getOther()); + RedshiftConnectionParam redshiftConnectionParam = (RedshiftConnectionParam) connectionParam; + if (MapUtils.isNotEmpty(redshiftConnectionParam.getOther())) { + return String.format("%s?%s", redshiftConnectionParam.getJdbcUrl(), + transformOther(redshiftConnectionParam.getOther())); } return redshiftConnectionParam.getJdbcUrl(); } @@ -126,15 +124,4 @@ public class RedshiftDataSourceProcessor extends AbstractDataSourceProcessor { return null; } - private Map<String, String> parseOther(String other) { - Map<String, String> otherMap = new LinkedHashMap<>(); - if (StringUtils.isEmpty(other)) { - return otherMap; - } - String[] configs = other.split(Constants.SEMICOLON); - for (String config : configs) { - otherMap.put(config.split(Constants.EQUAL_SIGN)[0], config.split(Constants.EQUAL_SIGN)[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessor.java index 69fcd4ff24..ef0078ff20 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessor.java @@ -35,7 +35,6 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -49,7 +48,7 @@ public class SparkDataSourceProcessor extends AbstractDataSourceProcessor { SparkDataSourceParamDTO sparkDatasourceParamDTO = new SparkDataSourceParamDTO(); sparkDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); sparkDatasourceParamDTO.setUserName(connectionParams.getUser()); - sparkDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + sparkDatasourceParamDTO.setOther(connectionParams.getOther()); sparkDatasourceParamDTO.setJavaSecurityKrb5Conf(connectionParams.getJavaSecurityKrb5Conf()); sparkDatasourceParamDTO.setLoginUserKeytabPath(connectionParams.getLoginUserKeytabPath()); sparkDatasourceParamDTO.setLoginUserKeytabUsername(connectionParams.getLoginUserKeytabUsername()); @@ -81,13 +80,12 @@ public class SparkDataSourceProcessor extends AbstractDataSourceProcessor { SparkConnectionParam sparkConnectionParam = new SparkConnectionParam(); sparkConnectionParam.setPassword(PasswordUtils.encodePassword(sparkDatasourceParam.getPassword())); sparkConnectionParam.setUser(sparkDatasourceParam.getUserName()); - sparkConnectionParam.setOther(transformOther(sparkDatasourceParam.getOther())); + sparkConnectionParam.setOther(sparkDatasourceParam.getOther()); sparkConnectionParam.setDatabase(sparkDatasourceParam.getDatabase()); sparkConnectionParam.setAddress(address.toString()); sparkConnectionParam.setJdbcUrl(jdbcUrl); sparkConnectionParam.setDriverClassName(getDatasourceDriver()); sparkConnectionParam.setValidationQuery(getValidationQuery()); - sparkConnectionParam.setProps(sparkDatasourceParam.getOther()); if (CommonUtils.getKerberosStartupState()) { sparkConnectionParam.setPrincipal(sparkDatasourceParam.getPrincipal()); @@ -117,8 +115,9 @@ public class SparkDataSourceProcessor extends AbstractDataSourceProcessor { @Override public String getJdbcUrl(ConnectionParam connectionParam) { SparkConnectionParam sparkConnectionParam = (SparkConnectionParam) connectionParam; - if (!StringUtils.isEmpty(sparkConnectionParam.getOther())) { - return String.format("%s;%s", sparkConnectionParam.getJdbcUrl(), sparkConnectionParam.getOther()); + if (MapUtils.isNotEmpty(sparkConnectionParam.getOther())) { + return String.format("%s;%s", sparkConnectionParam.getJdbcUrl(), + transformOther(sparkConnectionParam.getOther())); } return sparkConnectionParam.getJdbcUrl(); } @@ -147,15 +146,4 @@ public class SparkDataSourceProcessor extends AbstractDataSourceProcessor { return String.join(";", stringBuilder); } - private Map<String, String> parseOther(String other) { - if (StringUtils.isEmpty(other)) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - String[] configs = other.split(";"); - for (String config : configs) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/sqlserver/SQLServerDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/sqlserver/SQLServerDataSourceProcessor.java index 44855d1fb6..678e006099 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/sqlserver/SQLServerDataSourceProcessor.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/sqlserver/SQLServerDataSourceProcessor.java @@ -32,7 +32,6 @@ import org.apache.commons.lang.StringUtils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.LinkedHashMap; import java.util.Map; public class SQLServerDataSourceProcessor extends AbstractDataSourceProcessor { @@ -46,7 +45,7 @@ public class SQLServerDataSourceProcessor extends AbstractDataSourceProcessor { SQLServerDataSourceParamDTO sqlServerDatasourceParamDTO = new SQLServerDataSourceParamDTO(); sqlServerDatasourceParamDTO.setDatabase(connectionParams.getDatabase()); sqlServerDatasourceParamDTO.setUserName(connectionParams.getUser()); - sqlServerDatasourceParamDTO.setOther(parseOther(connectionParams.getOther())); + sqlServerDatasourceParamDTO.setOther(connectionParams.getOther()); sqlServerDatasourceParamDTO.setPort(Integer.parseInt(hostPortArray[0].split(Constants.COLON)[1])); sqlServerDatasourceParamDTO.setHost(hostPortArray[0].split(Constants.COLON)[0]); return sqlServerDatasourceParamDTO; @@ -62,12 +61,11 @@ public class SQLServerDataSourceProcessor extends AbstractDataSourceProcessor { sqlServerConnectionParam.setAddress(address); sqlServerConnectionParam.setDatabase(sqlServerParam.getDatabase()); sqlServerConnectionParam.setJdbcUrl(jdbcUrl); - sqlServerConnectionParam.setOther(transformOther(sqlServerParam.getOther())); + sqlServerConnectionParam.setOther(sqlServerParam.getOther()); sqlServerConnectionParam.setUser(sqlServerParam.getUserName()); sqlServerConnectionParam.setPassword(PasswordUtils.encodePassword(sqlServerParam.getPassword())); sqlServerConnectionParam.setDriverClassName(getDatasourceDriver()); sqlServerConnectionParam.setValidationQuery(getValidationQuery()); - sqlServerConnectionParam.setProps(sqlServerParam.getOther()); return sqlServerConnectionParam; } @@ -90,8 +88,9 @@ public class SQLServerDataSourceProcessor extends AbstractDataSourceProcessor { public String getJdbcUrl(ConnectionParam connectionParam) { SQLServerConnectionParam sqlServerConnectionParam = (SQLServerConnectionParam) connectionParam; - if (!StringUtils.isEmpty(sqlServerConnectionParam.getOther())) { - return String.format("%s;%s", sqlServerConnectionParam.getJdbcUrl(), sqlServerConnectionParam.getOther()); + if (MapUtils.isNotEmpty(sqlServerConnectionParam.getOther())) { + return String.format("%s;%s", sqlServerConnectionParam.getJdbcUrl(), + transformOther(sqlServerConnectionParam.getOther())); } return sqlServerConnectionParam.getJdbcUrl(); } @@ -118,14 +117,4 @@ public class SQLServerDataSourceProcessor extends AbstractDataSourceProcessor { return stringBuilder.toString(); } - private Map<String, String> parseOther(String other) { - if (StringUtils.isEmpty(other)) { - return null; - } - Map<String, String> otherMap = new LinkedHashMap<>(); - for (String config : other.split(";")) { - otherMap.put(config.split("=")[0], config.split("=")[1]); - } - return otherMap; - } } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/provider/JDBCDataSourceProvider.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/provider/JDBCDataSourceProvider.java index ef5db82cef..5b4ce6008d 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/provider/JDBCDataSourceProvider.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/provider/JDBCDataSourceProvider.java @@ -24,6 +24,7 @@ import org.apache.dolphinscheduler.spi.enums.DbType; import org.apache.dolphinscheduler.spi.utils.Constants; import org.apache.dolphinscheduler.spi.utils.PropertyUtils; import org.apache.dolphinscheduler.spi.utils.StringUtils; +import org.apache.commons.collections4.MapUtils; import java.sql.Driver; @@ -56,8 +57,8 @@ public class JDBCDataSourceProvider { dataSource.setMaximumPoolSize(PropertyUtils.getInt(Constants.SPRING_DATASOURCE_MAX_ACTIVE, 50)); dataSource.setConnectionTestQuery(properties.getValidationQuery()); - if (properties.getProps() != null) { - properties.getProps().forEach(dataSource::addDataSourceProperty); + if (MapUtils.isNotEmpty(properties.getOther())) { + properties.getOther().forEach(dataSource::addDataSourceProperty); } logger.info("Creating HikariDataSource pool success."); @@ -82,8 +83,8 @@ public class JDBCDataSourceProvider { dataSource.setMaximumPoolSize(isOneSession ? 1 : PropertyUtils.getInt(Constants.SPRING_DATASOURCE_MAX_ACTIVE, 50)); dataSource.setConnectionTestQuery(properties.getValidationQuery()); - if (properties.getProps() != null) { - properties.getProps().forEach(dataSource::addDataSourceProperty); + if (MapUtils.isNotEmpty(properties.getOther())) { + properties.getOther().forEach(dataSource::addDataSourceProperty); } logger.info("Creating OneSession HikariDataSource pool success."); diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessorTest.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessorTest.java index 63534dfc70..745f68ffa2 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessorTest.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/AbstractDataSourceProcessorTest.java @@ -17,10 +17,15 @@ package org.apache.dolphinscheduler.plugin.datasource.api.datasource; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import org.apache.dolphinscheduler.spi.datasource.ConnectionParam; +import org.apache.dolphinscheduler.spi.enums.DbType; + +import java.sql.Connection; import java.util.HashMap; import java.util.Map; @@ -43,4 +48,71 @@ public class AbstractDataSourceProcessorTest { other.put("arg0", "%"); doThrow(new IllegalArgumentException()).when(mockDataSourceProcessor).checkOther(other); } + + @Test + public void shouldNotIncludeMaliciousParams() { + AbstractDataSourceProcessor mockDataSourceProcessor = mock(AbstractDataSourceProcessor.class); + Map<String, String> other = new HashMap<>(); + other.put("allowLoadLocalInfile", "whatever"); + doThrow(new IllegalArgumentException()).when(mockDataSourceProcessor).checkOther(other); + } + + @org.junit.Test + public void transformOtherParamToMap() { + AbstractDataSourceProcessor abstractDataSourceProcessor = new AbstractDataSourceProcessor() { + + @Override + public BaseDataSourceParamDTO castDatasourceParamDTO(String paramJson) { + return null; + } + + @Override + public BaseDataSourceParamDTO createDatasourceParamDTO(String connectionJson) { + return null; + } + + @Override + public ConnectionParam createConnectionParams(BaseDataSourceParamDTO datasourceParam) { + return null; + } + + @Override + public ConnectionParam createConnectionParams(String connectionJson) { + return null; + } + + @Override + public String getDatasourceDriver() { + return null; + } + + @Override + public String getValidationQuery() { + return null; + } + + @Override + public String getJdbcUrl(ConnectionParam connectionParam) { + return null; + } + + @Override + public Connection getConnection(ConnectionParam connectionParam) { + return null; + } + + @Override + public DbType getDbType() { + return null; + } + + @Override + public DataSourceProcessor create() { + return null; + } + }; + String other = "{\"useSSL\": \"true\"}"; + Map<String, String> stringStringMap = abstractDataSourceProcessor.transformOtherParamToMap(other); + assertEquals("true", stringStringMap.get("useSSL")); + } } \ No newline at end of file diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessorTest.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessorTest.java index 8789213351..95cde6f364 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessorTest.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/db2/Db2DataSourceProcessorTest.java @@ -36,6 +36,8 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.google.common.collect.ImmutableMap; + @RunWith(PowerMockRunner.class) @PrepareForTest({Class.class, DriverManager.class, DataSourceUtils.class, CommonUtils.class, DataSourceClientProvider.class, PasswordUtils.class}) public class Db2DataSourceProcessorTest { @@ -83,7 +85,10 @@ public class Db2DataSourceProcessorTest { public void testGetJdbcUrl() { Db2ConnectionParam db2ConnectionParam = new Db2ConnectionParam(); db2ConnectionParam.setJdbcUrl("jdbc:db2://localhost:5142/default"); - db2ConnectionParam.setOther("other=other"); + ImmutableMap<String, String> map = new ImmutableMap.Builder<String, String>() + .put("other", "other") + .build(); + db2ConnectionParam.setOther(map); String jdbcUrl = db2DatasourceProcessor.getJdbcUrl(db2ConnectionParam); Assert.assertEquals("jdbc:db2://localhost:5142/default;other=other", jdbcUrl); } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessorTest.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessorTest.java index a997e8728e..4b7cc752d5 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessorTest.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/oracle/OracleDataSourceProcessorTest.java @@ -37,6 +37,8 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.google.common.collect.ImmutableMap; + @RunWith(PowerMockRunner.class) @PrepareForTest({Class.class, DriverManager.class, DataSourceUtils.class, CommonUtils.class, DataSourceClientProvider.class, PasswordUtils.class}) public class OracleDataSourceProcessorTest { @@ -83,8 +85,11 @@ public class OracleDataSourceProcessorTest { public void testGetJdbcUrl() { OracleConnectionParam oracleConnectionParam = new OracleConnectionParam(); oracleConnectionParam.setJdbcUrl("jdbc:oracle:thin:@localhost:3308:default"); - oracleConnectionParam.setOther("other=other"); - Assert.assertEquals("jdbc:oracle:thin:@localhost:3308:default?other=other", + ImmutableMap<String, String> map = new ImmutableMap.Builder<String, String>() + .put("other", "other") + .build(); + oracleConnectionParam.setOther(map); + Assertions.assertEquals("jdbc:oracle:thin:@localhost:3308:default?other=other", oracleDatasourceProcessor.getJdbcUrl(oracleConnectionParam)); } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessorTest.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessorTest.java index 8342094c70..a784370880 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessorTest.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/postgresql/PostgreSQLDataSourceProcessorTest.java @@ -36,6 +36,8 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.google.common.collect.ImmutableMap; + @RunWith(PowerMockRunner.class) @PrepareForTest({Class.class, DriverManager.class, DataSourceUtils.class, CommonUtils.class, DataSourceClientProvider.class, PasswordUtils.class}) public class PostgreSQLDataSourceProcessorTest { @@ -81,10 +83,13 @@ public class PostgreSQLDataSourceProcessorTest { public void testGetJdbcUrl() { PostgreSQLConnectionParam postgreSqlConnectionParam = new PostgreSQLConnectionParam(); postgreSqlConnectionParam.setJdbcUrl("jdbc:postgresql://localhost:3308/default"); - postgreSqlConnectionParam.setOther("other"); + ImmutableMap<String, String> map = new ImmutableMap.Builder<String, String>() + .put("other", "other") + .build(); + postgreSqlConnectionParam.setOther(map); String jdbcUrl = postgreSqlDatasourceProcessor.getJdbcUrl(postgreSqlConnectionParam); - Assert.assertEquals("jdbc:postgresql://localhost:3308/default?other", jdbcUrl); + Assertions.assertEquals("jdbc:postgresql://localhost:3308/default?other=other", jdbcUrl); } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessorTest.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessorTest.java index f43e747bc2..24026c8075 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessorTest.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/presto/PrestoDataSourceProcessorTest.java @@ -80,8 +80,7 @@ public class PrestoDataSourceProcessorTest { public void testGetJdbcUrl() { PrestoConnectionParam prestoConnectionParam = new PrestoConnectionParam(); prestoConnectionParam.setJdbcUrl("jdbc:postgresql://localhost:1234/default"); - prestoConnectionParam.setOther("other"); - Assert.assertEquals("jdbc:postgresql://localhost:1234/default?other", + Assertions.assertEquals("jdbc:postgresql://localhost:1234/default", prestoDatasourceProcessor.getJdbcUrl(prestoConnectionParam)); } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessorTest.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessorTest.java index a1756c3551..091919f1a8 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessorTest.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/redshift/RedshiftDataSourceProcessorTest.java @@ -36,6 +36,8 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.google.common.collect.ImmutableMap; + @RunWith(PowerMockRunner.class) @PrepareForTest({Class.class, DriverManager.class, DataSourceUtils.class, CommonUtils.class, DataSourceClientProvider.class, PasswordUtils.class}) public class RedshiftDataSourceProcessorTest { @@ -80,9 +82,13 @@ public class RedshiftDataSourceProcessorTest { public void testGetJdbcUrl() { RedshiftConnectionParam redshiftConnectionParam = new RedshiftConnectionParam(); redshiftConnectionParam.setJdbcUrl("jdbc:redshift://localhost:5439/default"); - redshiftConnectionParam.setOther("DSILogLevel=6;defaultRowFetchSize=100"); - Assert.assertEquals("jdbc:redshift://localhost:5439/default?DSILogLevel=6;defaultRowFetchSize=100", - redshiftDatasourceProcessor.getJdbcUrl(redshiftConnectionParam)); + ImmutableMap<String, String> map = new ImmutableMap.Builder<String, String>() + .put("DSILogLevel", "6") + .put("defaultRowFetchSize", "100") + .build(); + redshiftConnectionParam.setOther(map); + Assertions.assertEquals("jdbc:redshift://localhost:5439/default?DSILogLevel=6;defaultRowFetchSize=100", + redshiftDatasourceProcessor.getJdbcUrl(redshiftConnectionParam)); } diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessorTest.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessorTest.java index 7477ce7d24..f0acb9903f 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessorTest.java +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/datasource/spark/SparkDataSourceProcessorTest.java @@ -82,8 +82,7 @@ public class SparkDataSourceProcessorTest { public void testGetJdbcUrl() { SparkConnectionParam sparkConnectionParam = new SparkConnectionParam(); sparkConnectionParam.setJdbcUrl("jdbc:hive2://localhost1:1234,localhost2:1234/default"); - sparkConnectionParam.setOther("other"); - Assert.assertEquals("jdbc:hive2://localhost1:1234,localhost2:1234/default;other", + Assertions.assertEquals("jdbc:hive2://localhost1:1234,localhost2:1234/default", sparkDatasourceProcessor.getJdbcUrl(sparkConnectionParam)); } diff --git a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/datasource/BaseConnectionParam.java b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/datasource/BaseConnectionParam.java index b1df15c397..40e809c3d7 100644 --- a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/datasource/BaseConnectionParam.java +++ b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/datasource/BaseConnectionParam.java @@ -17,12 +17,14 @@ package org.apache.dolphinscheduler.spi.datasource; -import java.util.HashMap; import java.util.Map; +import lombok.Data; + import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; +@Data @JsonInclude(Include.NON_NULL) public abstract class BaseConnectionParam implements ConnectionParam { @@ -42,87 +44,6 @@ public abstract class BaseConnectionParam implements ConnectionParam { protected String validationQuery; - protected String other; - - private Map<String, String> props = new HashMap<>(); - - public String getUser() { - return user; - } - - public void setUser(String user) { - this.user = user; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getDatabase() { - return database; - } - - public void setDatabase(String database) { - this.database = database; - } - - public String getJdbcUrl() { - return jdbcUrl; - } - - public void setJdbcUrl(String jdbcUrl) { - this.jdbcUrl = jdbcUrl; - } - - public String getDriverLocation() { - return driverLocation; - } - - public void setDriverLocation(String driverLocation) { - this.driverLocation = driverLocation; - } - - public String getDriverClassName() { - return driverClassName; - } - - public void setDriverClassName(String driverClassName) { - this.driverClassName = driverClassName; - } - - public String getValidationQuery() { - return validationQuery; - } - - public void setValidationQuery(String validationQuery) { - this.validationQuery = validationQuery; - } - - public String getOther() { - return other; - } - - public void setOther(String other) { - this.other = other; - } - - public Map<String, String> getProps() { - return props; - } + protected Map<String, String> other; - public void setProps(Map<String, String> props) { - this.props = props; - } } diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/test/java/org/apache/dolphinscheduler/plugin/task/dq/DataQualityTaskTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/test/java/org/apache/dolphinscheduler/plugin/task/dq/DataQualityTaskTest.java index e3bd5f55d3..1d981619a3 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/test/java/org/apache/dolphinscheduler/plugin/task/dq/DataQualityTaskTest.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/test/java/org/apache/dolphinscheduler/plugin/task/dq/DataQualityTaskTest.java @@ -494,7 +494,7 @@ public class DataQualityTaskTest { + "\"jdbcUrl\":\"jdbc:postgresql://localhost:5432/dolphinscheduler\"," + "\"user\":\"test\"," + "\"password\":\"test\"," - + "\"other\":\"stringtype=unspecified&characterEncoding=UTF-8&allowMultiQueries=true\"}"); + + "\"other\":{\"stringtype\": \"unspecified\", \"characterEncoding\" : \"UTF-8\", \"allowMultiQueries\": true}}"); dataQualityTaskExecutionContext.setStatisticsValueConnectorType("JDBC"); dataQualityTaskExecutionContext.setStatisticsValueType(1); @@ -505,7 +505,7 @@ public class DataQualityTaskTest { + "\"jdbcUrl\":\"jdbc:postgresql://localhost:5432/dolphinscheduler\"," + "\"user\":\"test\"," + "\"password\":\"test\"," - + "\"other\":\"stringtype=unspecified&characterEncoding=UTF-8&allowMultiQueries=true\"}"); + + "\"other\":{\"stringtype\": \"unspecified\", \"characterEncoding\" : \"UTF-8\", \"allowMultiQueries\": true}}"); dataQualityTaskExecutionContext.setCompareWithFixedValue(true); @@ -791,7 +791,7 @@ public class DataQualityTaskTest { + "\"jdbcUrl\":\"jdbc:postgresql://localhost:5432/dolphinscheduler\"," + "\"user\":\"test\"," + "\"password\":\"test\"," - + "\"other\":\"stringtype=unspecified&characterEncoding=UTF-8&allowMultiQueries=true\"}"); + + "\"other\":{\"stringtype\": \"unspecified\", \"characterEncoding\": \"UTF-8\", \"allowMultiQueries\": true}}"); String expect = "{\"name\":\"跨表值比对\",\"env\":{\"type\":\"batch\",\"config\":null},\"readers\"" + ":[{\"type\":\"JDBC\",\"config\":{\"database\":\"test\",\"password\":\"test\",\"driver\":" @@ -1115,7 +1115,7 @@ public class DataQualityTaskTest { + "\"jdbcUrl\":\"jdbc:postgresql://localhost:5432/dolphinscheduler\"," + "\"user\":\"test\"," + "\"password\":\"test\"," - + "\"other\":\"stringtype=unspecified&characterEncoding=UTF-8&allowMultiQueries=true\"}"); + + "\"other\":{\"stringtype\": \"unspecified\", \"characterEncoding\": \"UTF-8\", \"allowMultiQueries\": true}}"); dataQualityTaskExecutionContext.setStatisticsValueConnectorType("JDBC"); dataQualityTaskExecutionContext.setStatisticsValueType(1); @@ -1126,7 +1126,7 @@ public class DataQualityTaskTest { + "\"jdbcUrl\":\"jdbc:postgresql://localhost:5432/dolphinscheduler\"," + "\"user\":\"test\"," + "\"password\":\"test\"," - + "\"other\":\"stringtype=unspecified&characterEncoding=UTF-8&allowMultiQueries=true\"}"); + + "\"other\":{\"stringtype\": \"unspecified\", \"characterEncoding\": \"UTF-8\", \"allowMultiQueries\": true }}"); dataQualityTaskExecutionContext.setRuleName("跨表准确性"); dataQualityTaskExecutionContext.setRuleType(RuleType.MULTI_TABLE_ACCURACY.getCode());
