提交 4cb69727 编写于 作者: T Tijs Rademakers

Added first parts of history rest support

上级 c66a2d46
......@@ -56,7 +56,7 @@ public class UserTaskConverterTest extends AbstractConverterTest {
assertTrue(userTask.getCandidateGroups().contains("sales"));
List<FormProperty> formProperties = userTask.getFormProperties();
assertEquals(2, formProperties.size());
assertEquals(3, formProperties.size());
FormProperty formProperty = formProperties.get(0);
assertEquals("formId", formProperty.getId());
assertEquals("formName", formProperty.getName());
......@@ -69,6 +69,13 @@ public class UserTaskConverterTest extends AbstractConverterTest {
assertEquals("long", formProperty.getType());
assertTrue(StringUtils.isEmpty(formProperty.getVariable()));
assertTrue(StringUtils.isEmpty(formProperty.getExpression()));
formProperty = formProperties.get(2);
assertEquals("formId3", formProperty.getId());
assertEquals("enumName", formProperty.getName());
assertEquals("enum", formProperty.getType());
assertTrue(StringUtils.isEmpty(formProperty.getVariable()));
assertTrue(StringUtils.isEmpty(formProperty.getExpression()));
assertEquals(2, formProperty.getFormValues().size());
List<ActivitiListener> listeners = userTask.getTaskListeners();
assertEquals(3, listeners.size());
......
......@@ -9,11 +9,14 @@
<extensionElements>
<activiti:formProperty id="formId" name="formName" type="string" expression="${expression}" variable="variable"></activiti:formProperty>
<activiti:formProperty id="formId2" name="anotherName" type="long"></activiti:formProperty>
<activiti:formProperty id="formId3" name="enumName" type="enum">
<activiti:value id="test" name="Test" />
<activiti:value id="test2" name="Test2" />
</activiti:formProperty>
<activiti:taskListener event="create" class="org.test.TestClass"></activiti:taskListener>
<activiti:taskListener event="assignment" expression="${someExpression}"></activiti:taskListener>
<activiti:taskListener event="complete" delegateExpression="${someDelegateExpression}"></activiti:taskListener>
<activiti:executionListener expression="${someExpression}" event="end" />
</extensionElements>
</userTask>
</process>
......
......@@ -19,6 +19,7 @@ import java.util.Map;
import java.util.Map.Entry;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.bpmn.deployer.BpmnDeployer;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.repository.Deployment;
......@@ -44,15 +45,16 @@ import org.activiti.rest.api.engine.variable.RestVariable.RestVariableScope;
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.history.HistoricProcessInstanceResponse;
import org.activiti.rest.api.identity.RestIdentityLink;
import org.activiti.rest.api.management.TableResponse;
import org.activiti.rest.api.process.ExecutionResponse;
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;
import org.activiti.rest.api.repository.ProcessDefinitionResponse;
import org.activiti.rest.api.task.TaskResponse;
import org.activiti.rest.api.runtime.process.ExecutionResponse;
import org.activiti.rest.api.runtime.process.ProcessInstanceResponse;
import org.activiti.rest.api.runtime.task.TaskResponse;
import org.restlet.data.MediaType;
......@@ -383,6 +385,23 @@ public class RestResponseFactory {
return result;
}
public HistoricProcessInstanceResponse createHistoricProcessInstanceResponse(SecuredResource securedResource, HistoricProcessInstance processInstance) {
HistoricProcessInstanceResponse result = new HistoricProcessInstanceResponse();
result.setBusinessKey(processInstance.getBusinessKey());
result.setDeleteReason(processInstance.getDeleteReason());
result.setDurationInMillis(processInstance.getDurationInMillis());
result.setEndActivityId(processInstance.getEndActivityId());
result.setEndTime(processInstance.getEndTime());
result.setId(processInstance.getId());
result.setProcessDefinitionUrl(securedResource.createFullResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processInstance.getProcessDefinitionId()));
result.setStartActivityId(processInstance.getStartActivityId());
result.setStartTime(processInstance.getStartTime());
result.setStartUserId(processInstance.getStartUserId());
result.setSuperProcessInstanceId(processInstance.getSuperProcessInstanceId());
result.setUrl(securedResource.createFullResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()));
return result;
}
public TableResponse createTableResponse(SecuredResource securedResource, String name, Long count) {
TableResponse result = new TableResponse();
result.setName(name);
......
......@@ -47,6 +47,7 @@ public final class RestUrls {
public static final String SEGMENT_IDENTITYLINKS_FAMILY_GROUPS = "groups";
public static final String SEGMENT_IDENTITYLINKS_FAMILY_USERS = "users";
public static final String SEGMENT_VARIABLE_DATA = "data";
public static final String SEGMENT_HISTORIC_PROCESS_INSTANCE_RESOURCE = "historic-process-instances";
public static final String SEGMENT_TABLES = "tables";
/**
......@@ -228,6 +229,11 @@ public final class RestUrls {
*/
public static final String[] URL_PROCESS_INSTANCE_COMMENT = {SEGMENT_RUNTIME_RESOURCES, SEGMENT_PROCESS_INSTANCE_RESOURCE, "{0}", SEGMENT_COMMENTS, "{1}"};
/**
* URL template for historic process instance query: <i>query/historic-process-instances</i>
*/
public static final String[] URL_HISTORIC_PROCESS_INSTANCE_QUERY = {SEGMENT_QUERY_RESOURCES, SEGMENT_HISTORIC_PROCESS_INSTANCE_RESOURCE};
/**
* URL template for the collection of tables: <i>management/tables</i>
*/
......
/* 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.history;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.impl.HistoricProcessInstanceQueryProperty;
import org.activiti.engine.query.QueryProperty;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.DataResponse;
import org.activiti.rest.api.RestResponseFactory;
import org.activiti.rest.api.SecuredResource;
import org.activiti.rest.api.engine.variable.QueryVariable;
import org.activiti.rest.api.engine.variable.QueryVariable.QueryVariableOperation;
import org.activiti.rest.application.ActivitiRestServicesApplication;
import org.restlet.data.Form;
/**
* @author Tijs Rademakers
*/
public class HistoricProcessInstanceBaseResource extends SecuredResource {
private static Map<String, QueryProperty> allowedSortProperties = new HashMap<String, QueryProperty>();
static {
allowedSortProperties.put("processInstanceId", HistoricProcessInstanceQueryProperty.PROCESS_INSTANCE_ID_);
allowedSortProperties.put("processDefinitionId", HistoricProcessInstanceQueryProperty.PROCESS_DEFINITION_ID);
allowedSortProperties.put("businessKey", HistoricProcessInstanceQueryProperty.BUSINESS_KEY);
allowedSortProperties.put("startTime", HistoricProcessInstanceQueryProperty.START_TIME);
allowedSortProperties.put("endTime", HistoricProcessInstanceQueryProperty.END_TIME);
allowedSortProperties.put("duration", HistoricProcessInstanceQueryProperty.DURATION);
}
protected DataResponse getQueryResponse(HistoricProcessInstanceQueryRequest queryRequest, Form urlQuery) {
HistoricProcessInstanceQuery query = ActivitiUtil.getHistoryService().createHistoricProcessInstanceQuery();
// 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.getSuperProcessInstanceId() != null) {
query.superProcessInstanceId(queryRequest.getSuperProcessInstanceId());
}
if (queryRequest.getFinishedAfter() != null) {
query.finishedAfter(queryRequest.getFinishedAfter());
}
if (queryRequest.getFinishedBefore() != null) {
query.finishedBefore(queryRequest.getFinishedBefore());
}
if (queryRequest.getStartedAfter() != null) {
query.startedAfter(queryRequest.getStartedAfter());
}
if (queryRequest.getStartedBefore() != null) {
query.startedBefore(queryRequest.getStartedBefore());
}
if (queryRequest.getStartedBy() != null) {
query.startedBy(queryRequest.getStartedBy());
}
if (queryRequest.getFinished() != null) {
if (queryRequest.getFinished()) {
query.finished();
} else {
query.unfinished();
}
}
if (queryRequest.getVariables() != null) {
addVariables(query, queryRequest.getVariables());
}
return new HistoricProcessInstancePaginateList(this).paginateList(urlQuery, query, "processInstanceId", allowedSortProperties);
}
protected void addVariables(HistoricProcessInstanceQuery processInstanceQuery, List<QueryVariable> variables) {
RestResponseFactory responseFactory = getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory();
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 = responseFactory.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 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 GREATER_THAN:
processInstanceQuery.variableValueGreaterThan(variable.getName(), actualValue);
case GREATER_THAN_OR_EQUALS:
processInstanceQuery.variableValueGreaterThanOrEqual(variable.getName(), actualValue);
case LESS_THAN:
processInstanceQuery.variableValueLessThan(variable.getName(), actualValue);
case LESS_THAN_OR_EQUALS:
processInstanceQuery.variableValueLessThanOrEqual(variable.getName(), actualValue);
default:
throw new ActivitiIllegalArgumentException("Unsupported variable query operation: " + variable.getVariableOperation());
}
}
}
}
/* 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.history;
import org.activiti.rest.api.DataResponse;
import org.restlet.data.Form;
import org.restlet.resource.Get;
/**
* @author Tijs Rademakers
*/
public class HistoricProcessInstanceCollectionResource extends HistoricProcessInstanceBaseResource {
@Get
public DataResponse getHistoricProcessInstances() {
if(!authenticate()) {
return null;
}
Form urlQuery = getQuery();
// Populate query based on request
HistoricProcessInstanceQueryRequest queryRequest = new HistoricProcessInstanceQueryRequest();
if(getQueryParameter("processInstanceId", urlQuery) != null) {
queryRequest.setProcessInstanceId(getQueryParameter("processInstanceId", 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("finished", urlQuery) != null) {
queryRequest.setFinished(getQueryParameterAsBoolean("finished", urlQuery));
}
if(getQueryParameter("superProcessInstanceId", urlQuery) != null) {
queryRequest.setSuperProcessInstanceId(getQueryParameter("superProcessInstanceId", urlQuery));
}
if(getQueryParameter("finishedAfter", urlQuery) != null) {
queryRequest.setFinishedAfter(getQueryParameterAsDate("finishedAfter", urlQuery));
}
if(getQueryParameter("finishedBefore", urlQuery) != null) {
queryRequest.setFinishedBefore(getQueryParameterAsDate("finishedBefore", urlQuery));
}
if(getQueryParameter("startedAfter", urlQuery) != null) {
queryRequest.setStartedAfter(getQueryParameterAsDate("startedAfter", urlQuery));
}
if(getQueryParameter("startedBefore", urlQuery) != null) {
queryRequest.setStartedBefore(getQueryParameterAsDate("startedBefore", urlQuery));
}
if(getQueryParameter("startedBy", urlQuery) != null) {
queryRequest.setStartedBy(getQueryParameter("startedBy", urlQuery));
}
return getQueryResponse(queryRequest, urlQuery);
}
}
/* 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.history;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.history.HistoricProcessInstance;
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 Tijs Rademakers
*/
public class HistoricProcessInstancePaginateList extends AbstractPaginateList {
private SecuredResource resource;
public HistoricProcessInstancePaginateList(SecuredResource resource) {
this.resource = resource;
}
@SuppressWarnings("rawtypes")
@Override
protected List processList(List list) {
List<HistoricProcessInstanceResponse> responseList = new ArrayList<HistoricProcessInstanceResponse>();
RestResponseFactory restResponseFactory = resource.getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory();
for (Object instance : list) {
responseList.add(restResponseFactory.createHistoricProcessInstanceResponse(resource, (HistoricProcessInstance) 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.history;
import java.util.Date;
import java.util.List;
import org.activiti.rest.api.engine.variable.QueryVariable;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
/**
* @author Tijs Rademakers
*/
public class HistoricProcessInstanceQueryRequest {
private String processInstanceId;
private String processBusinessKey;
private String processDefinitionId;
private String processDefinitionKey;
private String superProcessInstanceId;
private Boolean finished;
private String involvedUser;
private Date finishedAfter;
private Date finishedBefore;
private Date startedAfter;
private Date startedBefore;
private String startedBy;
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 Boolean getFinished() {
return finished;
}
public void setFinished(Boolean finished) {
this.finished = finished;
}
public String getInvolvedUser() {
return involvedUser;
}
public void setInvolvedUser(String involvedUser) {
this.involvedUser = involvedUser;
}
public Date getFinishedAfter() {
return finishedAfter;
}
public void setFinishedAfter(Date finishedAfter) {
this.finishedAfter = finishedAfter;
}
public Date getFinishedBefore() {
return finishedBefore;
}
public void setFinishedBefore(Date finishedBefore) {
this.finishedBefore = finishedBefore;
}
public Date getStartedAfter() {
return startedAfter;
}
public void setStartedAfter(Date startedAfter) {
this.startedAfter = startedAfter;
}
public Date getStartedBefore() {
return startedBefore;
}
public void setStartedBefore(Date startedBefore) {
this.startedBefore = startedBefore;
}
public String getStartedBy() {
return startedBy;
}
public void setStartedBy(String startedBy) {
this.startedBy = startedBy;
}
@JsonTypeInfo(use=Id.CLASS, defaultImpl=QueryVariable.class)
public List<QueryVariable> getVariables() {
return variables;
}
public void setVariables(List<QueryVariable> variables) {
this.variables = variables;
}
}
/* 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.history;
import org.activiti.rest.api.DataResponse;
import org.restlet.resource.Post;
/**
* @author Tijs Rademakers
*/
public class HistoricProcessInstanceQueryResource extends HistoricProcessInstanceBaseResource {
@Post
public DataResponse queryProcessInstances(HistoricProcessInstanceQueryRequest queryRequest) {
return getQueryResponse(queryRequest, getQuery());
}
}
/* 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.history;
import java.util.Date;
/**
* @author Tijs Rademakers
*/
public class HistoricProcessInstanceResponse {
protected String id;
protected String url;
protected String businessKey;
protected String processDefinitionUrl;
protected Date startTime;
protected Date endTime;
protected Long durationInMillis;
protected String startUserId;
protected String startActivityId;
protected String endActivityId;
protected String deleteReason;
protected String superProcessInstanceId;
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 String getProcessDefinitionUrl() {
return processDefinitionUrl;
}
public void setProcessDefinitionUrl(String processDefinitionUrl) {
this.processDefinitionUrl = processDefinitionUrl;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public Long getDurationInMillis() {
return durationInMillis;
}
public void setDurationInMillis(Long durationInMillis) {
this.durationInMillis = durationInMillis;
}
public String getStartUserId() {
return startUserId;
}
public void setStartUserId(String startUserId) {
this.startUserId = startUserId;
}
public String getStartActivityId() {
return startActivityId;
}
public void setStartActivityId(String startActivityId) {
this.startActivityId = startActivityId;
}
public String getEndActivityId() {
return endActivityId;
}
public void setEndActivityId(String endActivityId) {
this.endActivityId = endActivityId;
}
public String getDeleteReason() {
return deleteReason;
}
public void setDeleteReason(String deleteReason) {
this.deleteReason = deleteReason;
}
public String getSuperProcessInstanceId() {
return superProcessInstanceId;
}
public void setSuperProcessInstanceId(String superProcessInstanceId) {
this.superProcessInstanceId = superProcessInstanceId;
}
}
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.HashMap;
import java.util.List;
......@@ -36,7 +36,7 @@ import org.restlet.data.Form;
/**
* @author Frederik Heremans
*/
public class ExecutionBasedResource extends SecuredResource {
public class ExecutionBaseResource extends SecuredResource {
private static Map<String, QueryProperty> allowedSortProperties = new HashMap<String, QueryProperty>();
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.engine.ActivitiIllegalArgumentException;
......@@ -25,7 +25,7 @@ import org.restlet.resource.Put;
/**
* @author Frederik Heremans
*/
public class ExecutionCollectionResource extends ExecutionBasedResource {
public class ExecutionCollectionResource extends ExecutionBaseResource {
@Get
public DataResponse getProcessInstances() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.ArrayList;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.rest.api.DataResponse;
import org.restlet.resource.Post;
......@@ -21,7 +21,7 @@ import org.restlet.resource.Post;
/**
* @author Frederik Heremans
*/
public class ExecutionQueryResource extends ExecutionBasedResource {
public class ExecutionQueryResource extends ExecutionBaseResource {
@Post
public DataResponse queryProcessInstances(ExecutionQueryRequest queryRequest) {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.engine.ActivitiIllegalArgumentException;
......@@ -26,7 +26,7 @@ import org.restlet.resource.Put;
/**
* @author Frederik Heremans
*/
public class ExecutionResource extends ExecutionBasedResource {
public class ExecutionResource extends ExecutionBaseResource {
@Get
public ExecutionResponse getExecution() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
/**
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.io.IOException;
import java.util.ArrayList;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.io.IOException;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.List;
import java.util.Map;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.rest.api.RestActionRequest;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.HashMap;
import java.util.List;
......@@ -33,7 +33,7 @@ import org.restlet.data.Form;
/**
* @author Frederik Heremans
*/
public class ProcessInstanceBasedResource extends SecuredResource {
public class ProcessInstanceBaseResource extends SecuredResource {
private static Map<String, QueryProperty> allowedSortProperties = new HashMap<String, QueryProperty>();
......@@ -75,6 +75,9 @@ public class ProcessInstanceBasedResource extends SecuredResource {
if (queryRequest.getSuperProcessInstanceId() != null) {
query.superProcessInstanceId(queryRequest.getSuperProcessInstanceId());
}
if (queryRequest.getVariables() != null) {
addVariables(query, queryRequest.getVariables());
}
return new ProcessInstancePaginateList(this).paginateList(urlQuery, query, "id", allowedSortProperties);
}
......@@ -130,6 +133,28 @@ public class ProcessInstanceBasedResource extends SecuredResource {
+ 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 GREATER_THAN:
processInstanceQuery.variableValueGreaterThan(variable.getName(), actualValue);
case GREATER_THAN_OR_EQUALS:
processInstanceQuery.variableValueGreaterThanOrEqual(variable.getName(), actualValue);
case LESS_THAN:
processInstanceQuery.variableValueLessThan(variable.getName(), actualValue);
case LESS_THAN_OR_EQUALS:
processInstanceQuery.variableValueLessThanOrEqual(variable.getName(), actualValue);
default:
throw new ActivitiIllegalArgumentException("Unsupported variable query operation: " + variable.getVariableOperation());
}
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.HashMap;
......@@ -34,7 +34,7 @@ import org.restlet.resource.Post;
/**
* @author Frederik Heremans
*/
public class ProcessInstanceCollectionResource extends ProcessInstanceBasedResource {
public class ProcessInstanceCollectionResource extends ProcessInstanceBaseResource {
@Get
public DataResponse getProcessInstances() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.io.InputStream;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.ArrayList;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.rest.api.DataResponse;
import org.restlet.resource.Post;
......@@ -21,7 +21,7 @@ import org.restlet.resource.Post;
/**
* @author Frederik Heremans
*/
public class ProcessInstanceQueryResource extends ProcessInstanceBasedResource {
public class ProcessInstanceQueryResource extends ProcessInstanceBaseResource {
@Post
public DataResponse queryProcessInstances(ProcessInstanceQueryRequest queryRequest) {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
/**
* @author Frederik Heremans
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.HashMap;
import java.util.Map;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.List;
import java.util.Map;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import java.util.Map;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.process;
package org.activiti.rest.api.runtime.process;
import org.activiti.engine.runtime.ProcessInstance;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.io.IOException;
import java.util.ArrayList;
......@@ -40,7 +40,7 @@ import org.restlet.resource.ResourceException;
/**
* @author Frederik Heremans
*/
public class TaskAttachmentCollectionResource extends TaskBasedResource {
public class TaskAttachmentCollectionResource extends TaskBaseResource {
@Get
public List<AttachmentResponse> getAttachments() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.io.InputStream;
......@@ -28,7 +28,7 @@ import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class TaskAttachmentContentResource extends TaskBasedResource {
public class TaskAttachmentContentResource extends TaskBaseResource {
@Get
public InputRepresentation getAttachmentContent() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
......@@ -29,7 +29,7 @@ import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class TaskAttachmentResource extends TaskBasedResource {
public class TaskAttachmentResource extends TaskBaseResource {
@Get
public AttachmentResponse getAttachment() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.HashMap;
import java.util.List;
......@@ -38,7 +38,7 @@ import org.restlet.data.Form;
*
* @author Frederik Heremans
*/
public class TaskBasedResource extends SecuredResource {
public class TaskBaseResource extends SecuredResource {
private static HashMap<String, QueryProperty> properties = new HashMap<String, QueryProperty>();
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import org.activiti.engine.task.Task;
import org.activiti.rest.api.ActivitiUtil;
......@@ -26,7 +26,7 @@ import org.restlet.resource.ResourceException;
/**
* @author Frederik Heremans
*/
public class TaskCollectionResource extends TaskBasedResource {
public class TaskCollectionResource extends TaskBaseResource {
@Post
public TaskResponse createTask(TaskRequest taskRequest) {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.ArrayList;
import java.util.List;
......@@ -31,7 +31,7 @@ import org.restlet.resource.Post;
/**
* @author Frederik Heremans
*/
public class TaskCommentCollectionResource extends TaskBasedResource {
public class TaskCommentCollectionResource extends TaskBaseResource {
@Get
public List<CommentResponse> getComments() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
......@@ -28,7 +28,7 @@ import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class TaskCommentResource extends TaskBasedResource {
public class TaskCommentResource extends TaskBaseResource {
@Get
public CommentResponse getComment() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.ArrayList;
import java.util.List;
......@@ -28,7 +28,7 @@ import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class TaskEventCollectionResource extends TaskBasedResource {
public class TaskEventCollectionResource extends TaskBaseResource {
@Get
public List<EventResponse> getEvents() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
......@@ -29,7 +29,7 @@ import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class TaskEventResource extends TaskBasedResource {
public class TaskEventResource extends TaskBaseResource {
@Get
public EventResponse getComment() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.ArrayList;
import java.util.List;
......@@ -31,7 +31,7 @@ import org.restlet.resource.Post;
/**
* @author Frederik Heremans
*/
public class TaskIdentityLinkCollectionResource extends TaskBasedResource {
public class TaskIdentityLinkCollectionResource extends TaskBaseResource {
@Get
public List<RestIdentityLink> getIdentityLinks() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.ArrayList;
import java.util.List;
......@@ -33,7 +33,7 @@ import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class TaskIdentityLinkFamilyResource extends TaskBasedResource {
public class TaskIdentityLinkFamilyResource extends TaskBaseResource {
@Get
public List<RestIdentityLink> getIdentityLinksForFamily() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.List;
......@@ -31,7 +31,7 @@ import org.restlet.resource.Get;
/**
* @author Frederik Heremans
*/
public class TaskIdentityLinkResource extends TaskBasedResource {
public class TaskIdentityLinkResource extends TaskBaseResource {
@Get
public RestIdentityLink getIdentityLink() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.ArrayList;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.Date;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import org.activiti.rest.api.DataResponse;
import org.restlet.resource.Post;
......@@ -20,7 +20,7 @@ import org.restlet.resource.Post;
/**
* @author Frederik Heremans
*/
public class TaskQueryResource extends TaskBasedResource {
public class TaskQueryResource extends TaskBaseResource {
@Post
public DataResponse getQueryResult(TaskQueryRequest request) {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.Date;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.HashMap;
import java.util.Map;
......@@ -32,7 +32,7 @@ import org.restlet.resource.ResourceException;
/**
* @author Frederik Heremans
*/
public class TaskResource extends TaskBasedResource {
public class TaskResource extends TaskBaseResource {
@Get
public TaskResponse getTask() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.util.Date;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
......@@ -40,7 +40,7 @@ import org.restlet.resource.ResourceException;
/**
* @author Frederik Heremans
*/
public class BaseTaskVariableResource extends TaskBasedResource {
public class TaskVariableBaseResource extends TaskBaseResource {
public RestVariable getVariableFromRequest(boolean includeBinary) {
String taskId = getAttribute("taskId");
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.io.IOException;
import java.util.ArrayList;
......@@ -39,7 +39,7 @@ import org.restlet.resource.ResourceException;
/**
* @author Frederik Heremans
*/
public class TaskVariableCollectionResource extends BaseTaskVariableResource {
public class TaskVariableCollectionResource extends TaskVariableBaseResource {
@Get
public List<RestVariable> getVariables() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
......@@ -30,7 +30,7 @@ import org.restlet.resource.ResourceException;
/**
* @author Frederik Heremans
*/
public class TaskVariableDataResource extends BaseTaskVariableResource {
public class TaskVariableDataResource extends TaskVariableBaseResource {
@Get
public InputRepresentation getVariableData() {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.runtime.task;
import java.io.IOException;
......@@ -34,7 +34,7 @@ import org.restlet.resource.ResourceException;
/**
* @author Frederik Heremans
*/
public class TaskVariableResource extends BaseTaskVariableResource {
public class TaskVariableResource extends TaskVariableBaseResource {
@Get
public RestVariable getVariable() {
......
......@@ -2,6 +2,7 @@ package org.activiti.rest.application;
import org.activiti.rest.api.engine.ProcessEngineResource;
import org.activiti.rest.api.history.HistoricFormPropertiesResource;
import org.activiti.rest.api.history.HistoricProcessInstanceQueryResource;
import org.activiti.rest.api.identity.GroupCreateResource;
import org.activiti.rest.api.identity.GroupResource;
import org.activiti.rest.api.identity.GroupSearchResource;
......@@ -41,26 +42,6 @@ import org.activiti.rest.api.legacy.process.ProcessDefinitionsResource;
import org.activiti.rest.api.legacy.task.LegacyTaskResource;
import org.activiti.rest.api.management.TableCollectionResource;
import org.activiti.rest.api.management.TableResource;
import org.activiti.rest.api.process.ExecutionCollectionResource;
import org.activiti.rest.api.process.ExecutionQueryResource;
import org.activiti.rest.api.process.ExecutionResource;
import org.activiti.rest.api.process.ExecutionVariableCollectionResource;
import org.activiti.rest.api.process.ExecutionVariableDataResource;
import org.activiti.rest.api.process.ExecutionVariableResource;
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.ProcessInstanceQueryResource;
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.ProcessInstanceVariableCollectionResource;
import org.activiti.rest.api.process.ProcessInstanceVariableDataResource;
import org.activiti.rest.api.process.ProcessInstanceVariableResource;
import org.activiti.rest.api.process.SignalEventSubscriptionResource;
import org.activiti.rest.api.process.StartProcessInstanceResource;
import org.activiti.rest.api.repository.DeploymentCollectionResource;
import org.activiti.rest.api.repository.DeploymentResource;
import org.activiti.rest.api.repository.DeploymentResourceCollectionResource;
......@@ -69,22 +50,42 @@ import org.activiti.rest.api.repository.DeploymentResourceResource;
import org.activiti.rest.api.repository.ProcessDefinitionCollectionResource;
import org.activiti.rest.api.repository.ProcessDefinitionResource;
import org.activiti.rest.api.repository.SimpleWorkflowResource;
import org.activiti.rest.api.task.TaskAttachmentCollectionResource;
import org.activiti.rest.api.task.TaskAttachmentContentResource;
import org.activiti.rest.api.task.TaskAttachmentResource;
import org.activiti.rest.api.task.TaskCollectionResource;
import org.activiti.rest.api.task.TaskCommentCollectionResource;
import org.activiti.rest.api.task.TaskCommentResource;
import org.activiti.rest.api.task.TaskEventCollectionResource;
import org.activiti.rest.api.task.TaskEventResource;
import org.activiti.rest.api.task.TaskIdentityLinkCollectionResource;
import org.activiti.rest.api.task.TaskIdentityLinkFamilyResource;
import org.activiti.rest.api.task.TaskIdentityLinkResource;
import org.activiti.rest.api.task.TaskQueryResource;
import org.activiti.rest.api.task.TaskResource;
import org.activiti.rest.api.task.TaskVariableCollectionResource;
import org.activiti.rest.api.task.TaskVariableDataResource;
import org.activiti.rest.api.task.TaskVariableResource;
import org.activiti.rest.api.runtime.process.ExecutionCollectionResource;
import org.activiti.rest.api.runtime.process.ExecutionQueryResource;
import org.activiti.rest.api.runtime.process.ExecutionResource;
import org.activiti.rest.api.runtime.process.ExecutionVariableCollectionResource;
import org.activiti.rest.api.runtime.process.ExecutionVariableDataResource;
import org.activiti.rest.api.runtime.process.ExecutionVariableResource;
import org.activiti.rest.api.runtime.process.ProcessDefinitionDiagramResource;
import org.activiti.rest.api.runtime.process.ProcessDefinitionFormResource;
import org.activiti.rest.api.runtime.process.ProcessDefinitionPropertiesResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceCollectionResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceDiagramResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceQueryResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceSignalExecutionResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceTaskResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceVariableCollectionResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceVariableDataResource;
import org.activiti.rest.api.runtime.process.ProcessInstanceVariableResource;
import org.activiti.rest.api.runtime.process.SignalEventSubscriptionResource;
import org.activiti.rest.api.runtime.process.StartProcessInstanceResource;
import org.activiti.rest.api.runtime.task.TaskAttachmentCollectionResource;
import org.activiti.rest.api.runtime.task.TaskAttachmentContentResource;
import org.activiti.rest.api.runtime.task.TaskAttachmentResource;
import org.activiti.rest.api.runtime.task.TaskCollectionResource;
import org.activiti.rest.api.runtime.task.TaskCommentCollectionResource;
import org.activiti.rest.api.runtime.task.TaskCommentResource;
import org.activiti.rest.api.runtime.task.TaskEventCollectionResource;
import org.activiti.rest.api.runtime.task.TaskEventResource;
import org.activiti.rest.api.runtime.task.TaskIdentityLinkCollectionResource;
import org.activiti.rest.api.runtime.task.TaskIdentityLinkFamilyResource;
import org.activiti.rest.api.runtime.task.TaskIdentityLinkResource;
import org.activiti.rest.api.runtime.task.TaskQueryResource;
import org.activiti.rest.api.runtime.task.TaskResource;
import org.activiti.rest.api.runtime.task.TaskVariableCollectionResource;
import org.activiti.rest.api.runtime.task.TaskVariableDataResource;
import org.activiti.rest.api.runtime.task.TaskVariableResource;
import org.restlet.routing.Router;
@SuppressWarnings("deprecation")
......@@ -136,6 +137,7 @@ public class RestServicesInit {
router.attach("/query/tasks", TaskQueryResource.class);
router.attach("/query/process-instances", ProcessInstanceQueryResource.class);
router.attach("/query/executions", ExecutionQueryResource.class);
router.attach("/query/historic-process-instances", HistoricProcessInstanceQueryResource.class);
// Old rest-urls
router.attach("/process-engine", ProcessEngineResource.class);
......
......@@ -367,7 +367,10 @@ public class BaseRestTestCase extends PvmTestCase {
* contains entries with the given ID's.
*/
protected void assertResultsPresentInDataResponse(String url, ObjectNode body, String... expectedResourceIds) throws JsonProcessingException, IOException {
int numberOfResultsExpected = expectedResourceIds.length;
int numberOfResultsExpected = 0;
if (expectedResourceIds != null) {
numberOfResultsExpected = expectedResourceIds.length;
}
// Do the actual call
ClientResource client = getAuthenticatedClient(url);
......@@ -379,13 +382,33 @@ public class BaseRestTestCase extends PvmTestCase {
assertEquals(numberOfResultsExpected, dataNode.size());
// Check presence of ID's
List<String> toBeFound = new ArrayList<String>(Arrays.asList(expectedResourceIds));
Iterator<JsonNode> it = dataNode.iterator();
while(it.hasNext()) {
String id = it.next().get("id").getTextValue();
toBeFound.remove(id);
if (expectedResourceIds != null) {
List<String> toBeFound = new ArrayList<String>(Arrays.asList(expectedResourceIds));
Iterator<JsonNode> it = dataNode.iterator();
while(it.hasNext()) {
String id = it.next().get("id").getTextValue();
toBeFound.remove(id);
}
assertTrue("Not all entries have been found in result, missing: " + StringUtils.join(toBeFound, ", "), toBeFound.isEmpty());
}
client.release();
}
/**
* Checks if the rest operation returns an error as expected
*/
protected void assertErrorResult(String url, ObjectNode body, Status status) throws IOException {
// Do the actual call
ClientResource client = getAuthenticatedClient(url);
try {
client.post(body);
fail();
} catch(Exception e) {
// Check status
assertEquals(status, client.getResponse().getStatus());
}
assertTrue("Not all entries have been found in result, missing: " + StringUtils.join(toBeFound, ", "), toBeFound.isEmpty());
client.release();
}
......
/* 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.history;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
import org.activiti.rest.BaseRestTestCase;
import org.activiti.rest.api.RestUrls;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
import org.restlet.data.Status;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
/**
* Test for REST-operation related to the historic process instance query resource.
*
* @author Tijs Rademakers
*/
public class HistoricProcessInstanceQueryResourceTest extends BaseRestTestCase {
/**
* Test querying process instance based on variables.
* POST query/process-instances
*/
@Deployment
public void testQueryProcessInstancesWithVariables() throws Exception {
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 task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.complete(task.getId());
ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("oneTaskProcess", processVariables);
String url = RestUrls.createRelativeResourceUrl(RestUrls.URL_HISTORIC_PROCESS_INSTANCE_QUERY);
// Process variables
ObjectNode requestNode = objectMapper.createObjectNode();
ArrayNode variableArray = objectMapper.createArrayNode();
ObjectNode variableNode = objectMapper.createObjectNode();
variableArray.add(variableNode);
requestNode.put("variables", variableArray);
// String equals
variableNode.put("name", "stringVar");
variableNode.put("value", "Azerty");
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// Integer equals
variableNode.removeAll();
variableNode.put("name", "intVar");
variableNode.put("value", 67890);
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// Boolean equals
variableNode.removeAll();
variableNode.put("name", "booleanVar");
variableNode.put("value", false);
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// String not equals
variableNode.removeAll();
variableNode.put("name", "stringVar");
variableNode.put("value", "ghijkl");
variableNode.put("operation", "notEquals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// Integer not equals
variableNode.removeAll();
variableNode.put("name", "intVar");
variableNode.put("value", 45678);
variableNode.put("operation", "notEquals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// Boolean not equals
variableNode.removeAll();
variableNode.put("name", "booleanVar");
variableNode.put("value", true);
variableNode.put("operation", "notEquals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// String equals ignore case
variableNode.removeAll();
variableNode.put("name", "stringVar");
variableNode.put("value", "azeRTY");
variableNode.put("operation", "equalsIgnoreCase");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// String not equals ignore case (not supported)
variableNode.removeAll();
variableNode.put("name", "stringVar");
variableNode.put("value", "HIJKLm");
variableNode.put("operation", "notEqualsIgnoreCase");
assertErrorResult(url, requestNode, Status.CLIENT_ERROR_BAD_REQUEST);
// String equals without value
variableNode.removeAll();
variableNode.put("value", "Azerty");
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
// String equals with non existing value
variableNode.removeAll();
variableNode.put("value", "Azerty2");
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode);
requestNode = objectMapper.createObjectNode();
requestNode.put("finished", true);
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId());
requestNode = objectMapper.createObjectNode();
requestNode.put("finished", false);
assertResultsPresentInDataResponse(url, requestNode, processInstance2.getId());
requestNode = objectMapper.createObjectNode();
requestNode.put("processDefinitionId", processInstance.getProcessDefinitionId());
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
requestNode = objectMapper.createObjectNode();
requestNode.put("processDefinitionKey", "oneTaskProcess");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId(), processInstance2.getId());
requestNode = objectMapper.createObjectNode();
requestNode.put("processDefinitionKey", "oneTaskProcess");
ClientResource client = getAuthenticatedClient(url + "?sort=startTime");
Representation response = client.post(requestNode);
// Check status and size
assertEquals(Status.SUCCESS_OK, client.getResponse().getStatus());
JsonNode dataNode = objectMapper.readTree(response.getStream()).get("data");
assertEquals(2, dataNode.size());
assertEquals(processInstance.getId(), dataNode.get(0).get("id").asText());
assertEquals(processInstance2.getId(), dataNode.get(1).get("id").asText());
}
}
......@@ -113,5 +113,11 @@ public class ProcessInstanceQueryResourceTest extends BaseRestTestCase {
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode, processInstance.getId());
// String equals with non existing value
variableNode.removeAll();
variableNode.put("value", "Azerty2");
variableNode.put("operation", "equals");
assertResultsPresentInDataResponse(url, requestNode);
}
}
<?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="oneTaskProcess" 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="theEnd" />
<endEvent id="theEnd" />
</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.
先完成此消息的编辑!
想要评论请 注册