[SYNCOPE-735] Housekeeping implemented
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/5ad760bd Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/5ad760bd Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/5ad760bd Branch: refs/heads/master Commit: 5ad760bd5fdeb62bd695fcc6b888ef5e9fa3a8a8 Parents: 0980c8e Author: Francesco Chicchiriccò <[email protected]> Authored: Wed Nov 25 12:08:21 2015 +0100 Committer: Francesco Chicchiriccò <[email protected]> Committed: Wed Nov 25 12:08:21 2015 +0100 ---------------------------------------------------------------------- .../activiti/ActivitiUserWorkflowAdapter.java | 61 +++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/5ad760bd/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java b/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java index 08a1d91..1d06195 100644 --- a/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java +++ b/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; +import javax.sql.DataSource; import org.activiti.bpmn.converter.BpmnXMLConverter; import org.activiti.bpmn.model.BpmnModel; import org.activiti.editor.constants.ModelDataJsonConstants; @@ -82,6 +83,7 @@ import org.apache.syncope.core.workflow.user.AbstractUserWorkflowAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.annotation.Transactional; /** @@ -160,6 +162,9 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { @Autowired protected UserDataBinder userDataBinder; + @Autowired + protected DataSource dataSource; + @Override public Class<? extends WorkflowInstanceLoader> getLoaderClass() { return ActivitiWorkflowLoader.class; @@ -211,8 +216,8 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { protected Set<String> getPerformedTasks(final SyncopeUser user) { final Set<String> result = new HashSet<String>(); - for (HistoricActivityInstance task - : historyService.createHistoricActivityInstanceQuery().executionId(user.getWorkflowId()).list()) { + for (HistoricActivityInstance task : historyService.createHistoricActivityInstanceQuery(). + processInstanceId(user.getWorkflowId()).list()) { result.add(task.getActivityId()); } @@ -220,6 +225,36 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { return result; } + protected void cleanupHistory(final SyncopeUser user) { + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + + List<String> taskIds = jdbcTemplate.queryForList( + "SELECT TASK_ID_ FROM ACT_HI_VARINST WHERE NAME_='" + TASK_IS_FORM + + "' AND LONG_=1 AND PROC_INST_ID_='" + user.getWorkflowId() + "'", String.class); + + StringBuilder update = new StringBuilder(); + + update.append("DELETE FROM ACT_HI_VARINST WHERE PROC_INST_ID_='").append(user.getWorkflowId()).append("' "); + for (String taskId : taskIds) { + update.append("AND TASK_ID_<>'").append(taskId).append("' "); + } + jdbcTemplate.execute(update.toString()); + + update.setLength(0); + update.append("DELETE FROM ACT_HI_TASKINST WHERE PROC_INST_ID_='").append(user.getWorkflowId()).append("' "); + for (String taskId : taskIds) { + update.append("AND ID_<>'").append(taskId).append("' "); + } + jdbcTemplate.execute(update.toString()); + + update.setLength(0); + update.append("DELETE FROM ACT_HI_ACTINST WHERE PROC_INST_ID_='").append(user.getWorkflowId()).append("' "); + for (String taskId : taskIds) { + update.append("AND TASK_ID_<>'").append(taskId).append("' "); + } + jdbcTemplate.execute(update.toString()); + } + /** * Saves resources to be propagated and password for later - after form submission - propagation. */ @@ -293,8 +328,12 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { saveForFormSubmit(user, userTO.getPassword(), propByRes); + Set<String> tasks = getPerformedTasks(user); + + cleanupHistory(user); + return new WorkflowResult<Map.Entry<Long, Boolean>>( - new SimpleEntry<Long, Boolean>(user.getId(), propagateEnable), propByRes, getPerformedTasks(user)); + new SimpleEntry<Long, Boolean>(user.getId(), propagateEnable), propByRes, tasks); } protected Set<String> doExecuteTask(final SyncopeUser user, final String task, @@ -333,6 +372,9 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { Set<String> postTasks = getPerformedTasks(user); postTasks.removeAll(preTasks); postTasks.add(task); + + cleanupHistory(user); + return postTasks; } @@ -733,11 +775,11 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { @Override public List<WorkflowFormTO> getForms(final String workflowId, final String name) { List<WorkflowFormTO> forms = getForms( - taskService.createTaskQuery().processInstanceId(workflowId).taskName(name). - taskVariableValueEquals(TASK_IS_FORM, Boolean.TRUE)); + taskService.createTaskQuery().processInstanceId(workflowId). + taskName(name).taskVariableValueEquals(TASK_IS_FORM, Boolean.TRUE)); - forms.addAll(getForms(historyService.createHistoricTaskInstanceQuery().taskName(name). - taskVariableValueEquals(TASK_IS_FORM, Boolean.TRUE))); + forms.addAll(getForms(historyService.createHistoricTaskInstanceQuery().processInstanceId(workflowId). + taskName(name).taskVariableValueEquals(TASK_IS_FORM, Boolean.TRUE))); return forms; } @@ -794,6 +836,9 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { Task task; try { task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + throw new ActivitiException("NULL result"); + } } catch (ActivitiException e) { throw new NotFoundException("Activiti Task " + taskId, e); } @@ -906,6 +951,8 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { } } + cleanupHistory(user); + return new WorkflowResult<UserMod>(userMod, propByRes, postTasks); } }
