This is an automated email from the ASF dual-hosted git repository.

ricardozanini pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 56dfe50f0c [Fix #4007] Add content type support to openapi parser 
(#4041)
56dfe50f0c is described below

commit 56dfe50f0c3366eb590c7a9edbca547c461a3be4
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Tue Aug 26 21:16:00 2025 +0200

    [Fix #4007] Add content type support to openapi parser (#4041)
---
 .../executor/OpenAPIWorkflowApplicationTest.java   | 12 +++++
 .../src/test/resources/spec.yaml                   | 18 ++++++-
 .../src/test/resources/stringResource.sw.json      | 30 ++++++++++++
 .../parser/handlers/openapi/MediaTypeUtils.java    | 55 ++++++++++++++++++++++
 .../parser/handlers/openapi/OpenAPIDescriptor.java | 15 ++++++
 .../rest/DescriptorRestOperationHandler.java       |  2 +
 .../workflow/rest/JsonNodeResultHandler.java       | 11 ++++-
 .../kogito/workitem/rest/RestWorkItemHandler.java  | 37 ++++++++++++---
 .../workitem/rest/RestWorkItemHandlerUtils.java    |  6 +++
 .../kogito/workflows/services/StringResource.java  | 38 +++++++++++++++
 .../src/main/resources/application.properties      |  1 +
 .../src/main/resources/specs/stringResource.json   | 38 +++++++++++++++
 .../src/main/resources/stringResource.sw.json      | 37 +++++++++++++++
 ...nversationFlowIT.java => ConversionFlowIT.java} |  2 +-
 ...onversationFlowIT.java => StringOpenAPIIT.java} | 32 ++-----------
 15 files changed, 296 insertions(+), 38 deletions(-)

diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
index 28735970be..58536dcb1c 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/java/org/kie/kogito/serverless/workflow/executor/OpenAPIWorkflowApplicationTest.java
@@ -30,9 +30,11 @@ import org.kie.kogito.jackson.utils.ObjectMapperFactory;
 import org.kie.kogito.serverless.workflow.utils.ServerlessWorkflowUtils;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.node.TextNode;
 import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
 
 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
 import static com.github.tomakehurst.wiremock.client.WireMock.post;
 import static 
com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -71,4 +73,14 @@ class OpenAPIWorkflowApplicationTest {
             
assertThat(node.get("product").asDouble()).isEqualByComparingTo(product);
         }
     }
+
+    @Test
+    void stringContentTypeInvocation() throws IOException {
+        URL resource = 
Thread.currentThread().getContextClassLoader().getResource("stringResource.sw.json");
+        
wm.stubFor(post("/stringResource/reverse").withRequestBody(equalTo("redrum")).willReturn(aResponse().withStatus(200).withBody("murder")));
+        try (StaticWorkflowApplication application = 
StaticWorkflowApplication.create()) {
+            ObjectNode node = (ObjectNode) 
application.execute(ServerlessWorkflowUtils.getWorkflow(resource), 
Collections.singletonMap("name", "redrum")).getWorkflowdata();
+            assertThat(node.get("response")).isEqualTo(new TextNode("murder"));
+        }
+    }
 }
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
index 6cd67613c8..1ef8f35650 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/spec.yaml
@@ -48,7 +48,6 @@ paths:
                   product:
                     format: float
                     type: number
-                    
   /substract:
     post:
       operationId: substract
@@ -67,7 +66,22 @@ paths:
                 properties:
                  difference:
                    format: float
-                   type: number 
+                   type: number
+  /stringResource/reverse: 
+    post: 
+      operationId: reverse,
+      requestBody: 
+        content:
+          text/plain:
+            schema:
+              type: string
+      responses:
+        200:
+         description: OK
+         content:
+           text/plain: 
+            schema:
+              type:string
 components:
   schemas:
     MultiplicationOperation:
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/stringResource.sw.json
 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/stringResource.sw.json
