This is an automated email from the ASF dual-hosted git repository.
yamer 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 35bf597959 [kie-issues#2141] Improve OpenAPI v3 spec endpoints (#4091)
35bf597959 is described below
commit 35bf5979595a77944bb215d2e369fce5072e962c
Author: Yeser Amer <[email protected]>
AuthorDate: Tue Oct 21 13:09:12 2025 +0200
[kie-issues#2141] Improve OpenAPI v3 spec endpoints (#4091)
* Decisions
* Updated spring dep.
* DecisionRestResourceGenerator updated.
* DecisionRestResourceGenerator updated.
* Bug fixed
* Processes
* Tests
* Tags added
* Test fixed
* Template fixed
* Test fixed
* Rebase
---
kogito-build/kogito-dependencies-bom/pom.xml | 4 +-
.../decision/DecisionRestResourceGenerator.java | 46 ++++++++++++++++++----
.../DecisionRestResourceQuarkusTemplate.java | 3 ++
.../DecisionRestResourceSpringTemplate.java | 6 ++-
.../codegen/process/ProcessResourceGenerator.java | 5 ++-
.../RestResourceQuarkusTemplate.java | 18 ++++-----
.../RestResourceSpringTemplate.java | 17 ++++----
.../process/ProcessResourceGeneratorTest.java | 32 ++++++++++++---
.../quarkus/workflows/OpenAPIInterfaceGenIT.java | 2 +-
.../kie/kogito/quarkus/workflows/SwaggerIT.java | 2 +-
.../ProcessInstanceMigrationRestController.java | 2 +-
springboot/bom/pom.xml | 4 +-
12 files changed, 102 insertions(+), 39 deletions(-)
diff --git a/kogito-build/kogito-dependencies-bom/pom.xml
b/kogito-build/kogito-dependencies-bom/pom.xml
index f91f1fb6cd..71a28ffef9 100644
--- a/kogito-build/kogito-dependencies-bom/pom.xml
+++ b/kogito-build/kogito-dependencies-bom/pom.xml
@@ -102,8 +102,8 @@
<version.io.quarkus.camel>3.20.2</version.io.quarkus.camel>
- <version.io.swagger.parser.v3>2.1.20</version.io.swagger.parser.v3>
- <version.io.swagger.core.v3>2.2.19</version.io.swagger.core.v3>
+ <version.io.swagger.parser.v3>2.1.34</version.io.swagger.parser.v3>
+ <version.io.swagger.core.v3>2.2.38</version.io.swagger.core.v3>
<version.org.apache.commons>3.18.0</version.org.apache.commons>
<version.commons.io>2.19.0</version.commons.io>
diff --git
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionRestResourceGenerator.java
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionRestResourceGenerator.java
index 93cbb98d32..54f55ef2cb 100644
---
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionRestResourceGenerator.java
+++
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/java/org/kie/kogito/codegen/decision/DecisionRestResourceGenerator.java
@@ -47,6 +47,7 @@ import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.MemberValuePair;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.expr.Name;
import com.github.javaparser.ast.expr.NameExpr;
@@ -84,6 +85,9 @@ public class DecisionRestResourceGenerator {
private final TemplatedGenerator generator;
private static final Supplier<RuntimeException> TEMPLATE_WAS_MODIFIED = ()
-> new RuntimeException("Template was modified!");
+ private static final String DMN_RESULT_ENDPOINT_OPERATION_ID =
"evaluateDmnFullResults_";
+ private static final String DECISION_SERVICE_ENDPOINT_OPERATION_ID =
"evaluateDmnService_";
+ private static final String DECISION_SERVICE_RESULT_ENDPOINT_OPERATION_ID
= "evaluateDmnServiceFullResults_";
public DecisionRestResourceGenerator(KogitoBuildContext context, DMNModel
model, String appCanonicalName) {
this.context = context;
@@ -144,7 +148,13 @@ public class DecisionRestResourceGenerator {
final String dmnMethodUrlPlaceholder = "$dmnMethodUrl$";
- template.addMember(cloneForDMNResult(dmnMethod, "dmn_dmnresult",
"dmnresult", dmnMethodUrlPlaceholder));
+ template.addMember(cloneForDMNResult(dmnMethod,
+ "dmn_dmnresult",
+ "dmnresult",
+ dmnMethodUrlPlaceholder,
+ dmnModel.getName(),
+ DMN_RESULT_ENDPOINT_OPERATION_ID));
+
for (DecisionService ds :
dmnModel.getDefinitions().getDecisionService()) {
if (ds.getAdditionalAttributes().keySet().stream().anyMatch(qn ->
qn.getLocalPart().equals("dynamicDecisionService"))) {
continue;
@@ -162,7 +172,9 @@ public class DecisionRestResourceGenerator {
//insert request path
final String path = ds.getName();
+ final String modelAndServiceName = String.format("%s_%s",
dmnModel.getName(), ds.getName());
interpolateRequestPath(path, dmnMethodUrlPlaceholder,
clonedMethod);
+ interpolateOperation(modelAndServiceName,
DECISION_SERVICE_ENDPOINT_OPERATION_ID, clonedMethod);
ReturnStmt returnStmt =
clonedMethod.findFirst(ReturnStmt.class).orElseThrow(TEMPLATE_WAS_MODIFIED);
if (ds.getOutputDecision().size() == 1) {
@@ -177,7 +189,12 @@ public class DecisionRestResourceGenerator {
}
template.addMember(clonedMethod);
- template.addMember(cloneForDMNResult(clonedMethod, name +
"_dmnresult", ds.getName() + "/dmnresult", path));
+ template.addMember(cloneForDMNResult(clonedMethod,
+ name + "_dmnresult",
+ ds.getName() + "/dmnresult",
+ path,
+ modelAndServiceName,
+ DECISION_SERVICE_RESULT_ENDPOINT_OPERATION_ID));
}
//set the root path for the dmnMethod itself
@@ -277,7 +294,7 @@ public class DecisionRestResourceGenerator {
}
private MethodDeclaration cloneForDMNResult(MethodDeclaration dmnMethod,
String name, String pathName,
- String placeHolder) {
+ String placeHolder, String modelName, String operationIdPrefix) {
MethodDeclaration clonedDmnMethod = dmnMethod.clone();
// a DMNResult-returning method doesn't need the OAS annotations for
the $ref of return type.
removeAnnFromMethod(clonedDmnMethod,
"org.eclipse.microprofile.openapi.annotations.responses.APIResponse");
@@ -285,6 +302,7 @@ public class DecisionRestResourceGenerator {
clonedDmnMethod.setName(name);
interpolateRequestPath(pathName, placeHolder, clonedDmnMethod);
+ interpolateOperation(modelName, operationIdPrefix, clonedDmnMethod);
MethodCallExpr methodCallExpr =
clonedDmnMethod.findFirst(MethodCallExpr.class, mce ->
mce.getNameAsString().equals("enrichResponseHeaders")).orElseThrow(TEMPLATE_WAS_MODIFIED);
methodCallExpr.setName("buildDMNResultResponse").setArguments(NodeList.nodeList(new
NameExpr("result")));
@@ -302,6 +320,19 @@ public class DecisionRestResourceGenerator {
});
}
+ private void interpolateOperation(String modelName, String
operationIdPrefix, MethodDeclaration methodDecl) {
+ methodDecl.getAnnotationByName("Operation").ifPresent(annotation -> {
+ if (annotation.isNormalAnnotationExpr()) {
+ NormalAnnotationExpr normalExpr =
annotation.asNormalAnnotationExpr();
+ for (MemberValuePair pair : normalExpr.getPairs()) {
+ if (pair.getNameAsString().equals("operationId")) {
+ pair.setValue(new
StringLiteralExpr(String.format("%s%s", operationIdPrefix, modelName)));
+ }
+ }
+ }
+ });
+ }
+
private void interpolateInputType(ClassOrInterfaceDeclaration template) {
String inputType = isStronglyTyped ? "InputSet" :
"java.util.Map<String, Object>";
template.findAll(ClassOrInterfaceType.class, t ->
t.asString().equals("$inputType$"))
@@ -379,13 +410,14 @@ public class DecisionRestResourceGenerator {
private void interpolateStrings(StringLiteralExpr vv) {
String s = vv.getValue();
- String documentation = "";
- String interpolated = s.replace("$name$", decisionName)
+ String modelDescription = dmnModel.getDefinitions().getDescription();
+ String interpolated = s
+ .replace("$name$", decisionName)
.replace("$nameURL$", nameURL)
.replace("$id$", decisionId)
.replace("$modelName$", dmnModel.getName())
- .replace("$modelNamespace$", dmnModel.getNamespace())
- .replace("$documentation$", documentation);
+ .replace("$modelDescription$", modelDescription != null ?
modelDescription : "")
+ .replace("$modelNamespace$", dmnModel.getNamespace());
vv.setString(interpolated);
}
diff --git
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceQuarkusTemplate.java
index a14ff6013a..800f6c660e 100644
---
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceQuarkusTemplate.java
@@ -39,6 +39,7 @@ import org.kie.kogito.dmn.rest.KogitoDMNResult;
import org.kie.kogito.dmn.util.StronglyTypedUtils;
@Path("/$nameURL$")
[email protected](name = "Decision -
$modelName$", description = "$modelDescription$")
public class DMNRestResourceTemplate {
Application application;
@@ -58,6 +59,7 @@ public class DMNRestResourceTemplate {
@Path("/$dmnMethodUrl$")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
+ @org.eclipse.microprofile.openapi.annotations.Operation(operationId
="evaluateDmn_$modelName$", summary="It evaluates the $modelName$ DMN Model")
@org.eclipse.microprofile.openapi.annotations.parameters.RequestBody(content =
@org.eclipse.microprofile.openapi.annotations.media.Content(mediaType =
"application/json",schema =
@org.eclipse.microprofile.openapi.annotations.media.Schema(ref =
"/dmnDefinitions.json#/definitions/InputSet1")), description = "DMN input")
@org.eclipse.microprofile.openapi.annotations.responses.APIResponse(content =
@org.eclipse.microprofile.openapi.annotations.media.Content(mediaType =
"application/json", schema =
@org.eclipse.microprofile.openapi.annotations.media.Schema(ref =
"/dmnDefinitions.json#/definitions/OutputSet1")), description = "DMN output")
@io.swagger.v3.oas.annotations.parameters.RequestBody(content =
@io.swagger.v3.oas.annotations.media.Content(mediaType =
"application/json",schema = @io.swagger.v3.oas.annotations.media.Schema(ref =
"/dmnDefinitions.json#/definitions/InputSet1")), description = "DMN input")
@@ -72,6 +74,7 @@ public class DMNRestResourceTemplate {
@GET
@Produces(MediaType.APPLICATION_XML)
+ @org.eclipse.microprofile.openapi.annotations.Operation(operationId
="getDmn_$modelName$", summary = "Get the DMN $modelName$ model file")
public String dmn() throws java.io.IOException {
try (InputStream is =
this.getClass().getResourceAsStream(CodegenStringUtil.escapeIdentifier("$modelName$")
+ ".dmn_nologic")) {
return new
String(org.drools.util.IoUtils.readBytesFromInputStream(Objects.requireNonNull(is)));
diff --git
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceSpringTemplate.java
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceSpringTemplate.java
index 27bfc5a33a..0eb7408e52 100644
---
a/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceSpringTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-decisions/src/main/resources/class-templates/DecisionRestResourceSpringTemplate.java
@@ -45,6 +45,7 @@ import org.springframework.http.ResponseEntity;
@RestController
@RequestMapping("/$nameURL$")
[email protected](name = "Decision - $modelName$",
description = "$modelDescription$")
public class DMNRestResourceTemplate {
Application application;
@@ -60,8 +61,8 @@ public class DMNRestResourceTemplate {
.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS);
- @PostMapping(value = "$dmnMethodUrl$", produces =
MediaType.APPLICATION_JSON_VALUE, consumes =
- MediaType.APPLICATION_JSON_VALUE)
+ @PostMapping(value = "$dmnMethodUrl$", produces =
MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ @io.swagger.v3.oas.annotations.Operation(operationId
="evaluateDmn_$modelName$", summary="It evaluates the $modelName$ DMN Model")
@org.eclipse.microprofile.openapi.annotations.parameters.RequestBody(content =
@org.eclipse.microprofile.openapi.annotations.media.Content(mediaType =
"application/json",schema =
@org.eclipse.microprofile.openapi.annotations.media.Schema(ref =
"/dmnDefinitions.json#/definitions/InputSet1")), description = "DMN input")
@org.eclipse.microprofile.openapi.annotations.responses.APIResponse(content =
@org.eclipse.microprofile.openapi.annotations.media.Content(mediaType =
"application/json", schema =
@org.eclipse.microprofile.openapi.annotations.media.Schema(ref =
"/dmnDefinitions.json#/definitions/OutputSet1")), description = "DMN output")
@io.swagger.v3.oas.annotations.parameters.RequestBody(content =
@io.swagger.v3.oas.annotations.media.Content(mediaType =
"application/json",schema = @io.swagger.v3.oas.annotations.media.Schema(ref =
"/dmnDefinitions.json#/definitions/InputSet1")), description = "DMN input")
@@ -75,6 +76,7 @@ public class DMNRestResourceTemplate {
}
@GetMapping(produces = MediaType.APPLICATION_XML_VALUE)
+ @io.swagger.v3.oas.annotations.Operation(operationId
="getDmn_$modelName$", summary = "Get the DMN $modelName$ model file")
public String dmn() throws java.io.IOException {
try (InputStream is =
this.getClass().getResourceAsStream(CodegenStringUtil.escapeIdentifier("$modelName$")
+ ".dmn_nologic")) {
return new
String(org.drools.util.IoUtils.readBytesFromInputStream(Objects.requireNonNull(is)));
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessResourceGenerator.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessResourceGenerator.java
index 67a7a7ca4d..cdf4db12d5 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessResourceGenerator.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessResourceGenerator.java
@@ -221,7 +221,10 @@ public class ProcessResourceGenerator {
template.findAll(StringLiteralExpr.class).forEach(this::interpolateStrings);
template.findAll(ClassOrInterfaceType.class).forEach(cls ->
interpolateTypes(cls, typeInterpolations));
- TagResourceGenerator.addTags(toReturn, process, context);
+ // Tags are managed in the templates. This could be restored if:
+ // - Support spring-boot based projects is added
+ // - Support all models types (it is now bound with process only
+ //TagResourceGenerator.addTags(toReturn, process, context);
template.findAll(MethodDeclaration.class).forEach(this::interpolateMethods);
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceQuarkusTemplate.java
index 3a283866e1..e71951526d 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceQuarkusTemplate.java
@@ -55,6 +55,7 @@ import org.kie.kogito.auth.IdentityProviderFactory;
import org.kie.kogito.auth.SecurityPolicy;
@Path("/$name$")
[email protected](name = "Process -
$name$", description = "$documentation$")
public class $Type$Resource {
Process<$Type$> process;
@@ -68,7 +69,7 @@ public class $Type$Resource {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "createProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public Response createResource_$name$(@Context HttpHeaders httpHeaders,
@Context UriInfo uriInfo,
@QueryParam("businessKey")
@DefaultValue("") String businessKey,
@@ -88,7 +89,7 @@ public class $Type$Resource {
@GET
@Produces(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getAllProcessInstances_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public List<$Type$Output> getResources_$name$() {
return processService.getProcessInstanceOutput(process);
}
@@ -96,16 +97,15 @@ public class $Type$Resource {
@GET
@Path("schema")
@Produces(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getResourceSchema_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public Map<String, Object> getResourceSchema_$name$() {
return JsonSchemaUtil.load(this.getClass().getClassLoader(),
process.id());
}
-
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output getResource_$name$(@PathParam("id") String id) {
return processService.findById(process,
id).orElseThrow(NotFoundException::new);
}
@@ -113,7 +113,7 @@ public class $Type$Resource {
@DELETE
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "deleteProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output deleteResource_$name$(@PathParam("id") final String
id) {
return processService.delete(process,
id).orElseThrow(NotFoundException::new);
}
@@ -122,7 +122,7 @@ public class $Type$Resource {
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "updateProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output updateModel_$name$(@PathParam("id") String id,
$Type$Input resource) {
return processService.update(process, id,
resource.toModel()).orElseThrow(NotFoundException::new);
}
@@ -131,7 +131,7 @@ public class $Type$Resource {
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "patchProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output updateModelPartial_$name$(@PathParam("id") String id,
$Type$Input resource) {
return processService.updatePartial(process, id,
resource.toModel()).orElseThrow(NotFoundException::new);
}
@@ -139,7 +139,7 @@ public class $Type$Resource {
@GET
@Path("/{id}/tasks")
@Produces(MediaType.APPLICATION_JSON)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getTasksInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public List<TaskModel> getTasks_$name$(@PathParam("id") String id,
@QueryParam("user") final String
user,
@QueryParam("group") final
List<String> groups) {
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceSpringTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceSpringTemplate.java
index 303cb69e76..e4880ff753 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceSpringTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/RestResourceSpringTemplate.java
@@ -55,6 +55,7 @@ import io.swagger.v3.oas.annotations.Operation;
@RestController
@RequestMapping("/$name$")
[email protected](name = "Process - $name$", description
= "$documentation$")
public class $Type$Resource {
Process<$Type$> process;
@@ -66,7 +67,7 @@ public class $Type$Resource {
IdentityProviderFactory identityProviderFactory;
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes =
MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "createProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public ResponseEntity<$Type$Output> createResource_$name$(@RequestHeader
HttpHeaders httpHeaders,
@RequestParam(value = "businessKey", required = false) String businessKey,
@RequestBody(required = false) $Type$Input resource,
@@ -84,45 +85,45 @@ public class $Type$Resource {
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getAllProcessInstances_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public List<$Type$Output> getResources_$name$() {
return processService.getProcessInstanceOutput(process);
}
@GetMapping(value = "/schema", produces = MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getResourceSchema_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public Map<String, Object> getResourceSchema_$name$() {
return JsonSchemaUtil.load(this.getClass().getClassLoader(),
process.id());
}
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output getResource_$name$(@PathVariable("id") String id) {
return processService.findById(process, id).orElseThrow(() -> new
ResponseStatusException(HttpStatus.NOT_FOUND));
}
@DeleteMapping(value = "/{id}", produces =
MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "deleteProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output deleteResource_$name$(@PathVariable("id") final String
id) {
return processService.delete(process, id).orElseThrow(() -> new
ResponseStatusException(HttpStatus.NOT_FOUND));
}
@PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "updateProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output updateModel_$name$(@PathVariable("id") String id,
@RequestBody(required = false) $Type$Input resource) {
return processService.update(process, id,
resource.toModel()).orElseThrow(() -> new
ResponseStatusException(HttpStatus.NOT_FOUND));
}
@PatchMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "patchProcessInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public $Type$Output updateModelPartial_$name$(@PathVariable("id") String
id, @RequestBody(required = false) $Type$Input resource) {
return processService.updatePartial(process, id,
resource.toModel()).orElseThrow(() -> new
ResponseStatusException(HttpStatus.NOT_FOUND));
}
@GetMapping(value = "/{id}/tasks", produces =
MediaType.APPLICATION_JSON_VALUE)
- @Operation(summary = "$documentation$", description =
"$processInstanceDescription$")
+ @Operation(operationId = "getTasksInstance_$name$", summary =
"$documentation$", description = "$processInstanceDescription$")
public List<TaskModel> getTasks_$name$(@PathVariable("id") String id,
@RequestParam(value = "user",
required = false) final String user,
@RequestParam(value = "group",
required = false) final List<String> groups) {
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessResourceGeneratorTest.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessResourceGeneratorTest.java
index 3babba7116..38b17e2daa 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessResourceGeneratorTest.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessResourceGeneratorTest.java
@@ -19,6 +19,7 @@
package org.kie.kogito.codegen.process;
import java.io.File;
+import java.nio.file.Paths;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
@@ -314,7 +315,7 @@ public class ProcessResourceGeneratorTest {
classDeclaration.getMethods().stream()
.filter(this::isRestMethod)
- .forEach(method ->
assertThatMethodHasOpenApiDocumentation(method, expectedSummary,
expectedDescription));
+ .forEach(method ->
assertThatMethodHasOpenApiDocumentation(method, fileName, expectedSummary,
expectedDescription));
}
private ClassOrInterfaceDeclaration
getResourceClassDeclaration(KogitoBuildContext.Builder contextBuilder, String
fileName) {
@@ -368,10 +369,30 @@ public class ProcessResourceGeneratorTest {
return toReturn;
}
- private void assertThatMethodHasOpenApiDocumentation(MethodDeclaration
method, String summary, String description) {
+ private void assertThatMethodHasOpenApiDocumentation(MethodDeclaration
method, String fileName, String summary, String description) {
+ String operationId = "";
+ String nameWithoutExt =
Paths.get(fileName).getFileName().toString().replaceFirst("[.][^.]+$", "");
+ if (method.getNameAsString().startsWith("createResource_")) {
+ operationId = String.format("createProcessInstance_%s",
nameWithoutExt);
+ } else if (method.getNameAsString().startsWith("getResources_")) {
+ operationId = String.format("getAllProcessInstances_%s",
nameWithoutExt);
+ } else if (method.getNameAsString().startsWith("getResourceSchema_")) {
+ operationId = String.format("getResourceSchema_%s",
nameWithoutExt);
+ } else if (method.getNameAsString().startsWith("getResource_")) {
+ operationId = String.format("getProcessInstance_%s",
nameWithoutExt);
+ } else if (method.getNameAsString().startsWith("deleteResource_")) {
+ operationId = String.format("deleteProcessInstance_%s",
nameWithoutExt);
+ } else if (method.getNameAsString().startsWith("updateModel_")) {
+ operationId = String.format("updateProcessInstance_%s",
nameWithoutExt);
+ } else if (method.getNameAsString().startsWith("updateModelPartial_"))
{
+ operationId = String.format("patchProcessInstance_%s",
nameWithoutExt);
+ } else if (method.getNameAsString().startsWith("getTasks_")) {
+ operationId = String.format("getTasksInstance_%s", nameWithoutExt);
+ }
+
Optional<AnnotationExpr> annotation =
method.getAnnotationByName("Operation");
assertThat(annotation).isNotEmpty();
- assertThatAnnotationHasSummaryAndDescription(annotation.orElseThrow(),
summary, description);
+ assertThatAnnotationHasSummaryAndDescription(annotation.orElseThrow(),
summary, description, operationId);
}
private void assertMethodOutputModelType(MethodDeclaration method, String
outputType) {
@@ -379,12 +400,13 @@ public class ProcessResourceGeneratorTest {
assertThat(method.getType().asString()).isEqualTo(outputType);
}
- private void assertThatAnnotationHasSummaryAndDescription(AnnotationExpr
annotation, String summary, String description) {
+ private void assertThatAnnotationHasSummaryAndDescription(AnnotationExpr
annotation, String summary, String description, String operationId) {
NodeList<MemberValuePair> pairs = ((NormalAnnotationExpr)
annotation).getPairs();
assertThat(pairs).containsExactlyInAnyOrder(
new MemberValuePair("summary", new StringLiteralExpr(summary)),
- new MemberValuePair("description", new
StringLiteralExpr(description)));
+ new MemberValuePair("description", new
StringLiteralExpr(description)),
+ new MemberValuePair("operationId", new
StringLiteralExpr(operationId)));
}
private boolean isRestMethod(MethodDeclaration method) {
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIInterfaceGenIT.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIInterfaceGenIT.java
index 8c0cacb3ad..9c02ee0f39 100644
---
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIInterfaceGenIT.java
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/OpenAPIInterfaceGenIT.java
@@ -48,7 +48,7 @@ public class OpenAPIInterfaceGenIT {
.then()
.statusCode(200)
// verifies the get path in the helloworld SW
- .body("paths.'/helloworld'.get.operationId",
is("getResources_helloworld"));
+ .body("paths.'/helloworld'.get.operationId",
is("getAllProcessInstances_helloworld"));
}
}
diff --git
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/SwaggerIT.java
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/SwaggerIT.java
index e95c0b95cb..b70e1bd8e0 100644
---
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/SwaggerIT.java
+++
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/SwaggerIT.java
@@ -60,7 +60,7 @@ class SwaggerIT {
checkOperation(path.getPut(), tags);
}
logger.debug("Tags collected {}", tags);
- assertThat(tags).contains("expression");
+ assertThat(tags).contains("Process - expression");
}
diff --git
a/springboot/addons/process-instance-migration/src/main/java/org/kie/kogito/process/management/ProcessInstanceMigrationRestController.java
b/springboot/addons/process-instance-migration/src/main/java/org/kie/kogito/process/management/ProcessInstanceMigrationRestController.java
index d38e9a1d23..065fb1bbf4 100644
---
a/springboot/addons/process-instance-migration/src/main/java/org/kie/kogito/process/management/ProcessInstanceMigrationRestController.java
+++
b/springboot/addons/process-instance-migration/src/main/java/org/kie/kogito/process/management/ProcessInstanceMigrationRestController.java
@@ -63,7 +63,7 @@ public class ProcessInstanceMigrationRestController extends
BaseProcessInstanceM
@Override
@PostMapping(value = "{processId}/migrate", produces =
APPLICATION_JSON_VALUE)
- public ResponseEntity migrateAllInstances(String processId,
ProcessMigrationSpec migrationSpec) {
+ public ResponseEntity migrateAllInstances(@PathVariable("processId")
String processId, ProcessMigrationSpec migrationSpec) {
return doMigrateAllInstances(processId, migrationSpec);
}
diff --git a/springboot/bom/pom.xml b/springboot/bom/pom.xml
index 3749770b64..a15199ccab 100644
--- a/springboot/bom/pom.xml
+++ b/springboot/bom/pom.xml
@@ -35,8 +35,8 @@
<packaging>pom</packaging>
<properties>
- <version.io.swagger.core.v3>2.2.30</version.io.swagger.core.v3>
- <version.org.springdoc>2.8.8</version.org.springdoc>
+ <version.io.swagger.core.v3>2.2.38</version.io.swagger.core.v3>
+ <version.org.springdoc>2.8.13</version.org.springdoc>
<!-- Groovy -->
<!-- must be aligned with the Archetype plugin:
https://maven.apache.org/archetype/maven-archetype-plugin/dependencies.html -->
<version.org.apache.groovy>4.0.28</version.org.apache.groovy>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]