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 <[email protected]>
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"

Reply via email to