diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaExpressionFactory.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaExpressionFactory.java index 48f8b804..4d6ca49f 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaExpressionFactory.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaExpressionFactory.java @@ -24,6 +24,7 @@ import io.serverlessworkflow.impl.WorkflowModelFactory; import io.serverlessworkflow.impl.expressions.Expression; import io.serverlessworkflow.impl.expressions.ExpressionFactory; +import io.serverlessworkflow.impl.expressions.TaskMetadataKeys; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.BiPredicate; @@ -32,7 +33,6 @@ public class JavaExpressionFactory implements ExpressionFactory { - public static final String IF_PREDICATE = "if_predicate"; private final WorkflowModelFactory modelFactory = new JavaModelFactory(); private final Expression dummyExpression = new Expression() { @@ -74,7 +74,8 @@ private WorkflowFilter fromPredicate(Predicate pred) { public Optional buildIfFilter(TaskBase task) { TaskMetadata metadata = task.getMetadata(); return metadata != null - && metadata.getAdditionalProperties().get(IF_PREDICATE) instanceof Predicate pred + && metadata.getAdditionalProperties().get(TaskMetadataKeys.IF_PREDICATE) + instanceof Predicate pred ? Optional.of(fromPredicate(pred)) : ExpressionFactory.super.buildIfFilter(task); } diff --git a/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java b/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java index aaef75c8..3de3bb96 100644 --- a/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java +++ b/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java @@ -33,7 +33,7 @@ import io.serverlessworkflow.api.types.func.SwitchCaseFunction; import io.serverlessworkflow.impl.WorkflowApplication; import io.serverlessworkflow.impl.WorkflowDefinition; -import io.serverlessworkflow.impl.expressions.func.JavaExpressionFactory; +import io.serverlessworkflow.impl.expressions.TaskMetadataKeys; import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutionException; @@ -168,7 +168,7 @@ void testIf() throws InterruptedException, ExecutionException { private CallJava withPredicate(CallJava call, Predicate pred) { return (CallJava) call.withMetadata( - new TaskMetadata().withAdditionalProperty(JavaExpressionFactory.IF_PREDICATE, pred)); + new TaskMetadata().withAdditionalProperty(TaskMetadataKeys.IF_PREDICATE, pred)); } public static boolean isEven(Object model, Integer number) { diff --git a/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java b/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java index dcad95d8..cc34108d 100644 --- a/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java +++ b/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java @@ -54,7 +54,7 @@ void testForLoop() throws InterruptedException, ExecutionException { FuncWorkflowBuilder.workflow() .tasks( t -> - t.forFn( + t.forEach( f -> f.whileC(CallTest::isEven) .collection(v -> (Collection) v) @@ -80,9 +80,9 @@ void testSwitch() throws InterruptedException, ExecutionException { .tasks( tasks -> tasks - .switchFn( + .switchCase( switchOdd -> - switchOdd.items( + switchOdd.functions( item -> item.when(CallTest::isOdd).then(FlowDirectiveEnum.END))) .callFn(callJava -> callJava.function(CallTest::zero))) diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/HasDelegate.java b/experimental/types/src/main/java/io/serverlessworkflow/impl/expressions/TaskMetadataKeys.java similarity index 74% rename from fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/HasDelegate.java rename to experimental/types/src/main/java/io/serverlessworkflow/impl/expressions/TaskMetadataKeys.java index f0b1e0b9..879dc5ea 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/HasDelegate.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/impl/expressions/TaskMetadataKeys.java @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.fluent.spec; +package io.serverlessworkflow.impl.expressions; -public interface HasDelegate { +public final class TaskMetadataKeys { - Object delegate(); + /** Metadata entry name for the DSL’s “when”/“if” predicate. */ + public static final String IF_PREDICATE = "if_predicate"; } diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/DelegatingFuncDoTaskFluent.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/DelegatingFuncDoTaskFluent.java deleted file mode 100644 index 131330fa..00000000 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/DelegatingFuncDoTaskFluent.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.func; - -import io.serverlessworkflow.fluent.spec.HasDelegate; -import java.util.function.Consumer; - -/** - * Mixin that implements {@link FuncDoTaskFluent} by forwarding to another instance. - * - * @param concrete builder type - */ -public interface DelegatingFuncDoTaskFluent> - extends FuncDoTaskFluent, HasDelegate { - - @SuppressWarnings("unchecked") - default SELF self() { - return (SELF) this; - } - - @SuppressWarnings("unchecked") - private FuncDoTaskFluent d() { - return (FuncDoTaskFluent) this.delegate(); - } - - @Override - default SELF callFn(String name, Consumer cfg) { - d().callFn(name, cfg); - return self(); - } - - @Override - default SELF callFn(Consumer cfg) { - d().callFn(cfg); - return self(); - } - - @Override - default SELF forFn(String name, Consumer cfg) { - d().forFn(name, cfg); - return self(); - } - - @Override - default SELF forFn(Consumer cfg) { - d().forFn(cfg); - return self(); - } - - @Override - default SELF switchFn(String name, Consumer cfg) { - d().switchFn(name, cfg); - return self(); - } - - @Override - default SELF switchFn(Consumer cfg) { - d().switchFn(cfg); - return self(); - } - - @Override - default SELF forkFn(String name, Consumer cfg) { - d().forkFn(name, cfg); - return self(); - } - - @Override - default SELF forkFn(Consumer cfg) { - d().forkFn(cfg); - return self(); - } -} diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java index 6c4c524d..6e1da87f 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java @@ -17,11 +17,14 @@ import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallTaskJava; +import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; +import io.serverlessworkflow.fluent.func.spi.FuncTransformations; import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; import java.util.function.Function; public class FuncCallTaskBuilder extends TaskBaseBuilder - implements FuncTransformations { + implements FuncTransformations, + ConditionalTaskBuilder { private CallTaskJava callTaskJava; diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskBuilder.java index deefa099..723e8d23 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskBuilder.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskBuilder.java @@ -15,11 +15,16 @@ */ package io.serverlessworkflow.fluent.func; +import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; +import io.serverlessworkflow.fluent.func.spi.FuncDoFluent; +import io.serverlessworkflow.fluent.func.spi.FuncTransformations; import io.serverlessworkflow.fluent.spec.BaseDoTaskBuilder; +import java.util.function.Consumer; public class FuncDoTaskBuilder extends BaseDoTaskBuilder implements FuncTransformations, - DelegatingFuncDoTaskFluent { + ConditionalTaskBuilder, + FuncDoFluent { public FuncDoTaskBuilder() { super(new FuncTaskItemListBuilder()); @@ -29,4 +34,47 @@ public FuncDoTaskBuilder() { public FuncDoTaskBuilder self() { return this; } + + @Override + public FuncDoTaskBuilder emit(String name, Consumer itemsConfigurer) { + this.listBuilder().emit(name, itemsConfigurer); + return this; + } + + @Override + public FuncDoTaskBuilder forEach(String name, Consumer itemsConfigurer) { + this.listBuilder().forEach(name, itemsConfigurer); + return this; + } + + @Override + public FuncDoTaskBuilder set(String name, Consumer itemsConfigurer) { + this.listBuilder().set(name, itemsConfigurer); + return this; + } + + @Override + public FuncDoTaskBuilder set(String name, String expr) { + this.listBuilder().set(name, expr); + return this; + } + + @Override + public FuncDoTaskBuilder switchCase( + String name, Consumer itemsConfigurer) { + this.listBuilder().switchCase(name, itemsConfigurer); + return this; + } + + @Override + public FuncDoTaskBuilder callFn(String name, Consumer cfg) { + this.listBuilder().callFn(name, cfg); + return this; + } + + @Override + public FuncDoTaskBuilder fork(String name, Consumer itemsConfigurer) { + this.listBuilder().fork(name, itemsConfigurer); + return this; + } } diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncEmitTaskBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncEmitTaskBuilder.java new file mode 100644 index 00000000..89325ee8 --- /dev/null +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncEmitTaskBuilder.java @@ -0,0 +1,26 @@ +/* + * 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.func; + +import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; +import io.serverlessworkflow.fluent.spec.EmitTaskBuilder; + +public class FuncEmitTaskBuilder extends EmitTaskBuilder + implements ConditionalTaskBuilder { + FuncEmitTaskBuilder() { + super(); + } +} diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForTaskBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForTaskBuilder.java index 921ec920..9c345178 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForTaskBuilder.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForTaskBuilder.java @@ -21,7 +21,10 @@ import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallTaskJava; import io.serverlessworkflow.api.types.func.ForTaskFunction; +import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; +import io.serverlessworkflow.fluent.func.spi.FuncTransformations; import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import io.serverlessworkflow.fluent.spec.spi.ForEachTaskFluent; import io.serverlessworkflow.impl.expressions.LoopFunction; import io.serverlessworkflow.impl.expressions.LoopPredicate; import io.serverlessworkflow.impl.expressions.LoopPredicateIndex; @@ -33,7 +36,9 @@ import java.util.function.Function; public class FuncForTaskBuilder extends TaskBaseBuilder - implements FuncTransformations { + implements FuncTransformations, + ConditionalTaskBuilder, + ForEachTaskFluent { private final ForTaskFunction forTaskFunction; private final List items; @@ -81,6 +86,30 @@ public FuncForTaskBuilder tasks(LoopFunction function) { return this.tasks(UUID.randomUUID().toString(), function); } + @Override + public FuncForTaskBuilder each(String each) { + this.forTaskFunction.getFor().withEach(each); + return this; + } + + @Override + public FuncForTaskBuilder in(String in) { + this.forTaskFunction.getFor().withIn(in); + return this; + } + + @Override + public FuncForTaskBuilder at(String at) { + this.forTaskFunction.getFor().withAt(at); + return this; + } + + @Override + public FuncForTaskBuilder whileC(String expression) { + this.forTaskFunction.setWhile(expression); + return this; + } + public FuncForTaskBuilder tasks(Consumer consumer) { final FuncTaskItemListBuilder builder = new FuncTaskItemListBuilder(); consumer.accept(builder); diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForkTaskBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForkTaskBuilder.java index 7df66fab..a4326276 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForkTaskBuilder.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncForkTaskBuilder.java @@ -21,7 +21,10 @@ import io.serverlessworkflow.api.types.TaskItem; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallTaskJava; +import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; +import io.serverlessworkflow.fluent.func.spi.FuncTransformations; import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import io.serverlessworkflow.fluent.spec.spi.ForkTaskFluent; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -29,7 +32,9 @@ import java.util.function.Function; public class FuncForkTaskBuilder extends TaskBaseBuilder - implements FuncTransformations { + implements FuncTransformations, + ConditionalTaskBuilder, + ForkTaskFluent { private final ForkTask forkTask; private final List items; @@ -55,6 +60,7 @@ public FuncForkTaskBuilder branch(Function function) { return this.branch(UUID.randomUUID().toString(), function); } + @Override public FuncForkTaskBuilder branches(Consumer consumer) { final FuncTaskItemListBuilder builder = new FuncTaskItemListBuilder(); consumer.accept(builder); @@ -62,11 +68,13 @@ public FuncForkTaskBuilder branches(Consumer consumer) return this; } + @Override public FuncForkTaskBuilder compete(boolean compete) { this.forkTask.getFork().setCompete(compete); return this; } + @Override public ForkTask build() { this.forkTask.getFork().setBranches(this.items); return forkTask; diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskFluent.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSetTaskBuilder.java similarity index 54% rename from fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskFluent.java rename to fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSetTaskBuilder.java index 9ec0cb39..fc9753b0 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskFluent.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSetTaskBuilder.java @@ -15,23 +15,11 @@ */ package io.serverlessworkflow.fluent.func; -import java.util.function.Consumer; +import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; +import io.serverlessworkflow.fluent.spec.SetTaskBuilder; -public interface FuncDoTaskFluent> { +public class FuncSetTaskBuilder extends SetTaskBuilder + implements ConditionalTaskBuilder { - SELF callFn(String name, Consumer cfg); - - SELF callFn(Consumer cfg); - - SELF forFn(String name, Consumer cfg); - - SELF forFn(Consumer cfg); - - SELF switchFn(String name, Consumer cfg); - - SELF switchFn(Consumer cfg); - - SELF forkFn(String name, Consumer cfg); - - SELF forkFn(Consumer cfg); + FuncSetTaskBuilder() {} } diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java index aff365f7..db3e8867 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java @@ -21,7 +21,10 @@ import io.serverlessworkflow.api.types.SwitchItem; import io.serverlessworkflow.api.types.SwitchTask; import io.serverlessworkflow.api.types.func.SwitchCaseFunction; +import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; +import io.serverlessworkflow.fluent.func.spi.FuncTransformations; import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import io.serverlessworkflow.fluent.spec.spi.SwitchTaskFluent; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -29,7 +32,9 @@ import java.util.function.Predicate; public class FuncSwitchTaskBuilder extends TaskBaseBuilder - implements FuncTransformations { + implements FuncTransformations, + ConditionalTaskBuilder, + SwitchTaskFluent { private final SwitchTask switchTask; private final List switchItems; @@ -45,40 +50,49 @@ protected FuncSwitchTaskBuilder self() { return this; } - public FuncSwitchTaskBuilder items(Consumer consumer) { - return this.items(UUID.randomUUID().toString(), consumer); + public FuncSwitchTaskBuilder functions(Consumer consumer) { + return this.functions(UUID.randomUUID().toString(), consumer); } - public FuncSwitchTaskBuilder items(String name, Consumer consumer) { - final SwitchCaseJavaBuilder switchCase = new SwitchCaseJavaBuilder(); + public FuncSwitchTaskBuilder functions( + String name, Consumer consumer) { + final SwitchCaseFunctionBuilder switchCase = new SwitchCaseFunctionBuilder(); consumer.accept(switchCase); this.switchItems.add(new SwitchItem(name, switchCase.build())); return this; } + @Override + public FuncSwitchTaskBuilder items(String name, Consumer switchCaseConsumer) { + final SwitchCaseBuilder switchCase = new SwitchCaseBuilder(); + switchCaseConsumer.accept(switchCase); + this.switchItems.add(new SwitchItem(name, switchCase.build())); + return this; + } + public SwitchTask build() { this.switchTask.setSwitch(this.switchItems); return switchTask; } - public static final class SwitchCaseJavaBuilder { + public static final class SwitchCaseFunctionBuilder { private final SwitchCaseFunction switchCase; - SwitchCaseJavaBuilder() { + SwitchCaseFunctionBuilder() { this.switchCase = new SwitchCaseFunction(); } - public SwitchCaseJavaBuilder when(Predicate when) { + public SwitchCaseFunctionBuilder when(Predicate when) { this.switchCase.setPredicate(when); return this; } - public SwitchCaseJavaBuilder then(FlowDirective then) { + public SwitchCaseFunctionBuilder then(FlowDirective then) { this.switchCase.setThen(then); return this; } - public SwitchCaseJavaBuilder then(FlowDirectiveEnum then) { + public SwitchCaseFunctionBuilder then(FlowDirectiveEnum then) { this.switchCase.setThen(new FlowDirective().withFlowDirectiveEnum(then)); return this; } diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTaskItemListBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTaskItemListBuilder.java index 13ce0c29..2c8b5524 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTaskItemListBuilder.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTaskItemListBuilder.java @@ -17,13 +17,14 @@ import io.serverlessworkflow.api.types.Task; import io.serverlessworkflow.api.types.TaskItem; +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 - implements FuncDoTaskFluent { + implements FuncDoFluent { public FuncTaskItemListBuilder() { super(); @@ -57,42 +58,51 @@ public FuncTaskItemListBuilder callFn(Consumer consumer) { } @Override - public FuncTaskItemListBuilder forFn(String name, Consumer consumer) { - this.requireNameAndConfig(name, consumer); - final FuncForTaskBuilder forTaskJavaBuilder = new FuncForTaskBuilder(); - consumer.accept(forTaskJavaBuilder); - return this.addTaskItem(new TaskItem(name, new Task().withForTask(forTaskJavaBuilder.build()))); + public FuncTaskItemListBuilder set(String name, Consumer itemsConfigurer) { + this.requireNameAndConfig(name, itemsConfigurer); + final FuncSetTaskBuilder funcSetTaskBuilder = new FuncSetTaskBuilder(); + itemsConfigurer.accept(funcSetTaskBuilder); + return this.addTaskItem(new TaskItem(name, new Task().withSetTask(funcSetTaskBuilder.build()))); } @Override - public FuncTaskItemListBuilder forFn(Consumer consumer) { - return this.forFn(UUID.randomUUID().toString(), consumer); + public FuncTaskItemListBuilder set(String name, String expr) { + return this.set(name, s -> s.expr(expr)); } @Override - public FuncTaskItemListBuilder switchFn(String name, Consumer consumer) { - this.requireNameAndConfig(name, consumer); - final FuncSwitchTaskBuilder funcSwitchTaskBuilder = new FuncSwitchTaskBuilder(); - consumer.accept(funcSwitchTaskBuilder); + public FuncTaskItemListBuilder emit(String name, Consumer itemsConfigurer) { + this.requireNameAndConfig(name, itemsConfigurer); + final FuncEmitTaskBuilder emitTaskJavaBuilder = new FuncEmitTaskBuilder(); + itemsConfigurer.accept(emitTaskJavaBuilder); return this.addTaskItem( - new TaskItem(name, new Task().withSwitchTask(funcSwitchTaskBuilder.build()))); + new TaskItem(name, new Task().withEmitTask(emitTaskJavaBuilder.build()))); } @Override - public FuncTaskItemListBuilder switchFn(Consumer consumer) { - return this.switchFn(UUID.randomUUID().toString(), consumer); + public FuncTaskItemListBuilder forEach( + String name, Consumer itemsConfigurer) { + this.requireNameAndConfig(name, itemsConfigurer); + final FuncForTaskBuilder forTaskJavaBuilder = new FuncForTaskBuilder(); + itemsConfigurer.accept(forTaskJavaBuilder); + return this.addTaskItem(new TaskItem(name, new Task().withForTask(forTaskJavaBuilder.build()))); } @Override - public FuncTaskItemListBuilder forkFn(Consumer cfg) { - return this.forkFn(UUID.randomUUID().toString(), cfg); + public FuncTaskItemListBuilder switchCase( + String name, Consumer itemsConfigurer) { + this.requireNameAndConfig(name, itemsConfigurer); + final FuncSwitchTaskBuilder funcSwitchTaskBuilder = new FuncSwitchTaskBuilder(); + itemsConfigurer.accept(funcSwitchTaskBuilder); + return this.addTaskItem( + new TaskItem(name, new Task().withSwitchTask(funcSwitchTaskBuilder.build()))); } @Override - public FuncTaskItemListBuilder forkFn(String name, Consumer cfg) { - this.requireNameAndConfig(name, cfg); + public FuncTaskItemListBuilder fork(String name, Consumer itemsConfigurer) { + this.requireNameAndConfig(name, itemsConfigurer); final FuncForkTaskBuilder forkTaskJavaBuilder = new FuncForkTaskBuilder(); - cfg.accept(forkTaskJavaBuilder); + itemsConfigurer.accept(forkTaskJavaBuilder); return this.addTaskItem( new TaskItem(name, new Task().withForkTask(forkTaskJavaBuilder.build()))); } diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncWorkflowBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncWorkflowBuilder.java index 686b1773..261bd88b 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncWorkflowBuilder.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncWorkflowBuilder.java @@ -15,6 +15,7 @@ */ package io.serverlessworkflow.fluent.func; +import io.serverlessworkflow.fluent.func.spi.FuncTransformations; import io.serverlessworkflow.fluent.spec.BaseWorkflowBuilder; import java.util.UUID; diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/ConditionalTaskBuilder.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/ConditionalTaskBuilder.java new file mode 100644 index 00000000..5032ff4e --- /dev/null +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/ConditionalTaskBuilder.java @@ -0,0 +1,34 @@ +/* + * 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.func.spi; + +import io.serverlessworkflow.api.types.TaskBase; +import io.serverlessworkflow.api.types.TaskMetadata; +import io.serverlessworkflow.impl.expressions.TaskMetadataKeys; +import java.util.function.Predicate; + +public interface ConditionalTaskBuilder { + + TaskBase getTask(); + + default SELF when(Predicate predicate) { + if (getTask().getMetadata() == null) { + getTask().setMetadata(new TaskMetadata()); + } + getTask().getMetadata().setAdditionalProperty(TaskMetadataKeys.IF_PREDICATE, predicate); + return (SELF) this; + } +} diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncDoFluent.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncDoFluent.java new file mode 100644 index 00000000..434304d5 --- /dev/null +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncDoFluent.java @@ -0,0 +1,46 @@ +/* + * 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.func.spi; + +import io.serverlessworkflow.fluent.func.FuncCallTaskBuilder; +import io.serverlessworkflow.fluent.func.FuncEmitTaskBuilder; +import io.serverlessworkflow.fluent.func.FuncForTaskBuilder; +import io.serverlessworkflow.fluent.func.FuncForkTaskBuilder; +import io.serverlessworkflow.fluent.func.FuncSetTaskBuilder; +import io.serverlessworkflow.fluent.func.FuncSwitchTaskBuilder; +import io.serverlessworkflow.fluent.spec.spi.EmitFluent; +import io.serverlessworkflow.fluent.spec.spi.ForEachFluent; +import io.serverlessworkflow.fluent.spec.spi.ForkFluent; +import io.serverlessworkflow.fluent.spec.spi.SetFluent; +import io.serverlessworkflow.fluent.spec.spi.SwitchFluent; +import java.util.UUID; +import java.util.function.Consumer; + +// TODO: implement the other builders, e.g. CallHTTP + +public interface FuncDoFluent> + extends SetFluent, + EmitFluent, + ForEachFluent, + SwitchFluent, + ForkFluent { + + SELF callFn(String name, Consumer cfg); + + default SELF callFn(Consumer cfg) { + return this.callFn(UUID.randomUUID().toString(), cfg); + } +} diff --git a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTransformations.java b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTransformations.java similarity index 93% rename from fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTransformations.java rename to fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTransformations.java index f1516f7f..b063e4f8 100644 --- a/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTransformations.java +++ b/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTransformations.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.fluent.func; +package io.serverlessworkflow.fluent.func.spi; import io.serverlessworkflow.api.types.Export; import io.serverlessworkflow.api.types.Input; @@ -21,7 +21,7 @@ import io.serverlessworkflow.api.types.func.ExportAsFunction; import io.serverlessworkflow.api.types.func.InputFromFunction; import io.serverlessworkflow.api.types.func.OutputAsFunction; -import io.serverlessworkflow.fluent.spec.TransformationHandlers; +import io.serverlessworkflow.fluent.spec.spi.TransformationHandlers; import java.util.function.Function; public interface FuncTransformations> diff --git a/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/JavaWorkflowBuilderTest.java b/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/JavaWorkflowBuilderTest.java index 72cf6a68..24de3e7d 100644 --- a/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/JavaWorkflowBuilderTest.java +++ b/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/JavaWorkflowBuilderTest.java @@ -79,7 +79,7 @@ void testJavaForEach() { FuncWorkflowBuilder.workflow("javaLoopFlow") .tasks( d -> - d.forFn( + d.forEach( j -> j.collection(ctx -> List.of("a", "b", "c")) .whileC((String val, Object ctx) -> !val.equals("c")) @@ -111,7 +111,7 @@ void testMixedLoops() { .tasks( d -> d.forEach(f -> f.each("item").in("$.array")) // spec - .forFn(j -> j.collection(ctx -> List.of(1, 2, 3))) // java + .forEach(j -> j.collection(ctx -> List.of(1, 2, 3))) // java ) .build(); @@ -137,7 +137,7 @@ void testJavaFunctionalIO() { .tasks( d -> d.set("init", s -> s.expr("$.x = 1")) - .forFn( + .forEach( j -> j.collection( ctx -> { @@ -250,7 +250,7 @@ void testCompositeScenario() { .tasks( d -> d.set("init", s -> s.expr("$.val = 0")) - .forFn( + .forEach( j -> j.collection(ctx -> List.of("a", "b")) .tasks( diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseDoTaskBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseDoTaskBuilder.java index 8e6a2410..476e0e26 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseDoTaskBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseDoTaskBuilder.java @@ -19,23 +19,23 @@ public abstract class BaseDoTaskBuilder< SELF extends BaseDoTaskBuilder, LIST extends BaseTaskItemListBuilder> - extends TaskBaseBuilder implements DelegatingDoTaskFluent { + extends TaskBaseBuilder { private final DoTask doTask = new DoTask(); private final BaseTaskItemListBuilder itemsListBuilder; protected BaseDoTaskBuilder(BaseTaskItemListBuilder itemsListBuilder) { this.itemsListBuilder = itemsListBuilder; - setTask(doTask); + setTask(this.doTask); } - @SuppressWarnings("unchecked") - @Override - public LIST delegate() { - return (LIST) itemsListBuilder; + protected BaseDoTaskBuilder(BaseTaskItemListBuilder itemsListBuilder, DoTask doTask) { + this.itemsListBuilder = itemsListBuilder; + setTask(doTask); } - public LIST list() { + @SuppressWarnings("unchecked") + protected final LIST listBuilder() { return (LIST) itemsListBuilder; } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseTaskItemListBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseTaskItemListBuilder.java index 2233a418..33a424fc 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseTaskItemListBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseTaskItemListBuilder.java @@ -15,15 +15,12 @@ */ package io.serverlessworkflow.fluent.spec; -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; /** @@ -35,8 +32,7 @@ * * @param the concrete builder type */ -public abstract class BaseTaskItemListBuilder> - implements DoTaskFluent { +public abstract class BaseTaskItemListBuilder> { private final List list; @@ -67,135 +63,6 @@ protected final void requireNameAndConfig(String name, Consumer cfg) { Objects.requireNonNull(cfg, "Configurer must not be null"); } - @Override - 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()))); - } - - @Override - public SELF set(Consumer itemsConfigurer) { - return this.set(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - public SELF set(String name, final String expr) { - return this.set(name, s -> s.expr(expr)); - } - - @Override - public SELF set(final String expr) { - return this.set(UUID.randomUUID().toString(), s -> s.expr(expr)); - } - - @Override - 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()))); - } - - @Override - public SELF forEach(Consumer> itemsConfigurer) { - return this.forEach(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - public SELF switchCase(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()))); - } - - @Override - public SELF switchCase(Consumer itemsConfigurer) { - return this.switchCase(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - 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()))); - } - - @Override - public SELF raise(Consumer itemsConfigurer) { - return this.raise(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - 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()))); - } - - @Override - public SELF fork(Consumer itemsConfigurer) { - return this.fork(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - 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()))); - } - - @Override - public SELF listen(Consumer itemsConfigurer) { - return this.listen(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - 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()))); - } - - @Override - public SELF emit(Consumer itemsConfigurer) { - return this.emit(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - public SELF tryCatch(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()))); - } - - @Override - public SELF tryCatch(Consumer> itemsConfigurer) { - return this.tryCatch(UUID.randomUUID().toString(), itemsConfigurer); - } - - @Override - 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())))); - } - - @Override - public SELF callHTTP(Consumer itemsConfigurer) { - return this.callHTTP(UUID.randomUUID().toString(), itemsConfigurer); - } - /** * @return an immutable snapshot of all {@link TaskItem}s added so far */ diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java index e286d5fb..2ab0bb17 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/BaseWorkflowBuilder.java @@ -20,6 +20,7 @@ import io.serverlessworkflow.api.types.Input; import io.serverlessworkflow.api.types.Output; import io.serverlessworkflow.api.types.Workflow; +import io.serverlessworkflow.fluent.spec.spi.TransformationHandlers; import java.util.function.Consumer; public abstract class BaseWorkflowBuilder< diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DelegatingDoTaskFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DelegatingDoTaskFluent.java deleted file mode 100644 index bfaa6817..00000000 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DelegatingDoTaskFluent.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * 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.spec; - -import java.util.function.Consumer; - -/** - * Mixin that implements {@link DoTaskFluent} by delegating to another instance. - * - * @param the concrete delegating type - * @param the list-builder type used by nested constructs like for/try - */ -public interface DelegatingDoTaskFluent< - SELF extends DelegatingDoTaskFluent, LIST extends BaseTaskItemListBuilder> - extends DoTaskFluent, HasDelegate { - - @SuppressWarnings("unchecked") - default SELF self() { - return (SELF) this; - } - - LIST list(); - - @SuppressWarnings("unchecked") - private DoTaskFluent d() { - return (DoTaskFluent) this.delegate(); - } - - /* ---------- Forwarders ---------- */ - - @Override - default SELF set(String name, Consumer cfg) { - d().set(name, cfg); - return self(); - } - - @Override - default SELF set(Consumer cfg) { - d().set(cfg); - return self(); - } - - @Override - default SELF set(String name, String expr) { - d().set(name, expr); - return self(); - } - - @Override - default SELF set(String expr) { - d().set(expr); - return self(); - } - - @Override - default SELF forEach(String name, Consumer> cfg) { - d().forEach(name, cfg); - return self(); - } - - @Override - default SELF forEach(Consumer> cfg) { - d().forEach(cfg); - return self(); - } - - @Override - default SELF switchCase(String name, Consumer cfg) { - d().switchCase(name, cfg); - return self(); - } - - @Override - default SELF switchCase(Consumer cfg) { - d().switchCase(cfg); - return self(); - } - - @Override - default SELF raise(String name, Consumer cfg) { - d().raise(name, cfg); - return self(); - } - - @Override - default SELF raise(Consumer cfg) { - d().raise(cfg); - return self(); - } - - @Override - default SELF fork(String name, Consumer cfg) { - d().fork(name, cfg); - return self(); - } - - @Override - default SELF fork(Consumer cfg) { - d().fork(cfg); - return self(); - } - - @Override - default SELF listen(String name, Consumer cfg) { - d().listen(name, cfg); - return self(); - } - - @Override - default SELF listen(Consumer cfg) { - d().listen(cfg); - return self(); - } - - @Override - default SELF emit(String name, Consumer cfg) { - d().emit(name, cfg); - return self(); - } - - @Override - default SELF emit(Consumer cfg) { - d().emit(cfg); - return self(); - } - - @Override - default SELF tryCatch(String name, Consumer> cfg) { - d().tryCatch(name, cfg); - return self(); - } - - @Override - default SELF tryCatch(Consumer> cfg) { - d().tryCatch(cfg); - return self(); - } - - @Override - default SELF callHTTP(String name, Consumer cfg) { - d().callHTTP(name, cfg); - return self(); - } - - @Override - default SELF callHTTP(Consumer cfg) { - d().callHTTP(cfg); - return self(); - } -} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DoTaskBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DoTaskBuilder.java index 3b1a768c..669b580f 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DoTaskBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DoTaskBuilder.java @@ -15,14 +15,80 @@ */ package io.serverlessworkflow.fluent.spec; -public class DoTaskBuilder extends BaseDoTaskBuilder { +import io.serverlessworkflow.fluent.spec.spi.DoFluent; +import java.util.function.Consumer; + +public class DoTaskBuilder extends BaseDoTaskBuilder + implements DoFluent { DoTaskBuilder() { super(new TaskItemListBuilder()); } @Override - public DoTaskBuilder self() { + protected DoTaskBuilder self() { + return this; + } + + @Override + public DoTaskBuilder callHTTP(String name, Consumer itemsConfigurer) { + this.listBuilder().callHTTP(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder emit(String name, Consumer itemsConfigurer) { + this.listBuilder().emit(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder forEach( + String name, Consumer> itemsConfigurer) { + this.listBuilder().forEach(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder fork(String name, Consumer itemsConfigurer) { + this.listBuilder().fork(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder listen(String name, Consumer itemsConfigurer) { + this.listBuilder().listen(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder raise(String name, Consumer itemsConfigurer) { + this.listBuilder().raise(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder set(String name, Consumer itemsConfigurer) { + this.listBuilder().set(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder set(String name, String expr) { + this.listBuilder().set(name, expr); + return this; + } + + @Override + public DoTaskBuilder switchCase(String name, Consumer itemsConfigurer) { + this.listBuilder().switchCase(name, itemsConfigurer); + return this; + } + + @Override + public DoTaskBuilder tryCatch( + String name, Consumer> itemsConfigurer) { + this.listBuilder().tryCatch(name, itemsConfigurer); return this; } } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DoTaskFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DoTaskFluent.java deleted file mode 100644 index daaa8e25..00000000 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/DoTaskFluent.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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.spec; - -import java.util.function.Consumer; - -/** - * Documents the exposed fluent `do` DSL. - * - * @see CNCF - * DSL Reference - Do - * @param The TaskBaseBuilder constructor that sub-tasks will build - * @param The specialized BaseTaskItemListBuilder for sub-tasks that require a list of - * sub-tasks, such as `for`. - */ -public interface DoTaskFluent< - SELF extends DoTaskFluent, LIST extends BaseTaskItemListBuilder> { - - SELF set(String name, Consumer itemsConfigurer); - - SELF set(Consumer itemsConfigurer); - - SELF set(String name, final String expr); - - SELF set(final String expr); - - SELF forEach(String name, Consumer> itemsConfigurer); - - SELF forEach(Consumer> itemsConfigurer); - - SELF switchCase(String name, Consumer itemsConfigurer); - - SELF switchCase(Consumer itemsConfigurer); - - SELF raise(String name, Consumer itemsConfigurer); - - SELF raise(Consumer itemsConfigurer); - - SELF fork(String name, Consumer itemsConfigurer); - - SELF fork(Consumer itemsConfigurer); - - SELF listen(String name, Consumer itemsConfigurer); - - SELF listen(Consumer itemsConfigurer); - - SELF emit(String name, Consumer itemsConfigurer); - - SELF emit(Consumer itemsConfigurer); - - SELF tryCatch(String name, Consumer> itemsConfigurer); - - SELF tryCatch(Consumer> itemsConfigurer); - - SELF callHTTP(String name, Consumer itemsConfigurer); - - SELF callHTTP(Consumer itemsConfigurer); - - // ----- shortcuts/aliases - - default SELF sc(String name, Consumer cfg) { - return switchCase(name, cfg); - } - - default SELF sc(Consumer cfg) { - return switchCase(cfg); - } - - default SELF tc(String name, Consumer> cfg) { - return tryCatch(name, cfg); - } - - default SELF tc(Consumer> cfg) { - return tryCatch(cfg); - } -} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/EmitTaskBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/EmitTaskBuilder.java index 7a043c0a..be4aff6e 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/EmitTaskBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/EmitTaskBuilder.java @@ -24,7 +24,7 @@ public class EmitTaskBuilder extends TaskBaseBuilder { private final EmitTask emitTask; - EmitTaskBuilder() { + protected EmitTaskBuilder() { this.emitTask = new EmitTask(); super.setTask(emitTask); } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForTaskBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForEachTaskBuilder.java similarity index 73% rename from fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForTaskBuilder.java rename to fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForEachTaskBuilder.java index 70e97c64..f454e411 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForTaskBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForEachTaskBuilder.java @@ -17,16 +17,18 @@ import io.serverlessworkflow.api.types.ForTask; import io.serverlessworkflow.api.types.ForTaskConfiguration; +import io.serverlessworkflow.fluent.spec.spi.ForEachTaskFluent; import java.util.function.Consumer; -public class ForTaskBuilder> - extends TaskBaseBuilder> { +public class ForEachTaskBuilder> + extends TaskBaseBuilder> + implements ForEachTaskFluent, T> { private final ForTask forTask; private final ForTaskConfiguration forTaskConfiguration; private final T taskItemListBuilder; - ForTaskBuilder(T taskItemListBuilder) { + public ForEachTaskBuilder(T taskItemListBuilder) { super(); forTask = new ForTask(); forTaskConfiguration = new ForTaskConfiguration(); @@ -34,31 +36,31 @@ public class ForTaskBuilder> super.setTask(forTask); } - protected ForTaskBuilder self() { + protected ForEachTaskBuilder self() { return this; } - public ForTaskBuilder each(String each) { + public ForEachTaskBuilder each(String each) { forTaskConfiguration.setEach(each); return this; } - public ForTaskBuilder in(String in) { + public ForEachTaskBuilder in(String in) { this.forTaskConfiguration.setIn(in); return this; } - public ForTaskBuilder at(String at) { + public ForEachTaskBuilder at(String at) { this.forTaskConfiguration.setAt(at); return this; } - public ForTaskBuilder whileC(final String expression) { + public ForEachTaskBuilder whileC(final String expression) { this.forTask.setWhile(expression); return this; } - public ForTaskBuilder tasks(Consumer doBuilderConsumer) { + public ForEachTaskBuilder tasks(Consumer doBuilderConsumer) { final T taskItemListBuilder = this.taskItemListBuilder.newItemListBuilder(); doBuilderConsumer.accept(taskItemListBuilder); this.forTask.setDo(taskItemListBuilder.build()); diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForkTaskBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForkTaskBuilder.java index 51557259..56a21148 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForkTaskBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/ForkTaskBuilder.java @@ -17,36 +17,41 @@ import io.serverlessworkflow.api.types.ForkTask; import io.serverlessworkflow.api.types.ForkTaskConfiguration; +import io.serverlessworkflow.fluent.spec.spi.ForkTaskFluent; import java.util.function.Consumer; -public class ForkTaskBuilder extends TaskBaseBuilder { +public class ForkTaskBuilder extends TaskBaseBuilder + implements ForkTaskFluent { private final ForkTask forkTask; private final ForkTaskConfiguration forkTaskConfiguration; - @Override - protected ForkTaskBuilder self() { - return this; - } - ForkTaskBuilder() { this.forkTask = new ForkTask(); this.forkTaskConfiguration = new ForkTaskConfiguration(); super.setTask(this.forkTask); } - public ForkTaskBuilder compete(final Boolean compete) { + @Override + protected ForkTaskBuilder self() { + return this; + } + + @Override + public ForkTaskBuilder compete(final boolean compete) { this.forkTaskConfiguration.setCompete(compete); return this; } - public ForkTaskBuilder branches(Consumer branchesConsumer) { - final DoTaskBuilder doTaskBuilder = new DoTaskBuilder(); + @Override + public ForkTaskBuilder branches(Consumer branchesConsumer) { + final TaskItemListBuilder doTaskBuilder = new TaskItemListBuilder(); branchesConsumer.accept(doTaskBuilder); - this.forkTaskConfiguration.setBranches(doTaskBuilder.build().getDo()); + this.forkTaskConfiguration.setBranches(doTaskBuilder.build()); return this; } + @Override public ForkTask build() { return this.forkTask.withFork(this.forkTaskConfiguration); } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SetTaskBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SetTaskBuilder.java index a3166127..ced59032 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SetTaskBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SetTaskBuilder.java @@ -24,7 +24,7 @@ public class SetTaskBuilder extends TaskBaseBuilder { private final SetTask setTask; private final SetTaskConfiguration setTaskConfiguration; - SetTaskBuilder() { + public SetTaskBuilder() { this.setTask = new SetTask(); this.setTaskConfiguration = new SetTaskConfiguration(); this.setTask(setTask); diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SwitchTaskBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SwitchTaskBuilder.java index e82b42c5..8c6cc9a1 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SwitchTaskBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/SwitchTaskBuilder.java @@ -15,17 +15,15 @@ */ package io.serverlessworkflow.fluent.spec; -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 io.serverlessworkflow.fluent.spec.spi.SwitchTaskFluent; import java.util.ArrayList; import java.util.List; -import java.util.UUID; import java.util.function.Consumer; -public class SwitchTaskBuilder extends TaskBaseBuilder { +public class SwitchTaskBuilder extends TaskBaseBuilder + implements SwitchTaskFluent { private final SwitchTask switchTask; private final List switchItems; @@ -42,13 +40,11 @@ protected SwitchTaskBuilder self() { return this; } - public SwitchTaskBuilder items(Consumer switchCaseConsumer) { - return this.items(UUID.randomUUID().toString(), switchCaseConsumer); - } - + @Override public SwitchTaskBuilder items( - final String name, Consumer switchCaseConsumer) { - final SwitchCaseBuilder switchCaseBuilder = new SwitchCaseBuilder(); + final String name, Consumer switchCaseConsumer) { + final SwitchTaskFluent.SwitchCaseBuilder switchCaseBuilder = + new SwitchTaskFluent.SwitchCaseBuilder(); switchCaseConsumer.accept(switchCaseBuilder); this.switchItems.add(new SwitchItem(name, switchCaseBuilder.build())); return this; @@ -58,31 +54,4 @@ public SwitchTask build() { this.switchTask.setSwitch(this.switchItems); return this.switchTask; } - - public static final class SwitchCaseBuilder { - private final SwitchCase switchCase; - - SwitchCaseBuilder() { - this.switchCase = new SwitchCase(); - } - - public SwitchCaseBuilder when(String when) { - this.switchCase.setWhen(when); - return this; - } - - 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; - } - - public SwitchCase build() { - return this.switchCase; - } - } } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskBaseBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskBaseBuilder.java index 2bd068ce..3ce5c203 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskBaseBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskBaseBuilder.java @@ -27,6 +27,7 @@ import io.serverlessworkflow.api.types.SchemaInline; import io.serverlessworkflow.api.types.SchemaUnion; import io.serverlessworkflow.api.types.TaskBase; +import io.serverlessworkflow.fluent.spec.spi.TransformationHandlers; import java.util.function.Consumer; public abstract class TaskBaseBuilder> @@ -37,10 +38,14 @@ protected TaskBaseBuilder() {} protected abstract T self(); - protected void setTask(TaskBase task) { + protected final void setTask(TaskBase task) { this.task = task; } + public final TaskBase getTask() { + return task; + } + @Override public void setInput(Input input) { this.task.setInput(input); @@ -56,8 +61,17 @@ public void setOutput(Output output) { this.task.setOutput(output); } - public T ifClause(String id) { - this.task.setIf(id); + /** + * Conditional to execute this task. Parallel to the `if` conditional in the Spec. Replaced by + * `when` since `if` is a reserved word. + * + * @param expression jq expression to evaluate + * @see DSL + * Reference - Task + */ + public T when(String expression) { + this.task.setIf(expression); return self(); } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskItemListBuilder.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskItemListBuilder.java index 66cd59e2..4c82f62a 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskItemListBuilder.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TaskItemListBuilder.java @@ -15,12 +15,24 @@ */ package io.serverlessworkflow.fluent.spec; -public class TaskItemListBuilder extends BaseTaskItemListBuilder { +import io.serverlessworkflow.api.types.CallTask; +import io.serverlessworkflow.api.types.Task; +import io.serverlessworkflow.api.types.TaskItem; +import io.serverlessworkflow.fluent.spec.spi.DoFluent; +import java.util.List; +import java.util.function.Consumer; - TaskItemListBuilder() { +public class TaskItemListBuilder extends BaseTaskItemListBuilder + implements DoFluent { + + public TaskItemListBuilder() { super(); } + public TaskItemListBuilder(List list) { + super(list); + } + @Override protected TaskItemListBuilder self() { return this; @@ -30,4 +42,87 @@ protected TaskItemListBuilder self() { protected TaskItemListBuilder newItemListBuilder() { return new TaskItemListBuilder(); } + + @Override + public TaskItemListBuilder 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()))); + } + + @Override + public TaskItemListBuilder set(String name, final String expr) { + return this.set(name, s -> s.expr(expr)); + } + + @Override + public TaskItemListBuilder forEach( + String name, Consumer> itemsConfigurer) { + requireNameAndConfig(name, itemsConfigurer); + final ForEachTaskBuilder forBuilder = + new ForEachTaskBuilder<>(newItemListBuilder()); + itemsConfigurer.accept(forBuilder); + return addTaskItem(new TaskItem(name, new Task().withForTask(forBuilder.build()))); + } + + @Override + public TaskItemListBuilder switchCase(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()))); + } + + @Override + public TaskItemListBuilder 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()))); + } + + @Override + public TaskItemListBuilder 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()))); + } + + @Override + public TaskItemListBuilder 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()))); + } + + @Override + public TaskItemListBuilder 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()))); + } + + @Override + public TaskItemListBuilder tryCatch( + 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()))); + } + + @Override + public TaskItemListBuilder 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())))); + } } diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/CallHTTPFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/CallHTTPFluent.java new file mode 100644 index 00000000..48547057 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/CallHTTPFluent.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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface CallHTTPFluent, LIST> { + + LIST callHTTP(String name, Consumer itemsConfigurer); + + default LIST callHTTP(Consumer itemsConfigurer) { + return this.callHTTP(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/DoFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/DoFluent.java new file mode 100644 index 00000000..a18a08bf --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/DoFluent.java @@ -0,0 +1,45 @@ +/* + * 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.spec.spi; + +import io.serverlessworkflow.fluent.spec.CallHTTPTaskBuilder; +import io.serverlessworkflow.fluent.spec.EmitTaskBuilder; +import io.serverlessworkflow.fluent.spec.ForEachTaskBuilder; +import io.serverlessworkflow.fluent.spec.ForkTaskBuilder; +import io.serverlessworkflow.fluent.spec.ListenTaskBuilder; +import io.serverlessworkflow.fluent.spec.RaiseTaskBuilder; +import io.serverlessworkflow.fluent.spec.SetTaskBuilder; +import io.serverlessworkflow.fluent.spec.SwitchTaskBuilder; +import io.serverlessworkflow.fluent.spec.TaskItemListBuilder; +import io.serverlessworkflow.fluent.spec.TryTaskBuilder; + +/** + * Documents the exposed fluent `do` DSL. + * + * @see CNCF + * DSL Reference - Do + */ +public interface DoFluent + extends SetFluent, + SwitchFluent, + TryCatchFluent, T>, + CallHTTPFluent, + EmitFluent, + ForEachFluent, T>, + ForkFluent, + ListenFluent, + RaiseFluent {} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/EmitFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/EmitFluent.java new file mode 100644 index 00000000..06ab8d12 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/EmitFluent.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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface EmitFluent, LIST> { + + LIST emit(String name, Consumer itemsConfigurer); + + default LIST emit(Consumer itemsConfigurer) { + return emit(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForEachFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForEachFluent.java new file mode 100644 index 00000000..53a35e57 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForEachFluent.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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface ForEachFluent, LIST> { + + LIST forEach(String name, Consumer itemsConfigurer); + + default LIST forEach(Consumer itemsConfigurer) { + return this.forEach(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForEachTaskFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForEachTaskFluent.java new file mode 100644 index 00000000..4ca6d323 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForEachTaskFluent.java @@ -0,0 +1,37 @@ +/* + * 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.spec.spi; + +import io.serverlessworkflow.api.types.ForTask; +import io.serverlessworkflow.fluent.spec.BaseTaskItemListBuilder; +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.function.Consumer; + +public interface ForEachTaskFluent< + SELF extends TaskBaseBuilder, L extends BaseTaskItemListBuilder> { + + SELF each(String each); + + SELF in(String in); + + SELF at(String at); + + SELF whileC(final String expression); + + SELF tasks(Consumer doBuilderConsumer); + + ForTask build(); +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForkFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForkFluent.java new file mode 100644 index 00000000..708c41f8 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForkFluent.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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface ForkFluent, LIST> { + + LIST fork(String name, Consumer itemsConfigurer); + + default LIST fork(Consumer itemsConfigurer) { + return this.fork(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForkTaskFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForkTaskFluent.java new file mode 100644 index 00000000..31c40c9b --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ForkTaskFluent.java @@ -0,0 +1,31 @@ +/* + * 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.spec.spi; + +import io.serverlessworkflow.api.types.ForkTask; +import io.serverlessworkflow.fluent.spec.BaseTaskItemListBuilder; +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.function.Consumer; + +public interface ForkTaskFluent< + SELF extends TaskBaseBuilder, L extends BaseTaskItemListBuilder> { + + SELF compete(final boolean compete); + + SELF branches(Consumer branchesConsumer); + + ForkTask build(); +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ListenFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ListenFluent.java new file mode 100644 index 00000000..c3d32e14 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/ListenFluent.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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface ListenFluent, LIST> { + + LIST listen(String name, Consumer itemsConfigurer); + + default LIST listen(Consumer itemsConfigurer) { + return this.listen(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/RaiseFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/RaiseFluent.java new file mode 100644 index 00000000..699162d9 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/RaiseFluent.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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface RaiseFluent, LIST> { + + LIST raise(String name, Consumer itemsConfigurer); + + default LIST raise(Consumer itemsConfigurer) { + return this.raise(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SetFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SetFluent.java new file mode 100644 index 00000000..3bd743e7 --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SetFluent.java @@ -0,0 +1,35 @@ +/* + * 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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface SetFluent, LIST> { + + LIST set(String name, Consumer itemsConfigurer); + + LIST set(String name, final String expr); + + default LIST set(final String expr) { + return this.set(UUID.randomUUID().toString(), expr); + } + + default LIST set(Consumer itemsConfigurer) { + return this.set(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SwitchFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SwitchFluent.java new file mode 100644 index 00000000..affba92e --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SwitchFluent.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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface SwitchFluent, LIST> { + + LIST switchCase(String name, Consumer itemsConfigurer); + + default LIST switchCase(Consumer itemsConfigurer) { + return this.switchCase(UUID.randomUUID().toString(), itemsConfigurer); + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SwitchTaskFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SwitchTaskFluent.java new file mode 100644 index 00000000..1543660b --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/SwitchTaskFluent.java @@ -0,0 +1,61 @@ +/* + * 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.spec.spi; + +import io.serverlessworkflow.api.types.FlowDirective; +import io.serverlessworkflow.api.types.FlowDirectiveEnum; +import io.serverlessworkflow.api.types.SwitchCase; +import io.serverlessworkflow.api.types.SwitchTask; +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface SwitchTaskFluent> { + default SELF items(Consumer switchCaseConsumer) { + return this.items(UUID.randomUUID().toString(), switchCaseConsumer); + } + + SELF items(final String name, Consumer switchCaseConsumer); + + SwitchTask build(); + + final class SwitchCaseBuilder { + private final SwitchCase switchCase; + + public SwitchCaseBuilder() { + this.switchCase = new SwitchCase(); + } + + public SwitchCaseBuilder when(String when) { + this.switchCase.setWhen(when); + return this; + } + + 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; + } + + public SwitchCase build() { + return this.switchCase; + } + } +} diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TransformationHandlers.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/TransformationHandlers.java similarity index 95% rename from fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TransformationHandlers.java rename to fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/TransformationHandlers.java index f677fe22..5894109f 100644 --- a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/TransformationHandlers.java +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/TransformationHandlers.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.fluent.spec; +package io.serverlessworkflow.fluent.spec.spi; import io.serverlessworkflow.api.types.Export; import io.serverlessworkflow.api.types.Input; diff --git a/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/TryCatchFluent.java b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/TryCatchFluent.java new file mode 100644 index 00000000..ea2f82af --- /dev/null +++ b/fluent/spec/src/main/java/io/serverlessworkflow/fluent/spec/spi/TryCatchFluent.java @@ -0,0 +1,28 @@ +/* + * 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.spec.spi; + +import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; +import java.util.UUID; +import java.util.function.Consumer; + +public interface TryCatchFluent, LIST> { + LIST tryCatch(String name, Consumer itemsConfigurer); + + default LIST tryCatch(Consumer itemsConfigurer) { + return this.tryCatch(UUID.randomUUID().toString(), itemsConfigurer); + } +}