This is an automated email from the ASF dual-hosted git repository.

kerwin pushed a commit to branch 3.1.5-prepare
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/3.1.5-prepare by this push:
     new 76a1a6dfcb cherry-pick [Fix][Data Quality]Dataquality Spark Get 
Datasource Password Error When Password Has $ #13643
76a1a6dfcb is described below

commit 76a1a6dfcb07fb5f013d5dbd95968193e4ba64dc
Author: 旺阳 <[email protected]>
AuthorDate: Tue Feb 28 18:50:44 2023 +0800

    cherry-pick [Fix][Data Quality]Dataquality Spark Get Datasource Password 
Error When Password Has $ #13643
---
 .../data/quality/flow/batch/reader/JdbcReader.java |  3 +-
 .../data/quality/flow/batch/writer/JdbcWriter.java | 17 ++++---
 .../data/quality/utils/ParserUtils.java            | 58 +++++++++++++++++++++
 .../data/quality/utils/ParserUtilsTest.java        | 39 ++++++++++++++
 .../plugin/task/dq/utils/RuleParserUtils.java      | 59 +++++++++++++---------
 5 files changed, 142 insertions(+), 34 deletions(-)

diff --git 
a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java
 
b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java
index 0484c15fa2..d8d9e57fc4 100644
--- 
a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java
+++ 
b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/reader/JdbcReader.java
@@ -31,6 +31,7 @@ import 
org.apache.dolphinscheduler.data.quality.config.ValidateResult;
 import 
org.apache.dolphinscheduler.data.quality.execution.SparkRuntimeEnvironment;
 import org.apache.dolphinscheduler.data.quality.flow.batch.BatchReader;
 import org.apache.dolphinscheduler.data.quality.utils.ConfigUtils;
+import org.apache.dolphinscheduler.data.quality.utils.ParserUtils;
 
 import org.apache.spark.sql.DataFrameReader;
 import org.apache.spark.sql.Dataset;
@@ -79,7 +80,7 @@ public class JdbcReader implements BatchReader {
                 .option(URL, config.getString(URL))
                 .option(DB_TABLE, config.getString(TABLE))
                 .option(USER, config.getString(USER))
-                .option(PASSWORD, config.getString(PASSWORD))
+                .option(PASSWORD, 
ParserUtils.decode(config.getString(PASSWORD)))
                 .option(DRIVER, config.getString(DRIVER));
 
         Config jdbcConfig = ConfigUtils.extractSubConfig(config, JDBC + DOTS, 
false);
diff --git 
a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java
 
b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java
index f1c098965c..3b18a3f816 100644
--- 
a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java
+++ 
b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/flow/batch/writer/JdbcWriter.java
@@ -32,6 +32,7 @@ import org.apache.dolphinscheduler.data.quality.config.Config;
 import org.apache.dolphinscheduler.data.quality.config.ValidateResult;
 import 
org.apache.dolphinscheduler.data.quality.execution.SparkRuntimeEnvironment;
 import org.apache.dolphinscheduler.data.quality.flow.batch.BatchWriter;
+import org.apache.dolphinscheduler.data.quality.utils.ParserUtils;
 
 import org.apache.spark.sql.Dataset;
 import org.apache.spark.sql.Row;
@@ -75,13 +76,13 @@ public class JdbcWriter implements BatchWriter {
         }
 
         data.write()
-            .format(JDBC)
-            .option(DRIVER,config.getString(DRIVER))
-            .option(URL,config.getString(URL))
-            .option(DB_TABLE, config.getString(TABLE))
-            .option(USER, config.getString(USER))
-            .option(PASSWORD, config.getString(PASSWORD))
-            .mode(config.getString(SAVE_MODE))
-            .save();
+                .format(JDBC)
+                .option(DRIVER, config.getString(DRIVER))
+                .option(URL, config.getString(URL))
+                .option(DB_TABLE, config.getString(TABLE))
+                .option(USER, config.getString(USER))
+                .option(PASSWORD, 
ParserUtils.decode(config.getString(PASSWORD)))
+                .mode(config.getString(SAVE_MODE))
+                .save();
     }
 }
diff --git 
a/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtils.java
 
