Skip to content

Commit befb5b1

Browse files
committed
[Fix #982] HttpExecutor should not assume body is map
Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent 9a16384 commit befb5b1

File tree

7 files changed

+55
-39
lines changed

7 files changed

+55
-39
lines changed

impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowUtils.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,33 @@ public static boolean isValid(String str) {
6868
public static Optional<WorkflowFilter> buildWorkflowFilter(
6969
WorkflowApplication app, InputFrom from) {
7070
return from != null
71-
? Optional.of(buildWorkflowFilter(app, from.getString(), from.getObject()))
71+
? Optional.of(buildFilterFromStrObject(app, from.getString(), from.getObject()))
7272
: Optional.empty();
7373
}
7474

7575
public static Optional<WorkflowFilter> buildWorkflowFilter(WorkflowApplication app, OutputAs as) {
7676
return as != null
77-
? Optional.of(buildWorkflowFilter(app, as.getString(), as.getObject()))
77+
? Optional.of(buildFilterFromStrObject(app, as.getString(), as.getObject()))
7878
: Optional.empty();
7979
}
8080

8181
public static Optional<WorkflowFilter> buildWorkflowFilter(WorkflowApplication app, ExportAs as) {
8282
return as != null
83-
? Optional.of(buildWorkflowFilter(app, as.getString(), as.getObject()))
83+
? Optional.of(buildFilterFromStrObject(app, as.getString(), as.getObject()))
8484
: Optional.empty();
8585
}
8686

87+
public static WorkflowFilter buildWorkflowFilter(WorkflowApplication app, Object obj) {
88+
return obj instanceof String str
89+
? buildWorkflowFilter(app, str)
90+
: app.expressionFactory().buildFilter(ExpressionDescriptor.object(obj), app.modelFactory());
91+
}
92+
93+
public static WorkflowFilter buildWorkflowFilter(
94+
WorkflowApplication app, String str, Map<String, Object> object) {
95+
return buildFilterFromStrObject(app, str, object);
96+
}
97+
8798
public static WorkflowValueResolver<String> buildStringFilter(
8899
WorkflowApplication app, String expression, String literal) {
89100
return expression != null ? toExprString(app, expression) : toString(literal);
@@ -108,7 +119,7 @@ private static WorkflowValueResolver<String> toString(String literal) {
108119
return (w, t, m) -> literal;
109120
}
110121

111-
public static WorkflowFilter buildWorkflowFilter(
122+
private static WorkflowFilter buildFilterFromStrObject(
112123
WorkflowApplication app, String str, Object object) {
113124
return app.expressionFactory()
114125
.buildFilter(new ExpressionDescriptor(str, object), app.modelFactory());
@@ -125,8 +136,13 @@ public static WorkflowValueResolver<String> buildStringResolver(
125136
}
126137

127138
public static WorkflowValueResolver<Map<String, Object>> buildMapResolver(
128-
WorkflowApplication app, String str, Object obj) {
129-
return app.expressionFactory().resolveMap(new ExpressionDescriptor(str, obj));
139+
WorkflowApplication app, Map<String, Object> map) {
140+
return app.expressionFactory().resolveMap(ExpressionDescriptor.object(map));
141+
}
142+
143+
public static WorkflowValueResolver<Map<String, Object>> buildMapResolver(
144+
WorkflowApplication app, String expr, Map<String, ?> map) {
145+
return app.expressionFactory().resolveMap(new ExpressionDescriptor(expr, map));
130146
}
131147

132148
public static WorkflowFilter buildWorkflowFilter(WorkflowApplication app, String str) {
@@ -145,13 +161,6 @@ public static Optional<WorkflowPredicate> optionalPredicate(WorkflowApplication
145161
return str != null ? Optional.of(buildPredicate(app, str)) : Optional.empty();
146162
}
147163

148-
public static Optional<WorkflowFilter> optionalFilter(
149-
WorkflowApplication app, Object obj, String str) {
150-
return str != null || obj != null
151-
? Optional.of(buildWorkflowFilter(app, str, obj))
152-
: Optional.empty();
153-
}
154-
155164
public static String toString(UriTemplate template) {
156165
URI uri = template.getLiteralUri();
157166
return uri != null ? uri.toString() : template.getLiteralUriTemplate();

impl/core/src/main/java/io/serverlessworkflow/impl/executors/RunScriptExecutor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ public void init(RunScript taskConfiguration, WorkflowDefinition definition) {
7272
script.getEnvironment() != null && script.getEnvironment().getAdditionalProperties() != null
7373
? Optional.of(
7474
WorkflowUtils.buildMapResolver(
75-
application, null, script.getEnvironment().getAdditionalProperties()))
75+
application, script.getEnvironment().getAdditionalProperties()))
7676
: Optional.empty();
7777

7878
this.argumentExpr =
7979
script.getArguments() != null && script.getArguments().getAdditionalProperties() != null
8080
? Optional.of(
8181
WorkflowUtils.buildMapResolver(
82-
application, null, script.getArguments().getAdditionalProperties()))
82+
application, script.getArguments().getAdditionalProperties()))
8383
: Optional.empty();
8484

8585
this.codeSupplier =

impl/http/src/main/java/io/serverlessworkflow/impl/executors/http/HttpExecutor.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@
2828
import io.serverlessworkflow.impl.WorkflowDefinition;
2929
import io.serverlessworkflow.impl.WorkflowError;
3030
import io.serverlessworkflow.impl.WorkflowException;
31+
import io.serverlessworkflow.impl.WorkflowFilter;
3132
import io.serverlessworkflow.impl.WorkflowModel;
33+
import io.serverlessworkflow.impl.WorkflowUtils;
3234
import io.serverlessworkflow.impl.WorkflowValueResolver;
3335
import io.serverlessworkflow.impl.executors.CallableTask;
34-
import io.serverlessworkflow.impl.expressions.ExpressionDescriptor;
3536
import jakarta.ws.rs.HttpMethod;
3637
import jakarta.ws.rs.WebApplicationException;
3738
import jakarta.ws.rs.client.Invocation.Builder;
@@ -95,19 +96,11 @@ public HttpExecutorBuilder withQueryMap(WorkflowValueResolver<Map<String, Object
9596
}
9697

9798
public HttpExecutorBuilder withHeaders(Map<String, Object> headersMap) {
98-
return withHeaders(
99-
definition
100-
.application()
101-
.expressionFactory()
102-
.resolveMap(ExpressionDescriptor.object(headersMap)));
99+
return withHeaders(WorkflowUtils.buildMapResolver(definition.application(), headersMap));
103100
}
104101

105-
public HttpExecutorBuilder withQueryMap(Map<String, Object> headersMap) {
106-
return withQueryMap(
107-
definition
108-
.application()
109-
.expressionFactory()
110-
.resolveMap(ExpressionDescriptor.object(headersMap)));
102+
public HttpExecutorBuilder withQueryMap(Map<String, Object> queryMap) {
103+
return withQueryMap(WorkflowUtils.buildMapResolver(definition.application(), queryMap));
111104
}
112105

113106
public HttpExecutorBuilder withMethod(String method) {
@@ -193,8 +186,7 @@ private static RequestSupplier buildRequestSupplier(
193186
String method, Object body, WorkflowApplication application, HttpModelConverter converter) {
194187
switch (method.toUpperCase()) {
195188
case HttpMethod.POST:
196-
WorkflowValueResolver<Map<String, Object>> bodyFilter =
197-
buildMapResolver(application, null, body);
189+
WorkflowFilter bodyFilter = WorkflowUtils.buildWorkflowFilter(application, body);
198190
return (request, w, context, node) ->
199191
converter.toModel(
200192
application.modelFactory(),

impl/http/src/main/java/io/serverlessworkflow/impl/executors/http/HttpModelConverter.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@
1818
import io.serverlessworkflow.impl.WorkflowModel;
1919
import io.serverlessworkflow.impl.WorkflowModelFactory;
2020
import jakarta.ws.rs.client.Entity;
21-
import java.util.Map;
2221

2322
public interface HttpModelConverter {
2423

2524
default WorkflowModel toModel(WorkflowModelFactory factory, WorkflowModel model, Object entity) {
2625
return factory.fromAny(model, entity);
2726
}
2827

29-
default Entity toEntity(Map<String, Object> model) {
30-
return Entity.json(model);
28+
default Entity toEntity(WorkflowModel model) {
29+
return Entity.json(model.as(model.objectClass()).orElseThrow());
3130
}
3231
}

impl/openapi/src/main/java/io/serverlessworkflow/impl/executors/openapi/OperationPathResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import io.serverlessworkflow.impl.WorkflowApplication;
2020
import io.serverlessworkflow.impl.WorkflowContext;
2121
import io.serverlessworkflow.impl.WorkflowModel;
22+
import io.serverlessworkflow.impl.WorkflowUtils;
2223
import io.serverlessworkflow.impl.WorkflowValueResolver;
23-
import io.serverlessworkflow.impl.expressions.ExpressionDescriptor;
2424
import jakarta.ws.rs.core.UriBuilder;
2525
import java.net.URI;
2626
import java.util.Map;
@@ -31,7 +31,7 @@ class OperationPathResolver implements WorkflowValueResolver<URI> {
3131

3232
OperationPathResolver(String path, WorkflowApplication application, Map<String, Object> args) {
3333
this.path = path;
34-
this.asMap = application.expressionFactory().resolveMap(ExpressionDescriptor.object(args));
34+
this.asMap = WorkflowUtils.buildMapResolver(application, args);
3535
}
3636

3737
@Override

impl/test/src/test/java/io/serverlessworkflow/impl/test/HTTPWorkflowDefinitionTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ private static Stream<Arguments> provideParameters() {
9191
.get("title")
9292
.equals("Star Trek"),
9393
"StartTrek");
94+
Condition<WorkflowModel> postCondition =
95+
new Condition<WorkflowModel>(
96+
o -> o.asText().orElseThrow().equals("Javierito"), "CallHttpPostCondition");
97+
Map<String, String> postMap = Map.of("name", "Javierito", "surname", "Unknown");
9498
return Stream.of(
9599
Arguments.of("workflows-samples/callGetHttp.yaml", petInput, petCondition),
96100
Arguments.of(
@@ -106,10 +110,7 @@ private static Stream<Arguments> provideParameters() {
106110
"workflows-samples/call-http-query-parameters-external-schema.yaml",
107111
starTrekInput,
108112
starTrekCondition),
109-
Arguments.of(
110-
"workflows-samples/callPostHttp.yaml",
111-
Map.of("name", "Javierito", "surname", "Unknown"),
112-
new Condition<WorkflowModel>(
113-
o -> o.asText().orElseThrow().equals("Javierito"), "CallHttpPostCondition")));
113+
Arguments.of("workflows-samples/callPostHttp.yaml", postMap, postCondition),
114+
Arguments.of("workflows-samples/callPostHttpAsExpr.yaml", postMap, postCondition));
114115
}
115116
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
document:
2+
dsl: 1.0.0-alpha1
3+
namespace: test
4+
name: http-call-with-response-output-expr
5+
version: 1.0.0
6+
do:
7+
- postPet:
8+
call: http
9+
with:
10+
method: post
11+
endpoint:
12+
uri: https://fakerestapi.azurewebsites.net/api/v1/Authors
13+
body: "${firstName: .name, lastName:.surname }}"
14+
output:
15+
as: .firstName

0 commit comments

Comments
 (0)