You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/11/25 12:31:38 UTC

[2/3] syncope git commit: [SYNCOPE-735] Housekeeping implemented

[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ò <il...@apache.org>
Authored: Wed Nov 25 12:08:21 2015 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
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);
     }
 }