b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtils.java
new file mode 100644
index 0000000000..e2b3fc5abf
--- /dev/null
+++ 
b/dolphinscheduler-data-quality/src/main/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtils.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.data.quality.utils;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * ParserUtil
+ */
+@Slf4j
+public class ParserUtils {
+
+    private ParserUtils() {
+        throw new UnsupportedOperationException("Construct ParserUtils");
+    }
+
+    public static String encode(String str) {
+        String rs = str;
+        try {
+            rs = URLEncoder.encode(str, UTF_8.toString());
+        } catch (Exception e) {
+            log.error("encode str exception!", e);
+        }
+
+        return rs;
+    }
+
+    public static String decode(String str) {
+        String rs = str;
+        try {
+            rs = URLDecoder.decode(str, UTF_8.toString());
+        } catch (Exception e) {
+            log.error("decode str exception!", e);
+        }
+
+        return rs;
+    }
+}
diff --git 
a/dolphinscheduler-data-quality/src/test/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtilsTest.java
 
b/dolphinscheduler-data-quality/src/test/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtilsTest.java
new file mode 100644
index 0000000000..328316cc39
--- /dev/null
+++ 
b/dolphinscheduler-data-quality/src/test/java/org/apache/dolphinscheduler/data/quality/utils/ParserUtilsTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.data.quality.utils;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class ParserUtilsTest {
+
+    @Test
+    public void testParserUtils() {
+        String testStr = "aaa$bbb$ccc%ddd^eee#fff";
+        String encode = ParserUtils.encode(testStr);
+        String decode = ParserUtils.decode(encode);
+        Assertions.assertEquals(testStr, decode);
+
+        String blank = "";
+        Assertions.assertEquals(ParserUtils.encode(blank), blank);
+        Assertions.assertEquals(ParserUtils.decode(blank), blank);
+
+        Assertions.assertNull(ParserUtils.encode(null));
+        Assertions.assertNull(ParserUtils.decode(null));
+    }
+}
diff --git 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java
 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java
index 9cc14b6ae4..16f3d453ee 100644
--- 
a/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java
+++ 
b/dolphinscheduler-task-plugin/dolphinscheduler-task-dataquality/src/main/java/org/apache/dolphinscheduler/plugin/task/dq/utils/RuleParserUtils.java
@@ -60,6 +60,7 @@ import static 
org.apache.dolphinscheduler.plugin.task.api.utils.DataQualityConst
 import static 
org.apache.dolphinscheduler.plugin.task.api.utils.DataQualityConstants.USER;
 
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.data.quality.utils.ParserUtils;
 import org.apache.dolphinscheduler.plugin.datasource.api.utils.DataSourceUtils;
 import 
org.apache.dolphinscheduler.plugin.task.api.DataQualityTaskExecutionContext;
 import org.apache.dolphinscheduler.plugin.task.api.enums.dp.ExecuteSqlType;
@@ -115,12 +116,14 @@ public class RuleParserUtils {
             
sourceBaseConfig.setType(dataQualityTaskExecutionContext.getSourceConnectorType());
             Map<String,Object> config = new HashMap<>();
             if (sourceDataSource != null) {
-                config.put(DATABASE,sourceDataSource.getDatabase());
-                config.put(TABLE,inputParameterValue.get(SRC_TABLE));
-                
config.put(URL,DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getSourceType()),sourceDataSource));
-                config.put(USER,sourceDataSource.getUser());
-                config.put(PASSWORD,sourceDataSource.getPassword());
-                config.put(DRIVER, 
DataSourceUtils.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getSourceType())));
+                config.put(DATABASE, sourceDataSource.getDatabase());
+                config.put(TABLE, inputParameterValue.get(SRC_TABLE));
+                config.put(URL, 
DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getSourceType()),
+                        sourceDataSource));
+                config.put(USER, sourceDataSource.getUser());
+                config.put(PASSWORD, 
ParserUtils.encode(sourceDataSource.getPassword()));
+                config.put(DRIVER, DataSourceUtils
+                        
.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getSourceType())));
                 String outputTable = sourceDataSource.getDatabase() + "_" + 
