All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kie.remote.services.rest.TaskResource Maven / Gradle / Ivy

The newest version!
package org.kie.remote.services.rest;

import java.util.List;
import java.util.Map;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.drools.core.util.StringUtils;
import org.jbpm.kie.services.api.IdentityProvider;
import org.jbpm.services.task.commands.*;
import org.jbpm.services.task.impl.model.command.DeleteBAMTaskSummariesCommand;
import org.jbpm.services.task.impl.model.xml.JaxbContent;
import org.jbpm.services.task.impl.model.xml.JaxbTask;
import org.kie.api.task.model.OrganizationalEntity;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.Task;
import org.kie.api.task.model.TaskSummary;
import org.kie.services.client.serialization.jaxb.impl.JaxbCommandsRequest;
import org.kie.services.client.serialization.jaxb.impl.JaxbCommandsResponse;
import org.kie.services.client.serialization.jaxb.impl.audit.JaxbHistoryLogList;
import org.kie.services.client.serialization.jaxb.impl.task.JaxbTaskFormResponse;
import org.kie.services.client.serialization.jaxb.impl.task.JaxbTaskSummaryListResponse;
import org.kie.services.client.serialization.jaxb.rest.JaxbGenericResponse;
import org.kie.workbench.common.services.rest.RestOperationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * If a method in this class is annotated by a @Path annotation, 
 * then the name of the method should match the URL specified in the @Path, 
 * where "_" characters should be used for all "/" characters in the path. 
 * 