new file mode 100644
index 0000000000..566de53a7a
--- /dev/null
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-tests/src/test/resources/stringResource.sw.json
@@ -0,0 +1,30 @@
+{
+  "id": "stringResource",
+  "name": "String resource",
+  "version": "v1.0",
+  "start": "doCall",
+  "functions": [
+    {
+      "name": "reverse",
+      "operation": "spec.yaml#reverse"
+    }
+  ],
+  "states": [
+    {
+      "name": "doCall",
+      "type": "operation",
+      "actions": [
+        {
+          "name": "reverse",
+          "functionRef": {
+            "refName": "reverse",
+            "arguments": ".name"
+          }
+        }
+      ],
+      "end": {
+        "terminate": "true"
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/MediaTypeUtils.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/MediaTypeUtils.java
new file mode 100644
index 0000000000..3d75ca7deb
--- /dev/null
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/MediaTypeUtils.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.kie.kogito.serverless.workflow.parser.handlers.openapi;
+
+import java.util.Collection;
+import java.util.Optional;
+import java.util.Set;
+
+public class MediaTypeUtils {
+
+    private MediaTypeUtils() {
+    }
+
+    private static final Collection<String> textMedia = Set.of("text/plain", 
"text/csv", "text/html");
+    private static final Collection<String> bytesMedia = 
Set.of("application/octet-stream", "application/zip");
+
+    public static Optional<Class<?>> fromMedia(String type) {
+        if (isText(type)) {
+            return Optional.of(String.class);
+        } else if (isBytes(type)) {
+            return Optional.of(byte[].class);
+        } else {
+            return Optional.empty();
+        }
+
+    }
+
+    public static boolean isText(String type) {
+        if (type == null)
+            return false;
+        return textMedia.contains(type.toLowerCase());
+    }
+
+    public static boolean isBytes(String type) {
+        if (type == null)
+            return false;
+        return bytesMedia.contains(type.toLowerCase());
+    }
+}
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
index e08f590520..3150cbdaf0 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/openapi/OpenAPIDescriptor.java
@@ -20,6 +20,7 @@ package 
org.kie.kogito.serverless.workflow.parser.handlers.openapi;
 
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Optional;
 import java.util.Set;
 
 import io.swagger.v3.oas.models.Operation;
@@ -35,16 +36,26 @@ public class OpenAPIDescriptor {
     private final Set<String> pathParams = new HashSet<>();
     private final Set<String> queryParams = new HashSet<>();
     private final Set<String> headerParams = new HashSet<>();
+    private final Optional<String> resultType;
 
     OpenAPIDescriptor(HttpMethod method, String path, Operation operation, 
Collection<SecurityScheme> schemes) {
         this.method = method;
         this.path = path;
         this.schemes = schemes;
+
+        this.resultType = 
operation.getResponses().entrySet().stream().filter(e -> 
isValidStatusCode(Integer.parseInt(e.getKey())))
+                .filter(e -> e.getValue().getContent() != null)
+                .flatMap(e -> 
e.getValue().getContent().keySet().stream()).findFirst();
+
         if (operation.getParameters() != null) {
             operation.getParameters().forEach(this::addParameter);
         }
     }
 
+    private boolean isValidStatusCode(int statusCode) {
+        return statusCode >= 200 && statusCode < 300;
+    }
+
     private void addParameter(Parameter parameter) {
         switch (parameter.getIn()) {
             case "query":
@@ -61,6 +72,10 @@ public class OpenAPIDescriptor {
         }
     }
 
+    public Optional<String> getResultType() {
+        return resultType;
+    }
+
     public HttpMethod getMethod() {
         return method;
     }
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
index ff2ab4d5d1..ded1eb4c25 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-openapi-parser/src/main/java/org/kie/kogito/serverless/workflow/parser/rest/DescriptorRestOperationHandler.java
@@ -28,6 +28,7 @@ import org.jbpm.ruleflow.core.factory.WorkItemNodeFactory;
 import org.kie.kogito.internal.utils.ConversionUtils;
 import org.kie.kogito.serverless.workflow.operationid.WorkflowOperationId;
 import org.kie.kogito.serverless.workflow.parser.ParserContext;
+import 
org.kie.kogito.serverless.workflow.parser.handlers.openapi.MediaTypeUtils;
 import 
org.kie.kogito.serverless.workflow.parser.handlers.openapi.OpenAPIDescriptor;
 import 
org.kie.kogito.serverless.workflow.parser.handlers.openapi.OpenAPIDescriptorFactory;
 import org.kie.kogito.serverless.workflow.parser.types.OpenAPITypeHandler;
@@ -92,6 +93,7 @@ public class DescriptorRestOperationHandler extends 
OpenAPITypeHandler {
         OpenAPI openAPI = OpenAPIFactory.getOpenAPI(uri, workflow, function, 
Optional.of(parserContext));
         OpenAPIDescriptor openAPIDescriptor = 
OpenAPIDescriptorFactory.of(openAPI, operationId.getOperation());
         addSecurity(node, openAPIDescriptor, serviceName, parserContext);
+        
openAPIDescriptor.getResultType().flatMap(MediaTypeUtils::fromMedia).ifPresent(s
 -> node.workParameter(RestWorkItemHandler.TARGET_TYPE, s));
         return node.workParameter(RestWorkItemHandler.URL,
                 runtimeOpenApi(serviceName, URL, String.class, 
OpenAPIDescriptorFactory.getDefaultURL(openAPI, "http://localhost:8080";),
                         (key, clazz, defaultValue) -> new 
ConfigSuppliedWorkItemSupplier<>(key, clazz, defaultValue, calculatedKey -> 
concatPaths(calculatedKey, openAPIDescriptor.getPath()),
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
index 397bbfb46b..f91e71bfe5 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-rest-runtime/src/main/java/org/kie/kogito/serverless/workflow/rest/JsonNodeResultHandler.java
@@ -21,6 +21,7 @@ package org.kie.kogito.serverless.workflow.rest;
 import java.util.Map;
 
 import org.kie.kogito.internal.process.runtime.KogitoProcessContext;
+import org.kie.kogito.jackson.utils.JsonObjectUtils;
 import org.kogito.workitem.rest.resulthandlers.RestWorkItemHandlerResult;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -59,6 +60,14 @@ public class JsonNodeResultHandler implements 
RestWorkItemHandlerResult {
 
     @Override
     public Object apply(HttpResponse<Buffer> t, Class<?> u) {
-        return u == null ? t.bodyAsJson(JsonNode.class) : t.bodyAsJson(u);
+        if (u == null) {
+            return t.bodyAsJson(JsonNode.class);
+        } else if (byte[].class.isAssignableFrom(u)) {
+            return JsonObjectUtils.fromValue(t.body().getBytes());
+        } else if (String.class.isAssignableFrom(u)) {
+            return JsonObjectUtils.fromValue(t.bodyAsString());
+        } else {
+            return t.bodyAsJson(u);
+        }
     }
 }
diff --git 
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
 
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
index 7276f4c4f0..8e7ff73d1f 100644
--- 
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
+++ 
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandler.java
@@ -60,6 +60,7 @@ import 
org.kogito.workitem.rest.resulthandlers.RestWorkItemHandlerResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import io.smallrye.mutiny.Uni;
 import io.vertx.core.http.HttpMethod;
 import io.vertx.mutiny.core.buffer.Buffer;
 import io.vertx.mutiny.ext.web.client.HttpRequest;
@@ -70,6 +71,7 @@ import static 
org.kie.kogito.internal.utils.ConversionUtils.isEmpty;
 import static 
org.kogito.workitem.rest.RestWorkItemHandlerUtils.getClassListParam;
 import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.getClassParam;
 import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.getParam;
+import static org.kogito.workitem.rest.RestWorkItemHandlerUtils.getParamSupply;
 
 public class RestWorkItemHandler extends DefaultKogitoWorkItemHandler {
 
@@ -88,6 +90,7 @@ public class RestWorkItemHandler extends 
DefaultKogitoWorkItemHandler {
     public static final String PARAMS_DECORATOR = "ParamsDecorator";
     public static final String PATH_PARAM_RESOLVER = "PathParamResolver";
     public static final String AUTH_METHOD = "AuthMethod";
+    public static final String TARGET_TYPE = "TargetType";
 
     public static final String REQUEST_TIMEOUT_IN_MILLIS = "RequestTimeout";
 
@@ -118,12 +121,14 @@ public class RestWorkItemHandler extends 
DefaultKogitoWorkItemHandler {
 
     @Override
     public Optional<WorkItemTransition> 
activateWorkItemHandler(KogitoWorkItemManager manager, KogitoWorkItemHandler 
handler, KogitoWorkItem workItem, WorkItemTransition transition) {
-        Class<?> targetInfo = getTargetInfo(workItem);
-        logger.debug("Using target {}", targetInfo);
+
         //retrieving parameters
         Map<String, Object> parameters = new 
HashMap<>(workItem.getParameters());
         //removing unnecessary parameter
         parameters.remove("TaskName");
+        Class<?> targetInfo = getParamSupply(parameters, TARGET_TYPE, 
Class.class, () -> getTargetInfo(workItem));
+        logger.debug("Using target {}", targetInfo);
+
         String endPoint = getParam(parameters, URL, String.class, null);
         if (endPoint == null) {
             throw new IllegalArgumentException("Missing required parameter " + 
URL);
@@ -185,17 +190,35 @@ public class RestWorkItemHandler extends 
DefaultKogitoWorkItemHandler {
         paramsDecorator.decorate(workItem, parameters, request);
         Duration requestTimeout = getRequestTimeout(parameters);
         HttpResponse<Buffer> response = method.equals(HttpMethod.POST) || 
method.equals(HttpMethod.PUT)
-                ? sendJson(request, bodyBuilder.apply(parameters), 
requestTimeout)
+                ? sendBody(request, bodyBuilder.apply(parameters), 
requestTimeout)
                 : send(request, requestTimeout);
         return Optional.of(this.workItemLifeCycle.newTransition("complete", 
workItem.getPhaseStatus(),
                 Collections.singletonMap(RESULT, resultHandler.apply(response, 
targetInfo, ContextFactory.fromItem(workItem)))));
     }
 
-    private static HttpResponse<Buffer> sendJson(HttpRequest<Buffer> request, 
Object body, Duration requestTimeout) {
-        if (requestTimeout == null) {
-            return request.sendJsonAndAwait(body);
+    private static HttpResponse<Buffer> sendBody(HttpRequest<Buffer> request, 
Object body, Duration requestTimeout) {
+        return requestTimeout == null ? sendBody(request, body) : 
sendBodyTimeout(request, body, requestTimeout);
+    }
+
+    private static HttpResponse<Buffer> sendBodyTimeout(HttpRequest<Buffer> 
request, Object body, Duration requestTimeout) {
+        Uni<HttpResponse<Buffer>> uni;
+        if (body instanceof String string) {
+            uni = request.sendBuffer(Buffer.buffer(string));
+        } else if (body instanceof byte[] bytes) {
+            uni = request.sendBuffer(Buffer.buffer(bytes));
+        } else {
+            uni = request.sendJson(body);
+        }
+        return uni.await().atMost(requestTimeout);
+    }
+
+    private static HttpResponse<Buffer> sendBody(HttpRequest<Buffer> request, 
Object body) {
+        if (body instanceof String string) {
+            return request.sendBufferAndAwait(Buffer.buffer(string));
+        } else if (body instanceof byte[] bytes) {
+            return request.sendBufferAndAwait(Buffer.buffer(bytes));
         } else {
-            return request.sendJson(body).await().atMost(requestTimeout);
+            return request.sendJsonAndAwait(body);
         }
     }
 
diff --git 
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
 
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
index 85ccebdec8..60bc8bb78a 100644
--- 
a/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
+++ 
b/kogito-workitems/kogito-rest-workitem/src/main/java/org/kogito/workitem/rest/RestWorkItemHandlerUtils.java
@@ -22,6 +22,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import org.kie.kogito.internal.process.workitem.WorkItemExecutionException;
@@ -45,6 +46,11 @@ public class RestWorkItemHandlerUtils {
         return getParam(parameters, paramName, String.class, null);
     }
 
+    public static <T> T getParamSupply(Map<String, Object> parameters, String 
paramName, Class<T> type, Supplier<T> defaultValue) {
+        Object value = parameters.remove(paramName);
+        return value == null ? defaultValue.get() : convert(value, type, v -> 
v.toString().toUpperCase());
+    }
+
     public static <T> T getParam(Map<String, Object> parameters, String 
paramName, Class<T> type, T defaultValue) {
         Object value = parameters.remove(paramName);
         return value == null ? defaultValue : convert(value, type, v -> 
v.toString().toUpperCase());
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/java/org/kie/kogito/workflows/services/StringResource.java
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/java/org/kie/kogito/workflows/services/StringResource.java
new file mode 100644
index 0000000000..c1e292e368
--- /dev/null
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/java/org/kie/kogito/workflows/services/StringResource.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.kie.kogito.workflows.services;
+
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+
+@Path("stringResource")
+public class StringResource {
+
+    @POST
+    @Produces(MediaType.TEXT_PLAIN)
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Path("reverse")
+    public String reverse(String str) {
+        return new StringBuilder(str).reverse().toString();
+    }
+
+}
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
index cc5d826ddf..24bef754bb 100644
--- 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
@@ -44,6 +44,7 @@ 
quarkus.rest-client."multiplication.cluster1".url=${multiplication-service-mock.
 quarkus.rest-client.subtraction.url=${subtraction-service-mock.url}
 quarkus.rest-client.petstore_openapi_yaml.url=${petstore-service-mock.url}
 quarkus.rest-client.array_yaml.url=${array-service-mock.url}
+quarkus.rest-client.stringOperations.url=http://localhost:${quarkus.http.port}
 
 
 # OpenApi client properties to access the general purpose external-service, 
which is mocked by the ExternalServiceMock
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/stringResource.json
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/stringResource.json
new file mode 100644
index 0000000000..5606ed3d98
--- /dev/null
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/stringResource.json
@@ -0,0 +1,38 @@
+{
+  "openapi" : "3.1.0",
+  "info" : {
+    "title" : "String Operations",
+    "version" : "1.0-SNAPSHOT"
+  },
+  "paths" : {
+    "/stringResource/reverse" : {
+      "post" : {
+        "operationId" : "reverse",
+        "requestBody" : {
+          "content" : {
+            "text/plain" : {
+              "schema" : {
+                "type" : "string"
+              }
+            }
+          },
+          "required" : true
+        },
+        "responses" : {
+          "200" : {
+            "description" : "OK",
+            "content" : {
+              "text/plain" : {
+                "schema" : {
+                  "type" : "string"
+                }
+              }
+            }
+          }
+        },
+        "summary" : "Reverse",
+        "tags" : [ "String Resource" ]
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/stringResource.sw.json
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/stringResource.sw.json
new file mode 100644
index 0000000000..9604c27bb3
--- /dev/null
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/stringResource.sw.json
@@ -0,0 +1,37 @@
+{
+  "id": "stringResource",
+  "name": "String resource",
+  "version": "v1.0",
+  "start": "doCall",
+  "extensions" : [ {
+      "extensionid": "workflow-uri-definitions",
+      "definitions": {
+        "stringOperations": "specs/stringResource.json"
+       }
+     }
+  ],
+  "functions": [
+    {
+      "name": "reverse",
+      "operation": "stringOperations#reverse"
+    }
+  ],
+  "states": [
+    {
+      "name": "doCall",
+      "type": "operation",
+      "actions": [
+        {
+          "name": "reverse",
+          "functionRef": {
+            "refName": "reverse",
+            "arguments": ".name"
+          }
+        }
+      ],
+      "end": {
+        "terminate": "true"
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversionFlowIT.java
similarity index 98%
copy from 
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
copy to 
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversionFlowIT.java
index 9d18e18b13..a0b90db92b 100644
--- 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversionFlowIT.java
@@ -34,7 +34,7 @@ import static org.hamcrest.CoreMatchers.notNullValue;
 
 @QuarkusTestResource(OperationsMockService.class)
 @QuarkusIntegrationTest
-class ConversationFlowIT {
+class ConversionFlowIT {
 
     @BeforeAll
     static void init() {
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/StringOpenAPIIT.java
similarity index 64%
rename from 
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
rename to 
quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/StringOpenAPIIT.java
index 9d18e18b13..40a9768863 100644
--- 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ConversationFlowIT.java
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/StringOpenAPIIT.java
@@ -34,7 +34,7 @@ import static org.hamcrest.CoreMatchers.notNullValue;
 
 @QuarkusTestResource(OperationsMockService.class)
 @QuarkusIntegrationTest
-class ConversationFlowIT {
+class StringOpenAPIIT {
 
     @BeforeAll
     static void init() {
@@ -42,38 +42,16 @@ class ConversationFlowIT {
     }
 
     @Test
-    void sanityVerification() {
+    void testReverse() {
         given()
                 .contentType(ContentType.JSON)
                 .when()
-                .body(Map.of("fahrenheit", "100", "clusterName", "cluster1"))
-                .post("/fahrenheit_to_celsius")
+                .body(Map.of("name", "redrum"))
+                .post("/stringResource")
                 .then()
                 .statusCode(201)
                 .body("id", notNullValue())
-                .body("workflowdata.fahrenheit", is("100"))
-                .body("workflowdata.celsius", is(37.808f)); //values from mock 
server
+                .body("workflowdata.response", is("murder"));
     }
 
-    @Test
-    void wrongCluster() {
-        given()
-                .contentType(ContentType.JSON)
-                .when()
-                .body(Map.of("fahrenheit", "100", "clusterName", "cluster2"))
-                .post("/fahrenheit_to_celsius")
-                .then()
-                .statusCode(400);
-    }
-
-    @Test
-    void wrongData() {
-        given()
-                .contentType(ContentType.JSON)
-                .when()
-                .body(Map.of("fahrenheit", "100"))
-                .post("/fahrenheit_to_celsius")
-                .then()
-                .statusCode(400);
-    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to