diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaConsumerCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaConsumerCallExecutorBuilder.java index 379f5127a..555d331d5 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaConsumerCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaConsumerCallExecutorBuilder.java @@ -19,32 +19,21 @@ import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; -import java.util.Optional; -import java.util.function.Consumer; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; public class JavaConsumerCallExecutorBuilder implements CallableTaskBuilder> { - private Consumer consumer; - private Optional> inputClass; - - public void init( + public CallableTaskFactory init( CallJava.CallJavaConsumer task, WorkflowDefinition definition, WorkflowMutablePosition position) { - consumer = task.consumer(); - inputClass = task.inputClass(); + return () -> new JavaConsumerCallExecutor(task.inputClass(), task.consumer()); } @Override public boolean accept(Class clazz) { return CallJava.CallJavaConsumer.class.isAssignableFrom(clazz); } - - @Override - public CallableTask build() { - return new JavaConsumerCallExecutor(inputClass, consumer); - } } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java index 3d5bf9a5d..1c6126b7e 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java @@ -18,37 +18,26 @@ import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallJava.CallJavaContextFunction; -import io.serverlessworkflow.api.types.func.ContextFunction; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; -import java.util.Optional; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; public class JavaContextFunctionCallExecutorBuilder implements CallableTaskBuilder> { - protected ContextFunction function; - protected Optional> inputClass; - protected Optional> outputClass; - @Override public boolean accept(Class clazz) { return CallJava.CallJavaContextFunction.class.isAssignableFrom(clazz); } @Override - public void init( + public CallableTaskFactory init( CallJavaContextFunction task, WorkflowDefinition definition, WorkflowMutablePosition position) { - this.function = task.function(); - this.inputClass = task.inputClass(); - this.outputClass = task.outputClass(); - } - - @Override - public CallableTask build() { - return new JavaContextFunctionCallExecutor(inputClass, outputClass, function); + return () -> + new JavaContextFunctionCallExecutor( + task.inputClass(), task.outputClass(), task.function()); } } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java index d1bba5031..6178ada8c 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java @@ -18,37 +18,26 @@ import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallJava.CallJavaFilterFunction; -import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; -import java.util.Optional; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; public class JavaFilterFunctionCallExecutorBuilder implements CallableTaskBuilder> { - private FilterFunction function; - private Optional> inputClass; - private Optional> outputClass; - @Override public boolean accept(Class clazz) { return CallJava.CallJavaFilterFunction.class.isAssignableFrom(clazz); } @Override - public void init( + public CallableTaskFactory init( CallJavaFilterFunction task, WorkflowDefinition definition, WorkflowMutablePosition position) { - this.function = task.function(); - this.inputClass = task.inputClass(); - this.outputClass = task.outputClass(); - } - - @Override - public CallableTask build() { - return new JavaFilterFunctionCallExecutor<>(inputClass, outputClass, function); + return () -> + new JavaFilterFunctionCallExecutor<>( + task.inputClass(), task.outputClass(), task.function()); } } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFunctionCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFunctionCallExecutorBuilder.java index b0a29caa0..57058bbb3 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFunctionCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFunctionCallExecutorBuilder.java @@ -20,35 +20,23 @@ import io.serverlessworkflow.api.types.func.CallJava.CallJavaFunction; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; -import java.util.Optional; -import java.util.function.Function; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; public class JavaFunctionCallExecutorBuilder implements CallableTaskBuilder> { - protected Function function; - protected Optional> inputClass; - protected Optional> outputClass; - @Override public boolean accept(Class clazz) { return CallJava.CallJavaFunction.class.isAssignableFrom(clazz); } @Override - public void init( + public CallableTaskFactory init( CallJavaFunction task, WorkflowDefinition definition, WorkflowMutablePosition position) { - function = task.function(); - inputClass = task.inputClass(); - outputClass = task.outputClass(); - } - - @Override - public CallableTask build() { - return new JavaFunctionCallExecutor<>(inputClass, outputClass, function); + return () -> + new JavaFunctionCallExecutor<>(task.inputClass(), task.outputClass(), task.function()); } } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionCallExecutorBuilder.java index 9ca65180d..5c95ec611 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionCallExecutorBuilder.java @@ -18,32 +18,22 @@ import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallJava.CallJavaLoopFunction; -import io.serverlessworkflow.api.types.func.LoopFunction; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; public class JavaLoopFunctionCallExecutorBuilder implements CallableTaskBuilder { - private LoopFunction function; - private String varName; - @Override public boolean accept(Class clazz) { return CallJava.CallJavaLoopFunction.class.isAssignableFrom(clazz); } @Override - public void init( + public CallableTaskFactory init( CallJavaLoopFunction task, WorkflowDefinition definition, WorkflowMutablePosition position) { - function = task.function(); - varName = task.varName(); - } - - @Override - public CallableTask build() { - return new JavaLoopFunctionCallExecutor<>(function, varName); + return () -> new JavaLoopFunctionCallExecutor<>(task.function(), task.varName()); } } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionIndexCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionIndexCallExecutorBuilder.java index a59006df2..7e6f0c9d9 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionIndexCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionIndexCallExecutorBuilder.java @@ -18,36 +18,25 @@ import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallJava.CallJavaLoopFunctionIndex; -import io.serverlessworkflow.api.types.func.LoopFunctionIndex; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; public class JavaLoopFunctionIndexCallExecutorBuilder implements CallableTaskBuilder { - private LoopFunctionIndex function; - private String varName; - private String indexName; - @Override public boolean accept(Class clazz) { return CallJava.CallJavaLoopFunctionIndex.class.isAssignableFrom(clazz); } @Override - public void init( + public CallableTaskFactory init( CallJavaLoopFunctionIndex task, WorkflowDefinition definition, WorkflowMutablePosition position) { - function = task.function(); - varName = task.varName(); - indexName = task.indexName(); - } - - @Override - public CallableTask build() { - return new JavaLoopFunctionIndexCallExecutor<>(function, varName, indexName); + return () -> + new JavaLoopFunctionIndexCallExecutor<>(task.function(), task.varName(), task.indexName()); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallFunctionExecutorBuilder.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallFunctionExecutorBuilder.java index f7d66bfd0..1d53ad799 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallFunctionExecutorBuilder.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallFunctionExecutorBuilder.java @@ -33,11 +33,8 @@ public class CallFunctionExecutorBuilder implements CallableTaskBuilder { - private TaskExecutorBuilder executorBuilder; - private WorkflowValueResolver> args; - @Override - public void init( + public CallableTaskFactory init( CallFunction task, WorkflowDefinition definition, WorkflowMutablePosition position) { String functionName = task.getCall(); Use use = definition.workflow().getUse(); @@ -81,14 +78,15 @@ catalogEndpoint, pathFromFunctionName(functionName.substring(0, indexOf))), function = definition.resourceLoader().loadURI(URI.create(functionName), h -> from(definition, h)); } - executorBuilder = + TaskExecutorBuilder executorBuilder = definition.application().taskFactory().getTaskExecutor(position, function, definition); FunctionArguments functionArgs = task.getWith(); - args = + WorkflowValueResolver args = functionArgs != null ? WorkflowUtils.buildMapResolver( definition.application(), functionArgs.getAdditionalProperties()) : (w, t, m) -> Map.of(); + return () -> this.build(executorBuilder, args); } private String pathFromFunctionName(String functionName) { @@ -122,8 +120,8 @@ public boolean accept(Class clazz) { return clazz.equals(CallFunction.class); } - @Override - public CallableTask build() { + private CallableTask build( + TaskExecutorBuilder executorBuilder, WorkflowValueResolver args) { TaskExecutor executor = executorBuilder.build(); return (w, t, m) -> executor diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallTaskExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallTaskExecutor.java index b28d2ad84..fec6bcb7e 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallTaskExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallTaskExecutor.java @@ -30,7 +30,7 @@ public class CallTaskExecutor extends RegularTaskExecutor public static class CallTaskExecutorBuilder extends RegularTaskExecutorBuilder { - private CallableTaskBuilder callableBuilder; + private CallableTaskFactory callableFactory; private List callableProxyBuilders; private CallableTask callable; @@ -44,13 +44,12 @@ protected CallTaskExecutorBuilder( definition.application().callableProxyBuilders().stream() .filter(t -> t.accept(task)) .toList(); - callableBuilder.init(task, definition, position); - this.callableBuilder = callableBuilder; + this.callableFactory = callableBuilder.init(task, definition, position); } @Override public CallTaskExecutor buildInstance() { - this.callable = callableBuilder.build(); + this.callable = callableFactory.get(); for (CallableTaskProxyBuilder callableBuilder : callableProxyBuilders) { this.callable = callableBuilder.build(callable); } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskBuilder.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskBuilder.java index 5fb010455..ae8ed60f8 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskBuilder.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskBuilder.java @@ -24,7 +24,5 @@ public interface CallableTaskBuilder extends ServicePriority boolean accept(Class clazz); - void init(T task, WorkflowDefinition definition, WorkflowMutablePosition position); - - CallableTask build(); + CallableTaskFactory init(T task, WorkflowDefinition definition, WorkflowMutablePosition position); } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskFactory.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskFactory.java new file mode 100644 index 000000000..baac373fc --- /dev/null +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskFactory.java @@ -0,0 +1,21 @@ +/* + * Copyright 2020-Present The Serverless Workflow Specification Authors + * + * Licensed 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 io.serverlessworkflow.impl.executors; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface CallableTaskFactory extends Supplier {} diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DefaultTaskExecutorFactory.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DefaultTaskExecutorFactory.java index 105f95328..dd41652bc 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DefaultTaskExecutorFactory.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DefaultTaskExecutorFactory.java @@ -32,6 +32,7 @@ import io.serverlessworkflow.impl.executors.SwitchExecutor.SwitchExecutorBuilder; import io.serverlessworkflow.impl.executors.TryExecutor.TryExecutorBuilder; import io.serverlessworkflow.impl.executors.WaitExecutor.WaitExecutorBuilder; +import java.util.Collection; import java.util.ServiceLoader; import java.util.ServiceLoader.Provider; @@ -45,8 +46,8 @@ public static TaskExecutorFactory get() { protected DefaultTaskExecutorFactory() {} - private ServiceLoader callTasks = - ServiceLoader.load(CallableTaskBuilder.class); + private Collection callTasks = + ServiceLoader.load(CallableTaskBuilder.class).stream().map(Provider::get).toList(); @Override public TaskExecutorBuilder getTaskExecutor( @@ -88,10 +89,11 @@ public TaskExecutorBuilder getTaskExecutor( private CallableTaskBuilder findCallTask(Class clazz) { return (CallableTaskBuilder) callTasks.stream() - .map(Provider::get) .filter(s -> s.accept(clazz)) .findAny() .orElseThrow( - () -> new UnsupportedOperationException(clazz.getName() + " not supported yet")); + () -> + new UnsupportedOperationException( + clazz.getName() + " not accepted by any of these builders " + callTasks)); } } diff --git a/impl/grpc/src/main/java/io/serverlessworkflow/impl/executors/grpc/GrpcExecutorBuilder.java b/impl/grpc/src/main/java/io/serverlessworkflow/impl/executors/grpc/GrpcExecutorBuilder.java index 0e4f39c6d..1f9df38ed 100644 --- a/impl/grpc/src/main/java/io/serverlessworkflow/impl/executors/grpc/GrpcExecutorBuilder.java +++ b/impl/grpc/src/main/java/io/serverlessworkflow/impl/executors/grpc/GrpcExecutorBuilder.java @@ -23,44 +23,37 @@ import io.serverlessworkflow.impl.WorkflowMutablePosition; import io.serverlessworkflow.impl.WorkflowUtils; import io.serverlessworkflow.impl.WorkflowValueResolver; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; import java.util.Map; public class GrpcExecutorBuilder implements CallableTaskBuilder { - private GrpcRequestContext grpcRequestContext; - private FileDescriptorContext fileDescriptorContext; - private WorkflowValueResolver> arguments; - @Override public boolean accept(Class clazz) { return clazz.equals(CallGRPC.class); } @Override - public void init(CallGRPC task, WorkflowDefinition definition, WorkflowMutablePosition position) { + public CallableTaskFactory init( + CallGRPC task, WorkflowDefinition definition, WorkflowMutablePosition position) { GRPCArguments with = task.getWith(); WithGRPCService service = with.getService(); - this.arguments = + WorkflowValueResolver> arguments = WorkflowUtils.buildMapResolver( definition.application(), with.getArguments() != null ? with.getArguments().getAdditionalProperties() : Map.of()); - this.grpcRequestContext = + GrpcRequestContext grpcRequestContext = new GrpcRequestContext( service.getHost(), service.getPort(), with.getMethod(), service.getName()); - this.fileDescriptorContext = + FileDescriptorContext fileDescriptorContext = definition .resourceLoader() .loadStatic(with.getProto().getEndpoint(), FileDescriptorReader::readDescriptor); - } - - @Override - public CallableTask build() { - return new GrpcExecutor(this.grpcRequestContext, this.arguments, this.fileDescriptorContext); + return () -> new GrpcExecutor(grpcRequestContext, arguments, fileDescriptorContext); } } diff --git a/impl/http/src/main/java/io/serverlessworkflow/impl/executors/http/CallableTaskHttpExecutorBuilder.java b/impl/http/src/main/java/io/serverlessworkflow/impl/executors/http/CallableTaskHttpExecutorBuilder.java index a5b3eb046..5f45f5562 100644 --- a/impl/http/src/main/java/io/serverlessworkflow/impl/executors/http/CallableTaskHttpExecutorBuilder.java +++ b/impl/http/src/main/java/io/serverlessworkflow/impl/executors/http/CallableTaskHttpExecutorBuilder.java @@ -24,19 +24,17 @@ import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; import io.serverlessworkflow.impl.WorkflowValueResolver; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; import java.net.URI; public class CallableTaskHttpExecutorBuilder implements CallableTaskBuilder { - private HttpExecutorBuilder builder; - private WorkflowValueResolver uriSupplier; - @Override - public void init(CallHTTP task, WorkflowDefinition definition, WorkflowMutablePosition position) { + public CallableTaskFactory init( + CallHTTP task, WorkflowDefinition definition, WorkflowMutablePosition position) { - builder = HttpExecutorBuilder.builder(definition); + HttpExecutorBuilder builder = HttpExecutorBuilder.builder(definition); final HTTPArguments httpArgs = task.getWith(); final Endpoint endpoint = httpArgs.getEndpoint(); @@ -44,7 +42,7 @@ public void init(CallHTTP task, WorkflowDefinition definition, WorkflowMutablePo builder.withAuth(endpoint.getEndpointConfiguration().getAuthentication()); } - uriSupplier = definition.resourceLoader().uriSupplier(endpoint); + WorkflowValueResolver uriSupplier = definition.resourceLoader().uriSupplier(endpoint); if (httpArgs.getHeaders() != null) { builder.withHeaders( @@ -69,15 +67,11 @@ public void init(CallHTTP task, WorkflowDefinition definition, WorkflowMutablePo builder.withBody(httpArgs.getBody()); builder.withMethod(httpArgs.getMethod().toUpperCase()); builder.redirect(httpArgs.isRedirect()); + return () -> builder.build(uriSupplier); } @Override public boolean accept(Class clazz) { return clazz.equals(CallHTTP.class); } - - @Override - public CallableTask build() { - return builder.build(uriSupplier); - } } diff --git a/impl/openapi/src/main/java/io/serverlessworkflow/impl/executors/openapi/OpenAPIExecutorBuilder.java b/impl/openapi/src/main/java/io/serverlessworkflow/impl/executors/openapi/OpenAPIExecutorBuilder.java index c2a3fabbd..8c7cd11be 100644 --- a/impl/openapi/src/main/java/io/serverlessworkflow/impl/executors/openapi/OpenAPIExecutorBuilder.java +++ b/impl/openapi/src/main/java/io/serverlessworkflow/impl/executors/openapi/OpenAPIExecutorBuilder.java @@ -21,41 +21,32 @@ import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; -import io.serverlessworkflow.impl.executors.CallableTask; import io.serverlessworkflow.impl.executors.CallableTaskBuilder; +import io.serverlessworkflow.impl.executors.CallableTaskFactory; import io.serverlessworkflow.impl.executors.http.HttpExecutorBuilder; import java.util.Map; public class OpenAPIExecutorBuilder implements CallableTaskBuilder { - private OpenAPIProcessor processor; - private ExternalResource resource; - private Map parameters; - private HttpExecutorBuilder builder; - @Override public boolean accept(Class clazz) { return clazz.equals(CallOpenAPI.class); } @Override - public void init( + public CallableTaskFactory init( CallOpenAPI task, WorkflowDefinition definition, WorkflowMutablePosition position) { OpenAPIArguments with = task.getWith(); - this.processor = new OpenAPIProcessor(with.getOperationId()); - this.resource = with.getDocument(); - this.parameters = + OpenAPIProcessor processor = new OpenAPIProcessor(with.getOperationId()); + ExternalResource resource = with.getDocument(); + Map parameters = with.getParameters() != null && with.getParameters().getAdditionalProperties() != null ? with.getParameters().getAdditionalProperties() : Map.of(); - this.builder = + HttpExecutorBuilder builder = HttpExecutorBuilder.builder(definition) .withAuth(with.getAuthentication()) .redirect(with.isRedirect()); - } - - @Override - public CallableTask build() { - return new OpenAPIExecutor(processor, resource, parameters, builder); + return () -> new OpenAPIExecutor(processor, resource, parameters, builder); } }