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);
}
}