TaskEntityManager.java 7.3 KB
Newer Older
T
tombaeyens 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/* 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.
 */

T
tombaeyens 已提交
14
package org.activiti.engine.impl.persistence.entity;
T
tombaeyens 已提交
15

16
import java.util.Collections;
17
import java.util.HashMap;
T
tombaeyens 已提交
18
import java.util.List;
19
import java.util.Map;
T
tombaeyens 已提交
20

21
import org.activiti.engine.ActivitiException;
22
import org.activiti.engine.ActivitiIllegalArgumentException;
S
smirzai@gmail.com 已提交
23
import org.activiti.engine.delegate.TaskListener;
F
fheremans 已提交
24 25
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder;
26 27
import org.activiti.engine.impl.Page;
import org.activiti.engine.impl.TaskQueryImpl;
T
tombaeyens 已提交
28 29
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
T
tombaeyens 已提交
30
import org.activiti.engine.impl.persistence.AbstractManager;
31
import org.activiti.engine.task.Task;
T
tombaeyens 已提交
32 33 34 35 36


/**
 * @author Tom Baeyens
 */
37
public class TaskEntityManager extends AbstractManager {
T
tombaeyens 已提交
38

39
  @SuppressWarnings({ "unchecked", "rawtypes" })
40
  public void deleteTasksByProcessInstanceId(String processInstanceId, String deleteReason, boolean cascade) {
41
    List<TaskEntity> tasks = (List) getDbSqlSession()
42 43 44 45
      .createTaskQuery()
      .processInstanceId(processInstanceId)
      .list();
  
46
    String reason = (deleteReason == null || deleteReason.length() == 0) ? TaskEntity.DELETE_REASON_DELETED : deleteReason;
M
meyerd 已提交
47
    
48
    for (TaskEntity task: tasks) {
M
meyerd 已提交
49
      deleteTask(task, reason, cascade);
50 51 52 53
    }
  }

  public void deleteTask(TaskEntity task, String deleteReason, boolean cascade) {
T
tombaeyens 已提交
54
    if (!task.isDeleted()) {
S
smirzai@gmail.com 已提交
55
    	 task.fireEvent(TaskListener.EVENTNAME_DELETE);
T
tombaeyens 已提交
56 57
      task.setDeleted(true);
      
58
      CommandContext commandContext = Context.getCommandContext();
T
tombaeyens 已提交
59 60
      String taskId = task.getId();
      
61 62 63 64 65
      List<Task> subTasks = findTasksByParentTaskId(taskId);
      for (Task subTask: subTasks) {
        deleteTask((TaskEntity) subTask, deleteReason, cascade);
      }
      
66
      commandContext
67
        .getIdentityLinkEntityManager()
68
        .deleteIdentityLinksByTaskId(taskId);
T
tombaeyens 已提交
69

70
      commandContext
71
        .getVariableInstanceEntityManager()
72
        .deleteVariableInstanceByTask(task);
T
tombaeyens 已提交
73

74 75
      if (cascade) {
        commandContext
76
          .getHistoricTaskInstanceEntityManager()
77 78 79
          .deleteHistoricTaskInstanceById(taskId);
      } else {
        commandContext
80 81
          .getHistoryManager()
          .recordTaskEnd(taskId, deleteReason);
82
      }
83
        
J
Joram Barrez 已提交
84
      getDbSqlSession().delete(task);
F
fheremans 已提交
85 86 87 88 89
      
      if(commandContext.getEventDispatcher().isEnabled()) {
      	commandContext.getEventDispatcher().dispatchEvent(
      			ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_DELETED, task));
      }
T
tombaeyens 已提交
90 91 92
    }
  }

93

94 95
  public TaskEntity findTaskById(String id) {
    if (id == null) {
96
      throw new ActivitiIllegalArgumentException("Invalid task id : null");
97
    }
T
tijsrademakers 已提交
98
    return (TaskEntity) getDbSqlSession().selectById(TaskEntity.class, id);
99 100 101
  }

  @SuppressWarnings("unchecked")
102 103 104 105
  public List<TaskEntity> findTasksByExecutionId(String executionId) {
    return getDbSqlSession().selectList("selectTasksByExecutionId", executionId);
  }
  
106
  @SuppressWarnings("unchecked")
107 108 109 110
  public List<TaskEntity> findTasksByProcessInstanceId(String processInstanceId) {
    return getDbSqlSession().selectList("selectTasksByProcessInstanceId", processInstanceId);
  }
  
111
  @Deprecated
112
  public List<Task> findTasksByQueryCriteria(TaskQueryImpl taskQuery, Page page) {
113 114 115 116 117 118 119
    taskQuery.setFirstResult(page.getFirstResult());
    taskQuery.setMaxResults(page.getMaxResults());
    return findTasksByQueryCriteria(taskQuery);
  }
  
  @SuppressWarnings("unchecked")
  public List<Task> findTasksByQueryCriteria(TaskQueryImpl taskQuery) {
120
    final String query = "selectTaskByQueryCriteria";
121
    return getDbSqlSession().selectList(query, taskQuery);
122
  }
123 124 125 126
  
  @SuppressWarnings("unchecked")
  public List<Task> findTasksAndVariablesByQueryCriteria(TaskQueryImpl taskQuery) {
    final String query = "selectTaskWithVariablesByQueryCriteria";
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
    // paging doesn't work for combining task instances and variables due to an outer join, so doing it in-memory
    if (taskQuery.getFirstResult() < 0 || taskQuery.getMaxResults() <= 0) {
      return Collections.EMPTY_LIST;
    }
    
    int firstResult = taskQuery.getFirstResult();
    int maxResults = taskQuery.getMaxResults();
    
    // setting max results, limit to 20000 results for performance reasons
    taskQuery.setMaxResults(20000);
    taskQuery.setFirstResult(0);
    
    List<Task> instanceList = getDbSqlSession().selectList(query, taskQuery);
    
    if (instanceList != null && instanceList.size() > 0) {
      if (firstResult > 0) {
        if (firstResult <= instanceList.size()) {
          int toIndex = firstResult + Math.min(maxResults, instanceList.size() - firstResult);
          return instanceList.subList(firstResult, toIndex);
        } else {
          return Collections.EMPTY_LIST;
        }
      } else {
        int toIndex = Math.min(maxResults, instanceList.size());
        return instanceList.subList(0, toIndex);
      }
    }
    return Collections.EMPTY_LIST;
155
  }
156 157

  public long findTaskCountByQueryCriteria(TaskQueryImpl taskQuery) {
158
    return (Long) getDbSqlSession().selectOne("selectTaskCountByQueryCriteria", taskQuery);
159
  }
160 161 162
  
  @SuppressWarnings("unchecked")
  public List<Task> findTasksByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults) {
163
    return getDbSqlSession().selectListWithRawParameter("selectTaskByNativeQuery", parameterMap, firstResult, maxResults);
164 165 166 167 168
  }

  public long findTaskCountByNativeQuery(Map<String, Object> parameterMap) {
    return (Long) getDbSqlSession().selectOne("selectTaskCountByNativeQuery", parameterMap);
  }
169 170 171

  @SuppressWarnings("unchecked")
  public List<Task> findTasksByParentTaskId(String parentTaskId) {
172
    return getDbSqlSession().selectList("selectTasksByParentTaskId", parentTaskId);
173 174
  }

175
  public void deleteTask(String taskId, String deleteReason, boolean cascade) {
176 177
    TaskEntity task = Context
      .getCommandContext()
178
      .getTaskEntityManager()
179 180 181
      .findTaskById(taskId);
    
    if (task!=null) {
182 183 184 185 186 187
      if(task.getExecutionId() != null) {
        throw new ActivitiException("The task cannot be deleted because is part of a running process");
      }
      
      String reason = (deleteReason == null || deleteReason.length() == 0) ? TaskEntity.DELETE_REASON_DELETED : deleteReason;
      deleteTask(task, reason, cascade);
188 189 190
    } else if (cascade) {
      Context
        .getCommandContext()
191
        .getHistoricTaskInstanceEntityManager()
192 193 194
        .deleteHistoricTaskInstanceById(taskId);
    }
  }
195 196 197 198 199 200 201 202
  
  public void updateTaskTenantIdForDeployment(String deploymentId, String newTenantId) {
  	HashMap<String, Object> params = new HashMap<String, Object>();
  	params.put("deploymentId", deploymentId);
  	params.put("tenantId", newTenantId);
  	getDbSqlSession().getSqlSession().update("updateTaskTenantIdForDeployment", params);
  }
  
T
tombaeyens 已提交
203
}