Skip to content
Open
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 @@ -71,6 +70,9 @@ public FuncSwitchTaskBuilder onPredicate(
}
}

if (name == null || name.isBlank()) {
name = "switch-item-" + this.switchItems.size();
}
this.switchItems.add(new SwitchItem(name, switchCase.build()));
Comment on lines +73 to 76
Copy link

Copilot AI Mar 20, 2026

Choose a reason for hiding this comment

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

SwitchTaskFluent.on(Consumer) now passes null as the name, but this builder only applies default naming in onPredicate(...) and still adds switch items with the raw name in on(String, ...). That means .on(...) will now create SwitchItems with null/blank names. Please add the same null/blank defaulting for on(String, ...) (or override on(Consumer) in this builder) so switch items always have deterministic non-blank names.

Copilot uses AI. Check for mistakes.
return this;
}
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> {

public 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>> {

public final String TYPE_SET = "set";
public final String TYPE_FOR = "for";
public final String TYPE_SWITCH = "switch";
public final String TYPE_RAISE = "raise";
public final String TYPE_FORK = "fork";
public final String TYPE_LISTEN = "listen";
public final String TYPE_EMIT = "emit";
public final String TYPE_TRY = "try";
public final String TYPE_HTTP = "http";
public final String TYPE_OPENAPI = "openapi";
Comment on lines +37 to +46
Copy link

Copilot AI Mar 20, 2026

Choose a reason for hiding this comment

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

The new task type constants are declared as public final instance fields. This unnecessarily expands the public API surface and creates per-instance copies; consider making them protected static final (or private constants) since they appear to be internal implementation details used for default naming.

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

Copilot uses AI. Check for mistakes.

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();
}
Comment on lines +72 to 78
Copy link

Copilot AI Mar 20, 2026

Choose a reason for hiding this comment

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

Auto-generated names currently use this.list.size() as the suffix, which makes the first generated name end with -0. Issue #1252’s example suggests set-1 for the first unnamed task; please confirm whether the index should be 1-based and adjust the implementation/tests accordingly (e.g., size() + 1) if that’s the expected contract.

Copilot uses AI. Check for mistakes.
Objects.requireNonNull(cfg, "Configurer must not be null");

return name;
}

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);
}
}
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 CallOpenAPIFluent<SELF extends TaskBaseBuilder<SELF>, LIST> {

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

default LIST openapi(Consumer<SELF> itemsConfigurer) {
return this.openapi(UUID.randomUUID().toString(), itemsConfigurer);
return this.openapi(null, itemsConfigurer);
}
}
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 EmitFluent<SELF extends TaskBaseBuilder<?>, LIST> {

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

default LIST emit(Consumer<SELF> itemsConfigurer) {
return emit(UUID.randomUUID().toString(), itemsConfigurer);
return emit(null, itemsConfigurer);
}
}
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 ForEachFluent<SELF extends TaskBaseBuilder<SELF>, LIST> {

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

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