提交 134111b0 编写于 作者: F Frederik Heremans

Added task querying based on process-variables + test

上级 f9459f31
......@@ -184,13 +184,17 @@ public class TaskBasedResource extends SecuredResource {
}
if(request.getTaskVariables() != null) {
processTaskvariables(taskQuery, request.getTaskVariables());
addTaskvariables(taskQuery, request.getTaskVariables());
}
if(request.getProcessVariables() != null) {
addProcessvariables(taskQuery, request.getProcessVariables());
}
return new TaskPaginateList(this).paginateList(query, taskQuery, "id", properties);
}
protected void processTaskvariables(TaskQuery taskQuery, List<QueryVariable> variables) {
protected void addTaskvariables(TaskQuery taskQuery, List<QueryVariable> variables) {
for(QueryVariable variable : variables) {
if(variable.getVariableOperation() == null) {
......@@ -247,4 +251,62 @@ public class TaskBasedResource extends SecuredResource {
}
}
}
protected void addProcessvariables(TaskQuery taskQuery, 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 = variable.getValue();
if(variable.getType() != null) {
// Perform explicit conversion instead of using raw value from request
// TODO: use pluggable variable-creator based on objects and type
}
// 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) {
taskQuery.processVariableValueEquals(actualValue);
} else {
taskQuery.processVariableValueEquals(variable.getName(), actualValue);
}
break;
case EQUALS_IGNORE_CASE:
if(actualValue instanceof String) {
taskQuery.processVariableValueEqualsIgnoreCase(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:
taskQuery.processVariableValueNotEquals(variable.getName(), actualValue);
break;
case NOT_EQUALS_IGNORE_CASE:
if(actualValue instanceof String) {
taskQuery.processVariableValueNotEqualsIgnoreCase(variable.getName(), (String)actualValue);
} else {
throw new ActivitiIllegalArgumentException("Only string variable values are supported when ignoring casing, but was: " + actualValue.getClass().getName());
}
break;
default:
throw new ActivitiIllegalArgumentException("Unsupported variable query operation: " + variable.getVariableOperation());
}
}
}
}
......@@ -54,6 +54,7 @@ public class TaskQueryRequest {
private Boolean active;
private List<QueryVariable> taskVariables;
private List<QueryVariable> processVariables;
public String getName() {
return name;
......@@ -279,4 +280,13 @@ public class TaskQueryRequest {
public void setTaskVariables(List<QueryVariable> taskVariables) {
this.taskVariables = taskVariables;
}
@JsonTypeInfo(use=Id.CLASS, defaultImpl=QueryVariable.class)
public List<QueryVariable> getProcessVariables() {
return processVariables;
}
public void setProcessVariables(List<QueryVariable> processVariables) {
this.processVariables = processVariables;
}
}
......@@ -240,9 +240,12 @@ public class TaskQueryResourceTest extends BaseRestTestCase {
*/
@Deployment
public void testQueryTasksWithVariables() throws Exception {
// Task we're interested in
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
HashMap<String, Object> processVariables = new HashMap<String, Object>();
processVariables.put("stringVar", "Azerty");
processVariables.put("intVar", 67890);
processVariables.put("booleanVar", false);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", processVariables);
Task processTask = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
HashMap<String, Object> variables = new HashMap<String, Object>();
......@@ -347,5 +350,74 @@ public class TaskQueryResourceTest extends BaseRestTestCase {
assertEquals(Status.CLIENT_ERROR_BAD_REQUEST, expected.getStatus());
assertEquals("Unsupported variable query operation: operationX", expected.getStatus().getDescription());
}
// Process variables
requestNode = objectMapper.createObjectNode();
variableArray = objectMapper.createArrayNode();
variableNode = objectMapper.createObjectNode();
variableArray.add(variableNode);
requestNode.put("processVariables", variableArray);
// String equals
variableNode.put("name", "stringVar");
variableNode.put("value", "Azerty");
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// Integer equals
variableNode.removeAll();
variableNode.put("name", "intVar");
variableNode.put("value", 67890);
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// Boolean equals
variableNode.removeAll();
variableNode.put("name", "booleanVar");
variableNode.put("value", false);
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// String not equals
variableNode.removeAll();
variableNode.put("name", "stringVar");
variableNode.put("value", "ghijkl");
variableNode.put("operation", "notEquals");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// Integer not equals
variableNode.removeAll();
variableNode.put("name", "intVar");
variableNode.put("value", 45678);
variableNode.put("operation", "notEquals");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// Boolean not equals
variableNode.removeAll();
variableNode.put("name", "booleanVar");
variableNode.put("value", true);
variableNode.put("operation", "notEquals");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// String equals ignore case
variableNode.removeAll();
variableNode.put("name", "stringVar");
variableNode.put("value", "azeRTY");
variableNode.put("operation", "equalsIgnoreCase");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// String not equals ignore case
variableNode.removeAll();
variableNode.put("name", "stringVar");
variableNode.put("value", "HIJKLm");
variableNode.put("operation", "notEqualsIgnoreCase");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
// String equals without value
variableNode.removeAll();
variableNode.put("value", "Azerty");
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processTask.getId());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册