From 0bfa7c5ab492c1db3bca8ee587d0aaf9249890cc Mon Sep 17 00:00:00 2001 From: EricGao888 Date: Fri, 22 Mar 2024 22:26:18 +0800 Subject: [PATCH 1/8] use safe constructor with snake yaml --- .../plugin/task/api/k8s/AbstractK8sTaskExecutor.java | 3 ++- .../loop/template/http/parser/HttpTaskDefinitionParser.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java index 1313dc23a65c..786e3d6f4261 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java @@ -26,6 +26,7 @@ import java.util.Map; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.SafeConstructor; public abstract class AbstractK8sTaskExecutor { @@ -36,7 +37,7 @@ public abstract class AbstractK8sTaskExecutor { protected AbstractK8sTaskExecutor(TaskExecutionContext taskRequest) { this.taskRequest = taskRequest; this.k8sUtils = new K8sUtils(); - this.yaml = new Yaml(); + this.yaml = new Yaml(new SafeConstructor()); this.taskOutputParams = new HashMap<>(); } public Map getTaskOutputParams() { diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java index b00942fbd528..7d9101540467 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java @@ -32,7 +32,7 @@ import lombok.NonNull; import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.constructor.SafeConstructor; import com.google.common.base.Preconditions; @@ -60,7 +60,7 @@ public class HttpTaskDefinitionParser implements TaskDefinitionParser Date: Fri, 22 Mar 2024 22:57:52 +0800 Subject: [PATCH 2/8] revert changes to HttpTaskDefinitionParser --- .../loop/template/http/parser/HttpTaskDefinitionParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java index 7d9101540467..b00942fbd528 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java @@ -32,7 +32,7 @@ import lombok.NonNull; import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.constructor.Constructor; import com.google.common.base.Preconditions; @@ -60,7 +60,7 @@ public class HttpTaskDefinitionParser implements TaskDefinitionParser Date: Sat, 23 Mar 2024 23:18:47 +0800 Subject: [PATCH 3/8] introduce ClassFilterConstructor utility class --- .../common/utils/ClassFilterConstructor.java | 46 +++++++++++++++++++ .../task/api/k8s/AbstractK8sTaskExecutor.java | 6 ++- .../http/parser/HttpTaskDefinitionParser.java | 5 +- 3 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java new file mode 100644 index 000000000000..3a66f582f7da --- /dev/null +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java @@ -0,0 +1,46 @@ +/* + * 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.dolphinscheduler.common.utils; + +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.constructor.Constructor; + +/** + * Whitelist constructor implementation for YAML snake. + * Copied from Apache ShardingSphere and Apache Skywalking. + */ +public final class ClassFilterConstructor extends Constructor { + + private final Class[] acceptClasses; + + public ClassFilterConstructor(final Class[] acceptClasses) { + super(new LoaderOptions()); + this.acceptClasses = acceptClasses; + } + + @Override + protected Class getClassForName(final String name) throws ClassNotFoundException { + for (Class each : acceptClasses) { + if (name.equals(each.getName())) { + return super.getClassForName(name); + } + } + throw new IllegalArgumentException(String.format("Class is not accepted: %s", name)); + } +} diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java index 786e3d6f4261..e9e184510dc3 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java @@ -17,12 +17,14 @@ package org.apache.dolphinscheduler.plugin.task.api.k8s; +import org.apache.dolphinscheduler.common.utils.ClassFilterConstructor; import org.apache.dolphinscheduler.plugin.task.api.TaskException; import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext; import org.apache.dolphinscheduler.plugin.task.api.model.TaskResponse; import org.apache.dolphinscheduler.plugin.task.api.utils.K8sUtils; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.yaml.snakeyaml.Yaml; @@ -37,7 +39,9 @@ public abstract class AbstractK8sTaskExecutor { protected AbstractK8sTaskExecutor(TaskExecutionContext taskRequest) { this.taskRequest = taskRequest; this.k8sUtils = new K8sUtils(); - this.yaml = new Yaml(new SafeConstructor()); + this.yaml = new Yaml(new ClassFilterConstructor(new Class[] { + List.class + })); this.taskOutputParams = new HashMap<>(); } public Map getTaskOutputParams() { diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java index b00942fbd528..f4a9fed1ce19 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java @@ -17,6 +17,7 @@ package org.apache.dolphinscheduler.plugin.task.api.loop.template.http.parser; +import org.apache.dolphinscheduler.common.utils.ClassFilterConstructor; import org.apache.dolphinscheduler.plugin.task.api.loop.template.LoopTaskYamlDefinition; import org.apache.dolphinscheduler.plugin.task.api.loop.template.TaskDefinitionParser; import org.apache.dolphinscheduler.plugin.task.api.loop.template.http.HttpLoopTaskDefinition; @@ -60,9 +61,9 @@ public class HttpTaskDefinitionParser implements TaskDefinitionParser Date: Sat, 23 Mar 2024 23:25:03 +0800 Subject: [PATCH 4/8] fix style error --- .../plugin/task/api/k8s/AbstractK8sTaskExecutor.java | 5 ++--- .../loop/template/http/parser/HttpTaskDefinitionParser.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java index e9e184510dc3..4e8b56031bb6 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java @@ -28,7 +28,6 @@ import java.util.Map; import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.SafeConstructor; public abstract class AbstractK8sTaskExecutor { @@ -39,8 +38,8 @@ public abstract class AbstractK8sTaskExecutor { protected AbstractK8sTaskExecutor(TaskExecutionContext taskRequest) { this.taskRequest = taskRequest; this.k8sUtils = new K8sUtils(); - this.yaml = new Yaml(new ClassFilterConstructor(new Class[] { - List.class + this.yaml = new Yaml(new ClassFilterConstructor(new Class[]{ + List.class })); this.taskOutputParams = new HashMap<>(); } diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java index f4a9fed1ce19..826559eccd28 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java @@ -33,7 +33,6 @@ import lombok.NonNull; import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; import com.google.common.base.Preconditions; @@ -62,8 +61,8 @@ public class HttpTaskDefinitionParser implements TaskDefinitionParser Date: Mon, 25 Mar 2024 14:37:22 +0800 Subject: [PATCH 5/8] update --- .../dolphinscheduler/common/utils/ClassFilterConstructor.java | 4 ++++ .../loop/template/http/parser/HttpTaskDefinitionParser.java | 2 +- .../template/http/parser/HttpTaskDefinitionParserTest.java | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java index 3a66f582f7da..bf127d14bb9d 100644 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/ClassFilterConstructor.java @@ -18,6 +18,8 @@ package org.apache.dolphinscheduler.common.utils; +import lombok.extern.slf4j.Slf4j; + import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.constructor.Constructor; @@ -25,6 +27,7 @@ * Whitelist constructor implementation for YAML snake. * Copied from Apache ShardingSphere and Apache Skywalking. */ +@Slf4j public final class ClassFilterConstructor extends Constructor { private final Class[] acceptClasses; @@ -38,6 +41,7 @@ public ClassFilterConstructor(final Class[] acceptClasses) { protected Class getClassForName(final String name) throws ClassNotFoundException { for (Class each : acceptClasses) { if (name.equals(each.getName())) { + log.info("name - {} : class - {}", name, super.getClassForName(name)); return super.getClassForName(name); } } diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java index 826559eccd28..942e3c55b531 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java @@ -61,7 +61,7 @@ public class HttpTaskDefinitionParser implements TaskDefinitionParser Date: Tue, 14 May 2024 10:31:54 +0800 Subject: [PATCH 6/8] Add classes maybe parsed recursively --- .../http/parser/HttpTaskDefinitionParser.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java index 942e3c55b531..a9eae27a85ef 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java @@ -29,6 +29,7 @@ import java.io.FileReader; import java.io.IOException; +import java.util.Map; import lombok.NonNull; @@ -61,7 +62,18 @@ public class HttpTaskDefinitionParser implements TaskDefinitionParser Date: Tue, 14 May 2024 11:03:04 +0800 Subject: [PATCH 7/8] Add ut cases to make sure yaml.loadXXX parse file correctly --- .../http/parser/HttpTaskDefinitionParser.java | 20 +++++++++---------- .../task/api/k8s/K8sTaskExecutorTest.java | 9 +++++++++ .../parser/HttpTaskDefinitionParserTest.java | 15 +++++++++++++- .../src/test/resources/mock_loop_task.yaml | 1 + 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java index a9eae27a85ef..b28cd0c301cf 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParser.java @@ -63,16 +63,16 @@ public class HttpTaskDefinitionParser implements TaskDefinitionParser expectedCommands = Arrays.asList("perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"); + List actualCommands = + k8sTaskExecutor.getJob().getSpec().getTemplate().getSpec().getContainers().get(0).getCommand(); + Assertions.assertEquals(expectedCommands, actualCommands); + } + } diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParserTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParserTest.java index a68fa2321196..e25eaf72a1af 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParserTest.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/java/org/apache/dolphinscheduler/plugin/task/api/loop/template/http/parser/HttpTaskDefinitionParserTest.java @@ -20,6 +20,8 @@ import org.apache.dolphinscheduler.plugin.task.api.loop.template.LoopTaskYamlDefinition; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -32,13 +34,24 @@ public class HttpTaskDefinitionParserTest { @Test public void parseYamlConfigFile() throws IOException { LoopTaskYamlDefinition loopTaskYamlDefinition = new HttpTaskDefinitionParser().parseYamlConfigFile(yamlFile); + // check not null Assertions.assertNotNull(loopTaskYamlDefinition); Assertions.assertNotNull(loopTaskYamlDefinition.getService()); + Assertions.assertNotNull(loopTaskYamlDefinition.getService().getName()); + Assertions.assertNotNull(loopTaskYamlDefinition.getService().getType()); + Assertions.assertNotNull(loopTaskYamlDefinition.getService().getApi()); + Assertions.assertNotNull(loopTaskYamlDefinition.getService().getApi().getSubmit()); + Assertions.assertNotNull(loopTaskYamlDefinition.getService().getApi().getQueryState()); + Assertions.assertNotNull(loopTaskYamlDefinition.getService().getApi().getCancel()); + // check data consistency LoopTaskYamlDefinition.LoopTaskServiceYamlDefinition service = loopTaskYamlDefinition.getService(); Assertions.assertEquals("MockService", service.getName()); Assertions.assertEquals("Http", service.getType()); + Map expectedHeaders = new HashMap<>(); + expectedHeaders.put("Content-Type", "text/html"); + expectedHeaders.put("Content-Length", "1234"); Assertions.assertEquals("/api/v1/submit", service.getApi().getSubmit().getUrl()); - Assertions.assertNotNull(service.getApi()); + Assertions.assertEquals(expectedHeaders, service.getApi().getSubmit().getHttpHeaders()); } @Test diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/resources/mock_loop_task.yaml b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/resources/mock_loop_task.yaml index 3f891c805b20..61c98e8632ff 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/resources/mock_loop_task.yaml +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/test/resources/mock_loop_task.yaml @@ -22,6 +22,7 @@ service: url: /api/v1/submit method: POST dataType: Json + httpHeaders: { "Content-Type": "text/html", "Content-Length": "1234" } requestParams: { "taskId": "704" } taskInstanceIdJPath: "$.taskInstanceId[0]" queryState: From f606e310893405e4a871d6085b54e127f273fee8 Mon Sep 17 00:00:00 2001 From: EricGao888 Date: Tue, 14 May 2024 11:05:20 +0800 Subject: [PATCH 8/8] update --- .../plugin/task/api/k8s/AbstractK8sTaskExecutor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java index 4e8b56031bb6..8d3d2513af89 100644 --- a/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java +++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-api/src/main/java/org/apache/dolphinscheduler/plugin/task/api/k8s/AbstractK8sTaskExecutor.java @@ -39,7 +39,8 @@ protected AbstractK8sTaskExecutor(TaskExecutionContext taskRequest) { this.taskRequest = taskRequest; this.k8sUtils = new K8sUtils(); this.yaml = new Yaml(new ClassFilterConstructor(new Class[]{ - List.class + List.class, + String.class })); this.taskOutputParams = new HashMap<>(); }