* For example: *

 * @Path("/begin/{varOne: [_a-zA-Z0-9-:\\.]+}/midddle/{varTwo: [a-z]+}")
 * public void begin_varOne_middle_varTwo() { 
 * 
*/ @Path("/task") @RequestScoped public class TaskResource extends ResourceBase { private static final Logger logger = LoggerFactory.getLogger(RuntimeResource.class); /* REST information */ @Context protected HttpHeaders headers; @Context protected UriInfo uriInfo; @Context protected Request restRequest; @Inject private org.kie.remote.services.util.FormURLGenerator formURLGenerator; /* KIE information and processing */ @Inject protected IdentityProvider identityProvider; private static String[] allowedOperations = { "activate", "claim", "claimnextavailable", "complete", "delegate", "exit", "fail", "forward", "release", "resume", "skip", "start", "stop", "suspend", "nominate", "content"}; private static String [] allowedQueryParams = { "workItemId", // 0 "taskId", // 1 "businessAdministrator", // 2 "potentialOwner", // 3 "status", // 4 "taskOwner", // 5 "processInstanceId", // 6 "language", // 7 "union" // 8 }; // Rest methods -------------------------------------------------------------------------------------------------------------- @POST @Consumes(MediaType.APPLICATION_XML) @Produces(MediaType.APPLICATION_XML) @Path("/execute") public JaxbCommandsResponse execute(JaxbCommandsRequest cmdsRequest) { return restProcessJaxbCommandsRequest(cmdsRequest); } @GET @Path("/query") public Response query(@Context UriInfo uriInfo) { Map> params = getRequestParams(uriInfo); String oper = getRelativePath(uriInfo); for( String queryParam : params.keySet() ) { boolean allowed = false; for( String allowedParam : allowedQueryParams ) { if( allowedParam.equalsIgnoreCase(queryParam) || paginationParams.contains(queryParam)) { allowed = true; break; } } if( ! allowed ) { throw RestOperationException.badRequest(queryParam + " is an unknown and unsupported query param for the task query operation." ); } } List workItemIds = getLongListParam(allowedQueryParams[0], false, params, "query", true); List taskIds = getLongListParam(allowedQueryParams[1], false, params, "query", true); List procInstIds = getLongListParam(allowedQueryParams[6], false, params, "query", true); List busAdmins = getStringListParam(allowedQueryParams[2], false, params, "query"); List potOwners = getStringListParam(allowedQueryParams[3], false, params, "query"); List taskOwners = getStringListParam(allowedQueryParams[5], false, params, "query"); List language = getStringListParam(allowedQueryParams[7], false, params, "query"); String unionStr = getStringParam(allowedQueryParams[8], false, params, "query"); boolean union = Boolean.parseBoolean(unionStr); // null, etc == false List statusStrList = getStringListParam(allowedQueryParams[4], false, params, "query"); List statuses = convertStringListToStatusList(statusStrList); int [] pageInfo = getPageNumAndPageSize(params, oper); int maxResults = getMaxNumResultsNeeded(pageInfo); TaskCommand queryCmd = new GetTasksByVariousFieldsCommand(workItemIds, taskIds, procInstIds, busAdmins, potOwners, taskOwners, statuses, language, union, maxResults); List results = (List) doRestTaskOperation(null, queryCmd); logger.debug("{} results found.", results.size()); JaxbTaskSummaryListResponse resultList = paginateAndCreateResult(pageInfo, results, new JaxbTaskSummaryListResponse()); logger.debug("Returning {} results after pagination.", resultList.getList().size()); return createCorrectVariant(resultList, headers); } @GET @Path("/{taskId: [0-9-]+}") public Response taskId(@PathParam("taskId") long taskId) { TaskCommand cmd = new GetTaskCommand(taskId); JaxbTask task = (JaxbTask) doRestTaskOperation(taskId, cmd); if( task == null ) { throw RestOperationException.notFound("Task " + taskId + " could not be found."); } return createCorrectVariant(task, headers); } @POST @Path("/{taskId: [0-9-]+}/{oper: [a-zA-Z]+}") public Response taskId_oper(@PathParam("taskId") long taskId, @PathParam("oper") String operation) { Map> params = getRequestParams(uriInfo); operation = checkThatOperationExists(operation, allowedOperations); String oper = getRelativePath(uriInfo); String userId = identityProvider.getName(); logger.debug("Executing " + operation + " on task " + taskId + " by user " + userId ); TaskCommand cmd = null; if ("activate".equalsIgnoreCase(operation)) { cmd = new ActivateTaskCommand(taskId, userId); } else if ("claim".equalsIgnoreCase(operation)) { cmd = new ClaimTaskCommand(taskId, userId); } else if ("claimnextavailable".equalsIgnoreCase(operation)) { cmd = new ClaimNextAvailableTaskCommand(userId); } else if ("complete".equalsIgnoreCase(operation)) { Map data = extractMapFromParams(params, operation); cmd = new CompleteTaskCommand(taskId, userId, data); } else if ("delegate".equalsIgnoreCase(operation)) { String targetEntityId = getStringParam("targetEntityId", true, params, oper); cmd = new DelegateTaskCommand(taskId, userId, targetEntityId); } else if ("exit".equalsIgnoreCase(operation)) { cmd = new ExitTaskCommand(taskId, userId); } else if ("fail".equalsIgnoreCase(operation)) { Map data = extractMapFromParams(params, oper); cmd = new FailTaskCommand(taskId, userId, data); } else if ("forward".equalsIgnoreCase(operation)) { String targetEntityId = getStringParam("targetEntityId", true, params, oper); cmd = new ForwardTaskCommand(taskId, userId, targetEntityId); } else if ("release".equalsIgnoreCase(operation)) { cmd = new ReleaseTaskCommand(taskId, userId); } else if ("resume".equalsIgnoreCase(operation)) { cmd = new ResumeTaskCommand(taskId, userId); } else if ("skip".equalsIgnoreCase(operation)) { cmd = new SkipTaskCommand(taskId, userId); } else if ("start".equalsIgnoreCase(operation)) { cmd = new StartTaskCommand(taskId, userId); } else if ("stop".equalsIgnoreCase(operation)) { cmd = new StopTaskCommand(taskId, userId); } else if ("suspend".equalsIgnoreCase(operation)) { cmd = new SuspendTaskCommand(taskId, userId); } else if ("nominate".equalsIgnoreCase(operation)) { List potentialOwners = getOrganizationalEntityListFromParams(params, true, oper); cmd = new NominateTaskCommand(taskId, userId, potentialOwners); } else { throw RestOperationException.badRequest("Unsupported operation: " + oper); } doRestTaskOperation(taskId, cmd); return createCorrectVariant(new JaxbGenericResponse(uriInfo.getRequestUri().toString()), headers); } private static String checkThatOperationExists(String operation, String[] possibleOperations) { for (String oper : possibleOperations) { if (oper.equals(operation.trim().toLowerCase())) { return oper; } } throw RestOperationException.badRequest("Operation '" + operation + "' is not supported on tasks."); } @GET @Path("/{taskId: [0-9-]+}/content") public Response taskId_content(@PathParam("taskId") long taskId) { TaskCommand cmd = new GetTaskCommand(taskId); Object result = doRestTaskOperation(taskId, cmd); if( result == null ) { throw RestOperationException.notFound("Task " + taskId + " could not be found."); } Task task = ((Task) result); long contentId = task.getTaskData().getDocumentContentId(); JaxbContent content = null; if( contentId > -1 ) { cmd = new GetContentCommand(contentId); result = processRequestBean.doRestTaskOperation(taskId, task.getTaskData().getDeploymentId(), task.getTaskData().getProcessInstanceId(), task, cmd); content = (JaxbContent) result; } else { throw RestOperationException.notFound("Content for task " + taskId + " could not be found."); } return createCorrectVariant(content, headers); } @GET @Path("/{taskId: [0-9-]+}/showTaskForm") public Response taskId_form(@PathParam("taskId") long taskId) { TaskCommand cmd = new GetTaskCommand(taskId); Object result = doRestTaskOperation(taskId, cmd); if (result != null) { Map> requestParams = getRequestParams(uriInfo); String opener = ""; List openers = headers.getRequestHeader("host"); if (openers.size() == 1) { opener = openers.get(0); } String formUrl = formURLGenerator.generateFormTaskURL(uriInfo.getBaseUri().toString(), taskId, opener, requestParams); if (!StringUtils.isEmpty(formUrl)) { JaxbTaskFormResponse response = new JaxbTaskFormResponse(formUrl, uriInfo.getRequestUri().toString()); return createCorrectVariant(response, headers); } } throw RestOperationException.notFound("Task " + taskId + " could not be found."); } @GET @Path("/content/{contentId: [0-9-]+}") public Response content_contentId(@PathParam("contentId") long contentId) { TaskCommand cmd = new GetContentCommand(contentId); JaxbContent content = (JaxbContent) doRestTaskOperation(null, cmd); if( content == null ) { throw RestOperationException.notFound("Content " + contentId + " could not be found."); } return createCorrectVariant(new JaxbContent(content), headers); } @POST @Path("/history/bam/clear") public Response bam_clear() { doRestTaskOperation(null, new DeleteBAMTaskSummariesCommand()); return createCorrectVariant(new JaxbGenericResponse(uriInfo.getRequestUri().toString()), headers); } public Object doRestTaskOperation(Long taskId, TaskCommand cmd) { return processRequestBean.doRestTaskOperation(taskId, null, null, null, cmd); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy