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

egonzalez 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 d2d0f2ff6e [incubator-kie-issues-1520] Proper user task exception 
handling (#3705)
d2d0f2ff6e is described below

commit d2d0f2ff6e2aa7df57f853d3ee64d36d40d1bc47
Author: Enrique <[email protected]>
AuthorDate: Fri Oct 11 12:17:12 2024 +0200

    [incubator-kie-issues-1520] Proper user task exception handling (#3705)
    
    * [incubator-kie-issues-1520] Proper user task exception handling
    
    * fix quarkus exception resolution
---
 .../resource/exceptions/BaseExceptionsHandler.java | 12 ++++++++
 .../UserTaskInstanceNotAuthorizedException.java    | 32 +++++++++++++++++++++
 .../UserTaskInstanceNotFoundException.java         | 32 +++++++++++++++++++++
 .../impl/lifecycle/DefaultUserTaskLifeCycle.java   |  4 +--
 .../org/kie/kogito/codegen/tests/UserTaskIT.java   |  3 +-
 .../RestResourceUserTaskQuarkusTemplate.java       | 25 ++++++++--------
 ...erTaskInstanceNotAuthorizedExceptionMapper.java | 33 ++++++++++++++++++++++
 .../UserTaskInstanceNotFoundExceptionMapper.java   | 33 ++++++++++++++++++++++
 .../UserTaskTransitionExceptionMapper.java         | 33 ++++++++++++++++++++++
 9 files changed, 192 insertions(+), 15 deletions(-)

diff --git 
a/addons/common/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/BaseExceptionsHandler.java
 
b/addons/common/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/BaseExceptionsHandler.java
index 3da864ee7e..c326eeebe7 100644
--- 
a/addons/common/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/BaseExceptionsHandler.java
+++ 
b/addons/common/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/BaseExceptionsHandler.java
@@ -35,6 +35,9 @@ import 
org.kie.kogito.process.ProcessInstanceDuplicatedException;
 import org.kie.kogito.process.ProcessInstanceExecutionException;
 import org.kie.kogito.process.ProcessInstanceNotFoundException;
 import org.kie.kogito.process.VariableViolationException;
+import org.kie.kogito.usertask.UserTaskInstanceNotAuthorizedException;
+import org.kie.kogito.usertask.UserTaskInstanceNotFoundException;
+import org.kie.kogito.usertask.lifecycle.UserTaskTransitionException;
 
 public abstract class BaseExceptionsHandler<T> {
 
@@ -74,6 +77,15 @@ public abstract class BaseExceptionsHandler<T> {
         mapper.put(InvalidLifeCyclePhaseException.class, new FunctionHolder<>(
                 ex -> Collections.singletonMap(MESSAGE, ex.getMessage()), ex 
-> BaseExceptionsHandler.this::badRequest));
 
+        mapper.put(UserTaskTransitionException.class, new FunctionHolder<>(
+                ex -> Collections.singletonMap(MESSAGE, ex.getMessage()), ex 
-> BaseExceptionsHandler.this::badRequest));
+
+        mapper.put(UserTaskInstanceNotFoundException.class, new 
FunctionHolder<>(
+                ex -> Collections.singletonMap(MESSAGE, ex.getMessage()), ex 
-> BaseExceptionsHandler.this::notFound));
+
+        mapper.put(UserTaskInstanceNotAuthorizedException.class, new 
FunctionHolder<>(
+                ex -> Collections.singletonMap(MESSAGE, ex.getMessage()), ex 
-> BaseExceptionsHandler.this::forbidden));
+
         mapper.put(InvalidTransitionException.class, new FunctionHolder<>(
                 ex -> Collections.singletonMap(MESSAGE, ex.getMessage()), ex 
-> BaseExceptionsHandler.this::badRequest));
 
diff --git 
a/api/kogito-api/src/main/java/org/kie/kogito/usertask/UserTaskInstanceNotAuthorizedException.java
 
b/api/kogito-api/src/main/java/org/kie/kogito/usertask/UserTaskInstanceNotAuthorizedException.java
new file mode 100644
index 0000000000..4eadba5789
--- /dev/null
+++ 
b/api/kogito-api/src/main/java/org/kie/kogito/usertask/UserTaskInstanceNotAuthorizedException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.usertask;
+
+public class UserTaskInstanceNotAuthorizedException extends RuntimeException {
+
+    private static final long serialVersionUID = 6224742517975146469L;
+
+    public UserTaskInstanceNotAuthorizedException() {
+        // do nothing
+    }
+
+    public UserTaskInstanceNotAuthorizedException(String msg) {
+        super(msg);
+    }
+}
diff --git 
a/api/kogito-api/src/main/java/org/kie/kogito/usertask/UserTaskInstanceNotFoundException.java
 
b/api/kogito-api/src/main/java/org/kie/kogito/usertask/UserTaskInstanceNotFoundException.java
new file mode 100644
index 0000000000..66d0213a50
--- /dev/null
+++ 
b/api/kogito-api/src/main/java/org/kie/kogito/usertask/UserTaskInstanceNotFoundException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.usertask;
+
+public class UserTaskInstanceNotFoundException extends RuntimeException {
+
+    private static final long serialVersionUID = 6224742517975146469L;
+
+    public UserTaskInstanceNotFoundException() {
+        // do nothing
+    }
+
+    public UserTaskInstanceNotFoundException(String id) {
+        super("User task Instance " + id + " + not found");
+    }
+}
diff --git 
a/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/lifecycle/DefaultUserTaskLifeCycle.java
 
b/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/lifecycle/DefaultUserTaskLifeCycle.java
index 369c7fc6bc..a28a5accfd 100644
--- 
a/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/lifecycle/DefaultUserTaskLifeCycle.java
+++ 
b/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/lifecycle/DefaultUserTaskLifeCycle.java
@@ -26,9 +26,9 @@ import java.util.Optional;
 import java.util.Set;
 
 import org.kie.kogito.auth.IdentityProvider;
-import org.kie.kogito.internal.process.workitem.NotAuthorizedException;
 import org.kie.kogito.usertask.UserTaskAssignmentStrategy;
 import org.kie.kogito.usertask.UserTaskInstance;
+import org.kie.kogito.usertask.UserTaskInstanceNotAuthorizedException;
 import org.kie.kogito.usertask.impl.DefaultUserTaskInstance;
 import org.kie.kogito.usertask.lifecycle.UserTaskLifeCycle;
 import org.kie.kogito.usertask.lifecycle.UserTaskState;
@@ -205,7 +205,7 @@ public class DefaultUserTaskLifeCycle implements 
UserTaskLifeCycle {
             }
         }
 
-        throw new NotAuthorizedException("user " + user + " with roles " + 
roles + " not autorized to perform an operation on user task " + 
userTaskInstance.getId());
+        throw new UserTaskInstanceNotAuthorizedException("user " + user + " 
with roles " + roles + " not autorized to perform an operation on user task " + 
userTaskInstance.getId());
     }
 
 }
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/UserTaskIT.java
 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/UserTaskIT.java
index 7a0e493fa4..01f5b50521 100644
--- 
a/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/UserTaskIT.java
+++ 
b/kogito-codegen-modules/kogito-codegen-processes-integration-tests/src/test/java/org/kie/kogito/codegen/tests/UserTaskIT.java
@@ -50,6 +50,7 @@ import org.kie.kogito.process.WorkItem;
 import org.kie.kogito.usertask.UserTask;
 import org.kie.kogito.usertask.UserTaskConfig;
 import org.kie.kogito.usertask.UserTaskInstance;
+import org.kie.kogito.usertask.UserTaskInstanceNotAuthorizedException;
 import org.kie.kogito.usertask.UserTasks;
 import org.kie.kogito.usertask.impl.lifecycle.DefaultUserTaskLifeCycle;
 
@@ -396,7 +397,7 @@ public class UserTaskIT extends AbstractCodegenIT {
         List<UserTaskInstance> userTaskInstances = 
userTasks.instances().findByIdentity(IdentityProviders.of("john"));
         assertThat(userTaskInstances).isNotNull().hasSize(1);
         UserTaskInstance utInvalid = userTaskInstances.get(0);
-        assertThatExceptionOfType(NotAuthorizedException.class).isThrownBy(() 
-> utInvalid.transition(CLAIM, emptyMap(), IdentityProviders.of("invalid")));
+        
assertThatExceptionOfType(UserTaskInstanceNotAuthorizedException.class).isThrownBy(()
 -> utInvalid.transition(CLAIM, emptyMap(), IdentityProviders.of("invalid")));
 
         
assertThat(processInstance.status()).isEqualTo(ProcessInstance.STATE_ACTIVE);
 
diff --git 
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/usertask/RestResourceUserTaskQuarkusTemplate.java
 
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/usertask/RestResourceUserTaskQuarkusTemplate.java
index 231dfcc737..0c78cff0f3 100644
--- 
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/usertask/RestResourceUserTaskQuarkusTemplate.java
+++ 
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/usertask/RestResourceUserTaskQuarkusTemplate.java
@@ -45,6 +45,7 @@ import org.kie.kogito.process.ProcessInstanceReadMode;
 import org.kie.kogito.process.WorkItem;
 import org.kie.kogito.process.impl.Sig;
 import org.kie.kogito.services.uow.UnitOfWorkExecutor;
+import org.kie.kogito.usertask.UserTaskInstanceNotFoundException;
 import org.kie.kogito.usertask.UserTaskService;
 import org.kie.kogito.usertask.view.UserTaskView;
 import org.kie.kogito.usertask.view.UserTaskTransitionView;
@@ -69,7 +70,7 @@ public class UserTasksResource {
     @Path("/{taskId}")
     @Produces(MediaType.APPLICATION_JSON)
     public UserTaskView find(@PathParam("taskId") String taskId, 
@QueryParam("user") String user, @QueryParam("group") List<String> groups) {
-        return userTaskService.getUserTaskInstance(taskId, 
IdentityProviders.of(user, groups)).orElseThrow(NotFoundException::new);
+        return userTaskService.getUserTaskInstance(taskId, 
IdentityProviders.of(user, 
groups)).orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @POST
@@ -81,7 +82,7 @@ public class UserTasksResource {
             @QueryParam("transitionId") String transitionId,
             @QueryParam("user") String user,
             @QueryParam("group") List<String> groups, Map<String, Object> 
data) {
-        return userTaskService.transition(taskId, transitionId, data, 
IdentityProviders.of(user, groups)).orElseThrow(NotFoundException::new);
+        return userTaskService.transition(taskId, transitionId, data, 
IdentityProviders.of(user, 
groups)).orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @GET
@@ -102,7 +103,7 @@ public class UserTasksResource {
             @QueryParam("user") String user,
             @QueryParam("group") List<String> groups,
             Map<String, Object> data) {
-        return userTaskService.setOutputs(taskId, data, 
IdentityProviders.of(user, groups)).orElseThrow(NotFoundException::new);
+        return userTaskService.setOutputs(taskId, data, 
IdentityProviders.of(user, 
groups)).orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @PUT
@@ -113,7 +114,7 @@ public class UserTasksResource {
             @QueryParam("user") String user,
             @QueryParam("group") List<String> groups,
             Map<String, Object> data) {
-        return userTaskService.setInputs(taskId, data, 
IdentityProviders.of(user, groups)).orElseThrow(NotFoundException::new);
+        return userTaskService.setInputs(taskId, data, 
IdentityProviders.of(user, 
groups)).orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @GET
@@ -137,7 +138,7 @@ public class UserTasksResource {
             CommentInfo commentInfo) {
         Comment comment = new Comment(null, user);
         comment.setContent(commentInfo.getComment());
-        return userTaskService.addComment(taskId, comment, 
IdentityProviders.of(user, groups)).orElseThrow(NotFoundException::new);
+        return userTaskService.addComment(taskId, comment, 
IdentityProviders.of(user, 
groups)).orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @GET
@@ -149,7 +150,7 @@ public class UserTasksResource {
             @QueryParam("user") String user,
             @QueryParam("group") List<String> groups) {
         return userTaskService.getComment(taskId, commentId, 
IdentityProviders.of(user, groups))
-                .orElseThrow(() -> new NotFoundException("Comment " + 
commentId + " not found"));
+                .orElseThrow(() -> new 
UserTaskInstanceNotFoundException("Comment " + commentId + " not found"));
     }
 
     @PUT
@@ -165,7 +166,7 @@ public class UserTasksResource {
         Comment comment = new Comment(commentId, user);
         comment.setContent(commentInfo.getComment());
         return userTaskService.updateComment(taskId, comment, 
IdentityProviders.of(user, groups))
-                .orElseThrow(NotFoundException::new);
+                .orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @DELETE
@@ -176,7 +177,7 @@ public class UserTasksResource {
             @QueryParam("user") String user,
             @QueryParam("group") List<String> groups) {
         return userTaskService.removeComment(taskId, commentId, 
IdentityProviders.of(user, groups))
-                .orElseThrow(NotFoundException::new);
+                .orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @GET
@@ -202,7 +203,7 @@ public class UserTasksResource {
         attachment.setName(attachmentInfo.getName());
         attachment.setContent(attachmentInfo.getUri());
         return userTaskService.addAttachment(taskId, attachment, 
IdentityProviders.of(user, groups))
-                .orElseThrow(NotFoundException::new);
+                .orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @PUT
@@ -219,7 +220,7 @@ public class UserTasksResource {
         attachment.setName(attachmentInfo.getName());
         attachment.setContent(attachmentInfo.getUri());
         return userTaskService.updateAttachment(taskId, attachment, 
IdentityProviders.of(user, groups))
-                .orElseThrow(NotFoundException::new);
+                .orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @DELETE
@@ -230,7 +231,7 @@ public class UserTasksResource {
             @QueryParam("user") String user,
             @QueryParam("group") List<String> groups) {
         return userTaskService.removeAttachment(taskId, attachmentId, 
IdentityProviders.of(user, groups))
-                .orElseThrow(NotFoundException::new);
+                .orElseThrow(UserTaskInstanceNotFoundException::new);
     }
 
     @GET
@@ -242,7 +243,7 @@ public class UserTasksResource {
             @QueryParam("user") String user,
             @QueryParam("group") List<String> groups) {
         return userTaskService.getAttachment(taskId, attachmentId, 
IdentityProviders.of(user, groups))
-                .orElseThrow(() -> new NotFoundException("Attachment " + 
attachmentId + " not found"));
+                .orElseThrow(() -> new 
UserTaskInstanceNotFoundException("Attachment " + attachmentId + " not found"));
     }
 
 }
diff --git 
a/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskInstanceNotAuthorizedExceptionMapper.java
 
b/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskInstanceNotAuthorizedExceptionMapper.java
new file mode 100644
index 0000000000..9871032881
--- /dev/null
+++ 
b/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskInstanceNotAuthorizedExceptionMapper.java
@@ -0,0 +1,33 @@
+/*
+ * 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.resource.exceptions;
+
+import org.kie.kogito.usertask.UserTaskInstanceNotFoundException;
+
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.Provider;
+
+@Provider
+public class UserTaskInstanceNotAuthorizedExceptionMapper extends 
BaseExceptionMapper<UserTaskInstanceNotFoundException> {
+
+    @Override
+    public Response toResponse(UserTaskInstanceNotFoundException e) {
+        return exceptionsHandler.mapException(e);
+    }
+}
diff --git 
a/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskInstanceNotFoundExceptionMapper.java
 
b/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskInstanceNotFoundExceptionMapper.java
new file mode 100644
index 0000000000..d74ddf1fc5
--- /dev/null
+++ 
b/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskInstanceNotFoundExceptionMapper.java
@@ -0,0 +1,33 @@
+/*
+ * 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.resource.exceptions;
+
+import org.kie.kogito.usertask.UserTaskInstanceNotAuthorizedException;
+
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.Provider;
+
+@Provider
+public class UserTaskInstanceNotFoundExceptionMapper extends 
BaseExceptionMapper<UserTaskInstanceNotAuthorizedException> {
+
+    @Override
+    public Response toResponse(UserTaskInstanceNotAuthorizedException e) {
+        return exceptionsHandler.mapException(e);
+    }
+}
diff --git 
a/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskTransitionExceptionMapper.java
 
b/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskTransitionExceptionMapper.java
new file mode 100644
index 0000000000..233d3cd679
--- /dev/null
+++ 
b/quarkus/addons/rest-exception-handler/src/main/java/org/kie/kogito/resource/exceptions/UserTaskTransitionExceptionMapper.java
@@ -0,0 +1,33 @@
+/*
+ * 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.resource.exceptions;
+
+import org.kie.kogito.usertask.UserTaskInstanceNotFoundException;
+
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.Provider;
+
+@Provider
+public class UserTaskTransitionExceptionMapper extends 
BaseExceptionMapper<UserTaskInstanceNotFoundException> {
+
+    @Override
+    public Response toResponse(UserTaskInstanceNotFoundException e) {
+        return exceptionsHandler.mapException(e);
+    }
+}


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

Reply via email to