From 2e5829d2ca7d6a03a120524b3a63ffdc542faf6c Mon Sep 17 00:00:00 2001 From: fjtirado Date: Wed, 13 Aug 2025 11:05:06 +0200 Subject: [PATCH] [Fix_708] Fixing recursivity when using then loop Signed-off-by: fjtirado --- .../impl/executors/AbstractTaskExecutor.java | 14 +++++++++----- .../impl/executors/CallTaskExecutor.java | 2 +- .../impl/executors/DoExecutor.java | 2 +- .../impl/executors/EmitExecutor.java | 2 +- .../impl/executors/ForExecutor.java | 2 +- .../impl/executors/ForkExecutor.java | 2 +- .../impl/executors/ListenExecutor.java | 2 +- .../impl/executors/RaiseExecutor.java | 2 +- .../impl/executors/RegularTaskExecutor.java | 10 +++++++--- .../impl/executors/SetExecutor.java | 2 +- .../impl/executors/SwitchExecutor.java | 8 ++++++-- .../impl/executors/TryExecutor.java | 2 +- .../impl/executors/WaitExecutor.java | 2 +- .../impl/WorkflowDefinitionTest.java | 4 ++++ .../src/test/resources/switch-then-loop.yaml | 18 ++++++++++++++++++ 15 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 impl/jackson/src/test/resources/switch-then-loop.yaml diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/AbstractTaskExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/AbstractTaskExecutor.java index 9f20cd6c..10b76308 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/AbstractTaskExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/AbstractTaskExecutor.java @@ -61,7 +61,8 @@ public abstract class AbstractTaskExecutor implements TaskEx private final Optional contextSchemaValidator; private final Optional ifFilter; - public abstract static class AbstractTaskExecutorBuilder + public abstract static class AbstractTaskExecutorBuilder< + T extends TaskBase, V extends AbstractTaskExecutor> implements TaskExecutorBuilder { private Optional inputProcessor = Optional.empty(); private Optional outputProcessor = Optional.empty(); @@ -77,7 +78,7 @@ public abstract static class AbstractTaskExecutorBuilder protected final Workflow workflow; protected final ResourceLoader resourceLoader; - private TaskExecutor instance; + private V instance; protected AbstractTaskExecutorBuilder( WorkflowMutablePosition position, @@ -145,17 +146,20 @@ private TaskExecutorBuilder next(Map> connecti return next; } - public TaskExecutor build() { + public V build() { if (instance == null) { instance = buildInstance(); + buildTransition(instance); } return instance; } - protected abstract TaskExecutor buildInstance(); + protected abstract V buildInstance(); + + protected abstract void buildTransition(V instance); } - protected AbstractTaskExecutor(AbstractTaskExecutorBuilder builder) { + protected AbstractTaskExecutor(AbstractTaskExecutorBuilder builder) { this.task = builder.task; this.taskName = builder.taskName; this.position = builder.position; 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 d65859be..60733221 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 @@ -46,7 +46,7 @@ protected CallTaskExecutorBuilder( } @Override - public TaskExecutor buildInstance() { + public CallTaskExecutor buildInstance() { return new CallTaskExecutor<>(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DoExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DoExecutor.java index bc6e5091..23f06e1f 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DoExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/DoExecutor.java @@ -46,7 +46,7 @@ protected DoExecutorBuilder( } @Override - public TaskExecutor buildInstance() { + public DoExecutor buildInstance() { return new DoExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/EmitExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/EmitExecutor.java index e13cfe47..8e858335 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/EmitExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/EmitExecutor.java @@ -61,7 +61,7 @@ protected EmitExecutorBuilder( } @Override - public TaskExecutor buildInstance() { + public EmitExecutor buildInstance() { return new EmitExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java index 65cb578f..2ef9de14 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForExecutor.java @@ -68,7 +68,7 @@ protected WorkflowValueResolver> buildCollectionFilter() { } @Override - public TaskExecutor buildInstance() { + public ForExecutor buildInstance() { return new ForExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForkExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForkExecutor.java index 046b2807..75873e63 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForkExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ForkExecutor.java @@ -62,7 +62,7 @@ protected ForkExecutorBuilder( } @Override - public TaskExecutor buildInstance() { + public ForkExecutor buildInstance() { return new ForkExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ListenExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ListenExecutor.java index 06772d44..347bda9a 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ListenExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/ListenExecutor.java @@ -155,7 +155,7 @@ private EventRegistrationBuilder from(EventFilter filter) { } @Override - public TaskExecutor buildInstance() { + public ListenExecutor buildInstance() { return registrations.isAnd() ? new AndListenExecutor(this) : new OrListenExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RaiseExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RaiseExecutor.java index 2e0b70d4..a4213708 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RaiseExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RaiseExecutor.java @@ -114,7 +114,7 @@ private Error findError(String raiseErrorReference) { } @Override - public TaskExecutor buildInstance() { + public RaiseExecutor buildInstance() { return new RaiseExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RegularTaskExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RegularTaskExecutor.java index 5dbcfd66..30744e71 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RegularTaskExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/RegularTaskExecutor.java @@ -28,15 +28,14 @@ public abstract class RegularTaskExecutor extends AbstractTaskExecutor { - protected final TransitionInfo transition; + protected TransitionInfo transition; protected RegularTaskExecutor(RegularTaskExecutorBuilder builder) { super(builder); - this.transition = TransitionInfo.build(builder.transition); } public abstract static class RegularTaskExecutorBuilder - extends AbstractTaskExecutorBuilder { + extends AbstractTaskExecutorBuilder> { private TransitionInfoBuilder transition; @@ -52,6 +51,11 @@ protected RegularTaskExecutorBuilder( public void connect(Map> connections) { this.transition = next(task.getThen(), connections); } + + @Override + protected void buildTransition(RegularTaskExecutor instance) { + instance.transition = TransitionInfo.build(transition); + } } @Override diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SetExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SetExecutor.java index e4192acb..fda5b6f9 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SetExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SetExecutor.java @@ -54,7 +54,7 @@ protected SetExecutorBuilder( } @Override - public TaskExecutor buildInstance() { + public SetExecutor buildInstance() { return new SetExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SwitchExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SwitchExecutor.java index 944fd4d2..d8d2cc57 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SwitchExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/SwitchExecutor.java @@ -39,7 +39,8 @@ public class SwitchExecutor extends AbstractTaskExecutor { private final Map workflowFilters; private final TransitionInfo defaultTask; - public static class SwitchExecutorBuilder extends AbstractTaskExecutorBuilder { + public static class SwitchExecutorBuilder + extends AbstractTaskExecutorBuilder { private final Map workflowFilters = new HashMap<>(); private Map switchFilters = new HashMap<>(); private FlowDirective defaultDirective; @@ -77,9 +78,12 @@ public void connect(Map> connections) { } @Override - protected TaskExecutor buildInstance() { + protected SwitchExecutor buildInstance() { return new SwitchExecutor(this); } + + @Override + protected void buildTransition(SwitchExecutor ex) {} } @Override diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/TryExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/TryExecutor.java index 5aa2dceb..13d0500b 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/TryExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/TryExecutor.java @@ -77,7 +77,7 @@ protected TryExecutorBuilder( } @Override - public TaskExecutor buildInstance() { + public TryExecutor buildInstance() { return new TryExecutor(this); } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/WaitExecutor.java b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/WaitExecutor.java index 45137d69..afd1e890 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/executors/WaitExecutor.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/executors/WaitExecutor.java @@ -60,7 +60,7 @@ private Duration toLong(DurationInline durationInline) { } @Override - public TaskExecutor buildInstance() { + public WaitExecutor buildInstance() { return new WaitExecutor(this); } } diff --git a/impl/jackson/src/test/java/io/serverlessworkflow/impl/WorkflowDefinitionTest.java b/impl/jackson/src/test/java/io/serverlessworkflow/impl/WorkflowDefinitionTest.java index 8a8e7816..92091f16 100644 --- a/impl/jackson/src/test/java/io/serverlessworkflow/impl/WorkflowDefinitionTest.java +++ b/impl/jackson/src/test/java/io/serverlessworkflow/impl/WorkflowDefinitionTest.java @@ -73,6 +73,10 @@ private static Stream provideParameters() { "for-sum.yaml", Map.of("input", Arrays.asList(1, 2, 3)), o -> assertThat(o).isEqualTo(6)), + args( + "switch-then-loop.yaml", + Map.of("count", 1), + o -> assertThat(o).isEqualTo(Map.of("count", 6))), args( "for-collect.yaml", Map.of("input", Arrays.asList(1, 2, 3)), diff --git a/impl/jackson/src/test/resources/switch-then-loop.yaml b/impl/jackson/src/test/resources/switch-then-loop.yaml new file mode 100644 index 00000000..e38f08e4 --- /dev/null +++ b/impl/jackson/src/test/resources/switch-then-loop.yaml @@ -0,0 +1,18 @@ +document: + dsl: 1.0.0-alpha5 + namespace: test + name: switch-loop + version: 0.1.0 +do: + - inc: + set: + count: ${.count+1} + then: looping + - looping: + switch: + - loopCount: + when: .count < 6 + then: inc + - default: + then: exit +