Skip to content

Commit cb713b5

Browse files
authored
[Fix #1408] Do not rely on ServiceLoader instance creation (#1409)
Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent 5c0cf06 commit cb713b5

14 files changed

Lines changed: 81 additions & 151 deletions

File tree

experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaConsumerCallExecutorBuilder.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,21 @@
1919
import io.serverlessworkflow.api.types.func.CallJava;
2020
import io.serverlessworkflow.impl.WorkflowDefinition;
2121
import io.serverlessworkflow.impl.WorkflowMutablePosition;
22-
import io.serverlessworkflow.impl.executors.CallableTask;
2322
import io.serverlessworkflow.impl.executors.CallableTaskBuilder;
24-
import java.util.Optional;
25-
import java.util.function.Consumer;
23+
import io.serverlessworkflow.impl.executors.CallableTaskFactory;
2624

2725
public class JavaConsumerCallExecutorBuilder<T>
2826
implements CallableTaskBuilder<CallJava.CallJavaConsumer<T>> {
2927

30-
private Consumer<T> consumer;
31-
private Optional<Class<T>> inputClass;
32-
33-
public void init(
28+
public CallableTaskFactory init(
3429
CallJava.CallJavaConsumer<T> task,
3530
WorkflowDefinition definition,
3631
WorkflowMutablePosition position) {
37-
consumer = task.consumer();
38-
inputClass = task.inputClass();
32+
return () -> new JavaConsumerCallExecutor<T>(task.inputClass(), task.consumer());
3933
}
4034

4135
@Override
4236
public boolean accept(Class<? extends TaskBase> clazz) {
4337
return CallJava.CallJavaConsumer.class.isAssignableFrom(clazz);
4438
}
45-
46-
@Override
47-
public CallableTask build() {
48-
return new JavaConsumerCallExecutor<T>(inputClass, consumer);
49-
}
5039
}

experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,26 @@
1818
import io.serverlessworkflow.api.types.TaskBase;
1919
import io.serverlessworkflow.api.types.func.CallJava;
2020
import io.serverlessworkflow.api.types.func.CallJava.CallJavaContextFunction;
21-
import io.serverlessworkflow.api.types.func.ContextFunction;
2221
import io.serverlessworkflow.impl.WorkflowDefinition;
2322
import io.serverlessworkflow.impl.WorkflowMutablePosition;
24-
import io.serverlessworkflow.impl.executors.CallableTask;
2523
import io.serverlessworkflow.impl.executors.CallableTaskBuilder;
26-
import java.util.Optional;
24+
import io.serverlessworkflow.impl.executors.CallableTaskFactory;
2725

2826
public class JavaContextFunctionCallExecutorBuilder<T, V>
2927
implements CallableTaskBuilder<CallJava.CallJavaContextFunction<T, V>> {
3028

31-
protected ContextFunction<T, V> function;
32-
protected Optional<Class<T>> inputClass;
33-
protected Optional<Class<V>> outputClass;
34-
3529
@Override
3630
public boolean accept(Class<? extends TaskBase> clazz) {
3731
return CallJava.CallJavaContextFunction.class.isAssignableFrom(clazz);
3832
}
3933

4034
@Override
41-
public void init(
35+
public CallableTaskFactory init(
4236
CallJavaContextFunction<T, V> task,
4337
WorkflowDefinition definition,
4438
WorkflowMutablePosition position) {
45-
this.function = task.function();
46-
this.inputClass = task.inputClass();
47-
this.outputClass = task.outputClass();
48-
}
49-
50-
@Override
51-
public CallableTask build() {
52-
return new JavaContextFunctionCallExecutor<T, V>(inputClass, outputClass, function);
39+
return () ->
40+
new JavaContextFunctionCallExecutor<T, V>(
41+
task.inputClass(), task.outputClass(), task.function());
5342
}
5443
}

experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,26 @@
1818
import io.serverlessworkflow.api.types.TaskBase;
1919
import io.serverlessworkflow.api.types.func.CallJava;
2020
import io.serverlessworkflow.api.types.func.CallJava.CallJavaFilterFunction;
21-
import io.serverlessworkflow.api.types.func.FilterFunction;
2221
import io.serverlessworkflow.impl.WorkflowDefinition;
2322
import io.serverlessworkflow.impl.WorkflowMutablePosition;
24-
import io.serverlessworkflow.impl.executors.CallableTask;
2523
import io.serverlessworkflow.impl.executors.CallableTaskBuilder;
26-
import java.util.Optional;
24+
import io.serverlessworkflow.impl.executors.CallableTaskFactory;
2725

2826
public class JavaFilterFunctionCallExecutorBuilder<T, V>
2927
implements CallableTaskBuilder<CallJava.CallJavaFilterFunction<T, V>> {
3028

31-
private FilterFunction<T, V> function;
32-
private Optional<Class<T>> inputClass;
33-
private Optional<Class<V>> outputClass;
34-
3529
@Override
3630
public boolean accept(Class<? extends TaskBase> clazz) {
3731
return CallJava.CallJavaFilterFunction.class.isAssignableFrom(clazz);
3832
}
3933

4034
@Override
41-
public void init(
35+
public CallableTaskFactory init(
4236
CallJavaFilterFunction<T, V> task,
4337
WorkflowDefinition definition,
4438
WorkflowMutablePosition position) {
45-
this.function = task.function();
46-
this.inputClass = task.inputClass();
47-
this.outputClass = task.outputClass();
48-
}
49-
50-
@Override
51-
public CallableTask build() {
52-
return new JavaFilterFunctionCallExecutor<>(inputClass, outputClass, function);
39+
return () ->
40+
new JavaFilterFunctionCallExecutor<>(
41+
task.inputClass(), task.outputClass(), task.function());
5342
}
5443
}

experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFunctionCallExecutorBuilder.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,23 @@
2020
import io.serverlessworkflow.api.types.func.CallJava.CallJavaFunction;
2121
import io.serverlessworkflow.impl.WorkflowDefinition;
2222
import io.serverlessworkflow.impl.WorkflowMutablePosition;
23-
import io.serverlessworkflow.impl.executors.CallableTask;
2423
import io.serverlessworkflow.impl.executors.CallableTaskBuilder;
25-
import java.util.Optional;
26-
import java.util.function.Function;
24+
import io.serverlessworkflow.impl.executors.CallableTaskFactory;
2725

2826
public class JavaFunctionCallExecutorBuilder<T, V>
2927
implements CallableTaskBuilder<CallJava.CallJavaFunction<T, V>> {
3028

31-
protected Function<T, V> function;
32-
protected Optional<Class<T>> inputClass;
33-
protected Optional<Class<V>> outputClass;
34-
3529
@Override
3630
public boolean accept(Class<? extends TaskBase> clazz) {
3731
return CallJava.CallJavaFunction.class.isAssignableFrom(clazz);
3832
}
3933

4034
@Override
41-
public void init(
35+
public CallableTaskFactory init(
4236
CallJavaFunction<T, V> task,
4337
WorkflowDefinition definition,
4438
WorkflowMutablePosition position) {
45-
function = task.function();
46-
inputClass = task.inputClass();
47-
outputClass = task.outputClass();
48-
}
49-
50-
@Override
51-
public CallableTask build() {
52-
return new JavaFunctionCallExecutor<>(inputClass, outputClass, function);
39+
return () ->
40+
new JavaFunctionCallExecutor<>(task.inputClass(), task.outputClass(), task.function());
5341
}
5442
}

experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionCallExecutorBuilder.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,22 @@
1818
import io.serverlessworkflow.api.types.TaskBase;
1919
import io.serverlessworkflow.api.types.func.CallJava;
2020
import io.serverlessworkflow.api.types.func.CallJava.CallJavaLoopFunction;
21-
import io.serverlessworkflow.api.types.func.LoopFunction;
2221
import io.serverlessworkflow.impl.WorkflowDefinition;
2322
import io.serverlessworkflow.impl.WorkflowMutablePosition;
24-
import io.serverlessworkflow.impl.executors.CallableTask;
2523
import io.serverlessworkflow.impl.executors.CallableTaskBuilder;
24+
import io.serverlessworkflow.impl.executors.CallableTaskFactory;
2625

2726
public class JavaLoopFunctionCallExecutorBuilder
2827
implements CallableTaskBuilder<CallJava.CallJavaLoopFunction> {
2928

30-
private LoopFunction function;
31-
private String varName;
32-
3329
@Override
3430
public boolean accept(Class<? extends TaskBase> clazz) {
3531
return CallJava.CallJavaLoopFunction.class.isAssignableFrom(clazz);
3632
}
3733

3834
@Override
39-
public void init(
35+
public CallableTaskFactory init(
4036
CallJavaLoopFunction task, WorkflowDefinition definition, WorkflowMutablePosition position) {
41-
function = task.function();
42-
varName = task.varName();
43-
}
44-
45-
@Override
46-
public CallableTask build() {
47-
return new JavaLoopFunctionCallExecutor<>(function, varName);
37+
return () -> new JavaLoopFunctionCallExecutor<>(task.function(), task.varName());
4838
}
4939
}

experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaLoopFunctionIndexCallExecutorBuilder.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,25 @@
1818
import io.serverlessworkflow.api.types.TaskBase;
1919
import io.serverlessworkflow.api.types.func.CallJava;
2020
import io.serverlessworkflow.api.types.func.CallJava.CallJavaLoopFunctionIndex;
21-
import io.serverlessworkflow.api.types.func.LoopFunctionIndex;
2221
import io.serverlessworkflow.impl.WorkflowDefinition;
2322
import io.serverlessworkflow.impl.WorkflowMutablePosition;
24-
import io.serverlessworkflow.impl.executors.CallableTask;
2523
import io.serverlessworkflow.impl.executors.CallableTaskBuilder;
24+
import io.serverlessworkflow.impl.executors.CallableTaskFactory;
2625

2726
public class JavaLoopFunctionIndexCallExecutorBuilder
2827
implements CallableTaskBuilder<CallJava.CallJavaLoopFunctionIndex> {
2928

30-
private LoopFunctionIndex function;
31-
private String varName;
32-
private String indexName;
33-
3429
@Override
3530
public boolean accept(Class<? extends TaskBase> clazz) {
3631
return CallJava.CallJavaLoopFunctionIndex.class.isAssignableFrom(clazz);
3732
}
3833

3934
@Override
40-
public void init(
35+
public CallableTaskFactory init(
4136
CallJavaLoopFunctionIndex task,
4237
WorkflowDefinition definition,
4338
WorkflowMutablePosition position) {
44-
function = task.function();
45-
varName = task.varName();
46-
indexName = task.indexName();
47-
}
48-
49-
@Override
50-
public CallableTask build() {
51-
return new JavaLoopFunctionIndexCallExecutor<>(function, varName, indexName);
39+
return () ->
40+
new JavaLoopFunctionIndexCallExecutor<>(task.function(), task.varName(), task.indexName());
5241
}
5342
}

impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallFunctionExecutorBuilder.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@
3333

3434
public class CallFunctionExecutorBuilder implements CallableTaskBuilder<CallFunction> {
3535

36-
private TaskExecutorBuilder<? extends TaskBase> executorBuilder;
37-
private WorkflowValueResolver<Map<String, Object>> args;
38-
3936
@Override
40-
public void init(
37+
public CallableTaskFactory init(
4138
CallFunction task, WorkflowDefinition definition, WorkflowMutablePosition position) {
4239
String functionName = task.getCall();
4340
Use use = definition.workflow().getUse();
@@ -81,14 +78,15 @@ catalogEndpoint, pathFromFunctionName(functionName.substring(0, indexOf))),
8178
function =
8279
definition.resourceLoader().loadURI(URI.create(functionName), h -> from(definition, h));
8380
}
84-
executorBuilder =
81+
TaskExecutorBuilder<? extends TaskBase> executorBuilder =
8582
definition.application().taskFactory().getTaskExecutor(position, function, definition);
8683
FunctionArguments functionArgs = task.getWith();
87-
args =
84+
WorkflowValueResolver<?> args =
8885
functionArgs != null
8986
? WorkflowUtils.buildMapResolver(
9087
definition.application(), functionArgs.getAdditionalProperties())
9188
: (w, t, m) -> Map.of();
89+
return () -> this.build(executorBuilder, args);
9290
}
9391

9492
private String pathFromFunctionName(String functionName) {
@@ -122,8 +120,8 @@ public boolean accept(Class<? extends TaskBase> clazz) {
122120
return clazz.equals(CallFunction.class);
123121
}
124122

125-
@Override
126-
public CallableTask build() {
123+
private CallableTask build(
124+
TaskExecutorBuilder<? extends TaskBase> executorBuilder, WorkflowValueResolver<?> args) {
127125
TaskExecutor<? extends TaskBase> executor = executorBuilder.build();
128126
return (w, t, m) ->
129127
executor

impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallTaskExecutor.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class CallTaskExecutor<T extends TaskBase> extends RegularTaskExecutor<T>
3030

3131
public static class CallTaskExecutorBuilder<T extends TaskBase>
3232
extends RegularTaskExecutorBuilder<T> {
33-
private CallableTaskBuilder<T> callableBuilder;
33+
private CallableTaskFactory callableFactory;
3434
private List<CallableTaskProxyBuilder> callableProxyBuilders;
3535
private CallableTask callable;
3636

@@ -44,13 +44,12 @@ protected CallTaskExecutorBuilder(
4444
definition.application().callableProxyBuilders().stream()
4545
.filter(t -> t.accept(task))
4646
.toList();
47-
callableBuilder.init(task, definition, position);
48-
this.callableBuilder = callableBuilder;
47+
this.callableFactory = callableBuilder.init(task, definition, position);
4948
}
5049

5150
@Override
5251
public CallTaskExecutor<T> buildInstance() {
53-
this.callable = callableBuilder.build();
52+
this.callable = callableFactory.get();
5453
for (CallableTaskProxyBuilder callableBuilder : callableProxyBuilders) {
5554
this.callable = callableBuilder.build(callable);
5655
}

impl/core/src/main/java/io/serverlessworkflow/impl/executors/CallableTaskBuilder.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,5 @@ public interface CallableTaskBuilder<T extends TaskBase> extends ServicePriority
2424

2525
boolean accept(Class<? extends TaskBase> clazz);
2626

27-
void init(T task, WorkflowDefinition definition, WorkflowMutablePosition position);
28-
29-
CallableTask build();
27+
CallableTaskFactory init(T task, WorkflowDefinition definition, WorkflowMutablePosition position);
3028
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.impl.executors;
17+
18+
import java.util.function.Supplier;
19+
20+
@FunctionalInterface
21+
public interface CallableTaskFactory extends Supplier<CallableTask> {}

0 commit comments

Comments
 (0)