diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java index 58115e4e7..63bef84b9 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncCallTaskBuilder.java @@ -17,8 +17,8 @@ import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallTaskJava; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; import io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations; import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; @@ -51,22 +51,21 @@ public FuncCallTaskBuilder function(Function function, Class arg return this; } - public FuncCallTaskBuilder function(JavaContextFunction function) { + public FuncCallTaskBuilder function(ContextFunction function) { return function(function, null); } - public FuncCallTaskBuilder function( - JavaContextFunction function, Class argClass) { + public FuncCallTaskBuilder function(ContextFunction function, Class argClass) { this.callTaskJava = new CallTaskJava(CallJava.function(function, argClass)); super.setTask(this.callTaskJava.getCallJava()); return this; } - public FuncCallTaskBuilder function(JavaFilterFunction function) { + public FuncCallTaskBuilder function(FilterFunction function) { return function(function, null); } - public FuncCallTaskBuilder function(JavaFilterFunction function, Class argClass) { + public FuncCallTaskBuilder function(FilterFunction function, Class argClass) { this.callTaskJava = new CallTaskJava(CallJava.function(function, argClass)); super.setTask(this.callTaskJava.getCallJava()); return this; diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java index c6d51409c..17f909904 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncSwitchTaskBuilder.java @@ -20,7 +20,7 @@ import io.serverlessworkflow.api.types.SwitchCase; import io.serverlessworkflow.api.types.SwitchItem; import io.serverlessworkflow.api.types.SwitchTask; -import io.serverlessworkflow.api.types.func.SwitchCaseFunction; +import io.serverlessworkflow.api.types.func.SwitchCasePredicate; import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; import io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations; import io.serverlessworkflow.fluent.spec.TaskBaseBuilder; @@ -59,7 +59,7 @@ public FuncSwitchTaskBuilder onPredicate( String name, Consumer consumer) { final SwitchCasePredicateBuilder switchCase = new SwitchCasePredicateBuilder(); consumer.accept(switchCase); - final SwitchCaseFunction switchCaseValue = (SwitchCaseFunction) switchCase.build(); + final SwitchCasePredicate switchCaseValue = (SwitchCasePredicate) switchCase.build(); // Handling default cases if (switchCaseValue.predicate() == null) { @@ -89,10 +89,10 @@ public SwitchTask build() { } public static final class SwitchCasePredicateBuilder { - private final SwitchCaseFunction switchCase; + private final SwitchCasePredicate switchCase; SwitchCasePredicateBuilder() { - this.switchCase = new SwitchCaseFunction(); + this.switchCase = new SwitchCasePredicate(); } public SwitchCasePredicateBuilder when(Predicate when) { diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncCallStep.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncCallStep.java index 8575efe17..eb21cad92 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncCallStep.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncCallStep.java @@ -15,8 +15,8 @@ */ package io.serverlessworkflow.fluent.func.dsl; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.fluent.func.FuncCallTaskBuilder; import io.serverlessworkflow.fluent.func.FuncTaskItemListBuilder; import java.util.function.Consumer; @@ -26,8 +26,8 @@ public final class FuncCallStep extends Step, FuncCallT private final String name; private final Function fn; - private final JavaContextFunction ctxFn; - private final JavaFilterFunction filterFn; + private final ContextFunction ctxFn; + private final FilterFunction filterFn; private final Class argClass; /** Function variant (unnamed). */ @@ -44,13 +44,13 @@ public final class FuncCallStep extends Step, FuncCallT this.argClass = argClass; } - /** JavaContextFunction variant (unnamed). */ - FuncCallStep(JavaContextFunction ctxFn, Class argClass) { + /** ContextFunction variant (unnamed). */ + FuncCallStep(ContextFunction ctxFn, Class argClass) { this(null, ctxFn, argClass); } - /** JavaContextFunction variant (named). */ - FuncCallStep(String name, JavaContextFunction ctxFn, Class argClass) { + /** ContextFunction variant (named). */ + FuncCallStep(String name, ContextFunction ctxFn, Class argClass) { this.name = name; this.fn = null; this.ctxFn = ctxFn; @@ -58,13 +58,13 @@ public final class FuncCallStep extends Step, FuncCallT this.argClass = argClass; } - /** JavaFilterFunction variant (unnamed). */ - FuncCallStep(JavaFilterFunction filterFn, Class argClass) { + /** FilterFunction variant (unnamed). */ + FuncCallStep(FilterFunction filterFn, Class argClass) { this(null, filterFn, argClass); } - /** JavaFilterFunction variant (named). */ - FuncCallStep(String name, JavaFilterFunction filterFn, Class argClass) { + /** FilterFunction variant (named). */ + FuncCallStep(String name, FilterFunction filterFn, Class argClass) { this.name = name; this.fn = null; this.ctxFn = null; diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncDSL.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncDSL.java index eeaea6792..ea0edd1a3 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncDSL.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncDSL.java @@ -17,8 +17,8 @@ import io.cloudevents.CloudEventData; import io.serverlessworkflow.api.types.FlowDirectiveEnum; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.fluent.func.FuncCallTaskBuilder; import io.serverlessworkflow.fluent.func.FuncEmitTaskBuilder; import io.serverlessworkflow.fluent.func.FuncSwitchTaskBuilder; @@ -281,7 +281,7 @@ public static FuncPredicateEventConfigurer event(String type) { /** * Build a call step for functions that need {@link WorkflowContextData} as the first parameter. - * The DSL wraps it as a {@link JavaContextFunction} and injects the runtime context. + * The DSL wraps it as a {@link ContextFunction} and injects the runtime context. * *

Signature expected: {@code (ctx, payload) -> result} * @@ -291,16 +291,16 @@ public static FuncPredicateEventConfigurer event(String type) { * @param result type * @return a call step */ - public static FuncCallStep withContext(JavaContextFunction fn, Class in) { + public static FuncCallStep withContext(ContextFunction fn, Class in) { return withContext(null, fn, in); } - public static FuncCallStep withContext(JavaContextFunction fn) { + public static FuncCallStep withContext(ContextFunction fn) { return withContext(null, fn, ReflectionUtils.inferInputType(fn)); } /** - * Named variant of {@link #withContext(JavaContextFunction, Class)}. + * Named variant of {@link #withContext(ContextFunction, Class)}. * * @param name task name * @param fn context-aware function @@ -310,18 +310,18 @@ public static FuncCallStep withContext(JavaContextFunction fn * @return a named call step */ public static FuncCallStep withContext( - String name, JavaContextFunction fn, Class in) { + String name, ContextFunction fn, Class in) { return new FuncCallStep<>(name, fn, in); } - public static FuncCallStep withContext(String name, JavaContextFunction fn) { + public static FuncCallStep withContext(String name, ContextFunction fn) { return new FuncCallStep<>(name, fn, ReflectionUtils.inferInputType(fn)); } /** * Build a call step for functions that need {@link WorkflowContextData} and {@link * TaskContextData} as the first and second parameter. The DSL wraps it as a {@link - * JavaFilterFunction} and injects the runtime context. + * FilterFunction} and injects the runtime context. * *

Signature expected: {@code (payload, wctx, tctx) -> result} * @@ -331,12 +331,12 @@ public static FuncCallStep withContext(String name, JavaContextFunc * @param result type * @return a call step */ - public static FuncCallStep withFilter(JavaFilterFunction fn, Class in) { + public static FuncCallStep withFilter(FilterFunction fn, Class in) { return withFilter(null, fn, in); } /** - * Named variant of {@link #withFilter(JavaFilterFunction, Class)}. + * Named variant of {@link #withFilter(FilterFunction, Class)}. * * @param name task name * @param fn context-aware filter function @@ -346,15 +346,15 @@ public static FuncCallStep withFilter(JavaFilterFunction fn, * @return a named call step */ public static FuncCallStep withFilter( - String name, JavaFilterFunction fn, Class in) { + String name, FilterFunction fn, Class in) { return new FuncCallStep<>(name, fn, in); } - public static FuncCallStep withFilter(JavaFilterFunction fn) { + public static FuncCallStep withFilter(FilterFunction fn) { return withFilter(null, fn, ReflectionUtils.inferInputType(fn)); } - public static FuncCallStep withFilter(String name, JavaFilterFunction fn) { + public static FuncCallStep withFilter(String name, FilterFunction fn) { return withFilter(name, fn, ReflectionUtils.inferInputType(fn)); } @@ -370,7 +370,7 @@ public static FuncCallStep withFilter(String name, JavaFilterFuncti */ public static FuncCallStep withInstanceId( String name, InstanceIdFunction fn, Class in) { - JavaContextFunction jcf = (payload, wctx) -> fn.apply(wctx.instanceData().id(), payload); + ContextFunction jcf = (payload, wctx) -> fn.apply(wctx.instanceData().id(), payload); return new FuncCallStep<>(name, jcf, in); } @@ -426,7 +426,7 @@ static String defaultUniqueId(WorkflowContextData wctx, TaskContextData tctx) { */ public static FuncCallStep withUniqueId( String name, UniqueIdBiFunction fn, Class in) { - JavaFilterFunction jff = + FilterFunction jff = (payload, wctx, tctx) -> fn.apply(defaultUniqueId(wctx, tctx), payload); return new FuncCallStep<>(name, jff, in); } diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/ReflectionUtils.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/ReflectionUtils.java index 34617d787..c0b184993 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/ReflectionUtils.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/ReflectionUtils.java @@ -15,8 +15,8 @@ */ package io.serverlessworkflow.fluent.func.dsl; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import java.lang.invoke.MethodType; import java.lang.invoke.SerializedLambda; import java.lang.reflect.Method; @@ -32,12 +32,12 @@ final class ReflectionUtils { private ReflectionUtils() {} @SuppressWarnings("unchecked") - static Class inferInputType(JavaContextFunction fn) { + static Class inferInputType(ContextFunction fn) { return throwIllegalStateIfNull((Class) inferInputTypeFromAny(fn, 0)); } @SuppressWarnings("unchecked") - static Class inferInputType(JavaFilterFunction fn) { + static Class inferInputType(FilterFunction fn) { return throwIllegalStateIfNull((Class) inferInputTypeFromAny(fn, 0)); } diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/Step.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/Step.java index 71a4dc186..efbddba01 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/Step.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/Step.java @@ -16,8 +16,8 @@ package io.serverlessworkflow.fluent.func.dsl; import io.serverlessworkflow.api.types.FlowDirectiveEnum; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.fluent.func.FuncTaskItemListBuilder; import io.serverlessworkflow.fluent.func.configurers.FuncTaskConfigurer; import io.serverlessworkflow.fluent.func.spi.ConditionalTaskBuilder; @@ -153,9 +153,9 @@ public SELF exportAs(Function function, Class taskResultClass) { * @param the export type (what gets forwarded to the next step) * @param function the filter function with workflow and task context * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(JavaFilterFunction) + * @see io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(FilterFunction) */ - public SELF exportAs(JavaFilterFunction function) { + public SELF exportAs(FilterFunction function) { postConfigurers.add(b -> ((FuncTaskTransformations) b).exportAs(function)); return self(); } @@ -169,10 +169,10 @@ public SELF exportAs(JavaFilterFunction function) { * @param function the filter function with workflow and task context * @param taskResultClass the class of the task result type * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(JavaFilterFunction, + * @see io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(FilterFunction, * Class) */ - public SELF exportAs(JavaFilterFunction function, Class taskResultClass) { + public SELF exportAs(FilterFunction function, Class taskResultClass) { postConfigurers.add(b -> ((FuncTaskTransformations) b).exportAs(function, taskResultClass)); return self(); } @@ -187,10 +187,9 @@ public SELF exportAs(JavaFilterFunction function, Class taskResu * @param the export type (what gets forwarded to the next step) * @param function the context function with workflow context * @return this step for method chaining - * @see - * io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(JavaContextFunction) + * @see io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(ContextFunction) */ - public SELF exportAs(JavaContextFunction function) { + public SELF exportAs(ContextFunction function) { postConfigurers.add(b -> ((FuncTaskTransformations) b).exportAs(function)); return self(); } @@ -204,11 +203,10 @@ public SELF exportAs(JavaContextFunction function) { * @param function the context function with workflow context * @param taskResultClass the class of the task result type * @return this step for method chaining - * @see - * io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(JavaContextFunction, + * @see io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations#exportAs(ContextFunction, * Class) */ - public SELF exportAs(JavaContextFunction function, Class taskResultClass) { + public SELF exportAs(ContextFunction function, Class taskResultClass) { postConfigurers.add(b -> ((FuncTaskTransformations) b).exportAs(function, taskResultClass)); return self(); } @@ -311,9 +309,9 @@ public SELF outputAs(Function function, Class taskResultClass) { * @param the output type (what gets written to workflow data) * @param function the filter function with workflow and task context * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(JavaFilterFunction) + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(FilterFunction) */ - public SELF outputAs(JavaFilterFunction function) { + public SELF outputAs(FilterFunction function) { postConfigurers.add(b -> ((FuncTaskTransformations) b).outputAs(function)); return self(); } @@ -327,10 +325,9 @@ public SELF outputAs(JavaFilterFunction function) { * @param function the filter function with workflow and task context * @param taskResultClass the class of the task result type * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(JavaFilterFunction, - * Class) + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(FilterFunction, Class) */ - public SELF outputAs(JavaFilterFunction function, Class taskResultClass) { + public SELF outputAs(FilterFunction function, Class taskResultClass) { postConfigurers.add(b -> ((FuncTaskTransformations) b).outputAs(function, taskResultClass)); return self(); } @@ -345,9 +342,9 @@ public SELF outputAs(JavaFilterFunction function, Class taskResu * @param the output type (what gets written to workflow data) * @param function the context function with workflow context * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(JavaContextFunction) + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(ContextFunction) */ - public SELF outputAs(JavaContextFunction function) { + public SELF outputAs(ContextFunction function) { postConfigurers.add(b -> ((FuncTaskTransformations) b).outputAs(function)); return self(); } @@ -361,10 +358,9 @@ public SELF outputAs(JavaContextFunction function) { * @param function the context function with workflow context * @param taskResultClass the class of the task result type * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(JavaContextFunction, - * Class) + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#outputAs(ContextFunction, Class) */ - public SELF outputAs(JavaContextFunction function, Class taskResultClass) { + public SELF outputAs(ContextFunction function, Class taskResultClass) { postConfigurers.add(b -> ((FuncTaskTransformations) b).outputAs(function, taskResultClass)); return self(); } @@ -469,9 +465,9 @@ public SELF inputFrom(Function function, Class inputClass) { * @param the result type (what the task will see as input) * @param function the filter function with workflow and task context * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(JavaFilterFunction) + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(FilterFunction) */ - public SELF inputFrom(JavaFilterFunction function) { + public SELF inputFrom(FilterFunction function) { postConfigurers.add(b -> ((FuncTaskTransformations) b).inputFrom(function)); return self(); } @@ -479,18 +475,17 @@ public SELF inputFrom(JavaFilterFunction function) { /** * Shapes the task input using a context-aware filter function with explicit input type. * - *

This variant combines the benefits of {@link #inputFrom(JavaFilterFunction)} with explicit - * type specification. + *

This variant combines the benefits of {@link #inputFrom(FilterFunction)} with explicit type + * specification. * * @param the input type (workflow data or task input) * @param the result type (what the task will see as input) * @param function the filter function with workflow and task context * @param inputClass the class of the input type * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(JavaFilterFunction, - * Class) + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(FilterFunction, Class) */ - public SELF inputFrom(JavaFilterFunction function, Class inputClass) { + public SELF inputFrom(FilterFunction function, Class inputClass) { postConfigurers.add(b -> ((FuncTaskTransformations) b).inputFrom(function, inputClass)); return self(); } @@ -505,9 +500,9 @@ public SELF inputFrom(JavaFilterFunction function, Class inputCl * @param the result type (what the task will see as input) * @param function the context function with workflow context * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(JavaContextFunction) + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(ContextFunction) */ - public SELF inputFrom(JavaContextFunction function) { + public SELF inputFrom(ContextFunction function) { postConfigurers.add(b -> ((FuncTaskTransformations) b).inputFrom(function)); return self(); } @@ -515,18 +510,18 @@ public SELF inputFrom(JavaContextFunction function) { /** * Shapes the task input using a context-aware function with explicit input type. * - *

This variant combines the benefits of {@link #inputFrom(JavaContextFunction)} with explicit - * type specification. + *

This variant combines the benefits of {@link #inputFrom(ContextFunction)} with explicit type + * specification. * * @param the input type (workflow data or task input) * @param the result type (what the task will see as input) * @param function the context function with workflow context * @param inputClass the class of the input type * @return this step for method chaining - * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(JavaContextFunction, + * @see io.serverlessworkflow.fluent.func.spi.FuncTransformations#inputFrom(ContextFunction, * Class) */ - public SELF inputFrom(JavaContextFunction function, Class inputClass) { + public SELF inputFrom(ContextFunction function, Class inputClass) { postConfigurers.add(b -> ((FuncTaskTransformations) b).inputFrom(function, inputClass)); return self(); } diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTaskTransformations.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTaskTransformations.java index 16d2be288..74be14047 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTaskTransformations.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTaskTransformations.java @@ -16,9 +16,9 @@ package io.serverlessworkflow.fluent.func.spi; import io.serverlessworkflow.api.types.Export; +import io.serverlessworkflow.api.types.func.ContextFunction; import io.serverlessworkflow.api.types.func.ExportAsFunction; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.fluent.spec.spi.TaskTransformationHandlers; import java.util.function.Function; @@ -38,25 +38,25 @@ default SELF exportAs(Function function, Class argClass) { } @SuppressWarnings("unchecked") - default SELF exportAs(JavaFilterFunction function) { + default SELF exportAs(FilterFunction function) { setExport(new Export().withAs(new ExportAsFunction().withFunction(function))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF exportAs(JavaFilterFunction function, Class argClass) { + default SELF exportAs(FilterFunction function, Class argClass) { setExport(new Export().withAs(new ExportAsFunction().withFunction(function, argClass))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF exportAs(JavaContextFunction function) { + default SELF exportAs(ContextFunction function) { setExport(new Export().withAs(new ExportAsFunction().withFunction(function))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF exportAs(JavaContextFunction function, Class argClass) { + default SELF exportAs(ContextFunction function, Class argClass) { setExport(new Export().withAs(new ExportAsFunction().withFunction(function, argClass))); return (SELF) this; } diff --git a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTransformations.java b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTransformations.java index 65e8456b2..eb21f7aeb 100644 --- a/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTransformations.java +++ b/experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncTransformations.java @@ -19,9 +19,9 @@ import io.serverlessworkflow.api.types.InputFrom; import io.serverlessworkflow.api.types.Output; import io.serverlessworkflow.api.types.OutputAs; +import io.serverlessworkflow.api.types.func.ContextFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.api.types.func.InputFromFunction; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; import io.serverlessworkflow.api.types.func.OutputAsFunction; import io.serverlessworkflow.fluent.spec.spi.TransformationHandlers; import java.util.function.Function; @@ -42,25 +42,25 @@ default SELF inputFrom(Function function, Class argClass) { } @SuppressWarnings("unchecked") - default SELF inputFrom(JavaFilterFunction function) { + default SELF inputFrom(FilterFunction function) { setInput(new Input().withFrom(new InputFromFunction().withFunction(function))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF inputFrom(JavaFilterFunction function, Class argClass) { + default SELF inputFrom(FilterFunction function, Class argClass) { setInput(new Input().withFrom(new InputFromFunction().withFunction(function, argClass))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF inputFrom(JavaContextFunction function) { + default SELF inputFrom(ContextFunction function) { setInput(new Input().withFrom(new InputFromFunction().withFunction(function))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF inputFrom(JavaContextFunction function, Class argClass) { + default SELF inputFrom(ContextFunction function, Class argClass) { setInput(new Input().withFrom(new InputFromFunction().withFunction(function, argClass))); return (SELF) this; } @@ -84,25 +84,25 @@ default SELF outputAs(Function function, Class argClass) { } @SuppressWarnings("unchecked") - default SELF outputAs(JavaFilterFunction function) { + default SELF outputAs(FilterFunction function) { setOutput(new Output().withAs(new OutputAsFunction().withFunction(function))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF outputAs(JavaFilterFunction function, Class argClass) { + default SELF outputAs(FilterFunction function, Class argClass) { setOutput(new Output().withAs(new OutputAsFunction().withFunction(function, argClass))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF outputAs(JavaContextFunction function) { + default SELF outputAs(ContextFunction function) { setOutput(new Output().withAs(new OutputAsFunction().withFunction(function))); return (SELF) this; } @SuppressWarnings("unchecked") - default SELF outputAs(JavaContextFunction function, Class argClass) { + default SELF outputAs(ContextFunction function, Class argClass) { setOutput(new Output().withAs(new OutputAsFunction().withFunction(function, argClass))); return (SELF) this; } diff --git a/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLTest.java b/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLTest.java index 611c9b7a3..db0386709 100644 --- a/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLTest.java +++ b/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLTest.java @@ -38,7 +38,7 @@ import io.serverlessworkflow.api.types.TaskItem; import io.serverlessworkflow.api.types.Workflow; import io.serverlessworkflow.api.types.func.CallJava; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.fluent.func.dsl.FuncDSL; import io.serverlessworkflow.fluent.func.dsl.FuncEmitSpec; import io.serverlessworkflow.fluent.func.dsl.FuncListenSpec; @@ -98,8 +98,7 @@ void emit_step_exportAs_javaFilter_sets_export() { .type("org.acme.signal") .bytesData((String s) -> s.getBytes(StandardCharsets.UTF_8), String.class); - // JavaFilterFunction is (T, WorkflowContextData, TaskContextData) -> R - JavaFilterFunction> jf = + FilterFunction> jf = (val, wfCtx, taskCtx) -> Map.of("wrapped", val, "wfId", wfCtx.instanceData().id()); Workflow wf = diff --git a/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLUniqueIdTest.java b/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLUniqueIdTest.java index 7797556e8..213abc941 100644 --- a/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLUniqueIdTest.java +++ b/experimental/fluent/func/src/test/java/io/serverlessworkflow/fluent/func/FuncDSLUniqueIdTest.java @@ -24,7 +24,7 @@ import io.serverlessworkflow.api.types.TaskItem; import io.serverlessworkflow.api.types.Workflow; import io.serverlessworkflow.api.types.func.CallJava; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.fluent.func.dsl.UniqueIdBiFunction; import io.serverlessworkflow.impl.TaskContextData; import io.serverlessworkflow.impl.WorkflowContextData; @@ -42,9 +42,9 @@ class FuncDSLUniqueIdTest { @SuppressWarnings("unchecked") - private static JavaFilterFunction extractJavaFilterFunction(CallJava callJava) { + private static FilterFunction extractFilterFunction(CallJava callJava) { if (callJava instanceof CallJava.CallJavaFilterFunction f) { - return (JavaFilterFunction) f.function(); + return (FilterFunction) f.function(); } fail("CallTask is not a CallJavaFilterFunction; DSL contract may have changed."); return null; // unreachable @@ -75,7 +75,7 @@ void withUniqueId_uses_json_pointer_for_unique_id() { assertNotNull(t.getCallTask(), "CallTask expected"); CallJava cj = (CallJava) t.getCallTask().get(); - var jff = extractJavaFilterFunction(cj); + var jff = extractFilterFunction(cj); assertNotNull(jff, "JavaFilterFunction must be present for withUniqueId"); // Mockito stubs for runtime contexts @@ -123,7 +123,7 @@ void agent_uses_json_pointer_for_unique_id() { assertNotNull(t.getCallTask(), "CallTask expected"); CallJava cj = (CallJava) t.getCallTask().get(); - var jff = extractJavaFilterFunction(cj); + var jff = extractFilterFunction(cj); assertNotNull(jff, "JavaFilterFunction must be present for agent/withUniqueId"); WorkflowInstanceData inst = mock(WorkflowInstanceData.class); diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutor.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutor.java index beeb94b16..d8781ab72 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutor.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutor.java @@ -15,17 +15,17 @@ */ package io.serverlessworkflow.impl.executors.func; -import io.serverlessworkflow.api.types.func.JavaContextFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; import io.serverlessworkflow.impl.TaskContext; import io.serverlessworkflow.impl.WorkflowContext; import java.util.Optional; public class JavaContextFunctionCallExecutor extends AbstractJavaCallExecutor { - private final JavaContextFunction function; + private final ContextFunction function; public JavaContextFunctionCallExecutor( - Optional> inputClass, JavaContextFunction function) { + Optional> inputClass, ContextFunction function) { super(inputClass); this.function = function; } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java index e115141b3..c542d1669 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaContextFunctionCallExecutorBuilder.java @@ -18,7 +18,7 @@ import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallJava.CallJavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaContextFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; import io.serverlessworkflow.impl.executors.CallableTask; @@ -28,7 +28,7 @@ public class JavaContextFunctionCallExecutorBuilder implements CallableTaskBuilder> { - protected JavaContextFunction function; + protected ContextFunction function; protected Optional> inputClass; @Override diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutor.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutor.java index e0272c5c3..f5e583934 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutor.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutor.java @@ -15,17 +15,17 @@ */ package io.serverlessworkflow.impl.executors.func; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.impl.TaskContext; import io.serverlessworkflow.impl.WorkflowContext; import java.util.Optional; public class JavaFilterFunctionCallExecutor extends AbstractJavaCallExecutor { - private final JavaFilterFunction function; + private final FilterFunction function; public JavaFilterFunctionCallExecutor( - Optional> inputClass, JavaFilterFunction function) { + Optional> inputClass, FilterFunction function) { super(inputClass); this.function = function; } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java index 1b19677e6..db354e2de 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFilterFunctionCallExecutorBuilder.java @@ -18,7 +18,7 @@ import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallJava.CallJavaFilterFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.FilterFunction; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; import io.serverlessworkflow.impl.executors.CallableTask; @@ -28,7 +28,7 @@ public class JavaFilterFunctionCallExecutorBuilder implements CallableTaskBuilder> { - private JavaFilterFunction function; + private FilterFunction function; private Optional> inputClass; @Override diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java index 3ffb71083..0d07bbdb3 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaForExecutorBuilder.java @@ -19,7 +19,7 @@ import io.serverlessworkflow.api.types.ForTask; import io.serverlessworkflow.api.types.func.ForTaskFunction; -import io.serverlessworkflow.api.types.func.LoopPredicateIndex; +import io.serverlessworkflow.api.types.func.LoopPredicateIndexFilter; import io.serverlessworkflow.api.types.func.TypedFunction; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; @@ -40,7 +40,7 @@ protected JavaForExecutorBuilder( @Override protected Optional buildWhileFilter() { if (task instanceof ForTaskFunction taskFunctions) { - final LoopPredicateIndex whilePred = taskFunctions.getWhilePredicate(); + final LoopPredicateIndexFilter whilePred = taskFunctions.getWhilePredicate(); Optional> whileClass = taskFunctions.getWhileClass(); String varName = task.getFor().getEach(); String indexName = task.getFor().getAt(); @@ -51,7 +51,9 @@ protected Optional buildWhileFilter() { return whilePred.test( JavaFuncUtils.convert(n, whileClass), item, - (Integer) safeObject(t.variables().get(indexName))); + (Integer) safeObject(t.variables().get(indexName)), + w, + t); }); } } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFuncUtils.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFuncUtils.java index 608cf8f87..b1e6b5a04 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFuncUtils.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaFuncUtils.java @@ -15,10 +15,12 @@ */ package io.serverlessworkflow.impl.executors.func; -import io.serverlessworkflow.api.types.func.TypedPredicate; +import io.serverlessworkflow.api.types.func.PredicateContainer; +import io.serverlessworkflow.impl.WorkflowApplication; import io.serverlessworkflow.impl.WorkflowModel; +import io.serverlessworkflow.impl.WorkflowPredicate; +import io.serverlessworkflow.impl.expressions.ExpressionDescriptor; import java.util.Optional; -import java.util.function.Predicate; public class JavaFuncUtils { @@ -26,9 +28,11 @@ static Object safeObject(Object obj) { return obj instanceof WorkflowModel model ? model.asJavaObject() : obj; } - @SuppressWarnings({"unchecked", "rawtypes"}) - static Object predObject(Predicate pred, Optional> predClass) { - return predClass.isPresent() ? new TypedPredicate(pred, predClass.orElseThrow()) : pred; + static WorkflowPredicate from(WorkflowApplication application, PredicateContainer source) { + assert (source.predicate() != null); + return application + .expressionFactory() + .buildPredicate(ExpressionDescriptor.object(source.predicate())); } static T convertT(WorkflowModel model, Optional> inputClass) { diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaListenExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaListenExecutorBuilder.java index 57393976f..394423c48 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaListenExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaListenExecutorBuilder.java @@ -15,8 +15,6 @@ */ package io.serverlessworkflow.impl.executors.func; -import static io.serverlessworkflow.impl.executors.func.JavaFuncUtils.predObject; - import io.serverlessworkflow.api.types.ListenTask; import io.serverlessworkflow.api.types.Until; import io.serverlessworkflow.api.types.func.UntilPredicate; @@ -24,7 +22,6 @@ import io.serverlessworkflow.impl.WorkflowMutablePosition; import io.serverlessworkflow.impl.WorkflowPredicate; import io.serverlessworkflow.impl.executors.ListenExecutor.ListenExecutorBuilder; -import io.serverlessworkflow.impl.expressions.ExpressionDescriptor; public class JavaListenExecutorBuilder extends ListenExecutorBuilder { @@ -36,11 +33,7 @@ protected JavaListenExecutorBuilder( @Override protected WorkflowPredicate buildUntilPredicate(Until until) { return until instanceof UntilPredicate untilPred && untilPred.predicate() != null - ? application - .expressionFactory() - .buildPredicate( - ExpressionDescriptor.object( - predObject(untilPred.predicate(), untilPred.predicateClass()))) + ? JavaFuncUtils.from(application, untilPred) : super.buildUntilPredicate(until); } } diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaSwitchExecutorBuilder.java b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaSwitchExecutorBuilder.java index 1c54065db..1676c57b2 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaSwitchExecutorBuilder.java +++ b/experimental/lambda/src/main/java/io/serverlessworkflow/impl/executors/func/JavaSwitchExecutorBuilder.java @@ -15,16 +15,13 @@ */ package io.serverlessworkflow.impl.executors.func; -import static io.serverlessworkflow.impl.executors.func.JavaFuncUtils.predObject; - import io.serverlessworkflow.api.types.SwitchCase; import io.serverlessworkflow.api.types.SwitchTask; -import io.serverlessworkflow.api.types.func.SwitchCaseFunction; +import io.serverlessworkflow.api.types.func.SwitchCasePredicate; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowMutablePosition; import io.serverlessworkflow.impl.WorkflowPredicate; import io.serverlessworkflow.impl.executors.SwitchExecutor.SwitchExecutorBuilder; -import io.serverlessworkflow.impl.expressions.ExpressionDescriptor; import java.util.Optional; public class JavaSwitchExecutorBuilder extends SwitchExecutorBuilder { @@ -36,13 +33,8 @@ protected JavaSwitchExecutorBuilder( @Override protected Optional buildFilter(SwitchCase switchCase) { - return switchCase instanceof SwitchCaseFunction function - ? Optional.of( - application - .expressionFactory() - .buildPredicate( - ExpressionDescriptor.object( - predObject(function.predicate(), function.predicateClass())))) + return switchCase instanceof SwitchCasePredicate predicate && predicate.predicate() != null + ? Optional.of(JavaFuncUtils.from(application, predicate)) : super.buildFilter(switchCase); } } 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 4727fc375..058fb0550 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 @@ -18,12 +18,16 @@ import io.cloudevents.CloudEventData; import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.api.types.TaskMetadata; -import io.serverlessworkflow.api.types.func.JavaContextFunction; -import io.serverlessworkflow.api.types.func.JavaFilterFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; +import io.serverlessworkflow.api.types.func.ContextPredicate; +import io.serverlessworkflow.api.types.func.FilterFunction; +import io.serverlessworkflow.api.types.func.FilterPredicate; import io.serverlessworkflow.api.types.func.TaskMetadataKeys; +import io.serverlessworkflow.api.types.func.TypedContextFunction; +import io.serverlessworkflow.api.types.func.TypedContextPredicate; +import io.serverlessworkflow.api.types.func.TypedFilterFunction; +import io.serverlessworkflow.api.types.func.TypedFilterPredicate; import io.serverlessworkflow.api.types.func.TypedFunction; -import io.serverlessworkflow.api.types.func.TypedJavaContextFunction; -import io.serverlessworkflow.api.types.func.TypedJavaFilterFunction; import io.serverlessworkflow.api.types.func.TypedPredicate; import io.serverlessworkflow.impl.WorkflowModel; import io.serverlessworkflow.impl.WorkflowPredicate; @@ -46,13 +50,13 @@ public ObjectExpression buildExpression(ExpressionDescriptor descriptor) { return (w, t, n) -> func.apply(n.asJavaObject()); } else if (value instanceof TypedFunction func) { return (w, t, n) -> func.function().apply(convert(n, func.argClass())); - } else if (value instanceof JavaFilterFunction func) { + } else if (value instanceof FilterFunction func) { return (w, t, n) -> func.apply(n.asJavaObject(), w, t); - } else if (value instanceof TypedJavaFilterFunction func) { + } else if (value instanceof TypedFilterFunction func) { return (w, t, n) -> func.function().apply(convert(n, func.argClass()), w, t); - } else if (value instanceof JavaContextFunction func) { + } else if (value instanceof ContextFunction func) { return (w, t, n) -> func.apply(n.asJavaObject(), w); - } else if (value instanceof TypedJavaContextFunction func) { + } else if (value instanceof TypedContextFunction func) { return (w, t, n) -> func.function().apply(convert(n, func.argClass()), w); } else { return (w, t, n) -> value; @@ -75,12 +79,16 @@ public int priority(ExpressionDescriptor descriptor) { Object value = descriptor.asObject(); if (value instanceof Function || value instanceof TypedFunction - || value instanceof JavaFilterFunction - || value instanceof TypedJavaFilterFunction - || value instanceof JavaContextFunction - || value instanceof TypedJavaContextFunction + || value instanceof FilterFunction + || value instanceof TypedFilterFunction + || value instanceof ContextFunction + || value instanceof TypedContextFunction || value instanceof Predicate || value instanceof TypedPredicate + || value instanceof ContextPredicate + || value instanceof TypedContextPredicate + || value instanceof FilterPredicate + || value instanceof TypedFilterPredicate || value instanceof Boolean) { return DEFAULT_PRIORITY - 500; } else if (descriptor.asString() == null) { @@ -97,7 +105,23 @@ private WorkflowPredicate fromPredicate(Predicate pred) { @SuppressWarnings({"rawtypes", "unchecked"}) private WorkflowPredicate fromPredicate(TypedPredicate pred) { - return (w, t, n) -> pred.pred().test(n.as(pred.argClass()).orElseThrow()); + return (w, t, n) -> pred.pred().test(convert(n, pred.argClass())); + } + + private WorkflowPredicate fromPredicate(ContextPredicate pred) { + return (w, t, n) -> pred.test(n.asJavaObject(), w); + } + + private WorkflowPredicate fromPredicate(TypedContextPredicate pred) { + return (w, t, n) -> pred.predicate().test(convert(n, pred.argClass()), w); + } + + private WorkflowPredicate fromPredicate(FilterPredicate pred) { + return (w, t, n) -> pred.test(n.asJavaObject(), w, t); + } + + private WorkflowPredicate fromPredicate(TypedFilterPredicate pred) { + return (w, t, n) -> pred.predicate().test(convert(n, pred.argClass()), w, t); } @Override @@ -109,6 +133,14 @@ public Optional buildIfFilter(TaskBase task) { return Optional.of(fromPredicate(pred)); } else if (obj instanceof TypedPredicate pred) { return Optional.of(fromPredicate(pred)); + } else if (obj instanceof ContextPredicate pred) { + return Optional.of(fromPredicate(pred)); + } else if (obj instanceof TypedContextPredicate pred) { + return Optional.of(fromPredicate(pred)); + } else if (obj instanceof FilterPredicate pred) { + return Optional.of(fromPredicate(pred)); + } else if (obj instanceof TypedFilterPredicate pred) { + return Optional.of(fromPredicate(pred)); } } return Optional.empty(); @@ -121,6 +153,14 @@ public WorkflowPredicate buildPredicate(ExpressionDescriptor desc) { return fromPredicate(pred); } else if (value instanceof TypedPredicate pred) { return fromPredicate(pred); + } else if (value instanceof ContextPredicate pred) { + return fromPredicate(pred); + } else if (value instanceof TypedContextPredicate pred) { + return fromPredicate(pred); + } else if (value instanceof FilterPredicate pred) { + return fromPredicate(pred); + } else if (value instanceof TypedFilterPredicate pred) { + return fromPredicate(pred); } else if (value instanceof Boolean bool) { return (w, f, n) -> bool; } else { diff --git a/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallJavaContextFunctionTest.java b/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallJavaContextFunctionTest.java index 2520354d7..3a90da348 100644 --- a/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallJavaContextFunctionTest.java +++ b/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallJavaContextFunctionTest.java @@ -23,7 +23,7 @@ import io.serverlessworkflow.api.types.Workflow; import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallTaskJava; -import io.serverlessworkflow.api.types.func.JavaContextFunction; +import io.serverlessworkflow.api.types.func.ContextFunction; import io.serverlessworkflow.impl.WorkflowApplication; import java.util.List; import java.util.concurrent.ExecutionException; @@ -38,7 +38,7 @@ record Person(String name, int age) {} void testJavaContextFunction_simple() throws InterruptedException, ExecutionException { try (WorkflowApplication app = WorkflowApplication.builder().build()) { var ctxFn = - (JavaContextFunction) + (ContextFunction) (person, workflowContext) -> person.name + "@" diff --git a/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallTest.java b/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallTest.java index 5b0f7f6c8..5427b5c28 100644 --- a/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallTest.java +++ b/experimental/lambda/src/test/java/io/serverless/workflow/impl/executors/func/CallTest.java @@ -30,7 +30,7 @@ import io.serverlessworkflow.api.types.func.CallJava; import io.serverlessworkflow.api.types.func.CallTaskJava; import io.serverlessworkflow.api.types.func.ForTaskFunction; -import io.serverlessworkflow.api.types.func.SwitchCaseFunction; +import io.serverlessworkflow.api.types.func.SwitchCasePredicate; import io.serverlessworkflow.api.types.func.TaskMetadataKeys; import io.serverlessworkflow.impl.WorkflowApplication; import io.serverlessworkflow.impl.WorkflowDefinition; @@ -143,7 +143,7 @@ void testSwitch() throws InterruptedException, ExecutionException { List.of( new SwitchItem( "odd", - new SwitchCaseFunction() + new SwitchCasePredicate() .withPredicate(CallTest::isOdd, Integer.class) .withThen( new FlowDirective() diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/CallJava.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/CallJava.java index a9699b6b7..e9829755f 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/CallJava.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/CallJava.java @@ -50,11 +50,11 @@ public static CallJava loopFunction(LoopFunction function, St return new CallJavaLoopFunction<>(function, varName); } - public static CallJava function(JavaContextFunction function, Class inputClass) { + public static CallJava function(ContextFunction function, Class inputClass) { return new CallJavaContextFunction<>(function, Optional.ofNullable(inputClass)); } - public static CallJava function(JavaFilterFunction function, Class inputClass) { + public static CallJava function(FilterFunction function, Class inputClass) { return new CallJavaFilterFunction<>(function, Optional.ofNullable(inputClass)); } @@ -99,16 +99,15 @@ public Optional> inputClass() { public static class CallJavaContextFunction extends CallJava { private static final long serialVersionUID = 1L; - private final JavaContextFunction function; + private final ContextFunction function; private final Optional> inputClass; - public CallJavaContextFunction( - JavaContextFunction function, Optional> inputClass) { + public CallJavaContextFunction(ContextFunction function, Optional> inputClass) { this.function = function; this.inputClass = inputClass; } - public JavaContextFunction function() { + public ContextFunction function() { return function; } @@ -119,16 +118,15 @@ public Optional> inputClass() { public static class CallJavaFilterFunction extends CallJava { private static final long serialVersionUID = 1L; - private final JavaFilterFunction function; + private final FilterFunction function; private final Optional> inputClass; - public CallJavaFilterFunction( - JavaFilterFunction function, Optional> inputClass) { + public CallJavaFilterFunction(FilterFunction function, Optional> inputClass) { this.function = function; this.inputClass = inputClass; } - public JavaFilterFunction function() { + public FilterFunction function() { return function; } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/JavaContextFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ContextFunction.java similarity index 92% rename from experimental/types/src/main/java/io/serverlessworkflow/api/types/func/JavaContextFunction.java rename to experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ContextFunction.java index aae14302b..197764a70 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/JavaContextFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ContextFunction.java @@ -19,6 +19,6 @@ import java.io.Serializable; @FunctionalInterface -public interface JavaContextFunction extends Serializable { +public interface ContextFunction extends Serializable { R apply(T object, WorkflowContextData workflowContext); } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ContextPredicate.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ContextPredicate.java new file mode 100644 index 000000000..f1072c135 --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ContextPredicate.java @@ -0,0 +1,23 @@ +/* + * 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.api.types.func; + +import io.serverlessworkflow.impl.WorkflowContextData; + +@FunctionalInterface +public interface ContextPredicate { + boolean test(T value, WorkflowContextData context); +} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/EventDataPredicate.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/EventDataPredicate.java index e42612ca3..1e6865eac 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/EventDataPredicate.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/EventDataPredicate.java @@ -31,4 +31,26 @@ public EventDataPredicate withPredicate(Predicate predicate, Class cla setObject(new TypedPredicate<>(predicate, clazz)); return this; } + + public EventDataPredicate withPredicate(ContextPredicate predicate) { + setObject(predicate); + return this; + } + + public EventDataPredicate withPredicate(ContextPredicate predicate, Class clazz) { + Objects.requireNonNull(clazz); + setObject(new TypedContextPredicate<>(predicate, clazz)); + return this; + } + + public EventDataPredicate withPredicate(FilterPredicate predicate) { + setObject(predicate); + return this; + } + + public EventDataPredicate withPredicate(FilterPredicate predicate, Class clazz) { + Objects.requireNonNull(clazz); + setObject(new TypedFilterPredicate<>(predicate, clazz)); + return this; + } } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ExportAsFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ExportAsFunction.java index 15aa08615..b18f8d886 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ExportAsFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ExportAsFunction.java @@ -32,23 +32,23 @@ public ExportAs withFunction(Function value, Class argClass) { return this; } - public ExportAs withFunction(JavaFilterFunction value) { + public ExportAs withFunction(FilterFunction value) { setObject(value); return this; } - public ExportAs withFunction(JavaFilterFunction value, Class argClass) { - setObject(new TypedJavaFilterFunction<>(value, argClass)); + public ExportAs withFunction(FilterFunction value, Class argClass) { + setObject(new TypedFilterFunction<>(value, argClass)); return this; } - public ExportAs withFunction(JavaContextFunction value) { + public ExportAs withFunction(ContextFunction value) { setObject(value); return this; } - public ExportAs withFunction(JavaContextFunction value, Class argClass) { - setObject(new TypedJavaContextFunction<>(value, argClass)); + public ExportAs withFunction(ContextFunction value, Class argClass) { + setObject(new TypedContextFunction<>(value, argClass)); return this; } } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/JavaFilterFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/FilterFunction.java similarity index 93% rename from experimental/types/src/main/java/io/serverlessworkflow/api/types/func/JavaFilterFunction.java rename to experimental/types/src/main/java/io/serverlessworkflow/api/types/func/FilterFunction.java index 7bbb8e337..ccf138ca7 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/JavaFilterFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/FilterFunction.java @@ -20,6 +20,6 @@ import java.io.Serializable; @FunctionalInterface -public interface JavaFilterFunction extends Serializable { +public interface FilterFunction extends Serializable { R apply(T object, WorkflowContextData workflowContext, TaskContextData taskContext); } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/FilterPredicate.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/FilterPredicate.java new file mode 100644 index 000000000..d81b3ac48 --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/FilterPredicate.java @@ -0,0 +1,24 @@ +/* + * 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.api.types.func; + +import io.serverlessworkflow.impl.TaskContextData; +import io.serverlessworkflow.impl.WorkflowContextData; + +@FunctionalInterface +public interface FilterPredicate { + boolean test(T value, WorkflowContextData workflow, TaskContextData task); +} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ForTaskFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ForTaskFunction.java index 6a2732d67..9b88fd01a 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ForTaskFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/ForTaskFunction.java @@ -23,45 +23,92 @@ public class ForTaskFunction extends ForTask { private static final long serialVersionUID = 1L; - private LoopPredicateIndex whilePredicate; + private LoopPredicateIndexFilter whilePredicate; private Optional> whileClass; private Optional> itemClass; private Optional> forClass; private Function> collection; public ForTaskFunction withWhile(LoopPredicate whilePredicate) { - return withWhile(toPredicateIndex(whilePredicate)); + return withWhile(toPredicate(whilePredicate)); } public ForTaskFunction withWhile(LoopPredicate whilePredicate, Class modelClass) { - return withWhile(toPredicateIndex(whilePredicate), modelClass); + return withWhile(toPredicate(whilePredicate), modelClass); } public ForTaskFunction withWhile( LoopPredicate whilePredicate, Class modelClass, Class itemClass) { - return withWhile(toPredicateIndex(whilePredicate), modelClass, itemClass); + return withWhile(toPredicate(whilePredicate), modelClass, itemClass); } - private LoopPredicateIndex toPredicateIndex(LoopPredicate whilePredicate) { - return (model, item, index) -> whilePredicate.test(model, item); + public ForTaskFunction withWhile(LoopPredicateIndex whilePredicate) { + return withWhile(toPredicate(whilePredicate), Optional.empty(), Optional.empty()); } - public ForTaskFunction withWhile(LoopPredicateIndex whilePredicate) { + public ForTaskFunction withWhile( + LoopPredicateIndex whilePredicate, Class modelClass) { + return withWhile( + toPredicate(whilePredicate), Optional.ofNullable(modelClass), Optional.empty()); + } + + public ForTaskFunction withWhile( + LoopPredicateIndex whilePredicate, Class modelClass, Class itemClass) { + return withWhile( + toPredicate(whilePredicate), + Optional.ofNullable(modelClass), + Optional.ofNullable(itemClass)); + } + + public ForTaskFunction withWhile(LoopPredicateIndexContext whilePredicate) { + return withWhile(toPredicate(whilePredicate), Optional.empty(), Optional.empty()); + } + + public ForTaskFunction withWhile( + LoopPredicateIndexContext whilePredicate, Class modelClass) { + return withWhile( + toPredicate(whilePredicate), Optional.ofNullable(modelClass), Optional.empty()); + } + + public ForTaskFunction withWhile( + LoopPredicateIndexContext whilePredicate, Class modelClass, Class itemClass) { + return withWhile( + toPredicate(whilePredicate), + Optional.ofNullable(modelClass), + Optional.ofNullable(itemClass)); + } + + public ForTaskFunction withWhile(LoopPredicateIndexFilter whilePredicate) { return withWhile(whilePredicate, Optional.empty(), Optional.empty()); } public ForTaskFunction withWhile( - LoopPredicateIndex whilePredicate, Class modelClass) { + LoopPredicateIndexFilter whilePredicate, Class modelClass) { return withWhile(whilePredicate, Optional.ofNullable(modelClass), Optional.empty()); } public ForTaskFunction withWhile( - LoopPredicateIndex whilePredicate, Class modelClass, Class itemClass) { - return withWhile(whilePredicate, Optional.ofNullable(modelClass), Optional.of(itemClass)); + LoopPredicateIndexFilter whilePredicate, Class modelClass, Class itemClass) { + return withWhile( + whilePredicate, Optional.ofNullable(modelClass), Optional.ofNullable(itemClass)); + } + + private LoopPredicateIndexFilter toPredicate(LoopPredicate whilePredicate) { + return (model, item, index, w, t) -> whilePredicate.test(model, item); + } + + private LoopPredicateIndexFilter toPredicate( + LoopPredicateIndex whilePredicate) { + return (model, item, index, w, t) -> whilePredicate.test(model, item, index); + } + + private LoopPredicateIndexFilter toPredicate( + LoopPredicateIndexContext whilePredicate) { + return (model, item, index, w, t) -> whilePredicate.test(model, item, index, w); } private ForTaskFunction withWhile( - LoopPredicateIndex whilePredicate, + LoopPredicateIndexFilter whilePredicate, Optional> modelClass, Optional> itemClass) { this.whilePredicate = whilePredicate; @@ -81,7 +128,7 @@ public ForTaskFunction withCollection( return this; } - public LoopPredicateIndex getWhilePredicate() { + public LoopPredicateIndexFilter getWhilePredicate() { return whilePredicate; } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/InputFromFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/InputFromFunction.java index d1eed1032..bfa5bf12f 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/InputFromFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/InputFromFunction.java @@ -32,23 +32,23 @@ public InputFrom withFunction(Function value, Class argClass) { return this; } - public InputFrom withFunction(JavaFilterFunction value) { + public InputFrom withFunction(FilterFunction value) { setObject(value); return this; } - public InputFrom withFunction(JavaFilterFunction value, Class argClass) { - setObject(new TypedJavaFilterFunction<>(value, argClass)); + public InputFrom withFunction(FilterFunction value, Class argClass) { + setObject(new TypedFilterFunction<>(value, argClass)); return this; } - public InputFrom withFunction(JavaContextFunction value) { + public InputFrom withFunction(ContextFunction value) { setObject(value); return this; } - public InputFrom withFunction(JavaContextFunction value, Class argClass) { - setObject(new TypedJavaContextFunction<>(value, argClass)); + public InputFrom withFunction(ContextFunction value, Class argClass) { + setObject(new TypedContextFunction<>(value, argClass)); return this; } } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/LoopPredicateIndexContext.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/LoopPredicateIndexContext.java new file mode 100644 index 000000000..470bfbca5 --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/LoopPredicateIndexContext.java @@ -0,0 +1,23 @@ +/* + * 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.api.types.func; + +import io.serverlessworkflow.impl.WorkflowContextData; + +@FunctionalInterface +public interface LoopPredicateIndexContext { + boolean test(T model, V item, Integer index, WorkflowContextData context); +} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/LoopPredicateIndexFilter.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/LoopPredicateIndexFilter.java new file mode 100644 index 000000000..808719c50 --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/LoopPredicateIndexFilter.java @@ -0,0 +1,24 @@ +/* + * 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.api.types.func; + +import io.serverlessworkflow.impl.TaskContextData; +import io.serverlessworkflow.impl.WorkflowContextData; + +@FunctionalInterface +public interface LoopPredicateIndexFilter { + boolean test(T model, V item, Integer index, WorkflowContextData workflow, TaskContextData task); +} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/OutputAsFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/OutputAsFunction.java index 20e0b4c86..19d61335b 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/OutputAsFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/OutputAsFunction.java @@ -32,23 +32,23 @@ public OutputAs withFunction(Function value, Class argClass) { return this; } - public OutputAs withFunction(JavaFilterFunction value) { + public OutputAs withFunction(FilterFunction value) { setObject(value); return this; } - public OutputAs withFunction(JavaFilterFunction value, Class argClass) { - setObject(new TypedJavaFilterFunction<>(value, argClass)); + public OutputAs withFunction(FilterFunction value, Class argClass) { + setObject(new TypedFilterFunction<>(value, argClass)); return this; } - public OutputAs withFunction(JavaContextFunction value) { + public OutputAs withFunction(ContextFunction value) { setObject(value); return this; } - public OutputAs withFunction(JavaContextFunction value, Class argClass) { - setObject(new TypedJavaContextFunction<>(value, argClass)); + public OutputAs withFunction(ContextFunction value, Class argClass) { + setObject(new TypedContextFunction<>(value, argClass)); return this; } } diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedJavaFilterFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/PredicateContainer.java similarity index 87% rename from experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedJavaFilterFunction.java rename to experimental/types/src/main/java/io/serverlessworkflow/api/types/func/PredicateContainer.java index 90d3e130e..480d08cbd 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedJavaFilterFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/PredicateContainer.java @@ -15,4 +15,6 @@ */ package io.serverlessworkflow.api.types.func; -public record TypedJavaFilterFunction(JavaFilterFunction function, Class argClass) {} +public interface PredicateContainer { + Object predicate(); +} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/SwitchCaseFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/SwitchCaseFunction.java deleted file mode 100644 index 01813c5de..000000000 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/SwitchCaseFunction.java +++ /dev/null @@ -1,47 +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.api.types.func; - -import io.serverlessworkflow.api.types.SwitchCase; -import java.util.Optional; -import java.util.function.Predicate; - -public class SwitchCaseFunction extends SwitchCase { - - private static final long serialVersionUID = 1L; - private Predicate predicate; - private Optional> predicateClass; - - public SwitchCaseFunction withPredicate(Predicate predicate) { - this.predicate = predicate; - this.predicateClass = Optional.empty(); - return this; - } - - public SwitchCaseFunction withPredicate(Predicate predicate, Class predicateClass) { - this.predicate = predicate; - this.predicateClass = Optional.ofNullable(predicateClass); - return this; - } - - public Predicate predicate() { - return predicate; - } - - public Optional> predicateClass() { - return predicateClass; - } -} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/SwitchCasePredicate.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/SwitchCasePredicate.java new file mode 100644 index 000000000..4b67be8ca --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/SwitchCasePredicate.java @@ -0,0 +1,64 @@ +/* + * 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.api.types.func; + +import io.serverlessworkflow.api.types.SwitchCase; +import java.util.function.Predicate; + +public class SwitchCasePredicate extends SwitchCase implements PredicateContainer { + + private static final long serialVersionUID = 1L; + private Object predicate; + + public SwitchCasePredicate withPredicate(Predicate predicate) { + this.predicate = predicate; + return this; + } + + public SwitchCasePredicate withPredicate(Predicate predicate, Class predicateClass) { + this.predicate = + predicateClass == null ? predicate : new TypedPredicate<>(predicate, predicateClass); + return this; + } + + public SwitchCasePredicate withPredicate(ContextPredicate predicate) { + this.predicate = predicate; + return this; + } + + public SwitchCasePredicate withPredicate( + ContextPredicate predicate, Class predicateClass) { + this.predicate = + predicateClass == null ? predicate : new TypedContextPredicate<>(predicate, predicateClass); + return this; + } + + public SwitchCasePredicate withPredicate(FilterPredicate predicate) { + this.predicate = predicate; + return this; + } + + public SwitchCasePredicate withPredicate( + FilterPredicate predicate, Class predicateClass) { + this.predicate = + predicateClass == null ? predicate : new TypedFilterPredicate<>(predicate, predicateClass); + return this; + } + + public Object predicate() { + return predicate; + } +} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedJavaContextFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedContextFunction.java similarity index 86% rename from experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedJavaContextFunction.java rename to experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedContextFunction.java index e4254287b..6a83f65f9 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedJavaContextFunction.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedContextFunction.java @@ -15,5 +15,4 @@ */ package io.serverlessworkflow.api.types.func; -public record TypedJavaContextFunction( - JavaContextFunction function, Class argClass) {} +public record TypedContextFunction(ContextFunction function, Class argClass) {} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedContextPredicate.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedContextPredicate.java new file mode 100644 index 000000000..e6a522336 --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedContextPredicate.java @@ -0,0 +1,18 @@ +/* + * 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.api.types.func; + +public record TypedContextPredicate(ContextPredicate predicate, Class argClass) {} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedFilterFunction.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedFilterFunction.java new file mode 100644 index 000000000..2589af952 --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedFilterFunction.java @@ -0,0 +1,18 @@ +/* + * 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.api.types.func; + +public record TypedFilterFunction(FilterFunction function, Class argClass) {} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedFilterPredicate.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedFilterPredicate.java new file mode 100644 index 000000000..aaef7f98f --- /dev/null +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/TypedFilterPredicate.java @@ -0,0 +1,18 @@ +/* + * 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.api.types.func; + +public record TypedFilterPredicate(FilterPredicate predicate, Class argClass) {} diff --git a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/UntilPredicate.java b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/UntilPredicate.java index 8af8e46e4..e09c471b9 100644 --- a/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/UntilPredicate.java +++ b/experimental/types/src/main/java/io/serverlessworkflow/api/types/func/UntilPredicate.java @@ -16,31 +16,46 @@ package io.serverlessworkflow.api.types.func; import io.serverlessworkflow.api.types.Until; -import java.util.Optional; import java.util.function.Predicate; -public class UntilPredicate extends Until { +public class UntilPredicate extends Until implements PredicateContainer { - private Predicate predicate; - private Optional> predicateClass; + private Object predicate; public UntilPredicate withPredicate(Predicate predicate) { this.predicate = predicate; - this.predicateClass = Optional.empty(); return this; } - public UntilPredicate withPredicate(Predicate predicate, Class clazz) { + public UntilPredicate withPredicate(Predicate predicate, Class predicateClass) { + this.predicate = + predicateClass == null ? predicate : new TypedPredicate<>(predicate, predicateClass); + return this; + } + + public UntilPredicate withPredicate(ContextPredicate predicate) { this.predicate = predicate; - this.predicateClass = Optional.ofNullable(clazz); return this; } - public Predicate predicate() { - return predicate; + public UntilPredicate withPredicate(ContextPredicate predicate, Class predicateClass) { + this.predicate = + predicateClass == null ? predicate : new TypedContextPredicate<>(predicate, predicateClass); + return this; } - public Optional> predicateClass() { - return predicateClass; + public UntilPredicate withPredicate(FilterPredicate predicate) { + this.predicate = predicate; + return this; + } + + public UntilPredicate withPredicate(FilterPredicate predicate, Class predicateClass) { + this.predicate = + predicateClass == null ? predicate : new TypedFilterPredicate<>(predicate, predicateClass); + return this; + } + + public Object predicate() { + return predicate; } }