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