/* 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.engine; import java.io.InputStream; import java.util.Collection; import java.util.List; import java.util.Map; import org.activiti.engine.task.Attachment; import org.activiti.engine.task.Comment; import org.activiti.engine.task.DelegationState; import org.activiti.engine.task.Event; import org.activiti.engine.task.IdentityLink; import org.activiti.engine.task.IdentityLinkType; import org.activiti.engine.task.NativeTaskQuery; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskQuery; /** Service which provides access to {@link Task} and form related operations. * * @author Tom Baeyens * @author Joram Barrez */ public interface TaskService { /** * Creates a new task that is not related to any process instance. * * The returned task is transient and must be saved with {@link #saveTask(Task)} 'manually'. */ Task newTask(); /** create a new task with a user defined task id */ Task newTask(String taskId); /** * Saves the given task to the persistent data store. If the task is already * present in the persistent store, it is updated. * After a new task has been saved, the task instance passed into this method * is updated with the id of the newly created task. * @param task the task, cannot be null. */ void saveTask(Task task); /** * Deletes the given task, not deleting historic information that is related to this task. * @param taskId The id of the task that will be deleted, cannot be null. If no task * exists with the given taskId, the operation is ignored. * @throws ActivitiException when an error occurs while deleting the task or in case the task is part * of a running process. */ void deleteTask(String taskId); /** * Deletes all tasks of the given collection, not deleting historic information that is related * to these tasks. * @param taskIds The id's of the tasks that will be deleted, cannot be null. All * id's in the list that don't have an existing task will be ignored. * @throws ActivitiException when an error occurs while deleting the tasks or in case one of the tasks * is part of a running process. */ void deleteTasks(Collection<String> taskIds); /** * Deletes the given task. * @param taskId The id of the task that will be deleted, cannot be null. If no task * exists with the given taskId, the operation is ignored. * @param cascade If cascade is true, also the historic information related to this task is deleted. * @throws ActivitiException when an error occurs while deleting the task or in case the task is part * of a running process. */ void deleteTask(String taskId, boolean cascade); /** * Deletes all tasks of the given collection. * @param taskIds The id's of the tasks that will be deleted, cannot be null. All * id's in the list that don't have an existing task will be ignored. * @param cascade If cascade is true, also the historic information related to this task is deleted. * @throws ActivitiException when an error occurs while deleting the tasks or in case one of the tasks * is part of a running process. * @throws ActivitiException when an error occurs while deleting the tasks or in case one of the tasks * is part of a running process. */ void deleteTasks(Collection<String> taskIds, boolean cascade); /** * Deletes the given task, not deleting historic information that is related to this task.. * @param taskId The id of the task that will be deleted, cannot be null. If no task * exists with the given taskId, the operation is ignored. * @param deleteReason reason the task is deleted. Is recorded in history, if enabled. * @throws ActivitiException when an error occurs while deleting the task or in case the task is part * of a running process */ void deleteTask(String taskId, String deleteReason); /** * Deletes all tasks of the given collection, not deleting historic information that is related to these tasks. * @param taskIds The id's of the tasks that will be deleted, cannot be null. All * id's in the list that don't have an existing task will be ignored. * @param deleteReason reason the task is deleted. Is recorded in history, if enabled. * @throws ActivitiException when an error occurs while deleting the tasks or in case one of the tasks * is part of a running process. */ void deleteTasks(Collection<String> taskIds, String deleteReason); /** * Claim responsibility for a task: the given user is made assignee for the task. * The difference with {@link #setAssignee(String, String)} is that here * a check is done if the task already has a user assigned to it. * No check is done whether the user is known by the identity component. * @param taskId task to claim, cannot be null. * @param userId user that claims the task. When userId is null the task is unclaimed, * assigned to no one. * @throws ActivitiException when the task doesn't exist or when the task * is already claimed by another user. */ void claim(String taskId, String userId); /** * Called when the task is successfully executed. * @param taskId the id of the task to complete, cannot be null. * @throws ActivitiException when no task exists with the given id or when this task is {@link DelegationState#PENDING} delegation. */ void complete(String taskId); /** * Delegates the task to another user. This means that the assignee is set * and the delegation state is set to {@link DelegationState#PENDING}. * If no owner is set on the task, the owner is set to the current assignee * of the task. * @param taskId The id of the task that will be delegated. * @param userId The id of the user that will be set as assignee. * @throws ActivitiException when no task exists with the given id. */ void delegateTask(String taskId, String userId); /** * Marks that the assignee is done with this task and that it can be send back to the owner. * Can only be called when this task is {@link DelegationState#PENDING} delegation. * After this method returns, the {@link Task#getDelegationState() delegationState} is set to {@link DelegationState#RESOLVED}. * @param taskId the id of the task to resolve, cannot be null. * @throws ActivitiException when no task exists with the given id. */ void resolveTask(String taskId); /** * Called when the task is successfully executed, * and the required task parameters are given by the end-user. * @param taskId the id of the task to complete, cannot be null. * @param variables task parameters. May be null or empty. * @throws ActivitiException when no task exists with the given id. */ void complete(String taskId, Map<String, Object> variables); /** * Changes the assignee of the given task to the given userId. * No check is done whether the user is known by the identity component. * @param taskId id of the task, cannot be null. * @param userId id of the user to use as assignee. * @throws ActivitiException when the task or user doesn't exist. */ void setAssignee(String taskId, String userId); /** * Transfers ownership of this task to another user. * No check is done whether the user is known by the identity component. * @param taskId id of the task, cannot be null. * @param userId of the person that is receiving ownership. * @throws ActivitiException when the task or user doesn't exist. */ void setOwner(String taskId, String userId); /** * Retrieves the {@link IdentityLink}s associated with the given task. * Such an {@link IdentityLink} informs how a certain identity (eg. group or user) * is associated with a certain task (eg. as candidate, assignee, etc.) */ List<IdentityLink> getIdentityLinksForTask(String taskId); /** * Convenience shorthand for {@link #addUserIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE} * @param taskId id of the task, cannot be null. * @param userId id of the user to use as candidate, cannot be null. * @throws ActivitiException when the task or user doesn't exist. */ void addCandidateUser(String taskId, String userId); /** * Convenience shorthand for {@link #addGroupIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE} * @param taskId id of the task, cannot be null. * @param groupId id of the group to use as candidate, cannot be null. * @throws ActivitiException when the task or group doesn't exist. */ void addCandidateGroup(String taskId, String groupId); /** * Involves a user with a task. The type of identity link is defined by the * given identityLinkType. * @param taskId id of the task, cannot be null. * @param userId id of the user involve, cannot be null. * @param identityLinkType type of identityLink, cannot be null (@see {@link IdentityLinkType}). * @throws ActivitiException when the task or user doesn't exist. */ void addUserIdentityLink(String taskId, String userId, String identityLinkType); /** * Involves a group with a task. The type of identityLink is defined by the * given identityLink. * @param taskId id of the task, cannot be null. * @param groupId id of the group to involve, cannot be null. * @param identityLinkType type of identity, cannot be null (@see {@link IdentityLinkType}). * @throws ActivitiException when the task or group doesn't exist. */ void addGroupIdentityLink(String taskId, String groupId, String identityLinkType); /** * Convenience shorthand for {@link #deleteUserIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE} * @param taskId id of the task, cannot be null. * @param userId id of the user to use as candidate, cannot be null. * @throws ActivitiException when the task or user doesn't exist. */ void deleteCandidateUser(String taskId, String userId); /** * Convenience shorthand for {@link #deleteGroupIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE} * @param taskId id of the task, cannot be null. * @param groupId id of the group to use as candidate, cannot be null. * @throws ActivitiException when the task or group doesn't exist. */ void deleteCandidateGroup(String taskId, String groupId); /** * Removes the association between a user and a task for the given identityLinkType. * @param taskId id of the task, cannot be null. * @param userId id of the user involve, cannot be null. * @param identityLinkType type of identityLink, cannot be null (@see {@link IdentityLinkType}). * @throws ActivitiException when the task or user doesn't exist. */ void deleteUserIdentityLink(String taskId, String userId, String identityLinkType); /** * Removes the association between a group and a task for the given identityLinkType. * @param taskId id of the task, cannot be null. * @param groupId id of the group to involve, cannot be null. * @param identityLinkType type of identity, cannot be null (@see {@link IdentityLinkType}). * @throws ActivitiException when the task or group doesn't exist. */ void deleteGroupIdentityLink(String taskId, String groupId, String identityLinkType); /** * Changes the priority of the task. * * Authorization: actual owner / business admin * * @param taskId id of the task, cannot be null. * @param priority the new priority for the task. * @throws ActivitiException when the task doesn't exist. */ void setPriority(String taskId, int priority); /** * Returns a new {@link TaskQuery} that can be used to dynamically query tasks. */ TaskQuery createTaskQuery(); /** * Returns a new */ NativeTaskQuery createNativeTaskQuery(); /** set variable on a task. If the variable is not already existing, it will be created in the * most outer scope. This means the process instance in case this task is related to an * execution. */ void setVariable(String taskId, String variableName, Object value); /** set variables on a task. If the variable is not already existing, it will be created in the * most outer scope. This means the process instance in case this task is related to an * execution. */ void setVariables(String taskId, Map<String, ? extends Object> variables); /** set variable on a task. If the variable is not already existing, it will be created in the * task. */ void setVariableLocal(String taskId, String variableName, Object value); /** set variables on a task. If the variable is not already existing, it will be created in the * task. */ void setVariablesLocal(String taskId, Map<String, ? extends Object> variables); /** get a variables and search in the task scope and if available also the execution scopes. */ Object getVariable(String taskId, String variableName); /** get a variables and only search in the task scope. */ Object getVariableLocal(String taskId, String variableName); /** get all variables and search in the task scope and if available also the execution scopes. * If you have many variables and you only need a few, consider using {@link #getVariables(String, Collection)} * for better performance.*/ Map<String, Object> getVariables(String taskId); /** get all variables and search only in the task scope. * If you have many task local variables and you only need a few, consider using {@link #getVariablesLocal(String, Collection)} * for better performance.*/ Map<String, Object> getVariablesLocal(String taskId); /** get values for all given variableNames and search only in the task scope. */ Map<String, Object> getVariables(String taskId, Collection<String> variableNames); /** get a variable on a task */ Map<String, Object> getVariablesLocal(String taskId, Collection<String> variableNames); /** * Removes the variable from the task. * When the variable does not exist, nothing happens. */ void removeVariable(String taskId, String variableName); /** * Removes the variable from the task (not considering parent scopes). * When the variable does not exist, nothing happens. */ void removeVariableLocal(String taskId, String variableName); /** * Removes all variables in the given collection from the task. * Non existing variable names are simply ignored. */ void removeVariables(String taskId, Collection<String> variableNames); /** * Removes all variables in the given collection from the task (not considering parent scopes). * Non existing variable names are simply ignored. */ void removeVariablesLocal(String taskId, Collection<String> variableNames); /** Add a comment to a task and/or process instance. */ void addComment(String taskId, String processInstanceId, String message); /** The comments related to the given task. */ List<Comment> getTaskComments(String taskId); /** The all events related to the given task. */ List<Event> getTaskEvents(String taskId); /** The comments related to the given process instance. */ List<Comment> getProcessInstanceComments(String processInstanceId); /** Add a new attachment to a task and/or a process instance and use an input stream to provide the content */ Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String attachmentName, String attachmentDescription, InputStream content); /** Add a new attachment to a task and/or a process instance and use an url as the content */ Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String attachmentName, String attachmentDescription, String url); /** Update the name and decription of an attachment */ void saveAttachment(Attachment attachment); /** Retrieve a particular attachment */ Attachment getAttachment(String attachmentId); /** Retrieve stream content of a particular attachment */ InputStream getAttachmentContent(String attachmentId); /** The list of attachments associated to a task */ List<Attachment> getTaskAttachments(String taskId); /** The list of attachments associated to a process instance */ List<Attachment> getProcessInstanceAttachments(String processInstanceId); /** Delete an attachment */ void deleteAttachment(String attachmentId); /** The list of subtasks for this parent task */ List<Task> getSubTasks(String parentTaskId); }