提交 b79e02e3 编写于 作者: F Frederik Heremans

Added single task REST-resource and test

上级 ea46e5ed
......@@ -17,10 +17,12 @@ 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.task.Task;
import org.activiti.rest.api.repository.DeploymentResourceResponse;
import org.activiti.rest.api.repository.ProcessDefinitionResponse;
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.restlet.data.MediaType;
......@@ -31,6 +33,27 @@ import org.restlet.data.MediaType;
*/
public class RestResponseFactory {
public TaskResponse createTaskReponse(SecuredResource resourceContext, Task task) {
TaskResponse response = new TaskResponse(task);
response.setUrl(resourceContext.createFullResourceUrl(RestUrls.URL_TASK, task.getId()));
// Add references to other resources, if needed
if(task.getParentTaskId() != null) {
response.setParentTask(resourceContext.createFullResourceUrl(RestUrls.URL_TASK, task.getParentTaskId()));
}
if(task.getProcessDefinitionId() != null) {
response.setProcessDefinition(resourceContext.createFullResourceUrl(RestUrls.URL_PROCESS_DEFINITION, task.getProcessDefinitionId()));
}
if(task.getExecutionId() != null) {
response.setExecution(resourceContext.createFullResourceUrl(RestUrls.URL_EXECUTION, task.getExecutionId()));
}
if(task.getProcessInstanceId() != null) {
response.setProcessInstance(resourceContext.createFullResourceUrl(RestUrls.URL_PROCESS_INSTANCE, task.getProcessInstanceId()));
}
return response;
}
public DeploymentResponse createDeploymentResponse(SecuredResource resourceContext, Deployment deployment) {
return new DeploymentResponse(deployment, resourceContext.createFullResourceUrl(RestUrls.URL_DEPLOYMENT, deployment.getId()));
}
......
......@@ -32,6 +32,11 @@ public final class RestUrls {
public static final String SEGMENT_DEPLOYMENT_ARTIFACT_RESOURCE = "resources";
public static final String SEGMENT_DEPLOYMENT_ARTIFACT_RESOURCE_CONTENT = "resourcedata";
public static final String SEGMENT_RUNTIME_RESOURCES = "runtime";
public static final String SEGMENT_TASK_RESOURCE = "tasks";
public static final String SEGMENT_EXECUTION_RESOURCE = "executions";
public static final String SEGMENT_PROCESS_INSTANCE_RESOURCE = "process-instances";
/**
* URL template for the deployment collection: <i>repository/deployments</i>
*/
......@@ -80,4 +85,35 @@ public final class RestUrls {
*/
public static final String[] URL_PROCESS_DEFINITION = {SEGMENT_REPOSITORY_RESOURCES, SEGMENT_PROCESS_DEFINITION_RESOURCE, "{0}"};
/**
* URL template for task collection: <i>runtime/tasks/{0:taskId}</i>
*/
public static final String[] URL_TASK_COLLECTION = {SEGMENT_RUNTIME_RESOURCES, SEGMENT_TASK_RESOURCE};
/**
* URL template for a single task: <i>runtime/tasks/{0:taskId}</i>
*/
public static final String[] URL_TASK = {SEGMENT_RUNTIME_RESOURCES, SEGMENT_TASK_RESOURCE, "{0}"};
/**
* URL template for execution collection: <i>runtime/executions/{0:executionId}</i>
*/
public static final String[] URL_EXECUTION_COLLECTION = {SEGMENT_RUNTIME_RESOURCES, SEGMENT_EXECUTION_RESOURCE};
/**
* URL template for a single execution: <i>runtime/executions/{0:executionId}</i>
*/
public static final String[] URL_EXECUTION = {SEGMENT_RUNTIME_RESOURCES, SEGMENT_EXECUTION_RESOURCE, "{0}"};
/**
* URL template for process instance collection: <i>runtime/process-instances/{0:processInstanceId}</i>
*/
public static final String[] URL_PROCESS_INSTANCE_COLLECTION = {SEGMENT_RUNTIME_RESOURCES, SEGMENT_PROCESS_INSTANCE_RESOURCE};
/**
* URL template for a single process instance: <i>runtime/process-instances/{0:processInstanceId}</i>
*/
public static final String[] URL_PROCESS_INSTANCE = {SEGMENT_RUNTIME_RESOURCES, SEGMENT_PROCESS_INSTANCE_RESOURCE, "{0}"};
}
/* 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.task;
import java.util.List;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.task.Attachment;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.RequestUtil;
import org.activiti.rest.api.SecuredResource;
import org.activiti.rest.api.legacy.AttachmentResponse;
import org.activiti.rest.api.legacy.IdentityLinkResponse;
import org.activiti.rest.api.legacy.SubTaskResponse;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.restlet.representation.Representation;
import org.restlet.resource.Delete;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
/**
* @author Tijs Rademakers
*/
@Deprecated
public class LegacyTaskResource extends SecuredResource {
@Get
public LegacyTaskResponse getTask() {
if(authenticate() == false) return null;
String taskId = (String) getRequest().getAttributes().get("taskId");
Task task = ActivitiUtil.getTaskService().createTaskQuery().taskId(taskId).singleResult();
if(task == null) {
throw new ActivitiObjectNotFoundException("Task not found for id " + taskId, Task.class);
}
LegacyTaskResponse response = new LegacyTaskResponse(task);
TaskFormData taskFormData = ActivitiUtil.getFormService().getTaskFormData(taskId);
if(taskFormData != null) {
response.setFormResourceKey(taskFormData.getFormKey());
}
List<Task> subTaskList = ActivitiUtil.getTaskService().getSubTasks(task.getId());
if(subTaskList != null) {
for (Task subTask : subTaskList) {
SubTaskResponse subTaskResponse = new SubTaskResponse(subTask);
response.addSubTask(subTaskResponse);
}
}
List<IdentityLink> linkList = ActivitiUtil.getTaskService().getIdentityLinksForTask(task.getId());
if(linkList != null) {
for (IdentityLink identityLink : linkList) {
IdentityLinkResponse linkResponse = new IdentityLinkResponse(identityLink);
response.addIdentityLink(linkResponse);
}
}
List<Attachment> attachmentList = null;
if(task.getProcessInstanceId() != null && task.getProcessInstanceId().length() > 0) {
attachmentList = ActivitiUtil.getTaskService().getProcessInstanceAttachments(task.getProcessInstanceId());
} else {
attachmentList = ActivitiUtil.getTaskService().getTaskAttachments(task.getId());
}
if(attachmentList != null) {
for (Attachment attachment : attachmentList) {
AttachmentResponse attachmentResponse = new AttachmentResponse(attachment);
response.addAttachment(attachmentResponse);
}
}
return response;
}
@Post
public LegacyTaskResponse updateTask(Representation entity) {
if(authenticate() == false) return null;
String taskId = (String) getRequest().getAttributes().get("taskId");
Task task = ActivitiUtil.getTaskService().createTaskQuery().taskId(taskId).singleResult();
if(task == null) {
throw new ActivitiObjectNotFoundException("Task not found for id " + taskId, Task.class);
}
try {
String taskParams = entity.getText();
JsonNode taskJSON = new ObjectMapper().readTree(taskParams);
String description = null;
if(taskJSON.path("description") != null && taskJSON.path("description").getTextValue() != null) {
description = taskJSON.path("description").getTextValue();
task.setDescription(description);
}
String assignee = null;
if(taskJSON.path("assignee") != null && taskJSON.path("assignee").getTextValue() != null) {
assignee = taskJSON.path("assignee").getTextValue();
task.setAssignee(assignee);
}
String owner = null;
if(taskJSON.path("owner") != null && taskJSON.path("owner").getTextValue() != null) {
owner = taskJSON.path("owner").getTextValue();
task.setOwner(owner);
}
String priority = null;
if(taskJSON.path("priority") != null && taskJSON.path("priority").getTextValue() != null) {
priority = taskJSON.path("priority").getTextValue();
task.setPriority(RequestUtil.parseToInteger(priority));
}
String dueDate = null;
if(taskJSON.path("dueDate") != null && taskJSON.path("dueDate").getTextValue() != null) {
dueDate = taskJSON.path("dueDate").getTextValue();
task.setDueDate(RequestUtil.parseToDate(dueDate));
}
ActivitiUtil.getTaskService().saveTask(task);
LegacyTaskResponse response = new LegacyTaskResponse(task);
return response;
} catch (Exception e) {
if(e instanceof ActivitiException) {
throw (ActivitiException) e;
}
throw new ActivitiException("Failed to update task " + taskId, e);
}
}
@Delete
public void deleteTask(Representation entity) {
if(authenticate() == false) return;
String taskId = (String) getRequest().getAttributes().get("taskId");
Task task = ActivitiUtil.getTaskService().createTaskQuery().taskId(taskId).singleResult();
if(task == null) {
throw new ActivitiObjectNotFoundException("Task not found for id " + taskId, Task.class);
}
ActivitiUtil.getTaskService().deleteTask(taskId);
}
}
/* 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.task;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.task.DelegationState;
import org.activiti.engine.task.Task;
import org.activiti.rest.api.RequestUtil;
import org.activiti.rest.api.legacy.AttachmentResponse;
import org.activiti.rest.api.legacy.IdentityLinkResponse;
import org.activiti.rest.api.legacy.SubTaskResponse;
/**
* @author Tijs Rademakers
*/
public class LegacyTaskResponse {
String assignee;
String createTime;
DelegationState delegationState;
String description;
String dueDate;
String executionId;
String id;
String name;
String owner;
String parentTaskId;
int priority;
String processDefinitionId;
String processInstanceId;
String taskDefinitionKey;
String formResourceKey;
List<SubTaskResponse> subTaskList = new ArrayList<SubTaskResponse>();
List<IdentityLinkResponse> identityLinkList = new ArrayList<IdentityLinkResponse>();
List<AttachmentResponse> attachmentList = new ArrayList<AttachmentResponse>();
public LegacyTaskResponse(Task task) {
setAssignee(task.getAssignee());
setCreateTime(RequestUtil.dateToString(task.getCreateTime()));
setDelegationState(task.getDelegationState());
setDescription(task.getDescription());
setDueDate(RequestUtil.dateToString(task.getDueDate()));
setExecutionId(task.getExecutionId());
setId(task.getId());
setName(task.getName());
setOwner(task.getOwner());
setParentTaskId(task.getParentTaskId());
setPriority(task.getPriority());
setProcessDefinitionId(task.getProcessDefinitionId());
setProcessInstanceId(task.getProcessInstanceId());
setTaskDefinitionKey(task.getTaskDefinitionKey());
}
public String getAssignee() {
return assignee;
}
public void setAssignee(String assignee) {
this.assignee = assignee;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public DelegationState getDelegationState() {
return delegationState;
}
public void setDelegationState(DelegationState delegationState) {
this.delegationState = delegationState;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDueDate() {
return dueDate;
}
public void setDueDate(String dueDate) {
this.dueDate = dueDate;
}
public String getExecutionId() {
return executionId;
}
public void setExecutionId(String executionId) {
this.executionId = executionId;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getParentTaskId() {
return parentTaskId;
}
public void setParentTaskId(String parentTaskId) {
this.parentTaskId = parentTaskId;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
public void setProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public String getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getTaskDefinitionKey() {
return taskDefinitionKey;
}
public void setTaskDefinitionKey(String taskDefinitionKey) {
this.taskDefinitionKey = taskDefinitionKey;
}
public String getFormResourceKey() {
return formResourceKey;
}
public void setFormResourceKey(String formResourceKey) {
this.formResourceKey = formResourceKey;
}
public List<SubTaskResponse> getSubTaskList() {
return subTaskList;
}
public void setSubTaskList(List<SubTaskResponse> subTaskList) {
this.subTaskList = subTaskList;
}
public void addSubTask(SubTaskResponse subTask) {
this.subTaskList.add(subTask);
}
public List<IdentityLinkResponse> getIdentityLinkList() {
return identityLinkList;
}
public void setIdentityLinkList(List<IdentityLinkResponse> identityLinkList) {
this.identityLinkList = identityLinkList;
}
public void addIdentityLink(IdentityLinkResponse link) {
this.identityLinkList.add(link);
}
public List<AttachmentResponse> getAttachmentList() {
return attachmentList;
}
public void setAttachmentList(List<AttachmentResponse> attachmentList) {
this.attachmentList = attachmentList;
}
public void addAttachment(AttachmentResponse attachment) {
this.attachmentList.add(attachment);
}
}
......@@ -23,7 +23,7 @@ import org.activiti.engine.task.TaskQuery;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.DataResponse;
import org.activiti.rest.api.SecuredResource;
import org.activiti.rest.api.task.TasksPaginateList;
import org.activiti.rest.api.legacy.TasksPaginateList;
import org.restlet.resource.Get;
public class ProcessInstanceTaskResource extends SecuredResource {
......
......@@ -13,148 +13,32 @@
package org.activiti.rest.api.task;
import java.util.List;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.task.Attachment;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.RequestUtil;
import org.activiti.rest.api.SecuredResource;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.restlet.representation.Representation;
import org.restlet.resource.Delete;
import org.activiti.rest.application.ActivitiRestServicesApplication;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
/**
* @author Tijs Rademakers
* @author Frederik Heremans
*/
public class TaskResource extends SecuredResource {
@Get
public TaskResponse getTask() {
if(authenticate() == false) return null;
String taskId = (String) getRequest().getAttributes().get("taskId");
Task task = ActivitiUtil.getTaskService().createTaskQuery().taskId(taskId).singleResult();
if(task == null) {
throw new ActivitiObjectNotFoundException("Task not found for id " + taskId, Task.class);
}
TaskResponse response = new TaskResponse(task);
TaskFormData taskFormData = ActivitiUtil.getFormService().getTaskFormData(taskId);
if(taskFormData != null) {
response.setFormResourceKey(taskFormData.getFormKey());
}
List<Task> subTaskList = ActivitiUtil.getTaskService().getSubTasks(task.getId());
if(subTaskList != null) {
for (Task subTask : subTaskList) {
SubTaskResponse subTaskResponse = new SubTaskResponse(subTask);
response.addSubTask(subTaskResponse);
}
}
List<IdentityLink> linkList = ActivitiUtil.getTaskService().getIdentityLinksForTask(task.getId());
if(linkList != null) {
for (IdentityLink identityLink : linkList) {
IdentityLinkResponse linkResponse = new IdentityLinkResponse(identityLink);
response.addIdentityLink(linkResponse);
}
}
List<Attachment> attachmentList = null;
if(task.getProcessInstanceId() != null && task.getProcessInstanceId().length() > 0) {
attachmentList = ActivitiUtil.getTaskService().getProcessInstanceAttachments(task.getProcessInstanceId());
} else {
attachmentList = ActivitiUtil.getTaskService().getTaskAttachments(task.getId());
}
if(attachmentList != null) {
for (Attachment attachment : attachmentList) {
AttachmentResponse attachmentResponse = new AttachmentResponse(attachment);
response.addAttachment(attachmentResponse);
}
}
return response;
}
@Post
public TaskResponse updateTask(Representation entity) {
if(authenticate() == false) return null;
String taskId = (String) getRequest().getAttributes().get("taskId");
Task task = ActivitiUtil.getTaskService().createTaskQuery().taskId(taskId).singleResult();
if(task == null) {
throw new ActivitiObjectNotFoundException("Task not found for id " + taskId, Task.class);
}
try {
String taskParams = entity.getText();
JsonNode taskJSON = new ObjectMapper().readTree(taskParams);
String description = null;
if(taskJSON.path("description") != null && taskJSON.path("description").getTextValue() != null) {
description = taskJSON.path("description").getTextValue();
task.setDescription(description);
}
String assignee = null;
if(taskJSON.path("assignee") != null && taskJSON.path("assignee").getTextValue() != null) {
assignee = taskJSON.path("assignee").getTextValue();
task.setAssignee(assignee);
}
String owner = null;
if(taskJSON.path("owner") != null && taskJSON.path("owner").getTextValue() != null) {
owner = taskJSON.path("owner").getTextValue();
task.setOwner(owner);
}
String priority = null;
if(taskJSON.path("priority") != null && taskJSON.path("priority").getTextValue() != null) {
priority = taskJSON.path("priority").getTextValue();
task.setPriority(RequestUtil.parseToInteger(priority));
}
String dueDate = null;
if(taskJSON.path("dueDate") != null && taskJSON.path("dueDate").getTextValue() != null) {
dueDate = taskJSON.path("dueDate").getTextValue();
task.setDueDate(RequestUtil.parseToDate(dueDate));
}
ActivitiUtil.getTaskService().saveTask(task);
TaskResponse response = new TaskResponse(task);
return response;
} catch (Exception e) {
if(e instanceof ActivitiException) {
throw (ActivitiException) e;
}
throw new ActivitiException("Failed to update task " + taskId, e);
String taskId = getAttribute("taskId");
if (taskId == null) {
throw new ActivitiIllegalArgumentException("The taskId cannot be null");
}
}
@Delete
public void deleteTask(Representation entity) {
if(authenticate() == false) return;
String taskId = (String) getRequest().getAttributes().get("taskId");
Task task = ActivitiUtil.getTaskService().createTaskQuery().taskId(taskId).singleResult();
if(task == null) {
throw new ActivitiObjectNotFoundException("Task not found for id " + taskId, Task.class);
if (task == null) {
throw new ActivitiObjectNotFoundException("Could not find a task with id '" + taskId + "'.", Task.class);
}
ActivitiUtil.getTaskService().deleteTask(taskId);
return getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory().createTaskReponse(this, task);
}
}
......@@ -13,207 +13,152 @@
package org.activiti.rest.api.task;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import org.activiti.engine.task.DelegationState;
import org.activiti.engine.task.Task;
import org.activiti.rest.api.RequestUtil;
/**
* @author Tijs Rademakers
* @author Frederik Heremans
*/
public class TaskResponse {
private String id;
private String url;
private String owner;
private String assignee;
private String delegationState;
private String name;
private String description;
private Date createTime;
private Date dueDate;
private int priority;
private boolean suspended;
private String taskDefinitionKey;
// References to other resources
private String parentTask;
private String execution;
private String processInstance;
private String processDefinition;
String assignee;
String createTime;
DelegationState delegationState;
String description;
String dueDate;
String executionId;
String id;
String name;
String owner;
String parentTaskId;
int priority;
String processDefinitionId;
String processInstanceId;
String taskDefinitionKey;
String formResourceKey;
List<SubTaskResponse> subTaskList = new ArrayList<SubTaskResponse>();
List<IdentityLinkResponse> identityLinkList = new ArrayList<IdentityLinkResponse>();
List<AttachmentResponse> attachmentList = new ArrayList<AttachmentResponse>();
public TaskResponse(Task task) {
setAssignee(task.getAssignee());
setCreateTime(RequestUtil.dateToString(task.getCreateTime()));
setDelegationState(task.getDelegationState());
setDescription(task.getDescription());
setDueDate(RequestUtil.dateToString(task.getDueDate()));
setExecutionId(task.getExecutionId());
setId(task.getId());
setName(task.getName());
setOwner(task.getOwner());
setParentTaskId(task.getParentTaskId());
setAssignee(task.getAssignee());
setDelegationState(getDelegationStateString(task.getDelegationState()));
setName(task.getName());
setDescription(task.getDescription());
setCreateTime(task.getCreateTime());
setDueDate(task.getDueDate());
setPriority(task.getPriority());
setProcessDefinitionId(task.getProcessDefinitionId());
setProcessInstanceId(task.getProcessInstanceId());
setSuspended(task.isSuspended());
setTaskDefinitionKey(task.getTaskDefinitionKey());
}
public String getAssignee() {
return assignee;
}
public void setAssignee(String assignee) {
this.assignee = assignee;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
protected String getDelegationStateString(DelegationState state) {
String result = null;
if(state != null) {
result = state.toString().toLowerCase();
}
return result;
}
public DelegationState getDelegationState() {
return delegationState;
public String getId() {
return id;
}
public void setDelegationState(DelegationState delegationState) {
this.delegationState = delegationState;
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
public String getUrl() {
return url;
}
public void setDescription(String description) {
this.description = description;
public void setUrl(String url) {
this.url = url;
}
public String getDueDate() {
return dueDate;
public String getOwner() {
return owner;
}
public void setDueDate(String dueDate) {
this.dueDate = dueDate;
public void setOwner(String owner) {
this.owner = owner;
}
public String getExecutionId() {
return executionId;
public String getAssignee() {
return assignee;
}
public void setExecutionId(String executionId) {
this.executionId = executionId;
public void setAssignee(String assignee) {
this.assignee = assignee;
}
public String getId() {
return id;
public String getDelegationState() {
return delegationState;
}
public void setId(String id) {
this.id = id;
public void setDelegationState(String delegationState) {
this.delegationState = delegationState;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOwner() {
return owner;
public String getDescription() {
return description;
}
public void setOwner(String owner) {
this.owner = owner;
public void setDescription(String description) {
this.description = description;
}
public String getParentTaskId() {
return parentTaskId;
public Date getCreateTime() {
return createTime;
}
public void setParentTaskId(String parentTaskId) {
this.parentTaskId = parentTaskId;
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getDueDate() {
return dueDate;
}
public void setDueDate(Date dueDate) {
this.dueDate = dueDate;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
public void setProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public String getProcessInstanceId() {
return processInstanceId;
public boolean isSuspended() {
return suspended;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
public void setSuspended(boolean suspended) {
this.suspended = suspended;
}
public String getTaskDefinitionKey() {
return taskDefinitionKey;
public String getParentTask() {
return parentTask;
}
public void setTaskDefinitionKey(String taskDefinitionKey) {
this.taskDefinitionKey = taskDefinitionKey;
public void setParentTask(String parentTask) {
this.parentTask = parentTask;
}
public String getFormResourceKey() {
return formResourceKey;
public String getExecution() {
return execution;
}
public void setFormResourceKey(String formResourceKey) {
this.formResourceKey = formResourceKey;
public void setExecution(String execution) {
this.execution = execution;
}
public List<SubTaskResponse> getSubTaskList() {
return subTaskList;
public String getProcessInstance() {
return processInstance;
}
public void setSubTaskList(List<SubTaskResponse> subTaskList) {
this.subTaskList = subTaskList;
public void setProcessInstance(String processInstance) {
this.processInstance = processInstance;
}
public void addSubTask(SubTaskResponse subTask) {
this.subTaskList.add(subTask);
public String getProcessDefinition() {
return processDefinition;
}
public List<IdentityLinkResponse> getIdentityLinkList() {
return identityLinkList;
}
public void setIdentityLinkList(List<IdentityLinkResponse> identityLinkList) {
this.identityLinkList = identityLinkList;
}
public void addIdentityLink(IdentityLinkResponse link) {
this.identityLinkList.add(link);
}
public List<AttachmentResponse> getAttachmentList() {
return attachmentList;
public void setProcessDefinition(String processDefinition) {
this.processDefinition = processDefinition;
}
public void setAttachmentList(List<AttachmentResponse> attachmentList) {
this.attachmentList = attachmentList;
public String getTaskDefinitionKey() {
return taskDefinitionKey;
}
public void addAttachment(AttachmentResponse attachment) {
this.attachmentList.add(attachment);
public void setTaskDefinitionKey(String taskDefinitionKey) {
this.taskDefinitionKey = taskDefinitionKey;
}
}
......@@ -13,11 +13,16 @@
package org.activiti.rest.application;
import java.util.List;
import org.activiti.rest.api.DefaultResource;
import org.activiti.rest.api.RestResponseFactory;
import org.activiti.rest.api.RestResponseFactory;
import org.activiti.rest.filter.JsonpFilter;
import org.codehaus.jackson.map.SerializationConfig;
import org.restlet.Restlet;
import org.restlet.engine.Engine;
import org.restlet.engine.converter.ConverterHelper;
import org.restlet.ext.jackson.JacksonConverter;
import org.restlet.routing.Router;
/**
* @author Tijs Rademakers
......@@ -38,14 +43,21 @@ public class ActivitiRestServicesApplication extends ActivitiRestApplication {
initializeAuthentication();
Router router = new Router(getContext());
router.attachDefault(DefaultResource.class);
RestServicesInit.attachResources(router);
JsonpFilter jsonpFilter = new JsonpFilter(getContext());
jsonpFilter.setNext(router);
authenticator.setNext(jsonpFilter);
// Get hold of JSONConverter and enable ISO-date format by default
List<ConverterHelper> registeredConverters = Engine.getInstance().getRegisteredConverters();
for(ConverterHelper helper : registeredConverters) {
if(helper instanceof JacksonConverter) {
JacksonConverter jacksonConverter = (JacksonConverter) helper;
jacksonConverter.getObjectMapper().configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
}
}
return authenticator;
}
......
......@@ -13,6 +13,15 @@ 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.TaskAddResource;
import org.activiti.rest.api.legacy.TaskAttachmentAddResource;
import org.activiti.rest.api.legacy.TaskAttachmentResource;
import org.activiti.rest.api.legacy.TaskFormResource;
import org.activiti.rest.api.legacy.TaskOperationResource;
import org.activiti.rest.api.legacy.TaskPropertiesResource;
import org.activiti.rest.api.legacy.TaskUrlAddResource;
import org.activiti.rest.api.legacy.TasksResource;
import org.activiti.rest.api.legacy.TasksSummaryResource;
import org.activiti.rest.api.legacy.deployment.DeploymentArtifactResource;
import org.activiti.rest.api.legacy.deployment.DeploymentArtifactsResource;
import org.activiti.rest.api.legacy.deployment.DeploymentDeleteResource;
......@@ -20,6 +29,7 @@ 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.ProcessDefinitionsResource;
import org.activiti.rest.api.legacy.task.LegacyTaskResource;
import org.activiti.rest.api.management.JobExecuteResource;
import org.activiti.rest.api.management.JobResource;
import org.activiti.rest.api.management.JobsExecuteResource;
......@@ -45,16 +55,7 @@ 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.TaskAddResource;
import org.activiti.rest.api.task.TaskAttachmentAddResource;
import org.activiti.rest.api.task.TaskAttachmentResource;
import org.activiti.rest.api.task.TaskFormResource;
import org.activiti.rest.api.task.TaskOperationResource;
import org.activiti.rest.api.task.TaskPropertiesResource;
import org.activiti.rest.api.task.TaskResource;
import org.activiti.rest.api.task.TaskUrlAddResource;
import org.activiti.rest.api.task.TasksResource;
import org.activiti.rest.api.task.TasksSummaryResource;
import org.restlet.routing.Router;
@SuppressWarnings("deprecation")
......@@ -72,6 +73,9 @@ public class RestServicesInit {
router.attach("/repository/process-definitions", ProcessDefinitionCollectionResource.class);
router.attach("/repository/process-definitions/{processDefinitionId}", ProcessDefinitionResource.class);
router.attach("/runtime/tasks/{taskId}", TaskResource.class);
// Old rest-urls
router.attach("/process-engine", ProcessEngineResource.class);
......@@ -105,7 +109,7 @@ public class RestServicesInit {
router.attach("/tasks", TasksResource.class);
router.attach("/tasks-summary", TasksSummaryResource.class);
router.attach("/task", TaskAddResource.class);
router.attach("/task/{taskId}", TaskResource.class);
router.attach("/task/{taskId}", LegacyTaskResource.class);
router.attach("/task/{taskId}/form", TaskFormResource.class);
router.attach("/task/{taskId}/attachment", TaskAttachmentAddResource.class);
router.attach("/task/{taskId}/url", TaskUrlAddResource.class);
......
......@@ -5,6 +5,7 @@ import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
......@@ -43,6 +44,8 @@ import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
import org.junit.Assert;
import org.restlet.Component;
import org.restlet.data.ChallengeScheme;
......@@ -356,4 +359,17 @@ public class BaseRestTestCase extends PvmTestCase {
client.release();
}
/**
* Extract a date from the given string. Assertion fails when invalid date has been provided.
*/
protected Date getDateFromISOString(String isoString) {
DateTimeFormatter dateFormat = ISODateTimeFormat.dateTime();
try {
return dateFormat.parseDateTime(isoString).toDate();
} catch(IllegalArgumentException iae) {
fail("Illegal date provided: "+ isoString);
return null;
}
}
}
......@@ -23,7 +23,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import org.activiti.engine.task.Attachment;
......
......@@ -23,7 +23,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import org.activiti.engine.task.IdentityLink;
......
......@@ -23,7 +23,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import org.activiti.engine.task.DelegationState;
import org.activiti.engine.task.Task;
......
......@@ -11,13 +11,14 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.task.Task;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.RequestUtil;
import org.activiti.rest.api.SecuredResource;
import org.activiti.rest.api.legacy.task.LegacyTaskResponse;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.restlet.representation.Representation;
......@@ -29,7 +30,7 @@ import org.restlet.resource.Put;
public class TaskAddResource extends SecuredResource {
@Put
public TaskResponse addTask(Representation entity) {
public LegacyTaskResponse addTask(Representation entity) {
try {
if(authenticate() == false) return null;
......@@ -81,7 +82,7 @@ public class TaskAddResource extends SecuredResource {
}
newTask.setParentTaskId(parentTaskId);
ActivitiUtil.getTaskService().saveTask(newTask);
TaskResponse response = new TaskResponse(newTask);
LegacyTaskResponse response = new LegacyTaskResponse(newTask);
return response;
} catch (Exception e) {
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.util.List;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.io.InputStream;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.util.HashMap;
import java.util.Iterator;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.util.List;
import java.util.Map;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.util.ArrayList;
import java.util.List;
......@@ -20,6 +20,7 @@ import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.task.Task;
import org.activiti.rest.api.AbstractPaginateList;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.legacy.task.LegacyTaskResponse;
/**
* @author Tijs Rademakers
......@@ -29,9 +30,9 @@ public class TasksPaginateList extends AbstractPaginateList {
@SuppressWarnings("rawtypes")
@Override
protected List processList(List list) {
List<TaskResponse> responseList = new ArrayList<TaskResponse>();
List<LegacyTaskResponse> responseList = new ArrayList<LegacyTaskResponse>();
for (Object task : list) {
TaskResponse taskResponse = new TaskResponse((Task) task);
LegacyTaskResponse taskResponse = new LegacyTaskResponse((Task) task);
TaskFormData taskFormData = ActivitiUtil.getFormService().getTaskFormData(taskResponse.getId());
if(taskFormData != null) {
taskResponse.setFormResourceKey(taskFormData.getFormKey());
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.util.HashMap;
import java.util.Map;
......
......@@ -11,7 +11,7 @@
* limitations under the License.
*/
package org.activiti.rest.api.task;
package org.activiti.rest.api.legacy;
import java.util.List;
......
......@@ -19,7 +19,7 @@ import org.restlet.resource.ClientResource;
import org.restlet.resource.ResourceException;
/**
* Test for all REST-operations related to single a Deployment resource.
* Test for all REST-operations related to a single Deployment resource.
*
* @author Frederik Heremans
*/
......
/* 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 java.util.Calendar;
import java.util.List;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.DelegationState;
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.codehaus.jackson.JsonNode;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
/**
* Test for all REST-operations related to a single Task resource.
*
* @author Frederik Heremans
*/
public class TaskResourceTest extends BaseRestTestCase {
/**
* Test getting a single task, spawned by a process.
* GET runtime/tasks/{taskId}
*/
@Deployment
public void testGetProcessTask() throws Exception {
Calendar now = Calendar.getInstance();
ClockUtil.setCurrentTime(now.getTime());
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.setDueDate(task.getId(), now.getTime());
taskService.setOwner(task.getId(), "owner");
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(task);
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_TASK, task.getId()));
Representation response = client.get();
// Check resulting task
JsonNode responseNode = objectMapper.readTree(response.getStream());
assertEquals(task.getId(), responseNode.get("id").asText());
assertEquals(task.getAssignee(), responseNode.get("assignee").asText());
assertEquals(task.getOwner(), responseNode.get("owner").asText());
assertEquals(task.getDescription(), responseNode.get("description").asText());
assertEquals(task.getName(), responseNode.get("name").asText());
assertEquals(task.getDueDate(), getDateFromISOString(responseNode.get("dueDate").asText()));
assertEquals(task.getCreateTime(), getDateFromISOString(responseNode.get("createTime").asText()));
assertEquals(task.getPriority(), responseNode.get("priority").asInt());
assertTrue(responseNode.get("parentTask").isNull());
assertTrue(responseNode.get("delegationState").isNull());
assertTrue(responseNode.get("execution").asText().endsWith(
RestUrls.createRelativeResourceUrl(RestUrls.URL_EXECUTION, task.getExecutionId())));
assertTrue(responseNode.get("processInstance").asText().endsWith(
RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, task.getProcessInstanceId())));
assertTrue(responseNode.get("processDefinition").asText().endsWith(
RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_DEFINITION, encode(task.getProcessDefinitionId()))));
}
/**
* Test getting a single task, created using the API.
* GET runtime/tasks/{taskId}
*/
public void testGetProcessAdhoc() throws Exception {
try {
Calendar now = Calendar.getInstance();
ClockUtil.setCurrentTime(now.getTime());
Task parentTask = taskService.newTask();
taskService.saveTask(parentTask);
Task task = taskService.newTask();
task.setParentTaskId(parentTask.getId());
task.setName("Task name");
task.setDescription("Descriptions");
task.setAssignee("kermit");
task.setDelegationState(DelegationState.RESOLVED);
task.setDescription("Description");
task.setDueDate(now.getTime());
task.setOwner("owner");
task.setPriority(20);
taskService.saveTask(task);
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_TASK, task.getId()));
Representation response = client.get();
// Check resulting task
JsonNode responseNode = objectMapper.readTree(response.getStream());
assertEquals(task.getId(), responseNode.get("id").asText());
assertEquals(task.getAssignee(), responseNode.get("assignee").asText());
assertEquals(task.getOwner(), responseNode.get("owner").asText());
assertEquals(task.getDescription(), responseNode.get("description").asText());
assertEquals(task.getName(), responseNode.get("name").asText());
assertEquals(task.getDueDate(), getDateFromISOString(responseNode.get("dueDate").asText()));
assertEquals(task.getCreateTime(), getDateFromISOString(responseNode.get("createTime").asText()));
assertEquals(task.getPriority(), responseNode.get("priority").asInt());
assertEquals("resolved", responseNode.get("delegationState").asText());
assertTrue(responseNode.get("execution").isNull());
assertTrue(responseNode.get("processInstance").isNull());
assertTrue(responseNode.get("processDefinition").isNull());
assertTrue(responseNode.get("parentTask").asText().endsWith(
RestUrls.createRelativeResourceUrl(RestUrls.URL_TASK, parentTask.getId())));
} finally {
// Clean adhoc-tasks even if test fails
List<Task> tasks = taskService.createTaskQuery().list();
for(Task task : tasks) {
taskService.deleteTask(task.getId());
if(processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) {
historyService.deleteHistoricTaskInstance(task.getId());
}
}
}
}
}
<?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="theTask" />
<userTask id="theTask" name="my task" activiti:assignee="kermit">
<documentation>Usertask</documentation>
</userTask>
<sequenceFlow id="flow2" sourceRef="theTask" 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.
先完成此消息的编辑!
想要评论请 注册