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

tyrantlucifer 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 4e604184b [Improve][Core][Starter] Add PluginDiscovery Method to 
Support Search Plugin (#3488)
4e604184b is described below

commit 4e604184bd5d9a43f9b5d718d3a153baaa8d67f6
Author: Hisoka <[email protected]>
AuthorDate: Thu Nov 24 10:47:04 2022 +0800

    [Improve][Core][Starter] Add PluginDiscovery Method to Support Search 
Plugin (#3488)
    
    * [Core] [PluginDiscovery] Add Connector search method
    
    * [PluginDiscovery] [Connector] Add PluginDiscovery Method to Support Web
    
    * [Core] [Plugin] Fix Ci problem
    
    * [Core] [Plugin] Fix Ci problem
    
    * [Core] [Plugin] Change Search Plugin Method
    
    * [Plugin] [Core] Remove useless engine type
---
 pom.xml                                            |   2 +-
 .../apache/seatunnel/common/utils/FileUtils.java   |  24 +++-
 .../engine/client/job/JobExecutionEnvironment.java |  17 +--
 .../plugin/discovery/AbstractPluginDiscovery.java  |  64 +++++++++
 .../SeaTunnelTransformPluginDiscovery.java         |   3 +-
 .../discovery/AbstractPluginDiscoveryTest.java     |  47 +++++++
 .../home/connectors/plugin-mapping.properties      | 147 +++++++++++++++++++++
 7 files changed, 284 insertions(+), 20 deletions(-)

diff --git a/pom.xml b/pom.xml
index 726327b14..832e199ec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -113,7 +113,7 @@
 
     <properties>
         <!--todo The classification is too confusing, reclassify by type-->
-        <revision>2.1.3-SNAPSHOT</revision>
+        <revision>2.3.1-SNAPSHOT</revision>
         <seatunnel.config.shade.version>2.1.1</seatunnel.config.shade.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <java.version>1.8</java.version>
diff --git 
a/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/FileUtils.java
 
b/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/FileUtils.java
index a4738b6cc..58f95e662 100644
--- 
a/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/FileUtils.java
+++ 
b/seatunnel-common/src/main/java/org/apache/seatunnel/common/utils/FileUtils.java
@@ -25,14 +25,33 @@ import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.file.FileVisitOption;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Slf4j
 public class FileUtils {
 
+    public static List<URL> searchJarFiles(@NonNull Path directory) throws 
IOException {
+        try (Stream<Path> paths = Files.walk(directory, 
FileVisitOption.FOLLOW_LINKS)) {
+            return paths.filter(path -> path.toString().endsWith(".jar"))
+                .map(path -> {
+                    try {
+                        return path.toUri().toURL();
+                    } catch (MalformedURLException e) {
+                        throw new SeaTunnelException(e);
+                    }
+                }).collect(Collectors.toList());
+        }
+    }
+
     public static String readFileToStr(Path path) {
         try {
             byte[] bytes = Files.readAllBytes(path);
@@ -87,7 +106,7 @@ public class FileUtils {
      * return the line number of file
      *
      * @param filePath The file need be read
-     * @return
+     * @return The file line number
      */
     public static Long getFileLineNumber(@NonNull String filePath) {
         try {
@@ -101,7 +120,7 @@ public class FileUtils {
      * return the line number of all files in the dirPath
      *
      * @param dirPath dirPath
-     * @return
+     * @return The file line number of dirPath
      */
     public static Long getFileLineNumberFromDir(@NonNull String dirPath) {
         File file = new File(dirPath);
@@ -135,7 +154,6 @@ public class FileUtils {
      * clear dir and the sub dir
      *
      * @param filePath filePath
-     * @return
      */
     public static void deleteFile(@NonNull String filePath) {
         File file = new File(filePath);
diff --git 
a/seatunnel-engine/seatunnel-engine-client/src/main/java/org/apache/seatunnel/engine/client/job/JobExecutionEnvironment.java
 
b/seatunnel-engine/seatunnel-engine-client/src/main/java/org/apache/seatunnel/engine/client/job/JobExecutionEnvironment.java
index 4a04245ca..5f9a6ffcd 100644
--- 
a/seatunnel-engine/seatunnel-engine-client/src/main/java/org/apache/seatunnel/engine/client/job/JobExecutionEnvironment.java
+++ 
b/seatunnel-engine/seatunnel-engine-client/src/main/java/org/apache/seatunnel/engine/client/job/JobExecutionEnvironment.java
@@ -19,6 +19,7 @@ package org.apache.seatunnel.engine.client.job;
 
 import org.apache.seatunnel.api.common.JobContext;
 import org.apache.seatunnel.common.config.Common;
+import org.apache.seatunnel.common.utils.FileUtils;
 import org.apache.seatunnel.engine.client.SeaTunnelHazelcastClient;
 import org.apache.seatunnel.engine.common.config.JobConfig;
 import org.apache.seatunnel.engine.common.exception.SeaTunnelEngineException;
@@ -34,19 +35,14 @@ import com.hazelcast.logging.Logger;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 
 import java.io.IOException;
-import java.net.MalformedURLException;
 import java.net.URL;
-import java.nio.file.FileVisitOption;
 import java.nio.file.Files;
-import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 public class JobExecutionEnvironment {
 
@@ -88,16 +84,7 @@ public class JobExecutionEnvironment {
     private Set<URL> searchPluginJars() {
         try {
             if (Files.exists(Common.pluginRootDir())) {
-                try (Stream<Path> paths = Files.walk(Common.pluginRootDir(), 
FileVisitOption.FOLLOW_LINKS)) {
-                    return paths.filter(path -> 
path.toString().endsWith(".jar"))
-                        .map(path -> {
-                            try {
-                                return path.toUri().toURL();
-                            } catch (MalformedURLException e) {
-                                throw new SeaTunnelEngineException(e);
-                            }
-                        }).collect(Collectors.toSet());
-                }
+                return new 
HashSet<>(FileUtils.searchJarFiles(Common.pluginRootDir()));
             }
         } catch (IOException | SeaTunnelEngineException e) {
             LOGGER.warning(String.format("Can't search plugin jars in %s.", 
Common.pluginRootDir()), e);
diff --git 
a/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscovery.java
 
b/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscovery.java
index b5d49e2fc..9a861a4e7 100644
--- 
a/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscovery.java
+++ 
b/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscovery.java
@@ -18,8 +18,16 @@
 package org.apache.seatunnel.plugin.discovery;
 
 import org.apache.seatunnel.api.common.PluginIdentifierInterface;
+import org.apache.seatunnel.api.table.factory.Factory;
+import org.apache.seatunnel.api.table.factory.FactoryUtil;
+import org.apache.seatunnel.api.table.factory.TableSinkFactory;
+import org.apache.seatunnel.api.table.factory.TableSourceFactory;
+import org.apache.seatunnel.api.table.factory.TableTransformFactory;
 import org.apache.seatunnel.apis.base.plugin.Plugin;
 import org.apache.seatunnel.common.config.Common;
+import org.apache.seatunnel.common.constants.CollectionConstants;
+import org.apache.seatunnel.common.constants.PluginType;
+import org.apache.seatunnel.common.utils.FileUtils;
 import org.apache.seatunnel.common.utils.ReflectionUtils;
 
 import org.apache.seatunnel.shade.com.typesafe.config.Config;
@@ -31,16 +39,20 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import java.io.File;
 import java.io.FileFilter;
+import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -80,6 +92,10 @@ public abstract class AbstractPluginDiscovery<T> implements 
PluginDiscovery<T> {
         this(Common.connectorJarDir(pluginSubDir), 
loadConnectorPluginConfig());
     }
 
+    public AbstractPluginDiscovery(Path pluginDir) {
+        this(pluginDir, loadConnectorPluginConfig());
+    }
+
     public AbstractPluginDiscovery(Path pluginDir,
                                    Config pluginConfig) {
         this(pluginDir, pluginConfig, DEFAULT_URL_TO_CLASSLOADER);
@@ -117,6 +133,28 @@ public abstract class AbstractPluginDiscovery<T> 
implements PluginDiscovery<T> {
             .collect(Collectors.toList());
     }
 
+    /**
+     * Get all support plugin by plugin type
+     *
+     * @param pluginType plugin type, not support transform
+     * @return the all plugin identifier of the engine with artifactId
+     */
+    public static @Nonnull Map<PluginIdentifier, String> 
getAllSupportedPlugins(PluginType pluginType) {
+        Config config = loadConnectorPluginConfig();
+        Map<PluginIdentifier, String> pluginIdentifiers = new HashMap<>();
+        if (config.isEmpty() || 
!config.hasPath(CollectionConstants.SEATUNNEL_PLUGIN)) {
+            return pluginIdentifiers;
+        }
+        Config engineConfig = 
config.getConfig(CollectionConstants.SEATUNNEL_PLUGIN);
+        if (engineConfig.hasPath(pluginType.getType())) {
+            
engineConfig.getConfig(pluginType.getType()).entrySet().forEach(entry -> {
+                
pluginIdentifiers.put(PluginIdentifier.of(CollectionConstants.SEATUNNEL_PLUGIN, 
pluginType.getType(), entry.getKey()),
+                    entry.getValue().unwrapped().toString());
+            });
+        }
+        return pluginIdentifiers;
+    }
+
     @Override
     public T createPluginInstance(PluginIdentifier pluginIdentifier) {
         return (T) createPluginInstance(pluginIdentifier, 
Collections.EMPTY_LIST);
@@ -160,6 +198,32 @@ public abstract class AbstractPluginDiscovery<T> 
implements PluginDiscovery<T> {
         throw new RuntimeException("Plugin " + pluginIdentifier + " not 
found.");
     }
 
+    /**
+     * Get all support plugin already in SEATUNNEL_HOME, only support 
connector-v2
+     *
+     * @param pluginType choose which type plugin should be returned
+     * @return the all plugin identifier of the engine
+     */
+    @SuppressWarnings("unchecked")
+    public @Nonnull List<PluginIdentifier> getAllPlugin(PluginType pluginType) 
throws IOException {
+        List<URL> files = FileUtils.searchJarFiles(pluginDir);
+        List<PluginIdentifier> plugins = new ArrayList<>();
+        List factories;
+        if (pluginType.equals(PluginType.SOURCE)) {
+            factories = FactoryUtil.discoverFactories(new 
URLClassLoader(files.toArray(new URL[0])), TableSourceFactory.class);
+        } else if (pluginType.equals(PluginType.SINK)) {
+            factories = FactoryUtil.discoverFactories(new 
URLClassLoader(files.toArray(new URL[0])), TableSinkFactory.class);
+        } else if (pluginType.equals(PluginType.TRANSFORM)) {
+            factories = FactoryUtil.discoverFactories(new 
URLClassLoader(files.toArray(new URL[0])), TableTransformFactory.class);
+        } else {
+            throw new IllegalArgumentException("Unsupported plugin type: " + 
pluginType);
+        }
+        factories.forEach(plugin -> {
+            plugins.add(PluginIdentifier.of("seatunnel", pluginType.getType(), 
((Factory) plugin).factoryIdentifier()));
+        });
+        return plugins;
+    }
+
     @Nullable
     private T loadPluginInstance(PluginIdentifier pluginIdentifier, 
ClassLoader classLoader) {
         ServiceLoader<T> serviceLoader = 
ServiceLoader.load(getPluginBaseClass(), classLoader);
diff --git 
a/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/seatunnel/SeaTunnelTransformPluginDiscovery.java
 
b/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/seatunnel/SeaTunnelTransformPluginDiscovery.java
index 395e857ed..94ede43e1 100644
--- 
a/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/seatunnel/SeaTunnelTransformPluginDiscovery.java
+++ 
b/seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/seatunnel/SeaTunnelTransformPluginDiscovery.java
@@ -18,12 +18,13 @@
 package org.apache.seatunnel.plugin.discovery.seatunnel;
 
 import org.apache.seatunnel.api.transform.SeaTunnelTransform;
+import org.apache.seatunnel.common.config.Common;
 import org.apache.seatunnel.plugin.discovery.AbstractPluginDiscovery;
 
 public class SeaTunnelTransformPluginDiscovery extends 
AbstractPluginDiscovery<SeaTunnelTransform> {
 
     public SeaTunnelTransformPluginDiscovery() {
-        super("seatunnel");
+        super(Common.libDir());
     }
 
     @Override
diff --git 
a/seatunnel-plugin-discovery/src/test/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscoveryTest.java
 
b/seatunnel-plugin-discovery/src/test/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscoveryTest.java
new file mode 100644
index 000000000..0b64df270
--- /dev/null
+++ 
b/seatunnel-plugin-discovery/src/test/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscoveryTest.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.plugin.discovery;
+
+import org.apache.seatunnel.common.config.Common;
+import org.apache.seatunnel.common.config.DeployMode;
+import org.apache.seatunnel.common.constants.PluginType;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+import java.util.Map;
+import java.util.Objects;
+
+@DisabledOnOs(OS.WINDOWS)
+public class AbstractPluginDiscoveryTest {
+
+    @Test
+    public void testGetAllPlugins() {
+        Common.setDeployMode(DeployMode.CLIENT);
+        System.setProperty("SEATUNNEL_HOME", 
Objects.requireNonNull(AbstractPluginDiscoveryTest.class.getResource("/home")).getPath());
+        Map<PluginIdentifier, String> sourcePlugins = 
AbstractPluginDiscovery.getAllSupportedPlugins(PluginType.SOURCE);
+        Assertions.assertEquals(27, sourcePlugins.size());
+
+        Map<PluginIdentifier, String> sinkPlugins = 
AbstractPluginDiscovery.getAllSupportedPlugins(PluginType.SINK);
+        Assertions.assertEquals(30, sinkPlugins.size());
+
+    }
+
+}
diff --git 
a/seatunnel-plugin-discovery/src/test/resources/home/connectors/plugin-mapping.properties
 
b/seatunnel-plugin-discovery/src/test/resources/home/connectors/plugin-mapping.properties
new file mode 100644
index 000000000..b3f9707aa
--- /dev/null
+++ 
b/seatunnel-plugin-discovery/src/test/resources/home/connectors/plugin-mapping.properties
@@ -0,0 +1,147 @@
+#
+# 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.
+#
+
+# This mapping is used to resolve the Jar package name without version (or 
call artifactId)
+# corresponding to the module in the user Config, helping SeaTunnel to load 
the correct Jar package.
+
+# Flink Source
+flink.source.DruidSource = seatunnel-connector-flink-druid
+flink.source.FakeSource = seatunnel-connector-flink-fake
+flink.source.FakeSourceStream = seatunnel-connector-flink-fake
+flink.source.FileSource = seatunnel-connector-flink-file
+flink.source.InfluxDbSource = seatunnel-connector-flink-influxdb
+flink.source.JdbcSource = seatunnel-connector-flink-jdbc
+flink.source.KafkaTableStream = seatunnel-connector-flink-kafka
+flink.source.SocketStream = seatunnel-connector-flink-socket
+flink.source.Http = seatunnel-connector-flink-http
+
+# Flink Sink
+
+flink.sink.Clickhouse = seatunnel-connector-flink-clickhouse
+flink.sink.ClickhouseFile = seatunnel-connector-flink-clickhouse
+flink.sink.ConsoleSink = seatunnel-connector-flink-console
+flink.sink.DorisSink = seatunnel-connector-flink-doris
+flink.sink.DruidSink = seatunnel-connector-flink-druid
+flink.sink.ElasticSearch = seatunnel-connector-flink-elasticsearch7
+flink.sink.FileSink = seatunnel-connector-flink-file
+flink.sink.InfluxDbSink = seatunnel-connector-flink-influxdb
+flink.sink.JdbcSink = seatunnel-connector-flink-jdbc
+flink.sink.Kafka = seatunnel-connector-flink-kafka
+flink.sink.AssertSink = seatunnel-connector-flink-assert
+
+# Spark Source
+
+spark.source.ElasticSearch = seatunnel-connector-spark-elasticsearch
+spark.source.Fake = seatunnel-connector-spark-fake
+spark.source.FakeStream = seatunnel-connector-spark-fake
+spark.source.FeishuSheet = seatunnel-connector-spark-feishu
+spark.source.File = seatunnel-connector-spark-file
+spark.source.Hbase = seatunnel-connector-spark-hbase
+spark.source.Hive = seatunnel-connector-spark-hive
+spark.source.Http = seatunnel-connector-spark-http
+spark.source.Hudi = seatunnel-connector-spark-hudi
+spark.source.Iceberg = seatunnel-connector-spark-iceberg
+spark.source.Jdbc = seatunnel-connector-spark-jdbc
+spark.source.KafkaStream = seatunnel-connector-spark-kafka
+spark.source.Kudu = seatunnel-connector-spark-kudu
+spark.source.MongoDB = seatunnel-connector-spark-mongodb
+spark.source.Neo4j = seatunnel-connector-spark-neo4j
+spark.source.Phoenix = seatunnel-connector-spark-phoenix
+spark.source.Redis = seatunnel-connector-spark-redis
+spark.source.SocketStream = seatunnel-connector-spark-socket
+spark.source.TiDB = seatunnel-connector-spark-tidb
+
+# Spark Sink
+
+spark.sink.Clickhouse = seatunnel-connector-spark-clickhouse
+spark.sink.ClickhouseFile = seatunnel-connector-spark-clickhouse
+spark.sink.Console = seatunnel-connector-spark-console
+spark.sink.Doris = seatunnel-connector-spark-doris
+spark.sink.ElasticSearch = seatunnel-connector-spark-elasticsearch
+spark.sink.Email = seatunnel-connector-spark-email
+spark.sink.File = seatunnel-connector-spark-file
+spark.sink.Hbase = seatunnel-connector-spark-hbase
+spark.sink.Hive = seatunnel-connector-spark-hive
+spark.sink.Hudi = seatunnel-connector-spark-hudi
+spark.sink.Iceberg = seatunnel-connector-spark-iceberg
+spark.sink.Jdbc = seatunnel-connector-spark-jdbc
+spark.sink.Kafka = seatunnel-connector-spark-kafka
+spark.sink.Kudu = seatunnel-connector-spark-kudu
+spark.sink.MongoDB = seatunnel-connector-spark-mongodb
+spark.sink.Phoenix = seatunnel-connector-spark-phoenix
+spark.sink.Redis = seatunnel-connector-spark-redis
+spark.sink.TiDB = seatunnel-connector-spark-tidb
+
+# SeaTunnel new connector API
+
+seatunnel.source.FakeSource = connector-fake
+seatunnel.sink.Console = connector-console
+seatunnel.sink.Assert = connector-assert
+seatunnel.source.Kafka = connector-kafka
+seatunnel.sink.Kafka = connector-kafka
+seatunnel.source.Http = connector-http-base
+seatunnel.sink.Http = connector-http-base
+seatunnel.sink.Feishu = connector-http-feishu
+seatunnel.source.Socket = connector-socket
+seatunnel.sink.Hive = connector-hive
+seatunnel.source.Hive = connector-hive
+seatunnel.source.Clickhouse = connector-clickhouse
+seatunnel.sink.Clickhouse = connector-clickhouse
+seatunnel.sink.ClickhouseFile = connector-clickhouse
+seatunnel.source.Jdbc = connector-jdbc
+seatunnel.sink.Jdbc = connector-jdbc
+seatunnel.source.Kudu = connector-kudu
+seatunnel.sink.Kudu = connector-kudu
+seatunnel.sink.Email = connector-email
+seatunnel.source.HdfsFile = connector-file-hadoop
+seatunnel.sink.HdfsFile = connector-file-hadoop
+seatunnel.source.LocalFile = connector-file-local
+seatunnel.sink.LocalFile = connector-file-local
+seatunnel.source.OssFile = connector-file-oss
+seatunnel.sink.OssFile = connector-file-oss
+seatunnel.source.Pulsar = connector-pulsar
+seatunnel.source.Hudi = connector-hudi
+seatunnel.sink.DingTalk = connector-dingtalk
+seatunnel.source.Elasticsearch = connector-elasticsearch
+seatunnel.sink.Elasticsearch = connector-elasticsearch
+seatunnel.source.IoTDB = connector-iotdb
+seatunnel.sink.IoTDB = connector-iotdb
+seatunnel.source.Neo4j = connector-neo4j
+seatunnel.sink.Neo4j = connector-neo4j
+seatunnel.source.FtpFile = connector-file-ftp
+seatunnel.sink.FtpFile = connector-file-ftp
+seatunnel.source.SftpFile = connector-file-sftp
+seatunnel.sink.SftpFile = connector-file-sftp
+seatunnel.sink.Socket = connector-socket
+seatunnel.source.Redis = connector-redis
+seatunnel.sink.Redis = connector-redis
+seatunnel.sink.DataHub = connector-datahub
+seatunnel.sink.Sentry = connector-sentry
+seatunnel.source.MongoDB = connector-mongodb
+seatunnel.sink.MongoDB = connector-mongodb
+seatunnel.source.Iceberg = connector-iceberg
+seatunnel.source.InfluxDB = connector-influxdb
+seatunnel.source.S3File = connector-file-s3
+seatunnel.sink.S3File = connector-file-s3
+seatunnel.source.AmazonDynamodb = connector-amazondynamodb
+seatunnel.sink.AmazonDynamodb = connector-amazondynamodb
+seatunnel.source.Cassandra = connector-cassandra
+seatunnel.sink.Cassandra = connector-cassandra
+seatunnel.sink.StarRocks = connector-starrocks
+seatunnel.source.MyHours = connector-http-myhours
+seatunnel.sink.InfluxDB = connector-influxdb
+seatunnel.source.GoogleSheets = connector-google-sheets

Reply via email to