This is an automated email from the ASF dual-hosted git repository.
fjtiradosarti 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 6bd9b68d1d [KOGITO-9861] Fixing compilation issues with nested classes
and arrays (#3242)
6bd9b68d1d is described below
commit 6bd9b68d1d64031f25536572a8aaecc21dc90c5d
Author: Francisco Javier Tirado Sarti
<[email protected]>
AuthorDate: Fri Oct 6 12:23:35 2023 +0200
[KOGITO-9861] Fixing compilation issues with nested classes and arrays
(#3242)
* [KOGITO-9861] Fixing compilation issues with nested and arrays
* [KOGITO-9861] Adding IT test
---
.../workflow/WorkflowWorkItemHandler.java | 6 ++-
.../ClassAnnotatedWorkflowHandlerGenerator.java | 24 +++++++--
.../openapi/WorkflowOpenApiHandlerGenerator.java | 2 +-
.../src/main/resources/application.properties | 3 +-
.../src/main/resources/openapiarray.sw.json | 27 ++++++++++
.../src/main/resources/specs/array.yaml | 25 +++++++++
.../quarkus/workflows/OpenAPIArrayFlowIT.java | 57 ++++++++++++++++++++
.../quarkus/workflows/OpenAPIArrayMockService.java | 62 ++++++++++++++++++++++
8 files changed, 198 insertions(+), 8 deletions(-)
diff --git
a/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/WorkflowWorkItemHandler.java
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/WorkflowWorkItemHandler.java
index 9d87627bdd..557cb6c86d 100644
---
a/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/WorkflowWorkItemHandler.java
+++
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/WorkflowWorkItemHandler.java
@@ -26,7 +26,6 @@ import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
import org.kie.kogito.internal.process.runtime.KogitoWorkItemHandler;
import org.kie.kogito.internal.process.runtime.KogitoWorkItemManager;
import org.kie.kogito.jackson.utils.JsonObjectUtils;
-import org.kie.kogito.jackson.utils.ObjectMapperFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,10 +47,13 @@ public abstract class WorkflowWorkItemHandler implements
KogitoWorkItemHandler {
protected static <V> V buildBody(Map<String, Object> params, Class<V>
clazz) {
for (Object obj : params.values()) {
if (obj != null && clazz.isAssignableFrom(obj.getClass())) {
+ logger.trace("Invoking workitemhandler with value {}", obj);
return clazz.cast(obj);
}
}
- return ObjectMapperFactory.get().convertValue(params, clazz);
+ V value = JsonObjectUtils.convertValue(params, clazz);
+ logger.trace("Invoking workitemhandler with value {}", value);
+ return value;
}
@Override
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/ClassAnnotatedWorkflowHandlerGenerator.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/ClassAnnotatedWorkflowHandlerGenerator.java
index 32fce36910..95d117f885 100644
---
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/ClassAnnotatedWorkflowHandlerGenerator.java
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/ClassAnnotatedWorkflowHandlerGenerator.java
@@ -30,6 +30,7 @@ import org.jboss.jandex.Type;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
import com.github.javaparser.ast.NodeList;
+import com.github.javaparser.ast.type.ClassOrInterfaceType;
import static com.github.javaparser.StaticJavaParser.parseClassOrInterfaceType;
import static com.github.javaparser.StaticJavaParser.parseType;
@@ -46,16 +47,31 @@ public abstract class
ClassAnnotatedWorkflowHandlerGenerator implements Workflow
protected abstract Stream<WorkflowHandlerGeneratedFile>
generateHandler(KogitoBuildContext context, AnnotationInstance a);
protected final com.github.javaparser.ast.type.Type fromClass(Type param) {
+ return fromClass(param, true);
+ }
+
+ protected final com.github.javaparser.ast.type.Type fromClass(Type param,
boolean includeGeneric) {
switch (param.kind()) {
case CLASS:
- return
parseClassOrInterfaceType(param.asClassType().name().toString());
+ return
parseClassOrInterfaceType(fromDotName(param.asClassType().name()));
case PRIMITIVE:
- return parseType(param.asPrimitiveType().name().toString());
+ return parseType(fromDotName(param.asPrimitiveType().name()));
case PARAMETERIZED_TYPE:
- return
parseClassOrInterfaceType(param.asParameterizedType().name().toString())
-
.setTypeArguments(NodeList.nodeList(param.asParameterizedType().arguments().stream().map(this::fromClass).collect(Collectors.toList())));
+ ClassOrInterfaceType result =
parseClassOrInterfaceType(fromDotName(param.asParameterizedType().name()));
+ if (includeGeneric) {
+
result.setTypeArguments(NodeList.nodeList(param.asParameterizedType().arguments().stream().map(this::fromClass).collect(Collectors.toList())));
+ }
+ return result;
default:
throw new UnsupportedOperationException("Kind " + param.kind()
+ " is not supported");
}
}
+
+ private String fromDotName(DotName dotName) {
+ String result = dotName.toString();
+ if (dotName.isInner()) {
+ result = result.replace('$', '.');
+ }
+ return result;
+ }
}
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/openapi/WorkflowOpenApiHandlerGenerator.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/openapi/WorkflowOpenApiHandlerGenerator.java
index 36c97d8d73..f502b34a83 100644
---
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/openapi/WorkflowOpenApiHandlerGenerator.java
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-deployment/src/main/java/org/kie/kogito/quarkus/serverless/workflow/openapi/WorkflowOpenApiHandlerGenerator.java
@@ -109,7 +109,7 @@ public class WorkflowOpenApiHandlerGenerator extends
ClassAnnotatedWorkflowHandl
if (annotation != null) {
methodCallExpr.addArgument(new CastExpr(fromClass(param), new
MethodCallExpr(parameters, "remove").addArgument(new
StringLiteralExpr(annotation.value().asString()))));
} else {
- methodCallExpr.addArgument(new
MethodCallExpr("buildBody").addArgument(parameters).addArgument(new
ClassExpr(fromClass(param))));
+ methodCallExpr.addArgument(new
MethodCallExpr("buildBody").addArgument(parameters).addArgument(new
ClassExpr(fromClass(param, false))));
}
}
clazz.addMethod("getRestClass",
Keyword.PROTECTED).setType(parseClassOrInterfaceType(Class.class.getCanonicalName()).setTypeArguments(classNameType))
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 464e0b8e6e..238674ad34 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
@@ -9,7 +9,7 @@ quarkus.flyway.clean-at-start=true
quarkus.http.test-port=0
quarkus.log.level=INFO
-#quarkus.log.category."org.kie.kogito".level=DEBUG
+#quarkus.log.category."org.kie.kogito.serverless.workflow".level=DEBUG
# To include the greethidden workflow
kogito.codegen.ignoreHiddenFiles=false
@@ -20,6 +20,7 @@ quarkus.kubernetes-client.devservices.enabled=false
# OpenApi client properties, see OperationsMockService, which is mocking these
two services
quarkus.rest-client.multiplication.url=${multiplication-service-mock.url}
quarkus.rest-client.subtraction.url=${subtraction-service-mock.url}
+quarkus.rest-client.array_yaml.url=${array-service-mock.url}
# OpenApi client properties to access the general purpose external-service,
which is mocked by the ExternalServiceMock
quarkus.rest-client.external_service_yaml.url=${external-service-mock.url}
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/openapiarray.sw.json
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/openapiarray.sw.json
new file mode 100644
index 0000000000..32645efec4
--- /dev/null
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/openapiarray.sw.json
@@ -0,0 +1,27 @@
+{
+ "id": "openapiarray",
+ "name": "Open API Array Test",
+ "version": "v1.0",
+ "start": "DoIt",
+ "functions": [
+ {
+ "name": "testArray",
+ "operation": "specs/array.yaml#testArray"
+ }
+ ],
+ "states": [
+ {
+ "name": "DoIt",
+ "type": "operation",
+ "actions": [
+ {
+ "name": "testArray",
+ "functionRef": {
+ "refName": "testArray",
+ "arguments": ".inputArray"
+ }
+ }],
+ "end": true
+ }
+ ]
+}
\ 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/specs/array.yaml
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/array.yaml
new file mode 100644
index 0000000000..14fe0ad774
--- /dev/null
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/specs/array.yaml
@@ -0,0 +1,25 @@
+---
+openapi: 3.0.3
+info:
+ title: Generated API
+ version: "1.0"
+paths:
+ /testArray:
+ post:
+ operationId: testArray
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: number
+ responses:
+ "200":
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: number
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIArrayFlowIT.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIArrayFlowIT.java
new file mode 100644
index 0000000000..c4923c191b
--- /dev/null
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIArrayFlowIT.java
@@ -0,0 +1,57 @@
+/*
+ * 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.quarkus.workflows;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+
+@QuarkusTestResource(OpenAPIArrayMockService.class)
+@QuarkusIntegrationTest
+class OpenAPIArrayFlowIT {
+
+ @BeforeAll
+ static void init() {
+ RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();
+ }
+
+ @Test
+ void testArray() {
+ given()
+ .contentType(ContentType.JSON)
+ .when()
+ .body(Collections.singletonMap("inputArray", Arrays.asList(1,
2, 3, 4)))
+ .post("/openapiarray")
+ .then()
+ .statusCode(201)
+ .body("id", notNullValue())
+ .body("workflowdata.response", is(Arrays.asList(1, 2, 3, 4)));
+ }
+}
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIArrayMockService.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIArrayMockService.java
new file mode 100644
index 0000000000..c67a911d8e
--- /dev/null
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIArrayMockService.java
@@ -0,0 +1,62 @@
+/*
+ * 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.quarkus.workflows;
+
+import java.util.Map;
+import java.util.function.UnaryOperator;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.client.MappingBuilder;
+
+import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static
com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
+
+public class OpenAPIArrayMockService implements
QuarkusTestResourceLifecycleManager {
+
+ private static WireMockServer arrayService;
+
+ @Override
+ public Map<String, String> start() {
+ arrayService = startServer("[1,2,3,4]", p -> p);
+ return Map.of("array-service-mock.url", arrayService.baseUrl());
+ }
+
+ @Override
+ public void stop() {
+ if (arrayService != null) {
+ arrayService.stop();
+ }
+ }
+
+ private static WireMockServer startServer(final String response,
UnaryOperator<MappingBuilder> function) {
+ final WireMockServer server = new
WireMockServer(options().dynamicPort());
+ server.start();
+
server.stubFor(function.apply(post(urlEqualTo("/testArray")).withRequestBody(equalToJson("[1,2,3,4]")))
+ .withPort(server.port())
+ .willReturn(aResponse()
+ .withHeader("Content-Type", "application/json")
+ .withBody(response)));
+ return server;
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]