Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ public class RestURI {

public static final String PROCESS_INSTANCES_NODE_INSTANCES_GET_URI = "instances/{" + PROCESS_INST_ID + "}/nodes/instances";
public static final String PROCESS_INSTANCE_WORK_ITEM_COMPLETE_PUT_URI = "instances/{" + PROCESS_INST_ID + "}/workitems/{" + WORK_ITEM_ID + "}/completed";
public static final String PROCESS_INSTANCE_WORK_ITEM_COMPLETE_AND_VARS_PUT_URI = "instances/{" + PROCESS_INST_ID + "}/workitems/{" + WORK_ITEM_ID + "}/completed/variables";
public static final String PROCESS_INSTANCE_WORK_ITEM_ABORT_PUT_URI = "instances/{" + PROCESS_INST_ID + "}/workitems/{" + WORK_ITEM_ID + "}/aborted";
public static final String PROCESS_INSTANCE_WORK_ITEM_BY_ID_GET_URI = "instances/{" + PROCESS_INST_ID + "}/workitems/{" + WORK_ITEM_ID + "}";
public static final String PROCESS_INSTANCE_WORK_ITEMS_BY_PROC_INST_ID_GET_URI = "instances/{" + PROCESS_INST_ID + "}/workitems";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId> jackson-module-jaxb-annotations</artifactId>
</dependency>

<!-- JSON -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</dependency>

<!-- Swagger -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,24 @@
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.MessageFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.ws.rs.NotAcceptableException;
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.json.JSONException;
import org.json.JSONObject;

import org.kie.server.api.ConversationId;
import org.kie.server.api.KieServerConstants;
import org.kie.server.api.KieServerEnvironment;
import org.kie.server.api.marshalling.MarshallingException;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.api.model.KieContainerStatus;
import org.kie.server.api.model.ReleaseId;
Expand All @@ -47,6 +54,8 @@ public class RestUtils {
private static Variant ERROR_VARIANT = new Variant(MediaType.TEXT_PLAIN_TYPE, (Locale) null, null);
private static final String UNEXPECTED_ERROR = "Unexpected error during processing: {0}";
private static final boolean INCLUDE_STACKTRACE = Boolean.parseBoolean(System.getProperty(KieServerConstants.KIE_SERVER_INCLUDE_STACKTRACE, "false"));
public static final String VARIABLES_MAP_KEY = "variables";
public static final String RESULT_MAP_KEY = "result";

public static Response createCorrectVariant(Object responseObj, HttpHeaders headers, Header... customHeaders) {
return createCorrectVariant(responseObj, headers, null, customHeaders);
Expand Down Expand Up @@ -287,5 +296,23 @@ public static Boolean isCorrelationKeyAlreadyExists(Exception e) {
}
return false;

public static Map<String, String> extractPayloads(String fullPayload, String type) {
try {
if (type.equals(MediaType.APPLICATION_JSON)) {
JSONObject fullBody = new JSONObject(fullPayload);
HashMap<String, String> payloads = new HashMap<>();
payloads.put(VARIABLES_MAP_KEY, fullBody.remove(VARIABLES_MAP_KEY).toString());
payloads.put(RESULT_MAP_KEY, fullBody.toString());
return payloads;
} else {
throw new NotAcceptableException(
String.format(
"Expected request media type of [%s], found [%s].",
MediaType.APPLICATION_JSON, type));
}
} catch (JSONException e) {
throw new MarshallingException("Error marshalling input", e);
}

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.NotAcceptableException;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
Expand Down Expand Up @@ -81,6 +82,7 @@
import static org.kie.server.api.rest.RestURI.PROCESS_INSTANCE_WORK_ITEMS_BY_PROC_INST_ID_GET_URI;
import static org.kie.server.api.rest.RestURI.PROCESS_INSTANCE_WORK_ITEM_ABORT_PUT_URI;
import static org.kie.server.api.rest.RestURI.PROCESS_INSTANCE_WORK_ITEM_BY_ID_GET_URI;
import static org.kie.server.api.rest.RestURI.PROCESS_INSTANCE_WORK_ITEM_COMPLETE_AND_VARS_PUT_URI;
import static org.kie.server.api.rest.RestURI.PROCESS_INSTANCE_WORK_ITEM_COMPLETE_PUT_URI;
import static org.kie.server.api.rest.RestURI.PROCESS_INST_HISTORY_TYPE;
import static org.kie.server.api.rest.RestURI.PROCESS_INST_ID;
Expand All @@ -94,19 +96,23 @@
import static org.kie.server.api.rest.RestURI.START_PROCESS_POST_URI;
import static org.kie.server.api.rest.RestURI.START_PROCESS_WITH_CORRELATION_KEY_POST_URI;
import static org.kie.server.api.rest.RestURI.COMPUTE_PROCESS_OUTCOME_POST_URI;
import static org.kie.server.api.rest.RestURI.WORK_ITEM_ID;
import static org.kie.server.remote.rest.common.util.RestUtils.badRequest;
import static org.kie.server.remote.rest.common.util.RestUtils.buildConversationIdHeader;
import static org.kie.server.remote.rest.common.util.RestUtils.conflict;
import static org.kie.server.remote.rest.common.util.RestUtils.createCorrectVariant;
import static org.kie.server.remote.rest.common.util.RestUtils.createResponse;
import static org.kie.server.remote.rest.common.util.RestUtils.errorMessage;
import static org.kie.server.remote.rest.common.util.RestUtils.extractPayloads;
import static org.kie.server.remote.rest.common.util.RestUtils.forbidden;
import static org.kie.server.remote.rest.common.util.RestUtils.getContentType;
import static org.kie.server.remote.rest.common.util.RestUtils.getVariant;
import static org.kie.server.remote.rest.common.util.RestUtils.isCorrelationKeyAlreadyExists;
import static org.kie.server.remote.rest.common.util.RestUtils.internalServerError;
import static org.kie.server.remote.rest.common.util.RestUtils.noContent;
import static org.kie.server.remote.rest.common.util.RestUtils.notFound;
import static org.kie.server.remote.rest.common.util.RestUtils.RESULT_MAP_KEY;
import static org.kie.server.remote.rest.common.util.RestUtils.VARIABLES_MAP_KEY;
import static org.kie.server.remote.rest.jbpm.docs.ParameterSamples.GET_PROCESS_DEFS_RESPONSE_JSON;
import static org.kie.server.remote.rest.jbpm.docs.ParameterSamples.GET_PROCESS_INSTANCES_RESPONSE_JSON;
import static org.kie.server.remote.rest.jbpm.docs.ParameterSamples.GET_PROCESS_INSTANCE_NODES_RESPONSE_JSON;
Expand Down Expand Up @@ -822,6 +828,44 @@ public Response completeWorkItem(@javax.ws.rs.core.Context HttpHeaders headers,
}
}

@ApiOperation(value = "Sets a specific process variable and completes a specified work item for a specified process instance.",
code = 201)
@ApiResponses(value = {@ApiResponse(code = 500, message = "Unexpected error"),
@ApiResponse(code = 404, message = "Process instance, Work Item or Container Id not found"),
@ApiResponse(code = 403, message = "User does not have permission to access this asset")})
@PUT
@Path(PROCESS_INSTANCE_WORK_ITEM_COMPLETE_AND_VARS_PUT_URI)
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public Response completeWorkItemAndSetProcessVariables(
@Context HttpHeaders headers,
@ApiParam(value = "container id that process instance belongs to", required = true, example = "evaluation_1.0.0-SNAPSHOT") @PathParam(CONTAINER_ID) String containerId,
@ApiParam(value = "identifier of the process instance that work item belongs to", required = true, example = "123") @PathParam(PROCESS_INST_ID) Long processInstanceId,
@ApiParam(value = "identifier of the work item to complete", required = true, example = "567") @PathParam(WORK_ITEM_ID) Long workItemId,
@ApiParam(value = "optional outcome data give as map", examples = @Example(value = {
@ExampleProperty(mediaType = JSON, value = VAR_MAP_JSON)})) String resultPayload) {

Variant v = getVariant(headers);
String type = getContentType(headers);
Header conversationIdHeader = buildConversationIdHeader(containerId, this.context, headers);
try {
Map<String, String> payloads = extractPayloads(resultPayload, type);
processServiceBase.setProcessVariables(containerId, processInstanceId, payloads.get(VARIABLES_MAP_KEY), type);
processServiceBase.completeWorkItem(containerId, processInstanceId, workItemId, payloads.get(RESULT_MAP_KEY), type);
return createResponse("", v, Response.Status.CREATED, conversationIdHeader);
} catch (NotAcceptableException e) {
return createResponse(e.getMessage(), v, Response.Status.NOT_ACCEPTABLE, conversationIdHeader);
} catch (ProcessInstanceNotFoundException e) {
return notFound(MessageFormat.format(PROCESS_INSTANCE_NOT_FOUND, processInstanceId), v, conversationIdHeader);
} catch (DeploymentNotFoundException e) {
return notFound(MessageFormat.format(CONTAINER_NOT_FOUND, containerId), v, conversationIdHeader);
} catch (SecurityException e) {
return forbidden(errorMessage(e, e.getMessage()), v, conversationIdHeader);
} catch (Exception e) {
logger.error("Unexpected error during processing {}", e.getMessage(), e);
return internalServerError(errorMessage(e), v, conversationIdHeader);
}
}

@ApiOperation(value="Aborts a specified work item for a specified process instance.",
response=Void.class, code=201)
Expand Down Expand Up @@ -1111,4 +1155,4 @@ public Response getProcessInstances(@Context HttpHeaders headers,
return createCorrectVariant(processInstanceList, headers, Response.Status.OK, conversationIdHeader);
}

}
}