ludc
2025-01-16 986aa62ed00bee39363bab41b4eeb8259d446efd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package org.jbpm.pvm.internal.migration;
 
import org.jbpm.api.Execution;
import org.jbpm.api.JbpmException;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessInstance;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.ProcessInstanceMigration;
import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
 
 
public class DefaultMigrationHandler implements MigrationHandler {
 
  public void migrateInstance(
          ProcessDefinition newProcessDefinition, 
          ProcessInstance processInstance, 
          MigrationDescriptor migrationDescriptor) {
    migrateExecutions(newProcessDefinition, processInstance, migrationDescriptor);
    logMigration(processInstance, newProcessDefinition);
  }
 
  private void migrateChildExecutions(
          ProcessDefinition processDefinition, 
          Execution execution, 
          MigrationDescriptor migrationDescriptor) {
    for (Execution child : execution.getExecutions()) {
      migrateExecutions(processDefinition, child, migrationDescriptor);
    }
  }
 
  private void migrateExecutions(ProcessDefinition processDefinition, Execution execution, MigrationDescriptor migrationDescriptor) {
    migrateChildExecutions(processDefinition, execution, migrationDescriptor);
    if (!(execution instanceof ExecutionImpl) || !(processDefinition instanceof ProcessDefinitionImpl))
      return;
    ((ExecutionImpl)execution).setProcessDefinition((ProcessDefinitionImpl)processDefinition);
    String oldName = ((ExecutionImpl) execution).getActivityName();
    if (oldName == null)
      return;
    String newName = migrationDescriptor.getNewName(MigrationDescriptor.ACTIVITY_TYPE, oldName);
    if (newName == null)
      newName = oldName;
    Activity newActivity = ((ProcessDefinitionImpl) processDefinition).getActivity(newName);
    if (newActivity != null) {
      ((ExecutionImpl) execution).setActivity(newActivity);
    } else {
      throw new JbpmException("the activity " + newActivity + " could not be found in the new process definition.");
    }
  }
  
  private static void logMigration(ProcessInstance processInstance, ProcessDefinition processDefinition) {
    ProcessInstanceMigration processInstanceMigrate = new ProcessInstanceMigration(processInstance, processDefinition);
    HistoryEvent.fire(processInstanceMigrate);
  }
  
}