inputParameterValue.get(SRC_TABLE);
                 config.put(OUTPUT_TABLE,outputTable);
                 inputParameterValue.put(SRC_TABLE,outputTable);
@@ -140,12 +143,14 @@ public class RuleParserUtils {
             
targetBaseConfig.setType(dataQualityTaskExecutionContext.getTargetConnectorType());
             Map<String,Object> config = new HashMap<>();
             if (targetDataSource != null) {
-                config.put(DATABASE,targetDataSource.getDatabase());
-                config.put(TABLE,inputParameterValue.get(TARGET_TABLE));
-                
config.put(URL,DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getTargetType()),targetDataSource));
-                config.put(USER,targetDataSource.getUser());
-                config.put(PASSWORD,targetDataSource.getPassword());
-                config.put(DRIVER, 
DataSourceUtils.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getTargetType())));
+                config.put(DATABASE, targetDataSource.getDatabase());
+                config.put(TABLE, inputParameterValue.get(TARGET_TABLE));
+                config.put(URL, 
DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getTargetType()),
+                        targetDataSource));
+                config.put(USER, targetDataSource.getUser());
+                config.put(PASSWORD, 
ParserUtils.encode(targetDataSource.getPassword()));
+                config.put(DRIVER, DataSourceUtils
+                        
.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getTargetType())));
                 String outputTable = targetDataSource.getDatabase() + "_" + 
inputParameterValue.get(TARGET_TABLE);
                 config.put(OUTPUT_TABLE,outputTable);
                 inputParameterValue.put(TARGET_TABLE,outputTable);
@@ -266,13 +271,15 @@ public class RuleParserUtils {
 
             Map<String,Object> config = new HashMap<>();
             if (writerDataSource != null) {
-                config.put(DATABASE,writerDataSource.getDatabase());
-                
config.put(TABLE,dataQualityTaskExecutionContext.getWriterTable());
-                
config.put(URL,DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getWriterType()),writerDataSource));
-                config.put(USER,writerDataSource.getUser());
-                config.put(PASSWORD,writerDataSource.getPassword());
-                config.put(DRIVER, 
DataSourceUtils.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getWriterType())));
-                config.put(SQL,sql);
+                config.put(DATABASE, writerDataSource.getDatabase());
+                config.put(TABLE, 
dataQualityTaskExecutionContext.getWriterTable());
+                config.put(URL, 
DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getWriterType()),
+                        writerDataSource));
+                config.put(USER, writerDataSource.getUser());
+                config.put(PASSWORD, 
ParserUtils.encode(writerDataSource.getPassword()));
+                config.put(DRIVER, DataSourceUtils
+                        
.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getWriterType())));
+                config.put(SQL, sql);
             }
             writerConfig.setConfig(config);
             writerConfigList.add(writerConfig);
@@ -332,12 +339,14 @@ public class RuleParserUtils {
 
             Map<String,Object> config = new HashMap<>();
             if (writerDataSource != null) {
-                config.put(DATABASE,writerDataSource.getDatabase());
-                
config.put(TABLE,dataQualityTaskExecutionContext.getStatisticsValueTable());
-                
config.put(URL,DataSourceUtils.getJdbcUrl(DbType.of(dataQualityTaskExecutionContext.getStatisticsValueType()),writerDataSource));
-                config.put(USER,writerDataSource.getUser());
-                config.put(PASSWORD,writerDataSource.getPassword());
-                config.put(DRIVER, 
DataSourceUtils.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getWriterType())));
+                config.put(DATABASE, writerDataSource.getDatabase());
+                config.put(TABLE, 
dataQualityTaskExecutionContext.getStatisticsValueTable());
+                config.put(URL, DataSourceUtils.getJdbcUrl(
+                        
DbType.of(dataQualityTaskExecutionContext.getStatisticsValueType()), 
writerDataSource));
+                config.put(USER, writerDataSource.getUser());
+                config.put(PASSWORD, 
ParserUtils.encode(writerDataSource.getPassword()));
+                config.put(DRIVER, DataSourceUtils
+                        
.getDatasourceDriver(DbType.of(dataQualityTaskExecutionContext.getWriterType())));
             }
 
             baseConfig.setConfig(config);

Reply via email to