This is an automated email from the ASF dual-hosted git repository.
kirs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new 8fabcdb [Improve][Config] Refactor StringTemplate to unify variables
substitute util (#1442)
8fabcdb is described below
commit 8fabcdb46a788573a4cf42e11297e3a684a8c466
Author: Simon <[email protected]>
AuthorDate: Thu Mar 24 19:19:20 2022 +0800
[Improve][Config] Refactor StringTemplate to unify variables substitute
util (#1442)
---
.../seatunnel/common/utils/StringTemplate.java | 28 +++----------
...tringTemplate.java => VariablesSubstitute.java} | 30 +++++++++-----
.../common/utils/VariablesSubstituteTest.java | 47 ++++++++++++++++++++++
.../org/apache/seatunnel/core/sql/job/JobInfo.java | 19 ++++-----
.../core/sql/SqlVariableSubstitutionTest.java | 4 +-
.../src/test/resources/flink.sql.conf.template | 4 +-
6 files changed, 84 insertions(+), 48 deletions(-)
diff --git
a/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/StringTemplate.java
b/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/StringTemplate.java
index f8bb912..c072f9b 100644
---
a/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/StringTemplate.java
+++
b/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/StringTemplate.java
@@ -17,35 +17,17 @@
package org.apache.seatunnel.common.utils;
-import org.apache.commons.lang3.text.StrSubstitutor;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
+/**
+ * please using {@link VariablesSubstitute} instead, since 2.0.5
+ */
+@Deprecated
public final class StringTemplate {
private StringTemplate() {
}
- /**
- * @param str raw string
- * @param timeFormat example : "yyyy-MM-dd HH:mm:ss"
- * @return replaced string
- */
public static String substitute(String str, String timeFormat) {
-
- final SimpleDateFormat sdf = new SimpleDateFormat(timeFormat);
- final String formattedDate = sdf.format(new Date());
-
- final Map<String, String> valuesMap = new HashMap<>(3);
- valuesMap.put("uuid", UUID.randomUUID().toString());
- valuesMap.put("now", formattedDate);
- valuesMap.put(timeFormat, formattedDate);
- final StrSubstitutor sub = new StrSubstitutor(valuesMap);
- return sub.replace(str);
+ return VariablesSubstitute.substitute(str, timeFormat);
}
}
diff --git
a/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/StringTemplate.java
b/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/VariablesSubstitute.java
similarity index 64%
copy from
seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/StringTemplate.java
copy to
seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/VariablesSubstitute.java
index f8bb912..671d9ee 100644
---
a/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/StringTemplate.java
+++
b/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/VariablesSubstitute.java
@@ -19,33 +19,41 @@ package org.apache.seatunnel.common.utils;
import org.apache.commons.lang3.text.StrSubstitutor;
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
-public final class StringTemplate {
+public final class VariablesSubstitute {
- private StringTemplate() {
+ private VariablesSubstitute() {
}
/**
- * @param str raw string
+ * @param text raw string
* @param timeFormat example : "yyyy-MM-dd HH:mm:ss"
- * @return replaced string
+ * @return replaced text
*/
- public static String substitute(String str, String timeFormat) {
-
- final SimpleDateFormat sdf = new SimpleDateFormat(timeFormat);
- final String formattedDate = sdf.format(new Date());
+ public static String substitute(String text, String timeFormat) {
+ DateTimeFormatter df = DateTimeFormatter.ofPattern(timeFormat);
+ final String formattedDate = df.format(ZonedDateTime.now());
final Map<String, String> valuesMap = new HashMap<>(3);
valuesMap.put("uuid", UUID.randomUUID().toString());
valuesMap.put("now", formattedDate);
valuesMap.put(timeFormat, formattedDate);
+ return substitute(text, valuesMap);
+ }
+
+ /**
+ * @param text raw string
+ * @param valuesMap key is variable name, value is substituted string.
+ * @return replaced text
+ */
+ public static String substitute(String text, Map<String, String>
valuesMap) {
final StrSubstitutor sub = new StrSubstitutor(valuesMap);
- return sub.replace(str);
+ return sub.replace(text);
}
}
diff --git
a/seatunnel-common/src/test/java/org/apache/seatunnel/common/utils/VariablesSubstituteTest.java
b/seatunnel-common/src/test/java/org/apache/seatunnel/common/utils/VariablesSubstituteTest.java
new file mode 100644
index 0000000..a1731c3
--- /dev/null
+++
b/seatunnel-common/src/test/java/org/apache/seatunnel/common/utils/VariablesSubstituteTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.seatunnel.common.utils;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+public class VariablesSubstituteTest {
+
+ @Test
+ public void testSubstitute() {
+ String timeFormat = "yyyyMMddHHmmss";
+ DateTimeFormatter df = DateTimeFormatter.ofPattern(timeFormat);
+ String formattedDate = df.format(ZonedDateTime.now());
+ String path = "data_${now}_${uuid}.parquet";
+ String newPath = VariablesSubstitute.substitute(path, timeFormat);
+ Assert.assertTrue(newPath.contains(formattedDate));
+
+ String text = "${var1} is a distributed, high-performance data
integration platform for " +
+ "the synchronization and ${var2} of massive data (offline &
real-time).";
+
+ HashMap<String, String> valuesMap = new HashMap<>();
+ valuesMap.put("var1", "SeaTunnel");
+ valuesMap.put("var2", "transformation");
+ String newText = VariablesSubstitute.substitute(text, valuesMap);
+ Assert.assertTrue(newText.contains("SeaTunnel") &&
newText.contains("transformation"));
+ }
+}
diff --git
a/seatunnel-core/seatunnel-core-sql/src/main/java/org/apache/seatunnel/core/sql/job/JobInfo.java
b/seatunnel-core/seatunnel-core-sql/src/main/java/org/apache/seatunnel/core/sql/job/JobInfo.java
index db87424..d46fbcd 100644
---
a/seatunnel-core/seatunnel-core-sql/src/main/java/org/apache/seatunnel/core/sql/job/JobInfo.java
+++
b/seatunnel-core/seatunnel-core-sql/src/main/java/org/apache/seatunnel/core/sql/job/JobInfo.java
@@ -17,11 +17,14 @@
package org.apache.seatunnel.core.sql.job;
+import org.apache.seatunnel.common.utils.VariablesSubstitute;
+
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
public class JobInfo {
- private static final String VAR_REGEX = "\\$\\{%s}";
private static final String DELIMITER = "=";
private String jobContent;
@@ -35,15 +38,9 @@ public class JobInfo {
}
public void substitute(List<String> variables) {
- if (variables == null) {
- return;
- }
- for (String variable : variables) {
- String[] s = variable.split(DELIMITER);
- if (s.length == 2) {
- jobContent = jobContent.replaceAll(String.format(VAR_REGEX,
s[0].trim()), s[1].trim());
- }
- }
+ Map<String, String> substituteMap = variables.stream()
+ .filter(v -> v.contains(DELIMITER))
+ .collect(Collectors.toMap(v -> v.split(DELIMITER)[0], v ->
v.split(DELIMITER)[1]));
+ jobContent = VariablesSubstitute.substitute(jobContent, substituteMap);
}
-
}
diff --git
a/seatunnel-core/seatunnel-core-sql/src/test/java/org/apache/seatunnel/core/sql/SqlVariableSubstitutionTest.java
b/seatunnel-core/seatunnel-core-sql/src/test/java/org/apache/seatunnel/core/sql/SqlVariableSubstitutionTest.java
index 63f8ed8..95a0354 100644
---
a/seatunnel-core/seatunnel-core-sql/src/test/java/org/apache/seatunnel/core/sql/SqlVariableSubstitutionTest.java
+++
b/seatunnel-core/seatunnel-core-sql/src/test/java/org/apache/seatunnel/core/sql/SqlVariableSubstitutionTest.java
@@ -34,16 +34,18 @@ public class SqlVariableSubstitutionTest {
@Test
public void normalizeStatementsWithMultiSqls() throws Exception {
String[] args = {"-c", System.getProperty("user.dir") +
TEST_RESOURCE_DIR + "flink.sql.conf.template",
- "-t", "-i", "table_name=events"};
+ "-t", "-i", "table_name=events", "-i", "table_name2=print_table"};
FlinkCommandArgs flinkArgs = CommandLineUtils.parseFlinkArgs(args);
String configFilePath = flinkArgs.getConfigFile();
String jobContent = FileUtils.readFileToString(new
File(configFilePath), StandardCharsets.UTF_8);
JobInfo jobInfo = new JobInfo(jobContent);
Assert.assertFalse(jobInfo.getJobContent().contains("events"));
+ Assert.assertFalse(jobInfo.getJobContent().contains("print_table"));
jobInfo.substitute(flinkArgs.getVariables());
Assert.assertTrue(jobInfo.getJobContent().contains("events"));
+ Assert.assertTrue(jobInfo.getJobContent().contains("print_table"));
}
}
diff --git
a/seatunnel-core/seatunnel-core-sql/src/test/resources/flink.sql.conf.template
b/seatunnel-core/seatunnel-core-sql/src/test/resources/flink.sql.conf.template
index 2d7f9d4..5ca6023 100644
---
a/seatunnel-core/seatunnel-core-sql/src/test/resources/flink.sql.conf.template
+++
b/seatunnel-core/seatunnel-core-sql/src/test/resources/flink.sql.conf.template
@@ -37,7 +37,7 @@ CREATE TABLE ${table_name} (
'fields.f_uid.max'='1000'
);
-CREATE TABLE print_table (
+CREATE TABLE ${table_name2} (
type INT,
uid INT,
lstmt TIMESTAMP
@@ -46,4 +46,4 @@ CREATE TABLE print_table (
'sink.parallelism' = '1'
);
-INSERT INTO print_table SELECT * FROM ${table_name} where f_type = 1;
+INSERT INTO ${table_name2} SELECT * FROM ${table_name} where f_type = 1;