/* 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.service.api.runtime.process; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.ActivitiIllegalArgumentException; import org.activiti.engine.ActivitiObjectNotFoundException; import org.activiti.engine.RuntimeService; import org.activiti.engine.impl.ProcessInstanceQueryProperty; import org.activiti.engine.query.QueryProperty; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstanceQuery; import org.activiti.rest.common.api.DataResponse; import org.activiti.rest.service.api.RestResponseFactory; import org.activiti.rest.service.api.engine.variable.QueryVariable; import org.activiti.rest.service.api.engine.variable.QueryVariable.QueryVariableOperation; import org.springframework.beans.factory.annotation.Autowired; /** * @author Frederik Heremans */ public class BaseProcessInstanceResource { 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); allowedSortProperties.put("tenantId", ProcessInstanceQueryProperty.TENANT_ID); } @Autowired protected RestResponseFactory restResponseFactory; @Autowired protected RuntimeService runtimeService; protected DataResponse getQueryResponse(ProcessInstanceQueryRequest queryRequest, Map<String, String> requestParams) { ProcessInstanceQuery query = runtimeService.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()); } if (queryRequest.getExcludeSubprocesses() != null) { query.excludeSubprocesses(queryRequest.getExcludeSubprocesses()); } if (queryRequest.getIncludeProcessVariables() != null) { if (queryRequest.getIncludeProcessVariables()) { query.includeProcessVariables(); } } if (queryRequest.getVariables() != null) { addVariables(query, queryRequest.getVariables()); } if(queryRequest.getTenantId() != null) { query.processInstanceTenantId(queryRequest.getTenantId()); } if(queryRequest.getTenantIdLike() != null) { query.processInstanceTenantIdLike(queryRequest.getTenantIdLike()); } if(Boolean.TRUE.equals(queryRequest.getWithoutTenantId())) { query.processInstanceWithoutTenantId(); } return new ProcessInstancePaginateList(restResponseFactory) .paginateList(requestParams, queryRequest, query, "id", allowedSortProperties); } protected void addVariables(ProcessInstanceQuery processInstanceQuery, List<QueryVariable> variables) { for (QueryVariable variable : variables) { if (variable.getVariableOperation() == null) { throw new ActivitiIllegalArgumentException("Variable operation is missing for variable: " + variable.getName()); } if (variable.getValue() == null) { throw new ActivitiIllegalArgumentException("Variable value is missing for variable: " + variable.getName()); } boolean nameLess = variable.getName() == null; Object actualValue = restResponseFactory.getVariableValue(variable); // A value-only query is only possible using equals-operator if (nameLess && variable.getVariableOperation() != QueryVariableOperation.EQUALS) { throw new ActivitiIllegalArgumentException("Value-only query (without a variable-name) is only supported when using 'equals' operation."); } switch (variable.getVariableOperation()) { case EQUALS: if (nameLess) { processInstanceQuery.variableValueEquals(actualValue); } else { processInstanceQuery.variableValueEquals(variable.getName(), actualValue); } break; case EQUALS_IGNORE_CASE: if (actualValue instanceof String) { processInstanceQuery.variableValueEqualsIgnoreCase(variable.getName(), (String) actualValue); } else { throw new ActivitiIllegalArgumentException("Only string variable values are supported when ignoring casing, but was: " + actualValue.getClass().getName()); } break; case NOT_EQUALS: processInstanceQuery.variableValueNotEquals(variable.getName(), actualValue); break; case NOT_EQUALS_IGNORE_CASE: if (actualValue instanceof String) { processInstanceQuery.variableValueNotEqualsIgnoreCase(variable.getName(), (String) actualValue); } else { throw new ActivitiIllegalArgumentException("Only string variable values are supported when ignoring casing, but was: " + actualValue.getClass().getName()); } break; case LIKE: if (actualValue instanceof String) { processInstanceQuery.variableValueLike(variable.getName(), (String) actualValue); } else { throw new ActivitiIllegalArgumentException("Only string variable values are supported for like, but was: " + actualValue.getClass().getName()); } break; case LIKE_IGNORE_CASE: if (actualValue instanceof String) { processInstanceQuery.variableValueLikeIgnoreCase(variable.getName(), (String) actualValue); } else { throw new ActivitiIllegalArgumentException("Only string variable values are supported for like ignore case, but was: " + actualValue.getClass().getName()); } break; case GREATER_THAN: processInstanceQuery.variableValueGreaterThan(variable.getName(), actualValue); break; case GREATER_THAN_OR_EQUALS: processInstanceQuery.variableValueGreaterThanOrEqual(variable.getName(), actualValue); break; case LESS_THAN: processInstanceQuery.variableValueLessThan(variable.getName(), actualValue); break; case LESS_THAN_OR_EQUALS: processInstanceQuery.variableValueLessThanOrEqual(variable.getName(), actualValue); break; default: throw new ActivitiIllegalArgumentException("Unsupported variable query operation: " + variable.getVariableOperation()); } } } protected ProcessInstance getProcessInstanceFromRequest(String processInstanceId) { ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId).singleResult(); if (processInstance == null) { throw new ActivitiObjectNotFoundException("Could not find a process instance with id '" + processInstanceId + "'."); } return processInstance; } }