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 b121c332..395b4049 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowApplication.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowApplication.java @@ -70,6 +70,7 @@ public class WorkflowApplication implements AutoCloseable { private final Collection eventPublishers; private final boolean lifeCycleCEPublishingEnabled; private final WorkflowModelFactory modelFactory; + private final WorkflowModelFactory contextFactory; private final WorkflowScheduler scheduler; private final Map> additionalObjects; private final ConfigManager configManager; @@ -93,6 +94,7 @@ private WorkflowApplication(Builder builder) { this.eventPublishers = builder.eventPublishers; this.lifeCycleCEPublishingEnabled = builder.lifeCycleCEPublishingEnabled; this.modelFactory = builder.modelFactory; + this.contextFactory = builder.contextFactory; this.scheduler = builder.scheduler; this.schedulerListener = builder.schedulerListener; this.additionalObjects = builder.additionalObjects; @@ -175,6 +177,7 @@ public SchemaValidator getValidator(SchemaInline inline) { () -> new RuntimeDescriptor("reference impl", "1.0.0_alpha", Collections.emptyMap()); private boolean lifeCycleCEPublishingEnabled = true; private WorkflowModelFactory modelFactory; + private WorkflowModelFactory contextFactory; private Map> additionalObjects = new HashMap<>(); private SecretManager secretManager; private ConfigManager configManager; @@ -273,6 +276,11 @@ public Builder withModelFactory(WorkflowModelFactory modelFactory) { return this; } + public Builder withContextFactory(WorkflowModelFactory contextFactory) { + this.contextFactory = contextFactory; + return this; + } + public WorkflowApplication build() { if (modelFactory == null) { modelFactory = @@ -283,6 +291,9 @@ public WorkflowApplication build() { new IllegalStateException( "WorkflowModelFactory instance has to be set in WorkflowApplication or present in the classpath")); } + if (contextFactory == null) { + contextFactory = modelFactory; + } ServiceLoader.load(ExpressionFactory.class).forEach(exprFactories::add); if (schemaValidatorFactory == null) { schemaValidatorFactory = @@ -373,6 +384,10 @@ public WorkflowModelFactory modelFactory() { return modelFactory; } + public WorkflowModelFactory contextFactory() { + return contextFactory; + } + public RuntimeDescriptorFactory runtimeDescriptorFactory() { return runtimeDescriptorFactory; } diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java index 57e84fe9..ebc79fed 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java @@ -23,7 +23,7 @@ public class WorkflowContext implements WorkflowContextData { WorkflowContext(WorkflowDefinition definition, WorkflowMutableInstance instance) { this.definition = definition; this.instance = instance; - this.context = definition.application().modelFactory().fromNull(); + this.context = definition.application().contextFactory().fromNull(); } @Override 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 46ee3d24..c355163c 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java @@ -25,6 +25,7 @@ import io.serverlessworkflow.api.types.UriTemplate; import io.serverlessworkflow.api.types.Workflow; import io.serverlessworkflow.impl.expressions.ExpressionDescriptor; +import io.serverlessworkflow.impl.expressions.ExpressionFactory; import io.serverlessworkflow.impl.expressions.ExpressionUtils; import io.serverlessworkflow.impl.resources.ResourceLoader; import io.serverlessworkflow.impl.schema.SchemaValidator; @@ -77,7 +78,9 @@ public static Optional buildWorkflowFilter(WorkflowApplication a public static Optional buildWorkflowFilter(WorkflowApplication app, ExportAs as) { return as != null - ? Optional.of(buildFilterFromStrObject(app, as.getString(), as.getObject())) + ? Optional.of( + buildFilterFromStrObject( + app.expressionFactory(), app.contextFactory(), as.getString(), as.getObject())) : Optional.empty(); } @@ -118,8 +121,12 @@ private static WorkflowValueResolver toString(String literal) { private static WorkflowFilter buildFilterFromStrObject( WorkflowApplication app, String str, Object object) { - return app.expressionFactory() - .buildFilter(new ExpressionDescriptor(str, object), app.modelFactory()); + return buildFilterFromStrObject(app.expressionFactory(), app.modelFactory(), str, object); + } + + private static WorkflowFilter buildFilterFromStrObject( + ExpressionFactory exprFactory, WorkflowModelFactory modelFactory, String str, Object object) { + return exprFactory.buildFilter(new ExpressionDescriptor(str, object), modelFactory); } public static WorkflowValueResolver> buildMapResolver(