From 8d3ca6a830441aa4db6f150cefc729f1b199735d Mon Sep 17 00:00:00 2001 From: fjtirado Date: Thu, 9 Oct 2025 16:57:01 +0200 Subject: [PATCH] [Fix #869] Splitting ExpressionFactory from ModelFactory Signed-off-by: fjtirado --- experimental/agentic/pom.xml | 4 + .../agentic/AgenticExpressionFactory.java | 33 ------- .../agentic/AgenticModel.java | 4 +- .../agentic/AgenticModelCollection.java | 4 +- .../agentic/AgenticModelFactory.java | 13 ++- .../AgenticScopeCloudEventsHandler.java | 2 +- .../AgenticScopeRegistryAssessor.java | 2 +- ...rverlessworkflow.impl.WorkflowModelFactory | 1 + ...orkflow.impl.expressions.ExpressionFactory | 1 - .../WorkflowInvocationHandler.java | 2 +- experimental/lambda/pom.xml | 9 ++ .../func/JavaExpressionFactory.java | 30 ++++-- experimental/model/pom.xml | 16 ++++ .../impl/model}/func/JavaModel.java | 2 +- .../impl/model}/func/JavaModelCollection.java | 2 +- .../impl/model}/func/JavaModelFactory.java | 2 +- ...rverlessworkflow.impl.WorkflowModelFactory | 1 + experimental/pom.xml | 12 +++ .../impl/CompositeExpressionFactory.java | 89 ++++++++++++++++++ .../impl/WorkflowApplication.java | 29 ++++-- .../impl/WorkflowModelFactory.java | 2 +- .../impl/WorkflowUtils.java | 5 +- .../AbstractExpressionFactory.java | 10 +- .../impl/expressions/ExpressionFactory.java | 21 +++-- .../expressions/ObjectExpressionFactory.java | 18 ++++ impl/jackson/pom.xml | 16 ---- .../jq => model/jackson}/JacksonModel.java | 2 +- .../jackson}/JacksonModelCollection.java | 2 +- .../jackson}/JacksonModelDeserializer.java | 2 +- .../jackson}/JacksonModelFactory.java | 2 +- .../jackson}/JacksonModelSerializer.java | 2 +- ...rverlessworkflow.impl.WorkflowModelFactory | 1 + impl/jq/pom.xml | 32 +++++++ .../impl/expressions/jq/JQExpression.java | 0 .../expressions/jq/JQExpressionFactory.java | 8 -- ...orkflow.impl.expressions.ExpressionFactory | 0 .../jq/JQExpressionFactoryTest.java | 9 +- .../jackson/JacksonModelMarshaller.java | 2 +- impl/pom.xml | 6 ++ impl/test/db-samples/running.db | Bin 16384 -> 16384 bytes impl/test/db-samples/suspended.db | Bin 12288 -> 12288 bytes impl/test/pom.xml | 4 + 42 files changed, 291 insertions(+), 111 deletions(-) delete mode 100644 experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticExpressionFactory.java rename experimental/agentic/src/main/java/io/serverlessworkflow/impl/{expressions => model}/agentic/AgenticModel.java (93%) rename experimental/agentic/src/main/java/io/serverlessworkflow/impl/{expressions => model}/agentic/AgenticModelCollection.java (94%) rename experimental/agentic/src/main/java/io/serverlessworkflow/impl/{expressions => model}/agentic/AgenticModelFactory.java (92%) rename experimental/agentic/src/main/java/io/serverlessworkflow/impl/{expressions => model}/agentic/AgenticScopeCloudEventsHandler.java (97%) rename experimental/agentic/src/main/java/io/serverlessworkflow/impl/{expressions => model}/agentic/langchain4j/AgenticScopeRegistryAssessor.java (97%) create mode 100644 experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory delete mode 100644 experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory create mode 100644 experimental/model/pom.xml rename experimental/{lambda/src/main/java/io/serverlessworkflow/impl/expressions => model/src/main/java/io/serverlessworkflow/impl/model}/func/JavaModel.java (98%) rename experimental/{lambda/src/main/java/io/serverlessworkflow/impl/expressions => model/src/main/java/io/serverlessworkflow/impl/model}/func/JavaModelCollection.java (98%) rename experimental/{lambda/src/main/java/io/serverlessworkflow/impl/expressions => model/src/main/java/io/serverlessworkflow/impl/model}/func/JavaModelFactory.java (97%) create mode 100644 experimental/model/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory create mode 100644 impl/core/src/main/java/io/serverlessworkflow/impl/CompositeExpressionFactory.java rename impl/jackson/src/main/java/io/serverlessworkflow/impl/{expressions/jq => model/jackson}/JacksonModel.java (98%) rename impl/jackson/src/main/java/io/serverlessworkflow/impl/{expressions/jq => model/jackson}/JacksonModelCollection.java (98%) rename impl/jackson/src/main/java/io/serverlessworkflow/impl/{expressions/jq => model/jackson}/JacksonModelDeserializer.java (96%) rename impl/jackson/src/main/java/io/serverlessworkflow/impl/{expressions/jq => model/jackson}/JacksonModelFactory.java (98%) rename impl/jackson/src/main/java/io/serverlessworkflow/impl/{expressions/jq => model/jackson}/JacksonModelSerializer.java (95%) create mode 100644 impl/jackson/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory create mode 100644 impl/jq/pom.xml rename impl/{jackson => jq}/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpression.java (100%) rename impl/{jackson => jq}/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactory.java (93%) rename impl/{jackson => jq}/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory (100%) rename impl/{jackson => jq}/src/test/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactoryTest.java (90%) diff --git a/experimental/agentic/pom.xml b/experimental/agentic/pom.xml index ae1967690..a6ea803e9 100644 --- a/experimental/agentic/pom.xml +++ b/experimental/agentic/pom.xml @@ -11,6 +11,10 @@ io.serverlessworkflow serverlessworkflow-experimental-lambda + + + io.serverlessworkflow + serverlessworkflow-experimental-model dev.langchain4j diff --git a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticExpressionFactory.java b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticExpressionFactory.java deleted file mode 100644 index a4b79a183..000000000 --- a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticExpressionFactory.java +++ /dev/null @@ -1,33 +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.impl.expressions.agentic; - -import io.serverlessworkflow.impl.WorkflowModelFactory; -import io.serverlessworkflow.impl.expressions.func.JavaExpressionFactory; - -public class AgenticExpressionFactory extends JavaExpressionFactory { - - private final WorkflowModelFactory modelFactory = new AgenticModelFactory(); - - @Override - public WorkflowModelFactory modelFactory() { - return modelFactory; - } - - public int priority() { - return DEFAULT_PRIORITY - 1; - } -} diff --git a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModel.java b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModel.java similarity index 93% rename from experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModel.java rename to experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModel.java index 0d34d4248..2270fe0b6 100644 --- a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModel.java +++ b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModel.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.agentic; +package io.serverlessworkflow.impl.model.agentic; import dev.langchain4j.agentic.scope.AgenticScope; import io.serverlessworkflow.impl.WorkflowModel; -import io.serverlessworkflow.impl.expressions.func.JavaModel; +import io.serverlessworkflow.impl.model.func.JavaModel; import java.util.Collection; import java.util.Map; import java.util.Optional; diff --git a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModelCollection.java b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModelCollection.java similarity index 94% rename from experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModelCollection.java rename to experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModelCollection.java index 90ef8e734..a27866ab1 100644 --- a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModelCollection.java +++ b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModelCollection.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.agentic; +package io.serverlessworkflow.impl.model.agentic; import dev.langchain4j.agentic.scope.AgenticScope; import dev.langchain4j.agentic.scope.ResultWithAgenticScope; import io.serverlessworkflow.impl.WorkflowModel; -import io.serverlessworkflow.impl.expressions.func.JavaModelCollection; +import io.serverlessworkflow.impl.model.func.JavaModelCollection; import java.util.Collections; import java.util.Map; import java.util.Optional; diff --git a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModelFactory.java b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModelFactory.java similarity index 92% rename from experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModelFactory.java rename to experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModelFactory.java index d14dca884..f14c54ea7 100644 --- a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticModelFactory.java +++ b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticModelFactory.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.agentic; +package io.serverlessworkflow.impl.model.agentic; import dev.langchain4j.agentic.scope.AgenticScope; import io.cloudevents.CloudEvent; @@ -21,12 +21,12 @@ import io.serverlessworkflow.impl.WorkflowModel; import io.serverlessworkflow.impl.WorkflowModelCollection; import io.serverlessworkflow.impl.WorkflowModelFactory; -import io.serverlessworkflow.impl.expressions.agentic.langchain4j.AgenticScopeRegistryAssessor; +import io.serverlessworkflow.impl.model.agentic.langchain4j.AgenticScopeRegistryAssessor; import java.time.OffsetDateTime; import java.util.HashMap; import java.util.Map; -class AgenticModelFactory implements WorkflowModelFactory { +public class AgenticModelFactory implements WorkflowModelFactory { static final String DEFAULT_AGENTIC_SCOPE_STATE_KEY = "input"; private final AgenticScopeRegistryAssessor scopeRegistryAssessor = @@ -126,4 +126,11 @@ public WorkflowModel fromOther(Object value) { } return newAgenticModel(value); } + + public AgenticModelFactory() {} + + @Override + public int priority() { + return DEFAULT_PRIORITY - 1; + } } diff --git a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticScopeCloudEventsHandler.java b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticScopeCloudEventsHandler.java similarity index 97% rename from experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticScopeCloudEventsHandler.java rename to experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticScopeCloudEventsHandler.java index 8e9347ebd..1ee807fed 100644 --- a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/AgenticScopeCloudEventsHandler.java +++ b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/AgenticScopeCloudEventsHandler.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.agentic; +package io.serverlessworkflow.impl.model.agentic; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/langchain4j/AgenticScopeRegistryAssessor.java b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/langchain4j/AgenticScopeRegistryAssessor.java similarity index 97% rename from experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/langchain4j/AgenticScopeRegistryAssessor.java rename to experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/langchain4j/AgenticScopeRegistryAssessor.java index 1d3b5ab14..68f057e9f 100644 --- a/experimental/agentic/src/main/java/io/serverlessworkflow/impl/expressions/agentic/langchain4j/AgenticScopeRegistryAssessor.java +++ b/experimental/agentic/src/main/java/io/serverlessworkflow/impl/model/agentic/langchain4j/AgenticScopeRegistryAssessor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.agentic.langchain4j; +package io.serverlessworkflow.impl.model.agentic.langchain4j; import dev.langchain4j.agentic.internal.AgenticScopeOwner; import dev.langchain4j.agentic.scope.AgenticScope; diff --git a/experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory b/experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory new file mode 100644 index 000000000..eac09c0f2 --- /dev/null +++ b/experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory @@ -0,0 +1 @@ +io.serverlessworkflow.impl.model.agentic.AgenticModelFactory \ No newline at end of file diff --git a/experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory b/experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory deleted file mode 100644 index e0038ed99..000000000 --- a/experimental/agentic/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory +++ /dev/null @@ -1 +0,0 @@ -io.serverlessworkflow.impl.expressions.agentic.AgenticExpressionFactory \ No newline at end of file diff --git a/experimental/fluent/agentic-langchain4j/src/main/java/io/serverlessworkflow/fluent/agentic/langchain4j/WorkflowInvocationHandler.java b/experimental/fluent/agentic-langchain4j/src/main/java/io/serverlessworkflow/fluent/agentic/langchain4j/WorkflowInvocationHandler.java index 8eaffceec..33c9a9745 100644 --- a/experimental/fluent/agentic-langchain4j/src/main/java/io/serverlessworkflow/fluent/agentic/langchain4j/WorkflowInvocationHandler.java +++ b/experimental/fluent/agentic-langchain4j/src/main/java/io/serverlessworkflow/fluent/agentic/langchain4j/WorkflowInvocationHandler.java @@ -27,7 +27,7 @@ import dev.langchain4j.service.MemoryId; import io.serverlessworkflow.api.types.Workflow; import io.serverlessworkflow.impl.WorkflowApplication; -import io.serverlessworkflow.impl.expressions.agentic.langchain4j.AgenticScopeRegistryAssessor; +import io.serverlessworkflow.impl.model.agentic.langchain4j.AgenticScopeRegistryAssessor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Parameter; diff --git a/experimental/lambda/pom.xml b/experimental/lambda/pom.xml index a557b1ebe..50c054dad 100644 --- a/experimental/lambda/pom.xml +++ b/experimental/lambda/pom.xml @@ -12,9 +12,18 @@ io.serverlessworkflow serverlessworkflow-experimental-types + + io.serverlessworkflow + serverlessworkflow-experimental-model + test + io.serverlessworkflow serverlessworkflow-impl-core + + + io.serverlessworkflow + serverlessworkflow-impl-jq io.serverlessworkflow 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 1faea783a..bdc1aedf9 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 @@ -25,7 +25,6 @@ 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.WorkflowModelFactory; import io.serverlessworkflow.impl.WorkflowPredicate; import io.serverlessworkflow.impl.expressions.AbstractExpressionFactory; import io.serverlessworkflow.impl.expressions.ExpressionDescriptor; @@ -39,8 +38,6 @@ public class JavaExpressionFactory extends AbstractExpressionFactory { - private final WorkflowModelFactory modelFactory = new JavaModelFactory(); - @Override public ObjectExpression buildExpression(ExpressionDescriptor descriptor) { Object value = descriptor.asObject(); @@ -61,6 +58,26 @@ public ObjectExpression buildExpression(ExpressionDescriptor descriptor) { } } + @Override + 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 Predicate + || value instanceof TypedPredicate + || value instanceof Boolean) { + return DEFAULT_PRIORITY - 500; + } else if (descriptor.asString() == null) { + return MIN_PRIORITY; + } else { + return DEFAULT_PRIORITY + 500; + } + } + @SuppressWarnings({"rawtypes", "unchecked"}) private WorkflowPredicate fromPredicate(Predicate pred) { return (w, t, n) -> pred.test(n.asJavaObject()); @@ -82,12 +99,7 @@ public Optional buildIfFilter(TaskBase task) { return Optional.of(fromPredicate(pred)); } } - return super.buildIfFilter(task); - } - - @Override - public WorkflowModelFactory modelFactory() { - return modelFactory; + return Optional.empty(); } @Override diff --git a/experimental/model/pom.xml b/experimental/model/pom.xml new file mode 100644 index 000000000..6777d9e2b --- /dev/null +++ b/experimental/model/pom.xml @@ -0,0 +1,16 @@ + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-experimental + 8.0.0-SNAPSHOT + + serverlessworkflow-experimental-model + Serverless Workflow :: Experimental :: Model + + + io.serverlessworkflow + serverlessworkflow-impl-core + + + \ No newline at end of file diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModel.java b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java similarity index 98% rename from experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModel.java rename to experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java index e1d4dae3b..b4cec73e6 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModel.java +++ b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModel.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.func; +package io.serverlessworkflow.impl.model.func; import io.serverlessworkflow.impl.WorkflowModel; import java.time.OffsetDateTime; diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModelCollection.java b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModelCollection.java similarity index 98% rename from experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModelCollection.java rename to experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModelCollection.java index 2f84411af..5c52b33ed 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModelCollection.java +++ b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModelCollection.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.func; +package io.serverlessworkflow.impl.model.func; import io.serverlessworkflow.impl.WorkflowModel; import io.serverlessworkflow.impl.WorkflowModelCollection; diff --git a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModelFactory.java b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModelFactory.java similarity index 97% rename from experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModelFactory.java rename to experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModelFactory.java index 4502abf11..fecc0b8f5 100644 --- a/experimental/lambda/src/main/java/io/serverlessworkflow/impl/expressions/func/JavaModelFactory.java +++ b/experimental/model/src/main/java/io/serverlessworkflow/impl/model/func/JavaModelFactory.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.func; +package io.serverlessworkflow.impl.model.func; import io.cloudevents.CloudEvent; import io.cloudevents.CloudEventData; diff --git a/experimental/model/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory b/experimental/model/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory new file mode 100644 index 000000000..4b198a4d2 --- /dev/null +++ b/experimental/model/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory @@ -0,0 +1 @@ +io.serverlessworkflow.impl.model.func.JavaModelFactory \ No newline at end of file diff --git a/experimental/pom.xml b/experimental/pom.xml index 51c56ded6..520ecb954 100644 --- a/experimental/pom.xml +++ b/experimental/pom.xml @@ -14,12 +14,23 @@ io.serverlessworkflow serverlessworkflow-impl-core ${project.version} + + + io.serverlessworkflow + serverlessworkflow-impl-jq + ${project.version} + test io.serverlessworkflow serverlessworkflow-experimental-lambda ${project.version} + + io.serverlessworkflow + serverlessworkflow-experimental-model + ${project.version} + io.serverlessworkflow serverlessworkflow-experimental-types @@ -38,5 +49,6 @@ agentic lambda-fluent fluent + model \ No newline at end of file diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/CompositeExpressionFactory.java b/impl/core/src/main/java/io/serverlessworkflow/impl/CompositeExpressionFactory.java new file mode 100644 index 000000000..c8ea51e15 --- /dev/null +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/CompositeExpressionFactory.java @@ -0,0 +1,89 @@ +/* + * 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.impl; + +import io.cloudevents.CloudEventData; +import io.serverlessworkflow.api.types.TaskBase; +import io.serverlessworkflow.impl.expressions.ExpressionDescriptor; +import io.serverlessworkflow.impl.expressions.ExpressionFactory; +import java.time.OffsetDateTime; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +class CompositeExpressionFactory implements ExpressionFactory { + + private final Collection exprFactories; + + public CompositeExpressionFactory(Collection exprFactories) { + this.exprFactories = exprFactories; + } + + private T processFactories( + ExpressionDescriptor desc, Function consumer) { + return exprFactories.stream() + .sorted((f1, f2) -> f1.priority(desc) - f2.priority(desc)) + .findFirst() + .map(consumer::apply) + .orElseThrow( + () -> + new IllegalArgumentException("No expression factory found for expression " + desc)); + } + + @Override + public WorkflowValueResolver resolveString(ExpressionDescriptor desc) { + return processFactories(desc, f -> f.resolveString(desc)); + } + + @Override + public WorkflowValueResolver resolveDate(ExpressionDescriptor desc) { + return processFactories(desc, f -> f.resolveDate(desc)); + } + + @Override + public WorkflowValueResolver resolveCE(ExpressionDescriptor desc) { + return processFactories(desc, f -> f.resolveCE(desc)); + } + + @Override + public WorkflowValueResolver> resolveMap(ExpressionDescriptor desc) { + return processFactories(desc, f -> f.resolveMap(desc)); + } + + @Override + public WorkflowValueResolver> resolveCollection(ExpressionDescriptor desc) { + return processFactories(desc, f -> f.resolveCollection(desc)); + } + + @Override + public WorkflowFilter buildFilter(ExpressionDescriptor desc, WorkflowModelFactory modelFactory) { + return processFactories(desc, f -> f.buildFilter(desc, modelFactory)); + } + + @Override + public WorkflowPredicate buildPredicate(ExpressionDescriptor desc) { + return processFactories(desc, f -> f.buildPredicate(desc)); + } + + @Override + public Optional buildIfFilter(TaskBase task) { + return exprFactories.stream() + .map(f -> f.buildIfFilter(task)) + .flatMap(Optional::stream) + .findAny(); + } +} diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowApplication.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowApplication.java index 9e4cc0089..f589938fd 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowApplication.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowApplication.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Map; import java.util.ServiceLoader; import java.util.ServiceLoader.Provider; @@ -57,10 +58,11 @@ public class WorkflowApplication implements AutoCloseable { private final EventConsumer eventConsumer; private final Collection eventPublishers; private final boolean lifeCycleCEPublishingEnabled; + private final WorkflowModelFactory modelFactory; private WorkflowApplication(Builder builder) { this.taskFactory = builder.taskFactory; - this.exprFactory = builder.exprFactory; + this.exprFactory = new CompositeExpressionFactory(builder.exprFactories); this.resourceLoaderFactory = builder.resourceLoaderFactory; this.schemaValidatorFactory = builder.schemaValidatorFactory; this.positionFactory = builder.positionFactory; @@ -72,6 +74,7 @@ private WorkflowApplication(Builder builder) { this.eventConsumer = builder.eventConsumer; this.eventPublishers = builder.eventPublishers; this.lifeCycleCEPublishingEnabled = builder.lifeCycleCEPublishingEnabled; + this.modelFactory = builder.modelFactory; } public TaskExecutorFactory taskFactory() { @@ -130,7 +133,7 @@ public SchemaValidator getValidator(SchemaInline inline) { } private TaskExecutorFactory taskFactory; - private ExpressionFactory exprFactory; + private Collection exprFactories = new HashSet<>(); private Collection listeners = ServiceLoader.load(WorkflowExecutionListener.class).stream() .map(Provider::get) @@ -145,6 +148,7 @@ public SchemaValidator getValidator(SchemaInline inline) { private RuntimeDescriptorFactory descriptorFactory = () -> new RuntimeDescriptor("reference impl", "1.0.0_alpha", Collections.emptyMap()); private boolean lifeCycleCEPublishingEnabled = true; + private WorkflowModelFactory modelFactory; private Builder() {} @@ -159,7 +163,7 @@ public Builder withTaskExecutorFactory(TaskExecutorFactory factory) { } public Builder withExpressionFactory(ExpressionFactory factory) { - this.exprFactory = factory; + this.exprFactories.add(factory); return this; } @@ -208,13 +212,22 @@ public Builder withEventPublisher(EventPublisher eventPublisher) { return this; } + public Builder withModelFactory(WorkflowModelFactory modelFactory) { + this.modelFactory = modelFactory; + return this; + } + public WorkflowApplication build() { - if (exprFactory == null) { - exprFactory = - ServiceLoader.load(ExpressionFactory.class) + if (modelFactory == null) { + modelFactory = + ServiceLoader.load(WorkflowModelFactory.class) .findFirst() - .orElseThrow(() -> new IllegalStateException("Expression factory is required")); + .orElseThrow( + () -> + new IllegalStateException( + "WorkflowModelFactory instance has to be set in WorkflowApplication or present in the classpath")); } + ServiceLoader.load(ExpressionFactory.class).forEach(exprFactories::add); if (schemaValidatorFactory == null) { schemaValidatorFactory = ServiceLoader.load(SchemaValidatorFactory.class) @@ -281,7 +294,7 @@ public WorkflowPositionFactory positionFactory() { } public WorkflowModelFactory modelFactory() { - return exprFactory.modelFactory(); + return modelFactory; } public RuntimeDescriptorFactory runtimeDescriptorFactory() { diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowModelFactory.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowModelFactory.java index a65e930ff..b1c6caf6b 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowModelFactory.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowModelFactory.java @@ -20,7 +20,7 @@ import java.time.OffsetDateTime; import java.util.Map; -public interface WorkflowModelFactory { +public interface WorkflowModelFactory extends ServicePriority { WorkflowModel combine(Map workflowVariables); diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java index 491dc2aaf..8cf35e31b 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java @@ -97,7 +97,8 @@ private static WorkflowValueResolver toString(String literal) { public static WorkflowFilter buildWorkflowFilter( WorkflowApplication app, String str, Object object) { - return app.expressionFactory().buildFilter(new ExpressionDescriptor(str, object)); + return app.expressionFactory() + .buildFilter(new ExpressionDescriptor(str, object), app.modelFactory()); } public static WorkflowValueResolver buildStringResolver( @@ -116,7 +117,7 @@ public static WorkflowValueResolver> buildMapResolver( } public static WorkflowFilter buildWorkflowFilter(WorkflowApplication app, String str) { - return app.expressionFactory().buildFilter(ExpressionDescriptor.from(str)); + return app.expressionFactory().buildFilter(ExpressionDescriptor.from(str), app.modelFactory()); } public static WorkflowPredicate buildPredicate(WorkflowApplication app, String str) { diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/AbstractExpressionFactory.java b/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/AbstractExpressionFactory.java index 6abe723a7..95f0ea0fd 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/AbstractExpressionFactory.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/AbstractExpressionFactory.java @@ -17,6 +17,7 @@ import io.cloudevents.CloudEventData; import io.serverlessworkflow.impl.WorkflowFilter; +import io.serverlessworkflow.impl.WorkflowModelFactory; import io.serverlessworkflow.impl.WorkflowValueResolver; import java.time.OffsetDateTime; import java.util.Collection; @@ -52,12 +53,12 @@ public WorkflowValueResolver> resolveCollection(ExpressionDescript } @Override - public WorkflowFilter buildFilter(ExpressionDescriptor desc) { + public WorkflowFilter buildFilter(ExpressionDescriptor desc, WorkflowModelFactory modelFactory) { if (desc.asObject() instanceof WorkflowFilter filter) { return filter; } ObjectExpression expr = buildExpression(desc); - return (w, t, m) -> modelFactory().fromAny(m, expr.eval(w, t, m)); + return (w, t, m) -> modelFactory.fromAny(m, expr.eval(w, t, m)); } protected abstract ObjectExpression buildExpression(ExpressionDescriptor desc); @@ -71,4 +72,9 @@ public WorkflowFilter buildFilter(ExpressionDescriptor desc) { protected abstract Map toMap(Object obj); protected abstract Collection toCollection(Object obj); + + // this prevents two objects of the same class to be added to ExpressionFactory list + public boolean equals(Object obj) { + return obj != null && obj.getClass().equals(this.getClass()); + } } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ExpressionFactory.java b/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ExpressionFactory.java index 25211d7ae..e3ff1e929 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ExpressionFactory.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ExpressionFactory.java @@ -17,7 +17,6 @@ import io.cloudevents.CloudEventData; import io.serverlessworkflow.api.types.TaskBase; -import io.serverlessworkflow.impl.ServicePriority; import io.serverlessworkflow.impl.WorkflowFilter; import io.serverlessworkflow.impl.WorkflowModelFactory; import io.serverlessworkflow.impl.WorkflowPredicate; @@ -27,7 +26,15 @@ import java.util.Map; import java.util.Optional; -public interface ExpressionFactory extends ServicePriority { +public interface ExpressionFactory { + + static final int DEFAULT_PRIORITY = 1000; + static final int MIN_PRIORITY = Integer.MAX_VALUE; + static final int MAX_PRIORITY = Integer.MIN_VALUE; + + default int priority(ExpressionDescriptor desc) { + return DEFAULT_PRIORITY; + } WorkflowValueResolver resolveString(ExpressionDescriptor desc); @@ -39,15 +46,9 @@ public interface ExpressionFactory extends ServicePriority { WorkflowValueResolver> resolveCollection(ExpressionDescriptor desc); - WorkflowFilter buildFilter(ExpressionDescriptor desc); + WorkflowFilter buildFilter(ExpressionDescriptor desc, WorkflowModelFactory modelFactory); WorkflowPredicate buildPredicate(ExpressionDescriptor desc); - WorkflowModelFactory modelFactory(); - - default Optional buildIfFilter(TaskBase task) { - return task.getIf() != null - ? Optional.of(buildPredicate(ExpressionDescriptor.from(task.getIf()))) - : Optional.empty(); - } + Optional buildIfFilter(TaskBase task); } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ObjectExpressionFactory.java b/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ObjectExpressionFactory.java index 8d849753d..3de2fc477 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ObjectExpressionFactory.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/expressions/ObjectExpressionFactory.java @@ -15,12 +15,14 @@ */ package io.serverlessworkflow.impl.expressions; +import io.serverlessworkflow.api.types.TaskBase; import io.serverlessworkflow.impl.TaskContext; import io.serverlessworkflow.impl.WorkflowContext; import io.serverlessworkflow.impl.WorkflowModel; import io.serverlessworkflow.impl.WorkflowPredicate; import java.util.Collection; import java.util.Map; +import java.util.Optional; public abstract class ObjectExpressionFactory extends AbstractExpressionFactory { @@ -49,6 +51,15 @@ private Object buildExpressionObject(Object obj, ExpressionFactory factory) { } } + @Override + public int priority(ExpressionDescriptor desc) { + return (desc.asString() == null + && !(desc.asObject() instanceof Map) + && !(desc.asObject() instanceof Collection)) + ? MIN_PRIORITY + : super.priority(desc); + } + private Object evaluateExpressionObject( Object obj, WorkflowContext workflow, TaskContext task, WorkflowModel model) { if (obj instanceof ObjectExpression expr) { @@ -103,4 +114,11 @@ private Collection evaluateExpressionCollection( Collection col, WorkflowContext workflow, TaskContext task, WorkflowModel n) { return new ProxyCollection(col, o -> evaluateExpressionObject(o, workflow, task, n)); } + + @Override + public Optional buildIfFilter(TaskBase task) { + return task.getIf() != null + ? Optional.of(buildPredicate(ExpressionDescriptor.from(task.getIf()))) + : Optional.empty(); + } } diff --git a/impl/jackson/pom.xml b/impl/jackson/pom.xml index fb1d1499d..1f123648c 100644 --- a/impl/jackson/pom.xml +++ b/impl/jackson/pom.xml @@ -24,21 +24,5 @@ com.networknt json-schema-validator - - net.thisptr - jackson-jq - - - org.junit.jupiter - junit-jupiter-engine - - - org.assertj - assertj-core - - - org.mockito - mockito-core - \ No newline at end of file diff --git a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModel.java b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java similarity index 98% rename from impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModel.java rename to impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java index c3a61893a..5a91c5db2 100644 --- a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModel.java +++ b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModel.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.jq; +package io.serverlessworkflow.impl.model.jackson; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; diff --git a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelCollection.java b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelCollection.java similarity index 98% rename from impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelCollection.java rename to impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelCollection.java index 456db1658..d6e9c6b9e 100644 --- a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelCollection.java +++ b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelCollection.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.jq; +package io.serverlessworkflow.impl.model.jackson; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; diff --git a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelDeserializer.java b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelDeserializer.java similarity index 96% rename from impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelDeserializer.java rename to impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelDeserializer.java index 73d10bc1d..e0dd30bef 100644 --- a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelDeserializer.java +++ b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelDeserializer.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.jq; +package io.serverlessworkflow.impl.model.jackson; import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.core.JsonParser; diff --git a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelFactory.java b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelFactory.java similarity index 98% rename from impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelFactory.java rename to impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelFactory.java index 8f894fdb4..cb2516143 100644 --- a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelFactory.java +++ b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelFactory.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.jq; +package io.serverlessworkflow.impl.model.jackson; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.DoubleNode; diff --git a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelSerializer.java b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelSerializer.java similarity index 95% rename from impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelSerializer.java rename to impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelSerializer.java index 7d4b07c92..e621ee77f 100644 --- a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JacksonModelSerializer.java +++ b/impl/jackson/src/main/java/io/serverlessworkflow/impl/model/jackson/JacksonModelSerializer.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.serverlessworkflow.impl.expressions.jq; +package io.serverlessworkflow.impl.model.jackson; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; diff --git a/impl/jackson/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory b/impl/jackson/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory new file mode 100644 index 000000000..663194671 --- /dev/null +++ b/impl/jackson/src/main/resources/META-INF/services/io.serverlessworkflow.impl.WorkflowModelFactory @@ -0,0 +1 @@ +io.serverlessworkflow.impl.model.jackson.JacksonModelFactory \ No newline at end of file diff --git a/impl/jq/pom.xml b/impl/jq/pom.xml new file mode 100644 index 000000000..451ab5553 --- /dev/null +++ b/impl/jq/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + io.serverlessworkflow + serverlessworkflow-impl + 8.0.0-SNAPSHOT + + serverlessworkflow-impl-jq + Serverless Workflow :: Impl :: JQ + + + net.thisptr + jackson-jq + + + io.serverlessworkflow + serverlessworkflow-impl-jackson + + + org.junit.jupiter + junit-jupiter-engine + + + org.assertj + assertj-core + + + org.mockito + mockito-core + + + \ No newline at end of file diff --git a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpression.java b/impl/jq/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpression.java similarity index 100% rename from impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpression.java rename to impl/jq/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpression.java diff --git a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactory.java b/impl/jq/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactory.java similarity index 93% rename from impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactory.java rename to impl/jq/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactory.java index 7ebeaf106..7eeac60f5 100644 --- a/impl/jackson/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactory.java +++ b/impl/jq/src/main/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactory.java @@ -17,7 +17,6 @@ import io.cloudevents.CloudEventData; import io.cloudevents.jackson.JsonCloudEventData; -import io.serverlessworkflow.impl.WorkflowModelFactory; import io.serverlessworkflow.impl.expressions.ExpressionUtils; import io.serverlessworkflow.impl.expressions.ObjectExpression; import io.serverlessworkflow.impl.expressions.ObjectExpressionFactory; @@ -34,8 +33,6 @@ public class JQExpressionFactory extends ObjectExpressionFactory { - private WorkflowModelFactory modelFactory = new JacksonModelFactory(); - private final Supplier scopeSupplier; public JQExpressionFactory() { @@ -71,11 +68,6 @@ public ObjectExpression buildExpression(String expression) { } } - @Override - public WorkflowModelFactory modelFactory() { - return modelFactory; - } - @Override protected boolean toBoolean(Object eval) { return JsonUtils.convertValue(eval, Boolean.class); diff --git a/impl/jackson/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory b/impl/jq/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory similarity index 100% rename from impl/jackson/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory rename to impl/jq/src/main/resources/META-INF/services/io.serverlessworkflow.impl.expressions.ExpressionFactory diff --git a/impl/jackson/src/test/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactoryTest.java b/impl/jq/src/test/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactoryTest.java similarity index 90% rename from impl/jackson/src/test/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactoryTest.java rename to impl/jq/src/test/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactoryTest.java index b78d5ff78..784de6885 100644 --- a/impl/jackson/src/test/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactoryTest.java +++ b/impl/jq/src/test/java/io/serverlessworkflow/impl/expressions/jq/JQExpressionFactoryTest.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import io.serverlessworkflow.impl.WorkflowContext; +import io.serverlessworkflow.impl.WorkflowModelFactory; import io.serverlessworkflow.impl.WorkflowValueResolver; import io.serverlessworkflow.impl.expressions.ExpressionDescriptor; import io.serverlessworkflow.impl.jackson.JsonUtils; @@ -25,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -33,15 +35,18 @@ class JQExpressionFactoryTest { private WorkflowContext workflowContext; private JQExpressionFactory factory; + private WorkflowModelFactory modelFactory; @BeforeEach void setup() { workflowContext = Mockito.mock(WorkflowContext.class); factory = new JQExpressionFactory(); + modelFactory = ServiceLoader.load(WorkflowModelFactory.class).findFirst().orElseThrow(); } @Test void testArrayExpression() { + WorkflowValueResolver> expr = factory.resolveMap( ExpressionDescriptor.object( @@ -50,7 +55,7 @@ void testArrayExpression() { expr.apply( workflowContext, null, - new JacksonModel( + modelFactory.fromAny( JsonUtils.mapper() .createObjectNode() .set("array", JsonUtils.mapper().createArrayNode().add("John").add("Doe")))); @@ -77,7 +82,7 @@ void testNesterMapAndArrayTogether() { expr.apply( workflowContext, null, - new JacksonModel(JsonUtils.mapper().createObjectNode().put("name", "John"))); + modelFactory.fromAny(JsonUtils.mapper().createObjectNode().put("name", "John"))); Iterator iter = ((Collection) result.get("array")).iterator(); assertThat(iter.next()).isEqualTo("item1"); assertThat(iter.next()).isEqualTo("item2"); diff --git a/impl/persistence/jackson-marshaller/src/main/java/io/serverlessworkflow/impl/marshaller/jackson/JacksonModelMarshaller.java b/impl/persistence/jackson-marshaller/src/main/java/io/serverlessworkflow/impl/marshaller/jackson/JacksonModelMarshaller.java index ee0933ff7..9d62db1f0 100644 --- a/impl/persistence/jackson-marshaller/src/main/java/io/serverlessworkflow/impl/marshaller/jackson/JacksonModelMarshaller.java +++ b/impl/persistence/jackson-marshaller/src/main/java/io/serverlessworkflow/impl/marshaller/jackson/JacksonModelMarshaller.java @@ -16,11 +16,11 @@ package io.serverlessworkflow.impl.marshaller.jackson; import com.fasterxml.jackson.core.JsonProcessingException; -import io.serverlessworkflow.impl.expressions.jq.JacksonModel; import io.serverlessworkflow.impl.jackson.JsonUtils; import io.serverlessworkflow.impl.marshaller.CustomObjectMarshaller; import io.serverlessworkflow.impl.marshaller.WorkflowInputBuffer; import io.serverlessworkflow.impl.marshaller.WorkflowOutputBuffer; +import io.serverlessworkflow.impl.model.jackson.JacksonModel; import java.io.IOException; import java.io.UncheckedIOException; diff --git a/impl/pom.xml b/impl/pom.xml index f252b49bd..fe4f6bd32 100644 --- a/impl/pom.xml +++ b/impl/pom.xml @@ -57,6 +57,11 @@ serverlessworkflow-impl-jackson ${project.version} + + io.serverlessworkflow + serverlessworkflow-impl-jq + ${project.version} + net.thisptr jackson-jq @@ -98,5 +103,6 @@ jwt-impl persistence test + jq \ No newline at end of file diff --git a/impl/test/db-samples/running.db b/impl/test/db-samples/running.db index 29adc703bc8b36e30ab4cc089effa49387713558..4ec62e7f7b4faee41929eee96a8adbd9fd2bb16f 100644 GIT binary patch delta 417 zcmZo@U~Fh$oFK1cX>MX_mS(JzmS2>cSYl#iO`hzn;A>RC@PwI>fm_PJ(A(T3(84do&?3Oiz&G5;!^7Cu z(l^l8l!1@YodEcSYicaUkw5XBX$^`R1pj<^WYP zRo4Q^8I1EMb1N$I=7BUL>*hn%Jvmv?j&aH4MT)9o*j+IBuHpe)Qk#{Om@E=E1}^8B z+@ODw+1T88vX4PCF4cDxJtpfK&PNG_>xQXH*zMIVNi5DTw#Z8ahS%i(in5af4A~|( O8tE}wY~ElLzzYEWSbwzu diff --git a/impl/test/db-samples/suspended.db b/impl/test/db-samples/suspended.db index a174df9ed068ab280f9e48f8cc698fecdd599aca..939cd6abd85a5ddf52993855a4ae7e85fc0c735a 100644 GIT binary patch delta 368 zcmZojXh@hKuViU%Vrr3Upp%wgl$%&$WvG*ulUkCTky>PxoSKrDXq;xc(eWNX5z00@ z3jE{eHnud-Dap)DwK6oH?4{sqRKW0*nUR58%D~Xu+$7KDYLt{_tdo{sl$%&$WvG*ulUkCTky>PBXpxeVoMM=~(eWNX5z00@ z3jE{eHZe5NDap)DwK6oB?4{sqRLJmznUR58%D~Xu+|bF#+&fw7C09QX3R~H5b#^nrUldmXhi(z-;WKpFLxTK_&eR)k1xl9Z| Rz|7plWMd#F&*TRE1^@$}Wl8`5 diff --git a/impl/test/pom.xml b/impl/test/pom.xml index f861f9c55..32bc56756 100644 --- a/impl/test/pom.xml +++ b/impl/test/pom.xml @@ -29,6 +29,10 @@ io.serverlessworkflow serverlessworkflow-impl-http + + io.serverlessworkflow + serverlessworkflow-impl-jq + io.serverlessworkflow serverlessworkflow-impl-jackson-jwt