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"