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]


Reply via email to