itemsConfigurer) {
+ taskItemListBuilder.callHTTP(itemsConfigurer);
+ return self();
+ }
+
+ public DoTask build() {
+ this.doTask.setDo(this.taskItemListBuilder.build());
+ return this.doTask;
+ }
+}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/BaseTaskItemListBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/BaseTaskItemListBuilder.java
new file mode 100644
index 00000000..566b493a
--- /dev/null
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/BaseTaskItemListBuilder.java
@@ -0,0 +1,176 @@
+/*
+ * 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.fluent.standard;
+
+import io.serverlessworkflow.api.types.CallTask;
+import io.serverlessworkflow.api.types.Task;
+import io.serverlessworkflow.api.types.TaskBase;
+import io.serverlessworkflow.api.types.TaskItem;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.function.Consumer;
+
+/**
+ * A builder for an ordered {@link TaskItem} list.
+ *
+ * This builder only knows how to append new TaskItems of various flavors, but does NOT expose
+ * {@link TaskBase}‑level methods like export(), input(), etc. Those belong on {@link
+ * TaskBaseBuilder} subclasses.
+ *
+ * @param the concrete builder type
+ */
+public abstract class BaseTaskItemListBuilder> {
+
+ private final List list;
+
+ public BaseTaskItemListBuilder() {
+ this.list = new ArrayList<>();
+ }
+
+ protected abstract SELF self();
+
+ protected abstract SELF newItemListBuilder();
+
+ protected SELF addTaskItem(TaskItem taskItem) {
+ Objects.requireNonNull(taskItem, "taskItem must not be null");
+ list.add(taskItem);
+ return self();
+ }
+
+ protected void requireNameAndConfig(String name, Consumer> cfg) {
+ Objects.requireNonNull(name, "Task name must not be null");
+ Objects.requireNonNull(cfg, "Configurer must not be null");
+ }
+
+ public SELF set(String name, Consumer itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final SetTaskBuilder setBuilder = new SetTaskBuilder();
+ itemsConfigurer.accept(setBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withSetTask(setBuilder.build())));
+ }
+
+ public SELF set(Consumer itemsConfigurer) {
+ return this.set(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF set(String name, final String expr) {
+ return this.set(name, s -> s.expr(expr));
+ }
+
+ public SELF set(final String expr) {
+ return this.set(UUID.randomUUID().toString(), s -> s.expr(expr));
+ }
+
+ public SELF forEach(String name, Consumer> itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final ForTaskBuilder forBuilder = new ForTaskBuilder<>(newItemListBuilder());
+ itemsConfigurer.accept(forBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withForTask(forBuilder.build())));
+ }
+
+ public SELF forEach(Consumer> itemsConfigurer) {
+ return this.forEach(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF switchC(String name, Consumer itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final SwitchTaskBuilder switchBuilder = new SwitchTaskBuilder();
+ itemsConfigurer.accept(switchBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withSwitchTask(switchBuilder.build())));
+ }
+
+ public SELF switchC(Consumer itemsConfigurer) {
+ return this.switchC(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF raise(String name, Consumer itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final RaiseTaskBuilder raiseBuilder = new RaiseTaskBuilder();
+ itemsConfigurer.accept(raiseBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withRaiseTask(raiseBuilder.build())));
+ }
+
+ public SELF raise(Consumer itemsConfigurer) {
+ return this.raise(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF fork(String name, Consumer itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final ForkTaskBuilder forkBuilder = new ForkTaskBuilder();
+ itemsConfigurer.accept(forkBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withForkTask(forkBuilder.build())));
+ }
+
+ public SELF fork(Consumer itemsConfigurer) {
+ return this.fork(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF listen(String name, Consumer itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final ListenTaskBuilder listenBuilder = new ListenTaskBuilder();
+ itemsConfigurer.accept(listenBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withListenTask(listenBuilder.build())));
+ }
+
+ public SELF listen(Consumer itemsConfigurer) {
+ return this.listen(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF emit(String name, Consumer itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final EmitTaskBuilder emitBuilder = new EmitTaskBuilder();
+ itemsConfigurer.accept(emitBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withEmitTask(emitBuilder.build())));
+ }
+
+ public SELF emit(Consumer itemsConfigurer) {
+ return this.emit(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF tryC(String name, Consumer> itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final TryTaskBuilder tryBuilder = new TryTaskBuilder<>(this.newItemListBuilder());
+ itemsConfigurer.accept(tryBuilder);
+ return addTaskItem(new TaskItem(name, new Task().withTryTask(tryBuilder.build())));
+ }
+
+ public SELF tryC(Consumer> itemsConfigurer) {
+ return this.tryC(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ public SELF callHTTP(String name, Consumer itemsConfigurer) {
+ requireNameAndConfig(name, itemsConfigurer);
+ final CallHTTPTaskBuilder callHTTPBuilder = new CallHTTPTaskBuilder();
+ itemsConfigurer.accept(callHTTPBuilder);
+ return addTaskItem(
+ new TaskItem(
+ name, new Task().withCallTask(new CallTask().withCallHTTP(callHTTPBuilder.build()))));
+ }
+
+ public SELF callHTTP(Consumer itemsConfigurer) {
+ return this.callHTTP(UUID.randomUUID().toString(), itemsConfigurer);
+ }
+
+ /**
+ * @return an immutable snapshot of all {@link TaskItem}s added so far
+ */
+ public List build() {
+ return Collections.unmodifiableList(list);
+ }
+}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/BaseWorkflowBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/BaseWorkflowBuilder.java
new file mode 100644
index 00000000..b93bdda0
--- /dev/null
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/BaseWorkflowBuilder.java
@@ -0,0 +1,106 @@
+/*
+ * 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.fluent.standard;
+
+import io.serverlessworkflow.api.types.Document;
+import io.serverlessworkflow.api.types.Export;
+import io.serverlessworkflow.api.types.Input;
+import io.serverlessworkflow.api.types.Output;
+import io.serverlessworkflow.api.types.Workflow;
+import java.util.function.Consumer;
+
+public abstract class BaseWorkflowBuilder<
+ SELF extends BaseWorkflowBuilder,
+ DO extends BaseDoTaskBuilder,
+ LIST extends BaseTaskItemListBuilder>
+ implements TransformationHandlers {
+
+ public static final String DSL = "1.0.0";
+ public static final String DEFAULT_VERSION = "0.0.1";
+ public static final String DEFAULT_NAMESPACE = "org.acme";
+
+ private final Workflow workflow;
+ private final Document document;
+
+ protected BaseWorkflowBuilder(final String name, final String namespace, final String version) {
+ this.document = new Document();
+ this.document.setName(name);
+ this.document.setNamespace(namespace);
+ this.document.setVersion(version);
+ this.document.setDsl(DSL);
+ this.workflow = new Workflow();
+ this.workflow.setDocument(this.document);
+ }
+
+ protected abstract DO newDo();
+
+ protected abstract SELF self();
+
+ @Override
+ public void setOutput(Output output) {
+ this.workflow.setOutput(output);
+ }
+
+ @Override
+ public void setExport(Export export) {
+ // TODO: build another interface with only Output and Input
+ throw new UnsupportedOperationException(
+ "export() is not supported on the workflow root; only tasks may export");
+ }
+
+ @Override
+ public void setInput(Input input) {
+ this.workflow.setInput(input);
+ }
+
+ public SELF document(Consumer documentBuilderConsumer) {
+ final DocumentBuilder documentBuilder = new DocumentBuilder(this.document);
+ documentBuilderConsumer.accept(documentBuilder);
+ return self();
+ }
+
+ public SELF use(Consumer useBuilderConsumer) {
+ final UseBuilder builder = new UseBuilder();
+ useBuilderConsumer.accept(builder);
+ this.workflow.setUse(builder.build());
+ return self();
+ }
+
+ public SELF tasks(Consumer doTaskConsumer) {
+ final DO doTaskBuilder = newDo();
+ doTaskConsumer.accept(doTaskBuilder);
+ this.workflow.setDo(doTaskBuilder.build().getDo());
+ return self();
+ }
+
+ public SELF input(Consumer inputBuilderConsumer) {
+ final InputBuilder inputBuilder = new InputBuilder();
+ inputBuilderConsumer.accept(inputBuilder);
+ this.workflow.setInput(inputBuilder.build());
+ return self();
+ }
+
+ public SELF output(Consumer outputBuilderConsumer) {
+ final OutputBuilder outputBuilder = new OutputBuilder();
+ outputBuilderConsumer.accept(outputBuilder);
+ this.workflow.setOutput(outputBuilder.build());
+ return self();
+ }
+
+ public Workflow build() {
+ return this.workflow;
+ }
+}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/DoTaskBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/DoTaskBuilder.java
index 3de5cfe7..dee523b3 100644
--- a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/DoTaskBuilder.java
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/DoTaskBuilder.java
@@ -15,142 +15,14 @@
*/
package io.serverlessworkflow.fluent.standard;
-import io.serverlessworkflow.api.types.CallTask;
-import io.serverlessworkflow.api.types.DoTask;
-import io.serverlessworkflow.api.types.Task;
-import io.serverlessworkflow.api.types.TaskItem;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import java.util.function.Consumer;
-
-public class DoTaskBuilder extends TaskBaseBuilder {
-
- private final DoTask doTask;
- private final List list;
+public class DoTaskBuilder extends BaseDoTaskBuilder {
DoTaskBuilder() {
- this.doTask = new DoTask();
- this.list = new ArrayList<>();
- this.setTask(doTask);
+ super(new TaskItemListBuilder());
}
@Override
protected DoTaskBuilder self() {
return this;
}
-
- public DoTaskBuilder set(String name, Consumer itemsConfigurer) {
- final SetTaskBuilder setBuilder = new SetTaskBuilder();
- itemsConfigurer.accept(setBuilder);
- this.list.add(new TaskItem(name, new Task().withSetTask(setBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder set(Consumer itemsConfigurer) {
- return this.set(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder set(String name, final String expr) {
- return this.set(name, s -> s.expr(expr));
- }
-
- public DoTaskBuilder set(final String expr) {
- return this.set(UUID.randomUUID().toString(), s -> s.expr(expr));
- }
-
- public DoTaskBuilder forEach(String name, Consumer itemsConfigurer) {
- final ForTaskBuilder forBuilder = new ForTaskBuilder();
- itemsConfigurer.accept(forBuilder);
- this.list.add(new TaskItem(name, new Task().withForTask(forBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder forEach(Consumer itemsConfigurer) {
- return this.forEach(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder switchTask(String name, Consumer itemsConfigurer) {
- final SwitchTaskBuilder switchBuilder = new SwitchTaskBuilder();
- itemsConfigurer.accept(switchBuilder);
- this.list.add(new TaskItem(name, new Task().withSwitchTask(switchBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder switchTask(Consumer itemsConfigurer) {
- return this.switchTask(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder raise(String name, Consumer itemsConfigurer) {
- final RaiseTaskBuilder raiseBuilder = new RaiseTaskBuilder();
- itemsConfigurer.accept(raiseBuilder);
- this.list.add(new TaskItem(name, new Task().withRaiseTask(raiseBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder raise(Consumer itemsConfigurer) {
- return this.raise(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder fork(String name, Consumer itemsConfigurer) {
- final ForkTaskBuilder forkBuilder = new ForkTaskBuilder();
- itemsConfigurer.accept(forkBuilder);
- this.list.add(new TaskItem(name, new Task().withForkTask(forkBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder fork(Consumer itemsConfigurer) {
- return this.fork(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder listen(String name, Consumer itemsConfigurer) {
- final ListenTaskBuilder listenBuilder = new ListenTaskBuilder();
- itemsConfigurer.accept(listenBuilder);
- this.list.add(new TaskItem(name, new Task().withListenTask(listenBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder listen(Consumer itemsConfigurer) {
- return this.listen(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder emit(String name, Consumer itemsConfigurer) {
- final EmitTaskBuilder emitBuilder = new EmitTaskBuilder();
- itemsConfigurer.accept(emitBuilder);
- this.list.add(new TaskItem(name, new Task().withEmitTask(emitBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder emit(Consumer itemsConfigurer) {
- return this.emit(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder tryTask(String name, Consumer itemsConfigurer) {
- final TryTaskBuilder tryBuilder = new TryTaskBuilder();
- itemsConfigurer.accept(tryBuilder);
- this.list.add(new TaskItem(name, new Task().withTryTask(tryBuilder.build())));
- return this;
- }
-
- public DoTaskBuilder tryTask(Consumer itemsConfigurer) {
- return this.tryTask(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTaskBuilder callHTTP(String name, Consumer itemsConfigurer) {
- final CallHTTPTaskBuilder callHTTPBuilder = new CallHTTPTaskBuilder();
- itemsConfigurer.accept(callHTTPBuilder);
- this.list.add(
- new TaskItem(
- name, new Task().withCallTask(new CallTask().withCallHTTP(callHTTPBuilder.build()))));
- return this;
- }
-
- public DoTaskBuilder callHTTP(Consumer itemsConfigurer) {
- return this.callHTTP(UUID.randomUUID().toString(), itemsConfigurer);
- }
-
- public DoTask build() {
- this.doTask.setDo(this.list);
- return this.doTask;
- }
}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/ForTaskBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/ForTaskBuilder.java
index e755eebd..ba0cec7c 100644
--- a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/ForTaskBuilder.java
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/ForTaskBuilder.java
@@ -19,46 +19,49 @@
import io.serverlessworkflow.api.types.ForTaskConfiguration;
import java.util.function.Consumer;
-public class ForTaskBuilder extends TaskBaseBuilder {
+public class ForTaskBuilder>
+ extends TaskBaseBuilder> {
private final ForTask forTask;
private final ForTaskConfiguration forTaskConfiguration;
+ private final T taskItemListBuilder;
- ForTaskBuilder() {
+ ForTaskBuilder(T taskItemListBuilder) {
super();
forTask = new ForTask();
forTaskConfiguration = new ForTaskConfiguration();
+ this.taskItemListBuilder = taskItemListBuilder;
super.setTask(forTask);
}
- protected ForTaskBuilder self() {
+ protected ForTaskBuilder self() {
return this;
}
- public ForTaskBuilder each(String each) {
+ public ForTaskBuilder each(String each) {
forTaskConfiguration.setEach(each);
return this;
}
- public ForTaskBuilder in(String in) {
+ public ForTaskBuilder in(String in) {
this.forTaskConfiguration.setIn(in);
return this;
}
- public ForTaskBuilder at(String at) {
+ public ForTaskBuilder at(String at) {
this.forTaskConfiguration.setAt(at);
return this;
}
- public ForTaskBuilder whileCondition(final String expression) {
+ public ForTaskBuilder whileC(final String expression) {
this.forTask.setWhile(expression);
return this;
}
- public ForTaskBuilder doTasks(Consumer doBuilderConsumer) {
- final DoTaskBuilder doTaskBuilder = new DoTaskBuilder();
- doBuilderConsumer.accept(doTaskBuilder);
- this.forTask.setDo(doTaskBuilder.build().getDo());
+ public ForTaskBuilder tasks(Consumer doBuilderConsumer) {
+ final T taskItemListBuilder = this.taskItemListBuilder.newItemListBuilder();
+ doBuilderConsumer.accept(taskItemListBuilder);
+ this.forTask.setDo(taskItemListBuilder.build());
return this;
}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/SwitchTaskBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/SwitchTaskBuilder.java
index 12e027ee..fca04cdf 100644
--- a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/SwitchTaskBuilder.java
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/SwitchTaskBuilder.java
@@ -15,11 +15,14 @@
*/
package io.serverlessworkflow.fluent.standard;
+import io.serverlessworkflow.api.types.FlowDirective;
+import io.serverlessworkflow.api.types.FlowDirectiveEnum;
import io.serverlessworkflow.api.types.SwitchCase;
import io.serverlessworkflow.api.types.SwitchItem;
import io.serverlessworkflow.api.types.SwitchTask;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
import java.util.function.Consumer;
public class SwitchTaskBuilder extends TaskBaseBuilder {
@@ -39,7 +42,11 @@ protected SwitchTaskBuilder self() {
return this;
}
- public SwitchTaskBuilder switchTask(
+ public SwitchTaskBuilder items(Consumer switchCaseConsumer) {
+ return this.items(UUID.randomUUID().toString(), switchCaseConsumer);
+ }
+
+ public SwitchTaskBuilder items(
final String name, Consumer switchCaseConsumer) {
final SwitchCaseBuilder switchCaseBuilder = new SwitchCaseBuilder();
switchCaseConsumer.accept(switchCaseBuilder);
@@ -64,8 +71,13 @@ public SwitchCaseBuilder when(String when) {
return this;
}
- public SwitchCaseBuilder then(String then) {
- this.switchCase.setWhen(then);
+ public SwitchCaseBuilder then(FlowDirective then) {
+ this.switchCase.setThen(then);
+ return this;
+ }
+
+ public SwitchCaseBuilder then(FlowDirectiveEnum then) {
+ this.switchCase.setThen(new FlowDirective().withFlowDirectiveEnum(then));
return this;
}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TaskBaseBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TaskBaseBuilder.java
index 31d30b3f..e4b9a623 100644
--- a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TaskBaseBuilder.java
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TaskBaseBuilder.java
@@ -21,24 +21,42 @@
import io.serverlessworkflow.api.types.ExternalResource;
import io.serverlessworkflow.api.types.FlowDirective;
import io.serverlessworkflow.api.types.FlowDirectiveEnum;
+import io.serverlessworkflow.api.types.Input;
+import io.serverlessworkflow.api.types.Output;
import io.serverlessworkflow.api.types.SchemaExternal;
import io.serverlessworkflow.api.types.SchemaInline;
import io.serverlessworkflow.api.types.SchemaUnion;
import io.serverlessworkflow.api.types.TaskBase;
import java.util.function.Consumer;
-public abstract class TaskBaseBuilder> {
- protected abstract T self();
-
+public abstract class TaskBaseBuilder>
+ implements TransformationHandlers {
private TaskBase task;
protected TaskBaseBuilder() {}
+ protected abstract T self();
+
protected void setTask(TaskBase task) {
this.task = task;
}
- public T _if(String id) {
+ @Override
+ public void setInput(Input input) {
+ this.task.setInput(input);
+ }
+
+ @Override
+ public void setExport(Export export) {
+ this.task.setExport(export);
+ }
+
+ @Override
+ public void setOutput(Output output) {
+ this.task.setOutput(output);
+ }
+
+ public T ifClause(String id) {
this.task.setIf(id);
return self();
}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TaskItemListBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TaskItemListBuilder.java
new file mode 100644
index 00000000..ebc3353c
--- /dev/null
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TaskItemListBuilder.java
@@ -0,0 +1,33 @@
+/*
+ * 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.fluent.standard;
+
+public class TaskItemListBuilder extends BaseTaskItemListBuilder {
+
+ TaskItemListBuilder() {
+ super();
+ }
+
+ @Override
+ protected TaskItemListBuilder self() {
+ return this;
+ }
+
+ @Override
+ protected TaskItemListBuilder newItemListBuilder() {
+ return new TaskItemListBuilder();
+ }
+}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TransformationHandlers.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TransformationHandlers.java
new file mode 100644
index 00000000..298f2fbe
--- /dev/null
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TransformationHandlers.java
@@ -0,0 +1,29 @@
+/*
+ * 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.fluent.standard;
+
+import io.serverlessworkflow.api.types.Export;
+import io.serverlessworkflow.api.types.Input;
+import io.serverlessworkflow.api.types.Output;
+
+public interface TransformationHandlers {
+
+ void setOutput(final Output output);
+
+ void setExport(final Export export);
+
+ void setInput(final Input input);
+}
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TryTaskBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TryTaskBuilder.java
index 2e022503..677a36f0 100644
--- a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TryTaskBuilder.java
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/TryTaskBuilder.java
@@ -34,27 +34,30 @@
import io.serverlessworkflow.api.types.TryTaskCatch;
import java.util.function.Consumer;
-public class TryTaskBuilder extends TaskBaseBuilder {
+public class TryTaskBuilder>
+ extends TaskBaseBuilder> {
private final TryTask tryTask;
+ private final T doTaskBuilderFactory;
- TryTaskBuilder() {
+ TryTaskBuilder(T doTaskBuilderFactory) {
this.tryTask = new TryTask();
+ this.doTaskBuilderFactory = doTaskBuilderFactory;
}
@Override
- protected TryTaskBuilder self() {
+ protected TryTaskBuilder self() {
return this;
}
- public TryTaskBuilder tryHandler(Consumer consumer) {
- final DoTaskBuilder doTaskBuilder = new DoTaskBuilder();
- consumer.accept(doTaskBuilder);
- this.tryTask.setTry(doTaskBuilder.build().getDo());
+ public TryTaskBuilder tryHandler(Consumer consumer) {
+ final T taskItemListBuilder = this.doTaskBuilderFactory.newItemListBuilder();
+ consumer.accept(taskItemListBuilder);
+ this.tryTask.setTry(taskItemListBuilder.build());
return this;
}
- public TryTaskBuilder catchHandler(Consumer consumer) {
+ public TryTaskBuilder catchHandler(Consumer consumer) {
final TryTaskCatchBuilder catchBuilder = new TryTaskCatchBuilder();
consumer.accept(catchBuilder);
this.tryTask.setCatch(catchBuilder.build());
diff --git a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/WorkflowBuilder.java b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/WorkflowBuilder.java
index 742b5761..278e1df8 100644
--- a/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/WorkflowBuilder.java
+++ b/fluent/standard/src/main/java/io/serverlessworkflow/fluent/standard/WorkflowBuilder.java
@@ -15,28 +15,18 @@
*/
package io.serverlessworkflow.fluent.standard;
-import io.serverlessworkflow.api.types.Document;
-import io.serverlessworkflow.api.types.Workflow;
import java.util.UUID;
-import java.util.function.Consumer;
-public class WorkflowBuilder {
-
- private static final String DSL = "1.0.0";
- private static final String DEFAULT_VERSION = "0.0.1";
- private static final String DEFAULT_NAMESPACE = "org.acme";
-
- private final Workflow workflow;
- private final Document document;
+public class WorkflowBuilder
+ extends BaseWorkflowBuilder {
private WorkflowBuilder(final String name, final String namespace, final String version) {
- this.document = new Document();
- this.document.setName(name);
- this.document.setNamespace(namespace);
- this.document.setVersion(version);
- this.document.setDsl(DSL);
- this.workflow = new Workflow();
- this.workflow.setDocument(this.document);
+ super(name, namespace, version);
+ }
+
+ @Override
+ protected DoTaskBuilder newDo() {
+ return new DoTaskBuilder();
}
public static WorkflowBuilder workflow(
@@ -56,41 +46,8 @@ public static WorkflowBuilder workflow() {
return new WorkflowBuilder(UUID.randomUUID().toString(), DEFAULT_NAMESPACE, DEFAULT_VERSION);
}
- public WorkflowBuilder document(Consumer documentBuilderConsumer) {
- final DocumentBuilder documentBuilder = new DocumentBuilder(this.document);
- documentBuilderConsumer.accept(documentBuilder);
- return this;
- }
-
- public WorkflowBuilder use(Consumer useBuilderConsumer) {
- final UseBuilder builder = new UseBuilder();
- useBuilderConsumer.accept(builder);
- this.workflow.setUse(builder.build());
- return this;
- }
-
- public WorkflowBuilder doTasks(Consumer doTaskConsumer) {
- final DoTaskBuilder doTaskBuilder = new DoTaskBuilder();
- doTaskConsumer.accept(doTaskBuilder);
- this.workflow.setDo(doTaskBuilder.build().getDo());
+ @Override
+ protected WorkflowBuilder self() {
return this;
}
-
- public WorkflowBuilder input(Consumer inputBuilderConsumer) {
- final InputBuilder inputBuilder = new InputBuilder();
- inputBuilderConsumer.accept(inputBuilder);
- this.workflow.setInput(inputBuilder.build());
- return this;
- }
-
- public WorkflowBuilder output(Consumer outputBuilderConsumer) {
- final OutputBuilder outputBuilder = new OutputBuilder();
- outputBuilderConsumer.accept(outputBuilder);
- this.workflow.setOutput(outputBuilder.build());
- return this;
- }
-
- public Workflow build() {
- return this.workflow;
- }
}
diff --git a/fluent/standard/src/test/java/io/serverlessworkflow/fluent/standard/WorkflowBuilderTest.java b/fluent/standard/src/test/java/io/serverlessworkflow/fluent/standard/WorkflowBuilderTest.java
index e29a27b9..cdf1c3ba 100644
--- a/fluent/standard/src/test/java/io/serverlessworkflow/fluent/standard/WorkflowBuilderTest.java
+++ b/fluent/standard/src/test/java/io/serverlessworkflow/fluent/standard/WorkflowBuilderTest.java
@@ -99,7 +99,7 @@ void testUseAuthenticationsBasic() {
void testDoTaskSetAndForEach() {
Workflow wf =
WorkflowBuilder.workflow("flowDo")
- .doTasks(
+ .tasks(
d ->
d.set("initCtx", "$.foo = 'bar'")
.forEach("item", f -> f.each("item").at("$.list")))
@@ -124,11 +124,11 @@ void testDoTaskSetAndForEach() {
void testDoTaskMultipleTypes() {
Workflow wf =
WorkflowBuilder.workflow("flowMixed")
- .doTasks(
+ .tasks(
d ->
d.set("init", s -> s.expr("$.init = true"))
.forEach("items", f -> f.each("item").in("$.list"))
- .switchTask(
+ .switchC(
"choice",
sw -> {
// no-op configuration
@@ -154,7 +154,7 @@ void testDoTaskMultipleTypes() {
assertEquals("init", setItem.getName());
assertNotNull(setItem.getTask().getSetTask(), "SetTask should be present");
- // forEach task
+ // forE task
TaskItem forItem = items.get(1);
assertEquals("items", forItem.getName());
assertNotNull(forItem.getTask().getForTask(), "ForTask should be present");
@@ -179,7 +179,7 @@ void testDoTaskMultipleTypes() {
void testDoTaskListenOne() {
Workflow wf =
WorkflowBuilder.workflow("flowListen")
- .doTasks(
+ .tasks(
d ->
d.listen(
"waitCheck",
@@ -205,7 +205,7 @@ void testDoTaskListenOne() {
void testDoTaskEmitEvent() {
Workflow wf =
WorkflowBuilder.workflow("flowEmit")
- .doTasks(
+ .tasks(
d ->
d.emit(
"emitEvent",
@@ -256,9 +256,9 @@ void testDoTaskEmitEvent() {
void testDoTaskTryCatchWithRetry() {
Workflow wf =
WorkflowBuilder.workflow("flowTry")
- .doTasks(
+ .tasks(
d ->
- d.tryTask(
+ d.tryC(
"tryBlock",
t ->
t.tryHandler(tb -> tb.set("init", s -> s.expr("$.start = true")))
@@ -304,9 +304,9 @@ void testDoTaskTryCatchWithRetry() {
void testDoTaskTryCatchErrorsFiltering() {
Workflow wf =
WorkflowBuilder.workflow("flowCatch")
- .doTasks(
+ .tasks(
d ->
- d.tryTask(
+ d.tryC(
"tryBlock",
t ->
t.tryHandler(tb -> tb.set("foo", s -> s.expr("$.foo = 'bar'")))
@@ -402,7 +402,7 @@ void testWorkflowInputInlineSchemaAndFromObject() {
void testDoTaskCallHTTPBasic() {
Workflow wf =
WorkflowBuilder.workflow("flowCallBasic")
- .doTasks(
+ .tasks(
d ->
d.callHTTP(
"basicCall",
@@ -428,7 +428,7 @@ void testDoTaskCallHTTPBasic() {
void testDoTaskCallHTTPHeadersConsumerAndMap() {
Workflow wf =
WorkflowBuilder.workflow("flowCallHeaders")
- .doTasks(
+ .tasks(
d ->
d.callHTTP(
"hdrCall",
@@ -444,7 +444,7 @@ void testDoTaskCallHTTPHeadersConsumerAndMap() {
Workflow wf2 =
WorkflowBuilder.workflow()
- .doTasks(
+ .tasks(
d ->
d.callHTTP(
c ->
@@ -460,7 +460,7 @@ void testDoTaskCallHTTPHeadersConsumerAndMap() {
void testDoTaskCallHTTPQueryConsumerAndMap() {
Workflow wf =
WorkflowBuilder.workflow("flowCallQuery")
- .doTasks(
+ .tasks(
d ->
d.callHTTP(
"qryCall",
@@ -476,7 +476,7 @@ void testDoTaskCallHTTPQueryConsumerAndMap() {
Workflow wf2 =
WorkflowBuilder.workflow()
- .doTasks(
+ .tasks(
d ->
d.callHTTP(
c -> c.method("GET").endpoint("uri").query(Map.of("q1", "x", "q2", "y"))))
@@ -498,7 +498,7 @@ void testDoTaskCallHTTPQueryConsumerAndMap() {
void testDoTaskCallHTTPRedirectAndOutput() {
Workflow wf =
WorkflowBuilder.workflow("flowCallOpts")
- .doTasks(
+ .tasks(
d ->
d.callHTTP(
"optCall",