Skip to content

Commit 9504b50

Browse files
fjtiradorgdoliveira
authored andcommitted
[Fix apache#3573] configKey metadata (apache#3588)
1 parent 3557b8d commit 9504b50

File tree

8 files changed

+72
-15
lines changed

8 files changed

+72
-15
lines changed

kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,9 @@ public void emit(JsonNode out) throws JsonQueryException {
134134
if (sb.length() > 0) {
135135
sb.append(' ');
136136
}
137-
sb.append(out.asText());
137+
if (!out.isNull() && out.asText() != null) {
138+
sb.append(out.asText());
139+
}
138140
}
139141

140142
@Override

kogito-serverless-workflow/kogito-jq-expression/src/test/java/org/kie/kogito/expr/jq/JqExpressionHandlerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,15 +287,15 @@ private static Stream<Arguments> provideMagicWordExpressionsToTest() {
287287
Arguments.of("\"WORKFLOW.instanceId\"", "WORKFLOW.instanceId", getContext()),
288288
Arguments.of("\"$WORKFLOW.instanceId\"", "$WORKFLOW.instanceId", getContext()),
289289
Arguments.of("\"$WORKFLOW.instanceId: \" + $WORKFLOW.instanceId", "$WORKFLOW.instanceId: 1111-2222-3333", getContext()),
290-
Arguments.of("$SECRET.none", "null", getContext()),
290+
Arguments.of("$SECRET.none", "", getContext()),
291291
Arguments.of("\"$SECRET.none\"", "$SECRET.none", getContext()),
292292
Arguments.of("$SECRET.lettersonly", "secretlettersonly", getContext()),
293293
Arguments.of("$SECRET.dot.secret", "secretdotsecret", getContext()),
294294
Arguments.of("$SECRET.\"dot.secret\"", "secretdotsecret", getContext()),
295295
Arguments.of("$SECRET.\"dash-secret\"", "secretdashsecret", getContext()),
296296
Arguments.of("$CONST.someconstant", "value", getContext()),
297297
Arguments.of("$CONST.\"someconstant\"", "value", getContext()),
298-
Arguments.of("$CONST.some.constant", "null", getContext()),
298+
Arguments.of("$CONST.some.constant", "", getContext()),
299299
Arguments.of("$CONST.\"some.constant\"", "value", getContext()),
300300
Arguments.of("$CONST.\"some-constant\"", "value", getContext()),
301301
Arguments.of("$CONST.injectedexpression", "$WORKFLOW.instanceId", getContext()),

kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/CompositeContextNodeHandler.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.kie.kogito.serverless.workflow.parser.handlers;
2020

2121
import java.util.List;
22+
import java.util.Map;
2223
import java.util.Optional;
2324
import java.util.stream.Stream;
2425

@@ -209,9 +210,15 @@ private Stream<FunctionDefinition> getFunctionDefStream() {
209210
private NodeFactory fromFunctionDefinition(RuleFlowNodeContainerFactory<?, ?> embeddedSubProcess,
210211
FunctionDefinition functionDef,
211212
FunctionRef functionRef, VariableInfo varInfo) {
212-
return FunctionTypeHandlerFactory.instance().getTypeHandler(functionDef)
213+
NodeFactory result = FunctionTypeHandlerFactory.instance().getTypeHandler(functionDef)
213214
.map(type -> type.getActionNode(workflow, parserContext, embeddedSubProcess, functionDef, functionRef, varInfo))
214-
.orElseGet(() -> (NodeFactory) embeddedSubProcess.actionNode(parserContext.newId()).name(functionRef.getRefName()).action(JavaDialect.ID, ""));
215+
.orElseGet(() -> (NodeFactory) embeddedSubProcess.actionNode(parserContext.newId()).name(functionRef.getRefName()).action(JavaDialect.ID, "")
216+
.metaData(XORSPLITDEFAULT, varInfo));
217+
Map<String, String> metadata = functionDef.getMetadata();
218+
if (metadata != null) {
219+
metadata.forEach((k, v) -> result.metaData(k, v));
220+
}
221+
return result;
215222
}
216223

217224
private Optional<NodeFactory> fromPredefinedFunction(RuleFlowNodeContainerFactory<?, ?> embeddedSubProcess,

quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ quarkus.kafka.devservices.enabled=false
3838
quarkus.kubernetes-client.devservices.enabled=false
3939

4040
# OpenApi client properties, see OperationsMockService, which is mocking these two services
41-
quarkus.rest-client.multiplication.url=${multiplication-service-mock.url}
41+
quarkus.rest-client.multiplication.cluster1.url=${multiplication-service-mock.url}
4242
quarkus.rest-client.subtraction.url=${subtraction-service-mock.url}
4343
quarkus.rest-client.array_yaml.url=${array-service-mock.url}
4444

quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/fahrenheit-to-celsius.sw.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
"functions": [
1515
{
1616
"name": "multiplication",
17-
"operation": "multiplication#Do Operation"
17+
"operation": "multiplication#Do Operation",
18+
"metadata": {
19+
"configKey" : ".clusterName"
20+
}
1821
},
1922
{
2023
"name": "subtraction",

quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.kie.kogito.quarkus.workflows;
2020

21-
import java.util.Collections;
21+
import java.util.Map;
2222

2323
import org.junit.jupiter.api.BeforeAll;
2424
import org.junit.jupiter.api.Test;
@@ -46,16 +46,34 @@ void sanityVerification() {
4646
given()
4747
.contentType(ContentType.JSON)
4848
.when()
49-
.body(
50-
Collections
51-
.singletonMap(
52-
"workflowdata",
53-
Collections.singletonMap("fahrenheit", "100")))
49+
.body(Map.of("fahrenheit", "100", "clusterName", "cluster1"))
5450
.post("/fahrenheit_to_celsius")
5551
.then()
5652
.statusCode(201)
5753
.body("id", notNullValue())
5854
.body("workflowdata.fahrenheit", is("100"))
5955
.body("workflowdata.celsius", is(37.808f)); //values from mock server
6056
}
57+
58+
@Test
59+
void wrongCluster() {
60+
given()
61+
.contentType(ContentType.JSON)
62+
.when()
63+
.body(Map.of("fahrenheit", "100", "clusterName", "cluster2"))
64+
.post("/fahrenheit_to_celsius")
65+
.then()
66+
.statusCode(400);
67+
}
68+
69+
@Test
70+
void wrongData() {
71+
given()
72+
.contentType(ContentType.JSON)
73+
.when()
74+
.body(Map.of("fahrenheit", "100"))
75+
.post("/fahrenheit_to_celsius")
76+
.then()
77+
.statusCode(400);
78+
}
6179
}

quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow/src/main/java/io/quarkus/restclient/runtime/RestClientBuilderFactory.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
*/
1919
package io.quarkus.restclient.runtime;
2020

21+
import java.util.Optional;
22+
2123
import org.eclipse.microprofile.context.ManagedExecutor;
2224
import org.eclipse.microprofile.rest.client.RestClientBuilder;
2325
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
@@ -32,8 +34,13 @@ public RestClientBuilderFactory(Class<?> proxyType, String baseUriFromAnnotation
3234
}
3335

3436
public static RestClientBuilder build(Class<?> restClass) {
37+
return build(restClass, Optional.empty());
38+
}
39+
40+
public static RestClientBuilder build(Class<?> restClass, Optional<String> calculatedConfigKey) {
3541
RegisterRestClient annotation = restClass.getAnnotation(RegisterRestClient.class);
36-
RestClientBuilderFactory instance = new RestClientBuilderFactory(restClass, annotation.baseUri(), annotation.configKey());
42+
RestClientBuilderFactory instance =
43+
new RestClientBuilderFactory(restClass, annotation.baseUri(), calculatedConfigKey.map(c -> annotation.configKey() + "." + c).orElse(annotation.configKey()));
3744
RestClientBuilder builder = RestClientBuilder.newBuilder();
3845
instance.configureBaseUrl(builder);
3946
instance.configureTimeouts(builder);

quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow/src/main/java/org/kie/kogito/serverless/workflow/openapi/OpenApiWorkItemHandler.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,16 @@
2222
import java.lang.reflect.ParameterizedType;
2323
import java.util.Collections;
2424
import java.util.Map;
25+
import java.util.Optional;
2526

27+
import org.jbpm.process.instance.KogitoProcessContextImpl;
28+
import org.jbpm.util.ContextFactory;
29+
import org.jbpm.workflow.core.WorkflowProcess;
2630
import org.kie.kogito.event.cloudevents.extension.ProcessMeta;
2731
import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
32+
import org.kie.kogito.process.expr.ExpressionHandlerFactory;
2833
import org.kie.kogito.process.workitem.WorkItemExecutionException;
34+
import org.kie.kogito.serverless.workflow.SWFConstants;
2935
import org.kie.kogito.serverless.workflow.WorkflowWorkItemHandler;
3036

3137
import io.quarkus.restclient.runtime.RestClientBuilderFactory;
@@ -39,7 +45,7 @@ public abstract class OpenApiWorkItemHandler<T> extends WorkflowWorkItemHandler
3945
@Override
4046
protected Object internalExecute(KogitoWorkItem workItem, Map<String, Object> parameters) {
4147
Class<T> clazz = getRestClass();
42-
T ref = RestClientBuilderFactory.build(clazz).register(new ClientRequestFilter() {
48+
T ref = RestClientBuilderFactory.build(clazz, calculatedConfigKey(workItem, parameters)).register(new ClientRequestFilter() {
4349
@Override
4450
public void filter(ClientRequestContext requestContext) throws IOException {
4551
ProcessMeta.fromKogitoWorkItem(workItem).asMap().forEach((k, v) -> requestContext.getHeaders().put(k, Collections.singletonList(v)));
@@ -52,6 +58,20 @@ public void filter(ClientRequestContext requestContext) throws IOException {
5258
}
5359
}
5460

61+
private Optional<String> calculatedConfigKey(KogitoWorkItem workItem, Map<String, Object> parameters) {
62+
String configKeyExpr = (String) workItem.getNodeInstance().getNode().getMetaData().get("configKey");
63+
if (configKeyExpr == null) {
64+
return Optional.empty();
65+
}
66+
KogitoProcessContextImpl context = ContextFactory.fromItem(workItem);
67+
String result = ExpressionHandlerFactory.get(((WorkflowProcess) workItem.getProcessInstance().getProcess()).getExpressionLanguage(), configKeyExpr)
68+
.eval(context.getVariable(SWFConstants.DEFAULT_WORKFLOW_VAR), String.class, context);
69+
if (result == null || result.isBlank()) {
70+
throw new IllegalArgumentException("Expression " + configKeyExpr + " returns null or empty value");
71+
}
72+
return Optional.of(result);
73+
}
74+
5575
protected abstract Object internalExecute(T openAPIRef, Map<String, Object> parameters);
5676

5777
protected Class<T> getRestClass() {

0 commit comments

Comments
 (0)