Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Function;

Expand Down Expand Up @@ -71,6 +70,9 @@ public <T> FuncForTaskBuilder collection(Function<T, Collection<?>> collectionF)
}

public <T, V, R> FuncForTaskBuilder tasks(String name, LoopFunction<T, V, R> function) {
if (name == null || name.isBlank()) {
name = "for-task-" + this.items.size();
}
this.items.add(
new TaskItem(
name,
Expand All @@ -83,7 +85,7 @@ public <T, V, R> FuncForTaskBuilder tasks(String name, LoopFunction<T, V, R> fun
}

public <T, V, R> FuncForTaskBuilder tasks(LoopFunction<T, V, R> function) {
return this.tasks(UUID.randomUUID().toString(), function);
return this.tasks(null, function);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import io.serverlessworkflow.fluent.spec.spi.ForkTaskFluent;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Function;

Expand Down Expand Up @@ -57,6 +56,9 @@ public <T, V> FuncForkTaskBuilder branch(String name, Function<T, V> function) {

public <T, V> FuncForkTaskBuilder branch(
String name, Function<T, V> function, Class<T> argParam) {
if (name == null || name.isBlank()) {
name = "branch-" + this.items.size();
}
this.items.add(
new TaskItem(
name,
Expand All @@ -65,7 +67,7 @@ public <T, V> FuncForkTaskBuilder branch(
}

public <T, V> FuncForkTaskBuilder branch(Function<T, V> function) {
return this.branch(UUID.randomUUID().toString(), function);
return this.branch(null, function);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.function.Predicate;

Expand All @@ -52,7 +51,7 @@ protected FuncSwitchTaskBuilder self() {
}

public FuncSwitchTaskBuilder onPredicate(Consumer<SwitchCasePredicateBuilder> consumer) {
return this.onPredicate(UUID.randomUUID().toString(), consumer);
return this.onPredicate(null, consumer);
}

public FuncSwitchTaskBuilder onPredicate(
Expand All @@ -70,19 +69,23 @@ public FuncSwitchTaskBuilder onPredicate(
return this.onDefault(switchCaseValue.getThen().getString());
}
}

this.switchItems.add(new SwitchItem(name, switchCase.build()));
this.switchItems.add(new SwitchItem(defaultItemNameIfBlank(name), switchCase.build()));
return this;
}

@Override
public FuncSwitchTaskBuilder on(String name, Consumer<SwitchCaseBuilder> switchCaseConsumer) {
final SwitchCaseBuilder switchCase = new SwitchCaseBuilder();
switchCaseConsumer.accept(switchCase);
this.switchItems.add(new SwitchItem(name, switchCase.build()));
this.switchItems.add(new SwitchItem(defaultItemNameIfBlank(name), switchCase.build()));
return this;
}

@Override
public int switchItemCount() {
return this.switchItems.size();
}

public SwitchTask build() {
this.switchTask.setSwitch(this.switchItems);
return switchTask;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@
import io.serverlessworkflow.fluent.func.spi.FuncDoFluent;
import io.serverlessworkflow.fluent.spec.BaseTaskItemListBuilder;
import java.util.List;
import java.util.UUID;
import java.util.function.Consumer;

public class FuncTaskItemListBuilder extends BaseTaskItemListBuilder<FuncTaskItemListBuilder>
implements FuncDoFluent<FuncTaskItemListBuilder> {

protected static final String TYPE_FUNCTION = "function";

public FuncTaskItemListBuilder() {
super();
}
Expand All @@ -49,20 +50,20 @@ protected FuncTaskItemListBuilder newItemListBuilder() {

@Override
public FuncTaskItemListBuilder function(String name, Consumer<FuncCallTaskBuilder> consumer) {
name = this.defaultNameAndRequireConfig(name, consumer);
name = this.defaultNameAndRequireConfig(name, consumer, TYPE_FUNCTION);
final FuncCallTaskBuilder callTaskJavaBuilder = new FuncCallTaskBuilder();
consumer.accept(callTaskJavaBuilder);
return addTaskItem(new TaskItem(name, new Task().withCallTask(callTaskJavaBuilder.build())));
}

@Override
public FuncTaskItemListBuilder function(Consumer<FuncCallTaskBuilder> consumer) {
return this.function(UUID.randomUUID().toString(), consumer);
return this.function(null, consumer);
}

@Override
public FuncTaskItemListBuilder set(String name, Consumer<FuncSetTaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_SET);
final FuncSetTaskBuilder funcSetTaskBuilder = new FuncSetTaskBuilder();
itemsConfigurer.accept(funcSetTaskBuilder);
return this.addTaskItem(new TaskItem(name, new Task().withSetTask(funcSetTaskBuilder.build())));
Expand All @@ -75,7 +76,7 @@ public FuncTaskItemListBuilder set(String name, String expr) {

@Override
public FuncTaskItemListBuilder emit(String name, Consumer<FuncEmitTaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_EMIT);
final FuncEmitTaskBuilder emitTaskJavaBuilder = new FuncEmitTaskBuilder();
itemsConfigurer.accept(emitTaskJavaBuilder);
return this.addTaskItem(
Expand All @@ -85,7 +86,7 @@ public FuncTaskItemListBuilder emit(String name, Consumer<FuncEmitTaskBuilder> i
@Override
public FuncTaskItemListBuilder listen(
String name, Consumer<FuncListenTaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_LISTEN);
final FuncListenTaskBuilder listenTaskJavaBuilder = new FuncListenTaskBuilder();
itemsConfigurer.accept(listenTaskJavaBuilder);
return this.addTaskItem(
Expand All @@ -95,7 +96,7 @@ public FuncTaskItemListBuilder listen(
@Override
public FuncTaskItemListBuilder forEach(
String name, Consumer<FuncForTaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_FOR);
final FuncForTaskBuilder forTaskJavaBuilder = new FuncForTaskBuilder();
itemsConfigurer.accept(forTaskJavaBuilder);
return this.addTaskItem(new TaskItem(name, new Task().withForTask(forTaskJavaBuilder.build())));
Expand All @@ -104,7 +105,7 @@ public FuncTaskItemListBuilder forEach(
@Override
public FuncTaskItemListBuilder switchCase(
String name, Consumer<FuncSwitchTaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_SWITCH);
final FuncSwitchTaskBuilder funcSwitchTaskBuilder = new FuncSwitchTaskBuilder();
itemsConfigurer.accept(funcSwitchTaskBuilder);
return this.addTaskItem(
Expand All @@ -113,7 +114,7 @@ public FuncTaskItemListBuilder switchCase(

@Override
public FuncTaskItemListBuilder fork(String name, Consumer<FuncForkTaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_FORK);
final FuncForkTaskBuilder forkTaskJavaBuilder = new FuncForkTaskBuilder();
itemsConfigurer.accept(forkTaskJavaBuilder);
return this.addTaskItem(
Expand All @@ -123,7 +124,7 @@ public FuncTaskItemListBuilder fork(String name, Consumer<FuncForkTaskBuilder> i
@Override
public FuncTaskItemListBuilder http(
String name, Consumer<FuncCallHttpTaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_HTTP);

final FuncCallHttpTaskBuilder httpTaskJavaBuilder = new FuncCallHttpTaskBuilder();
itemsConfigurer.accept(httpTaskJavaBuilder);
Expand All @@ -140,7 +141,7 @@ public FuncTaskItemListBuilder http(
@Override
public FuncTaskItemListBuilder openapi(
String name, Consumer<FuncCallOpenAPITaskBuilder> itemsConfigurer) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer);
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_OPENAPI);

final FuncCallOpenAPITaskBuilder openAPITaskBuilder = new FuncCallOpenAPITaskBuilder();
itemsConfigurer.accept(openAPITaskBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,13 @@
package io.serverlessworkflow.fluent.func.spi;

import io.serverlessworkflow.fluent.spec.TaskBaseBuilder;
import java.util.UUID;
import java.util.function.Consumer;

public interface CallFnFluent<SELF extends TaskBaseBuilder<?>, LIST> {

LIST function(String name, Consumer<SELF> cfg);

default LIST function(Consumer<SELF> cfg) {
return this.function(UUID.randomUUID().toString(), cfg);
return this.function(null, cfg);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Consumer;

/**
Expand All @@ -35,6 +34,17 @@
*/
public abstract class BaseTaskItemListBuilder<SELF extends BaseTaskItemListBuilder<SELF>> {

protected final String TYPE_SET = "set";
protected final String TYPE_FOR = "for";
protected final String TYPE_SWITCH = "switch";
protected final String TYPE_RAISE = "raise";
protected final String TYPE_FORK = "fork";
protected final String TYPE_LISTEN = "listen";
protected final String TYPE_EMIT = "emit";
protected final String TYPE_TRY = "try";
protected final String TYPE_HTTP = "http";
protected final String TYPE_OPENAPI = "openapi";

private final List<TaskItem> list;

public BaseTaskItemListBuilder() {
Expand All @@ -59,11 +69,14 @@ protected final SELF addTaskItem(TaskItem taskItem) {
return self();
}

protected final String defaultNameAndRequireConfig(String name, Consumer<?> cfg) {
protected final String defaultNameAndRequireConfig(
String name, Consumer<?> cfg, String taskType) {
Objects.requireNonNull(cfg, "Configurer must not be null");

if (name == null || name.isBlank()) {
name = UUID.randomUUID().toString();
return taskType + "-" + this.list.size();
}
Objects.requireNonNull(cfg, "Configurer must not be null");

return name;
Comment on lines +72 to 80
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The auto-generated name uses this.list.size() from the current list builder instance. Since WorkflowBuilder.tasks(...) can be invoked multiple times and each call creates a new DoTaskBuilder / TaskItemListBuilder with an empty list, auto-naming will restart at *-0 on each invocation. That can produce duplicate task names in the final workflow, which will break downstream execution/visualization logic that keys by task name (e.g., maps keyed by item.getName()). Consider deriving the index from the merged workflow-level task list (or maintaining a workflow-scoped counter / offset) so names remain unique across multiple .tasks(...) appends.

Copilot uses AI. Check for mistakes.
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,19 @@ protected SwitchTaskBuilder self() {

@Override
public SwitchTaskBuilder on(
final String name, Consumer<SwitchTaskFluent.SwitchCaseBuilder> switchCaseConsumer) {
String name, Consumer<SwitchTaskFluent.SwitchCaseBuilder> switchCaseConsumer) {
final SwitchTaskFluent.SwitchCaseBuilder switchCaseBuilder =
new SwitchTaskFluent.SwitchCaseBuilder();
switchCaseConsumer.accept(switchCaseBuilder);
this.switchItems.add(new SwitchItem(name, switchCaseBuilder.build()));
this.switchItems.add(new SwitchItem(defaultItemNameIfBlank(name), switchCaseBuilder.build()));
return this;
}

@Override
public int switchItemCount() {
return this.switchItems.size();
}

public SwitchTask build() {
this.switchTask.setSwitch(this.switchItems);
return this.switchTask;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ protected TaskItemListBuilder newItemListBuilder() {

@Override
public TaskItemListBuilder set(String name, Consumer<SetTaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_SET);
final SetTaskBuilder setBuilder = new SetTaskBuilder();
itemsConfigurer.accept(setBuilder);
return addTaskItem(new TaskItem(name, new Task().withSetTask(setBuilder.build())));
Expand All @@ -59,7 +59,7 @@ public TaskItemListBuilder set(String name, final String expr) {
@Override
public TaskItemListBuilder forEach(
String name, Consumer<ForEachTaskBuilder<TaskItemListBuilder>> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_FOR);
final ForEachTaskBuilder<TaskItemListBuilder> forBuilder =
new ForEachTaskBuilder<>(newItemListBuilder());
itemsConfigurer.accept(forBuilder);
Expand All @@ -68,39 +68,39 @@ public TaskItemListBuilder forEach(

@Override
public TaskItemListBuilder switchCase(String name, Consumer<SwitchTaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_SWITCH);
final SwitchTaskBuilder switchBuilder = new SwitchTaskBuilder();
itemsConfigurer.accept(switchBuilder);
return addTaskItem(new TaskItem(name, new Task().withSwitchTask(switchBuilder.build())));
}

@Override
public TaskItemListBuilder raise(String name, Consumer<RaiseTaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_RAISE);
final RaiseTaskBuilder raiseBuilder = new RaiseTaskBuilder();
itemsConfigurer.accept(raiseBuilder);
return addTaskItem(new TaskItem(name, new Task().withRaiseTask(raiseBuilder.build())));
}

@Override
public TaskItemListBuilder fork(String name, Consumer<ForkTaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_FORK);
final ForkTaskBuilder forkBuilder = new ForkTaskBuilder();
itemsConfigurer.accept(forkBuilder);
return addTaskItem(new TaskItem(name, new Task().withForkTask(forkBuilder.build())));
}

@Override
public TaskItemListBuilder listen(String name, Consumer<ListenTaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_LISTEN);
final ListenTaskBuilder listenBuilder = new ListenTaskBuilder();
itemsConfigurer.accept(listenBuilder);
return addTaskItem(new TaskItem(name, new Task().withListenTask(listenBuilder.build())));
}

@Override
public TaskItemListBuilder emit(String name, Consumer<EmitTaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_EMIT);
final EmitTaskBuilder emitBuilder = new EmitTaskBuilder();
itemsConfigurer.accept(emitBuilder);
return addTaskItem(new TaskItem(name, new Task().withEmitTask(emitBuilder.build())));
Expand All @@ -109,7 +109,7 @@ public TaskItemListBuilder emit(String name, Consumer<EmitTaskBuilder> itemsConf
@Override
public TaskItemListBuilder tryCatch(
String name, Consumer<TryTaskBuilder<TaskItemListBuilder>> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_TRY);
final TryTaskBuilder<TaskItemListBuilder> tryBuilder =
new TryTaskBuilder<>(this.newItemListBuilder());
itemsConfigurer.accept(tryBuilder);
Expand All @@ -118,7 +118,7 @@ public TaskItemListBuilder tryCatch(

@Override
public TaskItemListBuilder http(String name, Consumer<CallHttpTaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_HTTP);

final CallHttpTaskBuilder callHTTPBuilder = new CallHttpTaskBuilder();
itemsConfigurer.accept(callHTTPBuilder);
Expand All @@ -134,7 +134,7 @@ public TaskItemListBuilder http(String name, Consumer<CallHttpTaskBuilder> items
@Override
public TaskItemListBuilder openapi(
String name, Consumer<CallOpenAPITaskBuilder> itemsConfigurer) {
name = defaultNameAndRequireConfig(name, itemsConfigurer);
name = defaultNameAndRequireConfig(name, itemsConfigurer, TYPE_OPENAPI);

final CallOpenAPITaskBuilder callOpenAPIBuilder = new CallOpenAPITaskBuilder();
itemsConfigurer.accept(callOpenAPIBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,13 @@
package io.serverlessworkflow.fluent.spec.spi;

import io.serverlessworkflow.fluent.spec.TaskBaseBuilder;
import java.util.UUID;
import java.util.function.Consumer;

public interface CallHttpFluent<SELF extends TaskBaseBuilder<SELF>, LIST> {

LIST http(String name, Consumer<SELF> itemsConfigurer);

default LIST http(Consumer<SELF> itemsConfigurer) {
return this.http(UUID.randomUUID().toString(), itemsConfigurer);
return this.http(null, itemsConfigurer);
}
}
Loading
Loading