You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@seatunnel.apache.org by wa...@apache.org on 2023/03/27 02:25:01 UTC
[incubator-seatunnel] branch dev updated: [hotfix][api] fixed generic class loss for lists (#4421)
This is an automated email from the ASF dual-hosted git repository.
wanghailin 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 87505e66a [hotfix][api] fixed generic class loss for lists (#4421)
87505e66a is described below
commit 87505e66af999eb3921203b8b10f03a16b8c9751
Author: Zongwen Li <zo...@apache.org>
AuthorDate: Mon Mar 27 10:24:53 2023 +0800
[hotfix][api] fixed generic class loss for lists (#4421)
---
.../seatunnel/api/configuration/Options.java | 28 +++++++++++++--
.../api/configuration/ReadableConfigTest.java | 42 ++++++++++++++++++++++
.../src/test/resources/conf/option-test.conf | 8 +++++
3 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/Options.java b/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/Options.java
index d7f94f0c4..02aa50c00 100644
--- a/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/Options.java
+++ b/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/Options.java
@@ -23,6 +23,7 @@ import org.apache.commons.lang3.StringUtils;
import lombok.NonNull;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.time.Duration;
import java.util.List;
@@ -130,8 +131,31 @@ public class Options {
* Defines that the value of the option should be a list of properties, which can be
* represented as {@code List<T>}.
*/
- public <T> TypedOptionBuilder<List<T>> listType(Class<T> option) {
- return new TypedOptionBuilder<>(key, new TypeReference<List<T>>() {});
+ public <T> TypedOptionBuilder<List<T>> listType(Class<T> subClass) {
+ return new TypedOptionBuilder<>(
+ key,
+ new TypeReference<List<T>>() {
+ @Override
+ public Type getType() {
+ return new ParameterizedType() {
+
+ @Override
+ public Type[] getActualTypeArguments() {
+ return new Type[] {subClass};
+ }
+
+ @Override
+ public Type getRawType() {
+ return List.class;
+ }
+
+ @Override
+ public Type getOwnerType() {
+ return null;
+ }
+ };
+ }
+ });
}
public <T> TypedOptionBuilder<T> objectType(Class<T> option) {
diff --git a/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/ReadableConfigTest.java b/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/ReadableConfigTest.java
index 615d9d682..d49b5aceb 100644
--- a/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/ReadableConfigTest.java
+++ b/seatunnel-api/src/test/java/org/apache/seatunnel/api/configuration/ReadableConfigTest.java
@@ -241,4 +241,46 @@ public class ReadableConfigTest {
Assertions.assertEquals(map, value.get(0));
});
}
+
+ @Test
+ public void testEnumListOption() {
+ List<OptionTest.TestMode> list = new ArrayList<>();
+ list.add(OptionTest.TestMode.EARLIEST);
+ list.add(OptionTest.TestMode.LATEST);
+ Assertions.assertEquals(
+ list,
+ config.get(
+ Options.key("option.enum-list")
+ .listType(OptionTest.TestMode.class)
+ .noDefaultValue()));
+ }
+
+ @Test
+ public void testNumericListOption() {
+ List<Integer> list = new ArrayList<>();
+ list.add(1);
+ list.add(2);
+ Assertions.assertEquals(
+ list,
+ config.get(
+ Options.key("option.numeric-list")
+ .listType(Integer.class)
+ .noDefaultValue()));
+ List<Long> list2 = new ArrayList<>();
+ list2.add(1L);
+ list2.add(2L);
+ Assertions.assertEquals(
+ list2,
+ config.get(
+ Options.key("option.numeric-list").listType(Long.class).noDefaultValue()));
+ List<Double> list3 = new ArrayList<>();
+ list3.add(1D);
+ list3.add(2D);
+ Assertions.assertEquals(
+ list3,
+ config.get(
+ Options.key("option.numeric-list")
+ .listType(Double.class)
+ .noDefaultValue()));
+ }
}
diff --git a/seatunnel-api/src/test/resources/conf/option-test.conf b/seatunnel-api/src/test/resources/conf/option-test.conf
index de4a2b977..4f20d493d 100644
--- a/seatunnel-api/src/test/resources/conf/option-test.conf
+++ b/seatunnel-api/src/test/resources/conf/option-test.conf
@@ -48,6 +48,14 @@ source {
option.long-str = "21474836470"
option.string = "Hello, Apache SeaTunnel"
option.enum = "LATEST"
+ option.numeric-list = [
+ 1,
+ 2
+ ]
+ option.enum-list = [
+ "EARLIEST",
+ "LATEST"
+ ]
option.list-json = """["Hello", "Apache SeaTunnel"]"""
option.list = ["final", "fantasy", "VII"]
option.list-str = "Silk,Song"