Skip to content

If predicate #670

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 31 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
21478f9
Bump com.networknt:json-schema-validator from 1.5.7 to 1.5.8 (#623)
dependabot[bot] Jun 30, 2025
70a46af
Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.7 to 3.2.8
dependabot[bot] Jul 7, 2025
7f1475e
Bump org.apache.maven.plugins:maven-enforcer-plugin from 3.5.0 to 3.6.0
dependabot[bot] Jul 7, 2025
9d635fa
Bump version.org.junit.jupiter from 5.13.2 to 5.13.3
dependabot[bot] Jul 7, 2025
a1a86f6
Add javadoc to serverlessworkflow api
fjtirado Jul 7, 2025
6dc4a72
[Fix #634] Refactoring modules
fjtirado Jul 10, 2025
97d2b89
[Fix #634] Setting up maven plugin
fjtirado Jul 10, 2025
2e4a550
[Fix #634] Preserving union class order
fjtirado Jul 14, 2025
5807740
Reorganizing directories
fjtirado Jul 14, 2025
df20c94
Bump org.apache.maven:maven-plugin-api from 3.9.7 to 3.9.10 (#640)
dependabot[bot] Jul 14, 2025
9d4ac19
Bump org.codehaus.mojo:build-helper-maven-plugin from 3.3.0 to 3.6.1 …
dependabot[bot] Jul 14, 2025
2e9e85e
[Fix #636] Initial refactor to separate Jackson/JQ
fjtirado Jul 15, 2025
492a14b
[Fix #636] Relocating dependencies
fjtirado Jul 17, 2025
a3d9f58
Minor refinements
fjtirado Jul 17, 2025
ead26ba
Adding java lambda support
fjtirado Jul 17, 2025
a799b4a
Fix #368 - Introduce Standard Fluent DSL (#645)
ricardozanini Jul 18, 2025
dd30ee0
Ensure not workflowmodel is returned within a Map or Collection
fjtirado Jul 19, 2025
fc800d5
Introduce Java Fluent DSL (#646)
ricardozanini Jul 21, 2025
e87a849
Bump io.github.classgraph:classgraph from 4.8.180 to 4.8.181 (#656)
dependabot[bot] Jul 21, 2025
a786b9a
Bump version.com.fasterxml.jackson from 2.19.1 to 2.19.2 (#655)
dependabot[bot] Jul 21, 2025
86679fc
Bump org.apache.maven.plugins:maven-enforcer-plugin from 3.6.0 to 3.6…
dependabot[bot] Jul 21, 2025
f164fa9
Bump org.apache.maven:maven-plugin-api from 3.9.10 to 3.9.11 (#653)
dependabot[bot] Jul 21, 2025
c39f665
Bump version.org.junit.jupiter from 5.13.3 to 5.13.4 (#652)
dependabot[bot] Jul 21, 2025
b107003
Rename java -> func / standard -> spec (#660)
ricardozanini Jul 21, 2025
0a39d4a
[Fix #648] Avoid splitting packages
fjtirado Jul 22, 2025
29f7389
Http dependencies
fjtirado Jul 22, 2025
7aece00
Jersey from runtime to test scope
fjtirado Jul 22, 2025
78a4276
Fixing maven plugin prefix
fjtirado Jul 22, 2025
0f1bce6
[Fix #665] While predicate invoked in proper place
fjtirado Jul 22, 2025
c71ff8a
Merge branch 'main' of https://github.com/serverlessworkflow/sdk-java…
fjtirado Jul 22, 2025
2eed8d8
Add if predicate support
fjtirado Jul 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ protected JavaForExecutorBuilder(
WorkflowApplication application,
ResourceLoader resourceLoader) {
super(position, task, workflow, application, resourceLoader);
if (task instanceof ForTaskFunction taskFunctions) {}
}

protected Optional<WorkflowFilter> buildWhileFilter() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,24 @@
*/
package io.serverlessworkflow.impl.expressions.func;

import io.serverlessworkflow.api.types.TaskBase;
import io.serverlessworkflow.api.types.TaskMetadata;
import io.serverlessworkflow.impl.TaskContext;
import io.serverlessworkflow.impl.WorkflowContext;
import io.serverlessworkflow.impl.WorkflowFilter;
import io.serverlessworkflow.impl.WorkflowModel;
import io.serverlessworkflow.impl.WorkflowModelFactory;
import io.serverlessworkflow.impl.expressions.Expression;
import io.serverlessworkflow.impl.expressions.ExpressionFactory;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.function.Predicate;

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() {
Expand All @@ -49,7 +53,7 @@ public WorkflowFilter buildFilter(String expr, Object value) {
if (value instanceof Function func) {
return (w, t, n) -> modelFactory.fromAny(func.apply(n.asJavaObject()));
} else if (value instanceof Predicate pred) {
return (w, t, n) -> modelFactory.from(pred.test(n.asJavaObject()));
return fromPredicate(pred);
} else if (value instanceof BiPredicate pred) {
return (w, t, n) -> modelFactory.from(pred.test(w, t));
} else if (value instanceof BiFunction func) {
Expand All @@ -61,6 +65,20 @@ public WorkflowFilter buildFilter(String expr, Object value) {
}
}

@SuppressWarnings({"rawtypes", "unchecked"})
private WorkflowFilter fromPredicate(Predicate pred) {
return (w, t, n) -> modelFactory.from(pred.test(n.asJavaObject()));
}

@Override
public Optional<WorkflowFilter> buildIfFilter(TaskBase task) {
TaskMetadata metadata = task.getMetadata();
return metadata != null
&& metadata.getAdditionalProperties().get(IF_PREDICATE) instanceof Predicate pred
? Optional.of(fromPredicate(pred))
: ExpressionFactory.super.buildIfFilter(task);
}

@Override
public WorkflowModelFactory modelFactory() {
return modelFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,19 @@
import io.serverlessworkflow.api.types.SwitchTask;
import io.serverlessworkflow.api.types.Task;
import io.serverlessworkflow.api.types.TaskItem;
import io.serverlessworkflow.api.types.TaskMetadata;
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.ForTaskFunction;
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 java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.function.Predicate;
import org.junit.jupiter.api.Test;

class CallTest {
Expand Down Expand Up @@ -140,6 +143,35 @@ void testSwitch() throws InterruptedException, ExecutionException {
}
}

@Test
void testIf() throws InterruptedException, ExecutionException {
try (WorkflowApplication app = WorkflowApplication.builder().build()) {
Workflow workflow =
new Workflow()
.withDocument(
new Document().withNamespace("test").withName("testIf").withVersion("1.0"))
.withDo(
List.of(
new TaskItem(
"java",
new Task()
.withCallTask(
new CallTaskJava(
(CallJava)
CallJava.function(CallTest::zero)
.withMetadata(
new TaskMetadata()
.withAdditionalProperty(
JavaExpressionFactory.IF_PREDICATE,
(Predicate<Integer>)
CallTest::isOdd)))))));

WorkflowDefinition definition = app.workflowDefinition(workflow);
assertThat(definition.instance(3).start().get().asNumber().orElseThrow()).isEqualTo(0);
assertThat(definition.instance(4).start().get().asNumber().orElseThrow()).isEqualTo(4);
}
}

public static boolean isEven(Object model, Integer number) {
return !isOdd(number);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,13 @@ public static Optional<WorkflowFilter> optionalFilter(WorkflowApplication app, S
return str != null ? Optional.of(buildWorkflowFilter(app, str)) : Optional.empty();
}

public static Optional<WorkflowFilter> optionalFilter(
WorkflowApplication app, Object obj, String str) {
return str != null || obj != null
? Optional.of(buildWorkflowFilter(app, str, obj))
: Optional.empty();
}

public static String toString(UriTemplate template) {
URI uri = template.getLiteralUri();
return uri != null ? uri.toString() : template.getLiteralUriTemplate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
*/
package io.serverlessworkflow.impl.executors;

import static io.serverlessworkflow.impl.WorkflowUtils.*;
import static io.serverlessworkflow.impl.WorkflowUtils.buildWorkflowFilter;
import static io.serverlessworkflow.impl.WorkflowUtils.getSchemaValidator;

import io.serverlessworkflow.api.types.Export;
import io.serverlessworkflow.api.types.FlowDirective;
Expand Down Expand Up @@ -101,7 +102,7 @@ protected AbstractTaskExecutorBuilder(
this.contextSchemaValidator =
getSchemaValidator(application.validatorFactory(), resourceLoader, export.getSchema());
}
this.ifFilter = optionalFilter(application, task.getIf());
this.ifFilter = application.expressionFactory().buildIfFilter(task);
}

protected final TransitionInfoBuilder next(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@
*/
package io.serverlessworkflow.impl.expressions;

import io.serverlessworkflow.api.types.TaskBase;
import io.serverlessworkflow.impl.WorkflowFilter;
import io.serverlessworkflow.impl.WorkflowModelFactory;
import java.util.Optional;

public interface ExpressionFactory {
/**
Expand All @@ -29,4 +31,8 @@ public interface ExpressionFactory {
WorkflowFilter buildFilter(String expr, Object value);

WorkflowModelFactory modelFactory();

default Optional<WorkflowFilter> buildIfFilter(TaskBase task) {
return task.getIf() != null ? Optional.of(buildFilter(task.getIf(), null)) : Optional.empty();
}
}