/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.server.remote.rest.jbpm; import java.text.MessageFormat; import java.util.List; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Variant; import org.jbpm.services.api.TaskNotFoundException; import org.kie.server.api.model.instance.TaskEventInstanceList; import org.kie.server.remote.rest.common.Header; import org.kie.server.services.api.KieServerRegistry; import org.kie.server.services.jbpm.RuntimeDataServiceBase; import org.kie.server.services.jbpm.UserTaskServiceBase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.kie.server.api.rest.RestURI.*; import static org.kie.server.remote.rest.common.util.RestUtils.*; import static org.kie.server.remote.rest.jbpm.resources.Messages.*; @Path("server/" + TASK_URI) public class UserTaskResource { public static final Logger logger = LoggerFactory.getLogger(UserTaskResource.class); private UserTaskServiceBase userTaskServiceBase; private RuntimeDataServiceBase runtimeDataServiceBase; private KieServerRegistry context; public UserTaskResource() { } public UserTaskResource(UserTaskServiceBase userTaskServiceBase, RuntimeDataServiceBase runtimeDataServiceBase, KieServerRegistry context) { this.userTaskServiceBase = userTaskServiceBase; this.runtimeDataServiceBase = runtimeDataServiceBase; this.context = context; } @PUT @Path(TASK_INSTANCE_ACTIVATE_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response activate(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.activate(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_CLAIM_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response claim(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.claim(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_COMPLETE_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response complete(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId, @QueryParam("auto-progress") boolean autoProgress, String payload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { if (autoProgress) { userTaskServiceBase.completeAutoProgress(containerId, taskId, userId, payload, type); } else { userTaskServiceBase.complete(containerId, taskId, userId, payload, type); } return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_DELEGATE_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response delegate(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId, @QueryParam("targetUser") String targetUserId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.delegate(containerId, taskId, userId, targetUserId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_EXIT_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response exit(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.exit(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_FAIL_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response fail(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId, String payload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.fail(containerId, taskId, userId, payload, type); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_FORWARD_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response forward(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId, @QueryParam("targetUser") String targetUserId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.forward(containerId, taskId, userId, targetUserId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_RELEASE_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response release(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.release(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_RESUME_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response resume(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.resume(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_SKIP_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response skip(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.skip(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_START_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response start(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.start(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_STOP_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response stop(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.stop(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_SUSPEND_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response suspend(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.suspend(containerId, taskId, userId); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_NOMINATE_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response nominate(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId, @QueryParam("potOwner") List<String> potentialOwners) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.nominate(containerId, taskId, userId, potentialOwners); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_PRIORITY_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response setPriority(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, String priorityPayload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.setPriority(containerId, taskId, priorityPayload, type); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_EXPIRATION_DATE_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response setExpirationDate(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, String datePayload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.setExpirationDate(containerId, taskId, datePayload, type); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_SKIPABLE_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response setSkipable(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, String skipablePayload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.setSkipable(containerId, taskId, skipablePayload, type); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_NAME_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response setName(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, String namePayload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.setName(containerId, taskId, namePayload, type); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_DESCRIPTION_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response setDescription(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, String descriptionPayload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.setDescription(containerId, taskId, descriptionPayload, type); return createResponse("", v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @PUT @Path(TASK_INSTANCE_OUTPUT_DATA_PUT_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response saveContent(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, String payload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.saveContent(containerId, taskId, payload, type); logger.debug("Returning CREATED response with content '{}'", response); return createResponse(response, v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_OUTPUT_DATA_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getTaskOutputContentByTaskId(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getTaskOutputContentByTaskId(containerId, taskId, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_INPUT_DATA_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getTaskInputContentByTaskId(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getTaskInputContentByTaskId(containerId, taskId, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @DELETE @Path(TASK_INSTANCE_CONTENT_DATA_DELETE_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response deleteContent(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @PathParam("contentId") Long contentId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.deleteContent(containerId, taskId, contentId); // produce 204 NO_CONTENT response code return noContent(v, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @POST @Path(TASK_INSTANCE_COMMENT_ADD_POST_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response addComment(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, String payload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.addComment(containerId, taskId, payload, type); logger.debug("Returning CREATED response with content '{}'", response); return createResponse(response, v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @DELETE @Path(TASK_INSTANCE_COMMENT_DELETE_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response deleteComment(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @PathParam("commentId") Long commentId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.deleteComment(containerId, taskId, commentId); // produce 204 NO_CONTENT response code return noContent(v, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_COMMENTS_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getCommentsByTaskId(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getCommentsByTaskId(containerId, taskId, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_COMMENT_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getCommentById(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @PathParam("commentId") Long commentId) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getCommentById(containerId, taskId, commentId, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @POST @Path(TASK_INSTANCE_ATTACHMENT_ADD_POST_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response addAttachment(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("user") String userId, @QueryParam("name") String name, String attachmentPayload) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.addAttachment(containerId, taskId, userId, name, attachmentPayload, type); logger.debug("Returning CREATED response with content '{}'", response); return createResponse(response, v, Response.Status.CREATED, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @DELETE @Path(TASK_INSTANCE_ATTACHMENT_DELETE_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response deleteAttachment(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @PathParam("attachmentId") Long attachmentId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { userTaskServiceBase.deleteAttachment(containerId, taskId, attachmentId); // produce 204 NO_CONTENT response code return noContent(v, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_ATTACHMENT_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getAttachmentById(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @PathParam("attachmentId") Long attachmentId) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getAttachmentById(containerId, taskId, attachmentId, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_ATTACHMENT_CONTENT_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getAttachmentContentById(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @PathParam("attachmentId") Long attachmentId) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getAttachmentContentById(containerId, taskId, attachmentId, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_ATTACHMENTS_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getAttachmentsByTaskId(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getAttachmentsByTaskId(containerId, taskId, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e){ return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getTask(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("withInputData") boolean withInput, @QueryParam("withOutputData") boolean withOutput, @QueryParam("withAssignments") boolean withAssignments) { Variant v = getVariant(headers); String type = getContentType(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String response = userTaskServiceBase.getTask(containerId, taskId, withInput, withOutput, withAssignments, type); logger.debug("Returning OK response with content '{}'", response); return createResponse(response, v, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e) { return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } @GET @Path(TASK_INSTANCE_EVENTS_GET_URI) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getTaskEvents(@Context HttpHeaders headers, @PathParam("id") String containerId, @PathParam("tInstanceId") Long taskId, @QueryParam("page") @DefaultValue("0") Integer page, @QueryParam("pageSize") @DefaultValue("10") Integer pageSize, @QueryParam("sort") String sort, @QueryParam("sortOrder") @DefaultValue("true") boolean sortOrder) { Variant v = getVariant(headers); // no container id available so only used to transfer conversation id if given by client Header conversationIdHeader = buildConversationIdHeader("", context, headers); try { TaskEventInstanceList result = runtimeDataServiceBase.getTaskEvents(taskId, page, pageSize, sort, sortOrder); return createCorrectVariant(result, headers, Response.Status.OK, conversationIdHeader); } catch (TaskNotFoundException e) { return notFound(MessageFormat.format(TASK_INSTANCE_NOT_FOUND, taskId), v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); } } }