提交 628e5d46 编写于 作者: F Frederik Heremans

Added process-instance GET, DELETE and GET of collection

上级 31a4ba82
......@@ -23,6 +23,7 @@ import org.activiti.engine.impl.bpmn.deployer.BpmnDeployer;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Attachment;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Event;
......@@ -42,6 +43,7 @@ import org.activiti.rest.api.engine.variable.RestVariableConverter;
import org.activiti.rest.api.engine.variable.ShortRestVariableConverter;
import org.activiti.rest.api.engine.variable.StringRestVariableConverter;
import org.activiti.rest.api.identity.RestIdentityLink;
import org.activiti.rest.api.process.ProcessInstanceResponse;
import org.activiti.rest.api.repository.DeploymentResourceResponse;
import org.activiti.rest.api.repository.DeploymentResourceResponse.DeploymentResourceType;
import org.activiti.rest.api.repository.DeploymentResponse;
......@@ -307,6 +309,17 @@ public class RestResponseFactory {
return result ;
}
public ProcessInstanceResponse createProcessInstanceResponse(SecuredResource securedResource, ProcessInstance processInstance) {
ProcessInstanceResponse result = new ProcessInstanceResponse();
result.setActivityId(processInstance.getActivityId());
result.setBusinessKey(processInstance.getBusinessKey());
result.setId(processInstance.getId());
result.setProcessDefinitionUrl(securedResource.createFullResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processInstance.getProcessDefinitionId()));
result.setSuspended(processInstance.isSuspended());
result.setUrl(securedResource.createFullResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()));
return result;
}
/**
* Called once when the converters need to be initialized. Override of custom conversion
......
/* Licensed 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.activiti.rest.api.legacy.process;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricDetail;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableUpdate;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.RequestUtil;
import org.activiti.rest.api.SecuredResource;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
import org.restlet.resource.Delete;
import org.restlet.resource.Get;
/**
* @author Tijs Rademakers
*/
public class LegacyProcessInstanceResource extends SecuredResource {
@Get
public ObjectNode getProcessInstance() {
if(authenticate() == false) return null;
String processInstanceId = (String) getRequest().getAttributes().get("processInstanceId");
HistoricProcessInstance instance = ActivitiUtil.getHistoryService()
.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if(instance == null) {
throw new ActivitiObjectNotFoundException("Process instance not found for id " + processInstanceId, ProcessInstance.class);
}
ObjectNode responseJSON = new ObjectMapper().createObjectNode();
responseJSON.put("processInstanceId", instance.getId());
if (instance.getBusinessKey() != null) {
responseJSON.put("businessKey", instance.getBusinessKey());
} else {
responseJSON.putNull("businessKey");
}
responseJSON.put("processDefinitionId", instance.getProcessDefinitionId());
responseJSON.put("startTime", RequestUtil.dateToString(instance.getStartTime()));
responseJSON.put("startActivityId", instance.getStartActivityId());
if (instance.getStartUserId() != null) {
responseJSON.put("startUserId", instance.getStartUserId());
} else {
responseJSON.putNull("startUserId");
}
if(instance.getEndTime() == null) {
responseJSON.put("completed", false);
} else {
responseJSON.put("completed", true);
responseJSON.put("endTime", RequestUtil.dateToString(instance.getEndTime()));
responseJSON.put("endActivityId", instance.getEndActivityId());
responseJSON.put("duration", instance.getDurationInMillis());
}
addTaskList(processInstanceId, responseJSON);
addActivityList(processInstanceId, responseJSON);
addVariableList(processInstanceId, responseJSON);
return responseJSON;
}
@Delete
public ObjectNode deleteProcessInstance() {
if(authenticate() == false) return null;
String processInstanceId = (String) getRequest().getAttributes().get("processInstanceId");
ActivitiUtil.getRuntimeService().deleteProcessInstance(processInstanceId, "REST API");
ObjectNode successNode = new ObjectMapper().createObjectNode();
successNode.put("success", true);
return successNode;
}
private void addTaskList(String processInstanceId, ObjectNode responseJSON) {
List<HistoricTaskInstance> taskList = ActivitiUtil.getHistoryService()
.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricTaskInstanceStartTime()
.asc()
.list();
if(taskList != null && taskList.size() > 0) {
ArrayNode tasksJSON = new ObjectMapper().createArrayNode();
responseJSON.put("tasks", tasksJSON);
for (HistoricTaskInstance historicTaskInstance : taskList) {
ObjectNode taskJSON = new ObjectMapper().createObjectNode();
taskJSON.put("taskId", historicTaskInstance.getId());
taskJSON.put("taskDefinitionKey", historicTaskInstance.getTaskDefinitionKey());
if (historicTaskInstance.getName() != null) {
taskJSON.put("taskName", historicTaskInstance.getName());
} else {
taskJSON.putNull("taskName");
}
if (historicTaskInstance.getDescription() != null) {
taskJSON.put("description", historicTaskInstance.getDescription());
} else {
taskJSON.putNull("description");
}
if (historicTaskInstance.getOwner() != null) {
taskJSON.put("owner", historicTaskInstance.getOwner());
} else {
taskJSON.putNull("owner");
}
if (historicTaskInstance.getAssignee() != null) {
taskJSON.put("assignee", historicTaskInstance.getAssignee());
} else {
taskJSON.putNull("assignee");
}
taskJSON.put("startTime", RequestUtil.dateToString(historicTaskInstance.getStartTime()));
if (historicTaskInstance.getDueDate() != null) {
taskJSON.put("dueDate", RequestUtil.dateToString(historicTaskInstance.getDueDate()));
} else {
taskJSON.putNull("dueDate");
}
if(historicTaskInstance.getEndTime() == null) {
taskJSON.put("completed", false);
} else {
taskJSON.put("completed", true);
taskJSON.put("endTime", RequestUtil.dateToString(historicTaskInstance.getEndTime()));
taskJSON.put("duration", historicTaskInstance.getDurationInMillis());
}
tasksJSON.add(taskJSON);
}
}
}
private void addActivityList(String processInstanceId, ObjectNode responseJSON) {
List<HistoricActivityInstance> activityList = ActivitiUtil.getHistoryService()
.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime()
.asc()
.list();
if(activityList != null && activityList.size() > 0) {
ArrayNode activitiesJSON = new ObjectMapper().createArrayNode();
responseJSON.put("activities", activitiesJSON);
for (HistoricActivityInstance historicActivityInstance : activityList) {
ObjectNode activityJSON = new ObjectMapper().createObjectNode();
activityJSON.put("activityId", historicActivityInstance.getActivityId());
if (historicActivityInstance.getActivityName() != null) {
activityJSON.put("activityName", historicActivityInstance.getActivityName());
} else {
activityJSON.putNull("activityName");
}
activityJSON.put("activityType", historicActivityInstance.getActivityType());
activityJSON.put("startTime", RequestUtil.dateToString(historicActivityInstance.getStartTime()));
if(historicActivityInstance.getEndTime() == null) {
activityJSON.put("completed", false);
} else {
activityJSON.put("completed", true);
activityJSON.put("endTime", RequestUtil.dateToString(historicActivityInstance.getEndTime()));
activityJSON.put("duration", historicActivityInstance.getDurationInMillis());
}
activitiesJSON.add(activityJSON);
}
}
}
private void addVariableList(String processInstanceId, ObjectNode responseJSON) {
try {
Map<String, Object> variableMap = ActivitiUtil.getRuntimeService()
.getVariables(processInstanceId);
if(variableMap != null && variableMap.size() > 0) {
ArrayNode variablesJSON = new ObjectMapper().createArrayNode();
responseJSON.put("variables", variablesJSON);
for (String key : variableMap.keySet()) {
Object variableValue = variableMap.get(key);
ObjectNode variableJSON = new ObjectMapper().createObjectNode();
variableJSON.put("variableName", key);
if (variableValue != null) {
if (variableValue instanceof Boolean) {
variableJSON.put("variableValue", (Boolean) variableValue);
} else if (variableValue instanceof Long) {
variableJSON.put("variableValue", (Long) variableValue);
} else if (variableValue instanceof Double) {
variableJSON.put("variableValue", (Double) variableValue);
} else if (variableValue instanceof Float) {
variableJSON.put("variableValue", (Float) variableValue);
} else if (variableValue instanceof Integer) {
variableJSON.put("variableValue", (Integer) variableValue);
} else {
variableJSON.put("variableValue", variableValue.toString());
}
} else {
variableJSON.putNull("variableValue");
}
variablesJSON.add(variableJSON);
}
}
} catch(Exception e) {
// Absorb possible error that the execution could not be found
}
List<HistoricDetail> historyVariableList = ActivitiUtil.getHistoryService()
.createHistoricDetailQuery()
.processInstanceId(processInstanceId)
.variableUpdates()
.orderByTime()
.desc()
.list();
if(historyVariableList != null && historyVariableList.size() > 0) {
ArrayNode variablesJSON = new ObjectMapper().createArrayNode();
responseJSON.put("historyVariables", variablesJSON);
for (HistoricDetail historicDetail : historyVariableList) {
HistoricVariableUpdate variableUpdate = (HistoricVariableUpdate) historicDetail;
ObjectNode variableJSON = new ObjectMapper().createObjectNode();
variableJSON.put("variableName", variableUpdate.getVariableName());
if (variableUpdate.getValue() != null) {
if (variableUpdate.getValue() instanceof Boolean) {
variableJSON.put("variableValue", (Boolean) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Long) {
variableJSON.put("variableValue", (Long) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Double) {
variableJSON.put("variableValue", (Double) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Float) {
variableJSON.put("variableValue", (Float) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Integer) {
variableJSON.put("variableValue", (Integer) variableUpdate.getValue());
} else {
variableJSON.put("variableValue", variableUpdate.getValue().toString());
}
} else {
variableJSON.putNull("variableValue");
}
variableJSON.put("variableType", variableUpdate.getVariableTypeName());
variableJSON.put("revision", variableUpdate.getRevision());
variableJSON.put("time", RequestUtil.dateToString(variableUpdate.getTime()));
variablesJSON.add(variableJSON);
}
}
}
}
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.legacy.process;
import java.util.ArrayList;
import java.util.List;
......@@ -22,14 +22,14 @@ import org.activiti.rest.api.AbstractPaginateList;
/**
* @author Tijs Rademakers
*/
public class ProcessInstancesPaginateList extends AbstractPaginateList {
public class LegacyProcessInstancesPaginateList extends AbstractPaginateList {
@SuppressWarnings("rawtypes")
@Override
protected List processList(List list) {
List<ProcessInstancesResponse> processResponseList = new ArrayList<ProcessInstancesResponse>();
List<LegacyProcessInstancesResponse> processResponseList = new ArrayList<LegacyProcessInstancesResponse>();
for (Object instance : list) {
processResponseList.add(new ProcessInstancesResponse(
processResponseList.add(new LegacyProcessInstancesResponse(
(HistoricProcessInstance) instance));
}
return processResponseList;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.legacy.process;
import java.util.HashMap;
import java.util.Map;
......@@ -27,11 +27,11 @@ import org.restlet.resource.Get;
/**
* @author Tijs Rademakers
*/
public class ProcessInstancesResource extends SecuredResource {
public class LegacyProcessInstancesResource extends SecuredResource {
Map<String, QueryProperty> properties = new HashMap<String, QueryProperty>();
public ProcessInstancesResource() {
public LegacyProcessInstancesResource() {
properties.put("id", HistoricProcessInstanceQueryProperty.PROCESS_INSTANCE_ID_);
properties.put("processDefinitionId", HistoricProcessInstanceQueryProperty.PROCESS_DEFINITION_ID);
properties.put("businessKey", HistoricProcessInstanceQueryProperty.BUSINESS_KEY);
......@@ -49,7 +49,7 @@ public class ProcessInstancesResource extends SecuredResource {
query = processDefinitionId == null ? query : query.processDefinitionId(processDefinitionId);
query = processInstanceKey == null ? query : query.processInstanceBusinessKey(processInstanceKey);
DataResponse response = new ProcessInstancesPaginateList().paginateList(getQuery(), query, "id", properties);
DataResponse response = new LegacyProcessInstancesPaginateList().paginateList(getQuery(), query, "id", properties);
return response;
}
}
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.legacy.process;
import java.io.Serializable;
......@@ -21,7 +21,7 @@ import org.activiti.rest.api.RequestUtil;
/**
* @author Tijs Rademakers
*/
public class ProcessInstancesResponse implements Serializable {
public class LegacyProcessInstancesResponse implements Serializable {
private static final long serialVersionUID = 1L;
......@@ -31,7 +31,7 @@ public class ProcessInstancesResponse implements Serializable {
String startTime;
String startUserId;
public ProcessInstancesResponse(HistoricProcessInstance processInstance) {
public LegacyProcessInstancesResponse(HistoricProcessInstance processInstance) {
this.setId(processInstance.getId());
this.setBusinessKey(processInstance.getBusinessKey());
this.setStartTime(RequestUtil.dateToString(processInstance.getStartTime()));
......
/* Licensed 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.activiti.rest.api.process;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.impl.ProcessInstanceQueryProperty;
import org.activiti.engine.query.QueryProperty;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.DataResponse;
import org.activiti.rest.api.SecuredResource;
import org.restlet.data.Form;
/**
* @author Frederik Heremans
*/
public class ProcessInstanceBasedResource extends SecuredResource {
private static Map<String, QueryProperty> allowedSortProperties = new HashMap<String, QueryProperty>();
static {
allowedSortProperties.put("processDefinitionId", ProcessInstanceQueryProperty.PROCESS_DEFINITION_ID);
allowedSortProperties.put("processDefinitionKey", ProcessInstanceQueryProperty.PROCESS_DEFINITION_KEY);
allowedSortProperties.put("id", ProcessInstanceQueryProperty.PROCESS_INSTANCE_ID);
}
protected DataResponse getQueryResponse(ProcessInstanceQueryRequest queryRequest, Form urlQuery) {
ProcessInstanceQuery query = ActivitiUtil.getRuntimeService().createProcessInstanceQuery();
// Populate query based on request
if(queryRequest.getProcessInstanceId() != null) {
query.processInstanceId(queryRequest.getProcessInstanceId());
}
if(queryRequest.getProcessDefinitionKey() != null) {
query.processDefinitionKey(queryRequest.getProcessDefinitionKey());
}
if(queryRequest.getProcessDefinitionId() != null) {
query.processDefinitionId(queryRequest.getProcessDefinitionId());
}
if(queryRequest.getProcessBusinessKey() != null) {
query.processInstanceBusinessKey(queryRequest.getProcessBusinessKey());
}
if(queryRequest.getInvolvedUser() != null) {
query.involvedUser(queryRequest.getInvolvedUser());
}
if(queryRequest.getSuspended() != null) {
if(queryRequest.getSuspended()) {
query.suspended();
} else {
query.active();
}
}
if(queryRequest.getSubProcessInstanceId() != null) {
query.subProcessInstanceId(queryRequest.getSubProcessInstanceId());
}
if(queryRequest.getSuperProcessInstanceId() != null) {
query.superProcessInstanceId(queryRequest.getSuperProcessInstanceId());
}
return new ProcessInstancePaginateList(this).paginateList(urlQuery, query, "id", allowedSortProperties);
}
}
/* Licensed 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.activiti.rest.api.process;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.DataResponse;
import org.restlet.data.Form;
import org.restlet.data.Status;
import org.restlet.resource.Delete;
import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class ProcessInstanceCollectionResource extends ProcessInstanceBasedResource {
@Get
public DataResponse getProcessInstances() {
if(!authenticate()) {
return null;
}
Form urlQuery = getQuery();
// Populate query based on request
ProcessInstanceQueryRequest queryRequest = new ProcessInstanceQueryRequest();
if(getQueryParameter("id", urlQuery) != null) {
queryRequest.setProcessInstanceId(getQueryParameter("id", urlQuery));
}
if(getQueryParameter("processDefinitionKey", urlQuery) != null) {
queryRequest.setProcessDefinitionKey(getQueryParameter("processDefinitionKey", urlQuery));
}
if(getQueryParameter("processDefinitionId", urlQuery) != null) {
queryRequest.setProcessDefinitionId(getQueryParameter("processDefinitionId", urlQuery));
}
if(getQueryParameter("businessKey", urlQuery) != null) {
queryRequest.setProcessBusinessKey(getQueryParameter("businessKey", urlQuery));
}
if(getQueryParameter("involvedUser", urlQuery) != null) {
queryRequest.setInvolvedUser(getQueryParameter("involvedUser", urlQuery));
}
if(getQueryParameter("suspended", urlQuery) != null) {
queryRequest.setSuspended(getQueryParameterAsBoolean("suspended", urlQuery));
}
if(getQueryParameter("superProcessInstanceId", urlQuery) != null) {
queryRequest.setSuperProcessInstanceId(getQueryParameter("superProcessInstanceId", urlQuery));
}
if(getQueryParameter("subProcessInstanceId", urlQuery) != null) {
queryRequest.setSubProcessInstanceId(getQueryParameter("subProcessInstanceId", urlQuery));
}
return getQueryResponse(queryRequest, urlQuery);
}
@Delete
public void deleteProcessInstance() {
if(!authenticate()) {
return;
}
ProcessInstance processInstance = getProcessInstanceFromRequest();
String deleteReason = getQueryParameter("deleteReason", getQuery());
ActivitiUtil.getRuntimeService().deleteProcessInstance(processInstance.getId(), deleteReason);
setStatus(Status.SUCCESS_NO_CONTENT);
}
protected ProcessInstance getProcessInstanceFromRequest() {
String processInstanceId = getAttribute("processInstanceId");
if (processInstanceId == null) {
throw new ActivitiIllegalArgumentException("The processInstanceId cannot be null");
}
ProcessInstance processInstance = ActivitiUtil.getRuntimeService().createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
if (processInstance == null) {
throw new ActivitiObjectNotFoundException("Could not find a process instance with id '" + processInstanceId + "'.", ProcessInstance.class);
}
return processInstance;
}
}
/* Licensed 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.activiti.rest.api.process;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.rest.api.AbstractPaginateList;
import org.activiti.rest.api.RestResponseFactory;
import org.activiti.rest.api.SecuredResource;
import org.activiti.rest.application.ActivitiRestServicesApplication;
/**
* @author Frederik Heremans
*/
public class ProcessInstancePaginateList extends AbstractPaginateList {
private SecuredResource resource;
public ProcessInstancePaginateList(SecuredResource resource) {
this.resource = resource;
}
@SuppressWarnings("rawtypes")
@Override
protected List processList(List list) {
List<ProcessInstanceResponse> responseList = new ArrayList<ProcessInstanceResponse>();
RestResponseFactory restResponseFactory = resource.getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory();
for (Object instance : list) {
responseList.add(restResponseFactory.createProcessInstanceResponse(resource, (ProcessInstance) instance));
}
return responseList;
}
}
/* Licensed 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.activiti.rest.api.process;
import java.util.List;
import org.activiti.rest.api.task.QueryVariable;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
/**
* @author Frederik Heremans
*/
public class ProcessInstanceQueryRequest {
private String processInstanceId;
private String processBusinessKey;
private String processDefinitionId;
private String processDefinitionKey;
private String superProcessInstanceId;
private String subProcessInstanceId;
private String involvedUser;
private Boolean suspended;
private List<QueryVariable> variables;
public String getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getProcessBusinessKey() {
return processBusinessKey;
}
public void setProcessBusinessKey(String processBusinessKey) {
this.processBusinessKey = processBusinessKey;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
public void setProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public String getProcessDefinitionKey() {
return processDefinitionKey;
}
public void setProcessDefinitionKey(String processDefinitionKey) {
this.processDefinitionKey = processDefinitionKey;
}
public String getSuperProcessInstanceId() {
return superProcessInstanceId;
}
public void setSuperProcessInstanceId(String superProcessInstanceId) {
this.superProcessInstanceId = superProcessInstanceId;
}
public String getSubProcessInstanceId() {
return subProcessInstanceId;
}
public void setSubProcessInstanceId(String subProcessInstanceId) {
this.subProcessInstanceId = subProcessInstanceId;
}
public String getInvolvedUser() {
return involvedUser;
}
public void setInvolvedUser(String involvedUser) {
this.involvedUser = involvedUser;
}
public Boolean getSuspended() {
return suspended;
}
public void setSuspended(Boolean suspended) {
this.suspended = suspended;
}
@JsonTypeInfo(use=Id.CLASS, defaultImpl=QueryVariable.class)
public List<QueryVariable> getVariables() {
return variables;
}
public void setVariables(List<QueryVariable> variables) {
this.variables = variables;
}
}
......@@ -13,250 +13,54 @@
package org.activiti.rest.api.process;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricDetail;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableUpdate;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.RequestUtil;
import org.activiti.rest.api.SecuredResource;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
import org.activiti.rest.application.ActivitiRestServicesApplication;
import org.restlet.data.Status;
import org.restlet.resource.Delete;
import org.restlet.resource.Get;
/**
* @author Tijs Rademakers
* @author Frederik Heremans
*/
public class ProcessInstanceResource extends SecuredResource {
@Get
public ObjectNode getProcessInstance() {
if(authenticate() == false) return null;
String processInstanceId = (String) getRequest().getAttributes().get("processInstanceId");
HistoricProcessInstance instance = ActivitiUtil.getHistoryService()
.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if(instance == null) {
throw new ActivitiObjectNotFoundException("Process instance not found for id " + processInstanceId, ProcessInstance.class);
}
ObjectNode responseJSON = new ObjectMapper().createObjectNode();
responseJSON.put("processInstanceId", instance.getId());
if (instance.getBusinessKey() != null) {
responseJSON.put("businessKey", instance.getBusinessKey());
} else {
responseJSON.putNull("businessKey");
public ProcessInstanceResponse getProcessInstance() {
if(!authenticate()) {
return null;
}
responseJSON.put("processDefinitionId", instance.getProcessDefinitionId());
responseJSON.put("startTime", RequestUtil.dateToString(instance.getStartTime()));
responseJSON.put("startActivityId", instance.getStartActivityId());
if (instance.getStartUserId() != null) {
responseJSON.put("startUserId", instance.getStartUserId());
} else {
responseJSON.putNull("startUserId");
}
if(instance.getEndTime() == null) {
responseJSON.put("completed", false);
} else {
responseJSON.put("completed", true);
responseJSON.put("endTime", RequestUtil.dateToString(instance.getEndTime()));
responseJSON.put("endActivityId", instance.getEndActivityId());
responseJSON.put("duration", instance.getDurationInMillis());
}
addTaskList(processInstanceId, responseJSON);
addActivityList(processInstanceId, responseJSON);
addVariableList(processInstanceId, responseJSON);
return responseJSON;
return getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory()
.createProcessInstanceResponse(this, getProcessInstanceFromRequest());
}
@Delete
public ObjectNode deleteProcessInstance() {
if(authenticate() == false) return null;
String processInstanceId = (String) getRequest().getAttributes().get("processInstanceId");
ActivitiUtil.getRuntimeService().deleteProcessInstance(processInstanceId, "REST API");
ObjectNode successNode = new ObjectMapper().createObjectNode();
successNode.put("success", true);
return successNode;
public void deleteProcessInstance() {
if(!authenticate()) {
return;
}
ProcessInstance processInstance = getProcessInstanceFromRequest();
String deleteReason = getQueryParameter("deleteReason", getQuery());
private void addTaskList(String processInstanceId, ObjectNode responseJSON) {
List<HistoricTaskInstance> taskList = ActivitiUtil.getHistoryService()
.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricTaskInstanceStartTime()
.asc()
.list();
if(taskList != null && taskList.size() > 0) {
ArrayNode tasksJSON = new ObjectMapper().createArrayNode();
responseJSON.put("tasks", tasksJSON);
for (HistoricTaskInstance historicTaskInstance : taskList) {
ObjectNode taskJSON = new ObjectMapper().createObjectNode();
taskJSON.put("taskId", historicTaskInstance.getId());
taskJSON.put("taskDefinitionKey", historicTaskInstance.getTaskDefinitionKey());
if (historicTaskInstance.getName() != null) {
taskJSON.put("taskName", historicTaskInstance.getName());
} else {
taskJSON.putNull("taskName");
}
if (historicTaskInstance.getDescription() != null) {
taskJSON.put("description", historicTaskInstance.getDescription());
} else {
taskJSON.putNull("description");
}
if (historicTaskInstance.getOwner() != null) {
taskJSON.put("owner", historicTaskInstance.getOwner());
} else {
taskJSON.putNull("owner");
}
if (historicTaskInstance.getAssignee() != null) {
taskJSON.put("assignee", historicTaskInstance.getAssignee());
} else {
taskJSON.putNull("assignee");
}
taskJSON.put("startTime", RequestUtil.dateToString(historicTaskInstance.getStartTime()));
if (historicTaskInstance.getDueDate() != null) {
taskJSON.put("dueDate", RequestUtil.dateToString(historicTaskInstance.getDueDate()));
} else {
taskJSON.putNull("dueDate");
}
if(historicTaskInstance.getEndTime() == null) {
taskJSON.put("completed", false);
} else {
taskJSON.put("completed", true);
taskJSON.put("endTime", RequestUtil.dateToString(historicTaskInstance.getEndTime()));
taskJSON.put("duration", historicTaskInstance.getDurationInMillis());
}
tasksJSON.add(taskJSON);
ActivitiUtil.getRuntimeService().deleteProcessInstance(processInstance.getId(), deleteReason);
setStatus(Status.SUCCESS_NO_CONTENT);
}
}
}
private void addActivityList(String processInstanceId, ObjectNode responseJSON) {
List<HistoricActivityInstance> activityList = ActivitiUtil.getHistoryService()
.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime()
.asc()
.list();
if(activityList != null && activityList.size() > 0) {
ArrayNode activitiesJSON = new ObjectMapper().createArrayNode();
responseJSON.put("activities", activitiesJSON);
for (HistoricActivityInstance historicActivityInstance : activityList) {
ObjectNode activityJSON = new ObjectMapper().createObjectNode();
activityJSON.put("activityId", historicActivityInstance.getActivityId());
if (historicActivityInstance.getActivityName() != null) {
activityJSON.put("activityName", historicActivityInstance.getActivityName());
} else {
activityJSON.putNull("activityName");
}
activityJSON.put("activityType", historicActivityInstance.getActivityType());
activityJSON.put("startTime", RequestUtil.dateToString(historicActivityInstance.getStartTime()));
if(historicActivityInstance.getEndTime() == null) {
activityJSON.put("completed", false);
} else {
activityJSON.put("completed", true);
activityJSON.put("endTime", RequestUtil.dateToString(historicActivityInstance.getEndTime()));
activityJSON.put("duration", historicActivityInstance.getDurationInMillis());
}
activitiesJSON.add(activityJSON);
}
}
}
private void addVariableList(String processInstanceId, ObjectNode responseJSON) {
try {
Map<String, Object> variableMap = ActivitiUtil.getRuntimeService()
.getVariables(processInstanceId);
if(variableMap != null && variableMap.size() > 0) {
ArrayNode variablesJSON = new ObjectMapper().createArrayNode();
responseJSON.put("variables", variablesJSON);
for (String key : variableMap.keySet()) {
Object variableValue = variableMap.get(key);
ObjectNode variableJSON = new ObjectMapper().createObjectNode();
variableJSON.put("variableName", key);
if (variableValue != null) {
if (variableValue instanceof Boolean) {
variableJSON.put("variableValue", (Boolean) variableValue);
} else if (variableValue instanceof Long) {
variableJSON.put("variableValue", (Long) variableValue);
} else if (variableValue instanceof Double) {
variableJSON.put("variableValue", (Double) variableValue);
} else if (variableValue instanceof Float) {
variableJSON.put("variableValue", (Float) variableValue);
} else if (variableValue instanceof Integer) {
variableJSON.put("variableValue", (Integer) variableValue);
} else {
variableJSON.put("variableValue", variableValue.toString());
}
} else {
variableJSON.putNull("variableValue");
}
variablesJSON.add(variableJSON);
}
}
} catch(Exception e) {
// Absorb possible error that the execution could not be found
protected ProcessInstance getProcessInstanceFromRequest() {
String processInstanceId = getAttribute("processInstanceId");
if (processInstanceId == null) {
throw new ActivitiIllegalArgumentException("The processInstanceId cannot be null");
}
List<HistoricDetail> historyVariableList = ActivitiUtil.getHistoryService()
.createHistoricDetailQuery()
.processInstanceId(processInstanceId)
.variableUpdates()
.orderByTime()
.desc()
.list();
if(historyVariableList != null && historyVariableList.size() > 0) {
ArrayNode variablesJSON = new ObjectMapper().createArrayNode();
responseJSON.put("historyVariables", variablesJSON);
for (HistoricDetail historicDetail : historyVariableList) {
HistoricVariableUpdate variableUpdate = (HistoricVariableUpdate) historicDetail;
ObjectNode variableJSON = new ObjectMapper().createObjectNode();
variableJSON.put("variableName", variableUpdate.getVariableName());
if (variableUpdate.getValue() != null) {
if (variableUpdate.getValue() instanceof Boolean) {
variableJSON.put("variableValue", (Boolean) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Long) {
variableJSON.put("variableValue", (Long) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Double) {
variableJSON.put("variableValue", (Double) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Float) {
variableJSON.put("variableValue", (Float) variableUpdate.getValue());
} else if (variableUpdate.getValue() instanceof Integer) {
variableJSON.put("variableValue", (Integer) variableUpdate.getValue());
} else {
variableJSON.put("variableValue", variableUpdate.getValue().toString());
}
} else {
variableJSON.putNull("variableValue");
}
variableJSON.put("variableType", variableUpdate.getVariableTypeName());
variableJSON.put("revision", variableUpdate.getRevision());
variableJSON.put("time", RequestUtil.dateToString(variableUpdate.getTime()));
variablesJSON.add(variableJSON);
}
ProcessInstance processInstance = ActivitiUtil.getRuntimeService().createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
if (processInstance == null) {
throw new ActivitiObjectNotFoundException("Could not find a process instance with id '" + processInstanceId + "'.", ProcessInstance.class);
}
return processInstance;
}
}
/* Licensed 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.activiti.rest.api.process;
/**
* @author Frederik Heremans
*/
public class ProcessInstanceResponse {
protected String id;
protected String url;
protected String businessKey;
protected boolean suspended;
protected String processDefinitionUrl;
protected String activityId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getBusinessKey() {
return businessKey;
}
public void setBusinessKey(String businessKey) {
this.businessKey = businessKey;
}
public boolean isSuspended() {
return suspended;
}
public void setSuspended(boolean suspended) {
this.suspended = suspended;
}
public String getProcessDefinitionUrl() {
return processDefinitionUrl;
}
public void setProcessDefinitionUrl(String processDefinitionUrl) {
this.processDefinitionUrl = processDefinitionUrl;
}
public String getActivityId() {
return activityId;
}
public void setActivityId(String activityId) {
this.activityId = activityId;
}
}
......@@ -47,9 +47,9 @@ public class DeploymentCollectionResource extends SecuredResource {
protected static final String DEPRECATED_API_DEPLOYMENT_SEGMENT = "deployment";
Map<String, QueryProperty> allowedSortProperties = new HashMap<String, QueryProperty>();
private static Map<String, QueryProperty> allowedSortProperties = new HashMap<String, QueryProperty>();
public DeploymentCollectionResource() {
static {
allowedSortProperties.put("id", DeploymentQueryProperty.DEPLOYMENT_ID);
allowedSortProperties.put("name", DeploymentQueryProperty.DEPLOYMENT_NAME);
allowedSortProperties.put("deployTime", DeploymentQueryProperty.DEPLOY_TIME);
......
......@@ -13,9 +13,9 @@ import org.activiti.rest.api.identity.UserGroupsResource;
import org.activiti.rest.api.identity.UserPictureResource;
import org.activiti.rest.api.identity.UserResource;
import org.activiti.rest.api.identity.UserSearchResource;
import org.activiti.rest.api.legacy.LegacyTaskAttachmentResource;
import org.activiti.rest.api.legacy.TaskAddResource;
import org.activiti.rest.api.legacy.TaskAttachmentAddResource;
import org.activiti.rest.api.legacy.LegacyTaskAttachmentResource;
import org.activiti.rest.api.legacy.TaskFormResource;
import org.activiti.rest.api.legacy.TaskOperationResource;
import org.activiti.rest.api.legacy.TaskPropertiesResource;
......@@ -28,6 +28,8 @@ import org.activiti.rest.api.legacy.deployment.DeploymentDeleteResource;
import org.activiti.rest.api.legacy.deployment.DeploymentUploadResource;
import org.activiti.rest.api.legacy.deployment.DeploymentsDeleteResource;
import org.activiti.rest.api.legacy.deployment.DeploymentsResource;
import org.activiti.rest.api.legacy.process.LegacyProcessInstanceResource;
import org.activiti.rest.api.legacy.process.LegacyProcessInstancesResource;
import org.activiti.rest.api.legacy.process.ProcessDefinitionsResource;
import org.activiti.rest.api.legacy.task.LegacyTaskResource;
import org.activiti.rest.api.management.JobExecuteResource;
......@@ -40,11 +42,11 @@ import org.activiti.rest.api.management.TablesResource;
import org.activiti.rest.api.process.ProcessDefinitionDiagramResource;
import org.activiti.rest.api.process.ProcessDefinitionFormResource;
import org.activiti.rest.api.process.ProcessDefinitionPropertiesResource;
import org.activiti.rest.api.process.ProcessInstanceCollectionResource;
import org.activiti.rest.api.process.ProcessInstanceDiagramResource;
import org.activiti.rest.api.process.ProcessInstanceResource;
import org.activiti.rest.api.process.ProcessInstanceSignalExecutionResource;
import org.activiti.rest.api.process.ProcessInstanceTaskResource;
import org.activiti.rest.api.process.ProcessInstancesResource;
import org.activiti.rest.api.process.SignalEventSubscriptionResource;
import org.activiti.rest.api.process.StartProcessInstanceResource;
import org.activiti.rest.api.repository.DeploymentCollectionResource;
......@@ -104,6 +106,9 @@ public class RestServicesInit {
router.attach("/runtime/tasks/{taskId}/attachments/{attachmentId}", TaskAttachmentResource.class);
router.attach("/runtime/tasks/{taskId}/attachments/{attachmentId}/content", TaskAttachmentContentResource.class);
router.attach("/runtime/process-instances/{processInstanceId}", ProcessInstanceResource.class);
router.attach("/runtime/process-instances", ProcessInstanceCollectionResource.class);
router.attach("/query/tasks", TaskQueryResource.class);
// Old rest-urls
......@@ -125,9 +130,9 @@ public class RestServicesInit {
router.attach("/groups", GroupSearchResource.class);
router.attach("/process-definitions", ProcessDefinitionsResource.class);
router.attach("/process-instances", ProcessInstancesResource.class);
router.attach("/process-instances", LegacyProcessInstancesResource.class);
router.attach("/process-instance", StartProcessInstanceResource.class);
router.attach("/process-instance/{processInstanceId}", ProcessInstanceResource.class);
router.attach("/process-instance/{processInstanceId}", LegacyProcessInstanceResource.class);
router.attach("/process-instance/{processInstanceId}/diagram", ProcessInstanceDiagramResource.class);
router.attach("/process-instance/{processInstanceId}/tasks", ProcessInstanceTaskResource.class);
router.attach("/process-instance/{processInstanceId}/signal", ProcessInstanceSignalExecutionResource.class);
......
/* Licensed 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.activiti.rest.api.runtime;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.activiti.rest.BaseRestTestCase;
import org.activiti.rest.api.RestUrls;
import org.codehaus.jackson.JsonNode;
import org.restlet.data.Status;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
import org.restlet.resource.ResourceException;
/**
* Test for all REST-operations related to a single Process instance resource.
*
* @author Frederik Heremans
*/
public class ProcessInstanceCollectionResourceTest extends BaseRestTestCase {
/**
* Test getting a single process instance.
*/
@Deployment(resources = {"org/activiti/rest/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"})
public void testGetProcessInstance() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processOne", "myBusinessKey");
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()));
Representation response = client.get();
assertEquals(Status.SUCCESS_OK, client.getResponse().getStatus());
// Check resulting instance
JsonNode responseNode = objectMapper.readTree(response.getStream());
assertNotNull(responseNode);
assertEquals(processInstance.getId(), responseNode.get("id").getTextValue());
assertEquals("myBusinessKey", responseNode.get("businessKey").getTextValue());
assertEquals("processTask", responseNode.get("activityId").getTextValue());
assertFalse(responseNode.get("suspended").getBooleanValue());
assertTrue(responseNode.get("url").asText().endsWith(
RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId())));
assertTrue(responseNode.get("processDefinitionUrl").asText().endsWith(
RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_DEFINITION, encode(processInstance.getProcessDefinitionId()))));
}
/**
* Test getting an unexisting process instance.
*/
public void testGetUnexistingProcessInstance() {
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, "unexistingpi"));
try {
client.get();
fail("Exception expected");
} catch(ResourceException expected) {
assertEquals(Status.CLIENT_ERROR_NOT_FOUND, expected.getStatus());
assertEquals("Could not find a process instance with id 'unexistingpi'.", expected.getStatus().getDescription());
}
}
/**
* Test deleting a single process instance.
*/
@Deployment(resources = {"org/activiti/rest/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"})
public void testDeleteProcessInstance() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processOne", "myBusinessKey");
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()));
client.delete();
assertEquals(Status.SUCCESS_NO_CONTENT, client.getResponse().getStatus());
// Check if process-instance is gone
assertEquals(0, runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).count());
}
/**
* Test deleting an unexisting process instance.
*/
public void testDeleteUnexistingProcessInstance() {
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, "unexistingpi"));
try {
client.delete();
fail("Exception expected");
} catch(ResourceException expected) {
assertEquals(Status.CLIENT_ERROR_NOT_FOUND, expected.getStatus());
assertEquals("Could not find a process instance with id 'unexistingpi'.", expected.getStatus().getDescription());
}
}
}
/* Licensed 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.activiti.rest.api.runtime;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.activiti.rest.BaseRestTestCase;
import org.activiti.rest.api.RestUrls;
/**
* Test for all REST-operations related to a single Process instance resource.
*
* @author Frederik Heremans
*/
public class ProcessInstanceResourceTest extends BaseRestTestCase {
/**
* Test getting a single process instance.
*/
@Deployment(resources = {"org/activiti/rest/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"})
public void testGetProcessInstance() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processOne", "myBusinessKey");
String id = processInstance.getId();
runtimeService.addUserIdentityLink(id, "kermit", "whatever");
// Test without any parameters
String url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION);
assertResultsPresentInDataResponse(url, id);
// Process instance id
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?id=" + id;
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?id=anotherId";
assertResultsPresentInDataResponse(url);
// Process instance business key
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?businessKey=myBusinessKey";
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?businessKey=anotherBusinessKey";
assertResultsPresentInDataResponse(url);
// Process definition key
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionKey=processOne";
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionKey=processTwo";
assertResultsPresentInDataResponse(url);
// Process definition id
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionId=" + processInstance.getProcessDefinitionId();
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionId=anotherId";
assertResultsPresentInDataResponse(url);
// Involved user
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?involvedUser=kermit";
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?involvedUser=gonzo";
assertResultsPresentInDataResponse(url);
// Active process
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=false";
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=true";
assertResultsPresentInDataResponse(url);
// Suspended process
runtimeService.suspendProcessInstanceById(id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=true";
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=false";
assertResultsPresentInDataResponse(url);
runtimeService.activateProcessInstanceById(id);
// Complete first task in the process to have a subprocess created
taskService.complete(taskService.createTaskQuery().processInstanceId(id).singleResult().getId());
ProcessInstance subProcess = runtimeService.createProcessInstanceQuery().superProcessInstanceId(id).singleResult();
assertNotNull(subProcess);
// Super-process instance id
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?superProcessInstanceId=" + id;
assertResultsPresentInDataResponse(url, subProcess.getId());
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?superProcessInstanceId=anotherId";
assertResultsPresentInDataResponse(url);
// Sub-process instance id
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?subProcessInstanceId=" + subProcess.getId();
assertResultsPresentInDataResponse(url, id);
url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?subProcessInstanceId=anotherId";
assertResultsPresentInDataResponse(url);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="OneTaskCategory">
<process id="processOne" name="The One Task Process">
<documentation>One task process description</documentation>
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="processTask" />
<userTask id="processTask" name="Process task" activiti:candidateUsers="kermit" activiti:candidateGroups="sales">
<documentation>Process task description</documentation>
</userTask>
<sequenceFlow id="flow2" sourceRef="processTask" targetRef="callSubProcess" />
<callActivity id="callSubProcess" calledElement="subProcess" />
<sequenceFlow id="flow3" sourceRef="callSubProcess" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
<process id="subProcess">
<startEvent id="subProcessStart" />
<sequenceFlow sourceRef="subProcessStart" targetRef="anotherTask" />
<userTask id="anotherTask" name="Process task" activiti:candidateUsers="kermit" activiti:candidateGroups="sales" />
<sequenceFlow sourceRef="anotherTask" targetRef="subProcessEnd" />
<endEvent id="subProcessEnd" />
</process>
</definitions>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册