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]