Package org.jbpm.pvm.internal.migration

Source Code of org.jbpm.pvm.internal.migration.InstanceMigrator

package org.jbpm.pvm.internal.migration;

import java.util.ArrayList;
import java.util.List;

import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessDefinitionQuery;
import org.jbpm.api.ProcessInstance;
import org.jbpm.internal.log.Log;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.session.RepositorySession;
import org.jbpm.pvm.internal.util.ReflectUtil;

public class InstanceMigrator {

  private static Log log = Log.getLog(InstanceMigrator.class.getName());

  public static void migrateAll(ProcessDefinition processDefinition, MigrationDescriptor migrationDescriptor) {
//    String oldVersionId = getOldVersionId(processDefinition.getName());
//    ExecutionService executionService = (ExecutionService) EnvironmentImpl.getFromCurrent(ExecutionService.class);
//    ProcessInstanceQuery processInstanceQuery = executionService
//      .createProcessInstanceQuery()
//      .processDefinitionId(oldVersionId);
//    List<ProcessInstance> processInstances = processInstanceQuery.list();
    List<ProcessInstance> processInstances = getProcessInstancesToMigrate(processDefinition.getName(), migrationDescriptor);
    for (ProcessInstance processInstance : processInstances) {
      migrateInstance(processDefinition, processInstance, migrationDescriptor);
    }
  }

  public static void migrateInstance(
          ProcessDefinition processDefinition,
          ProcessInstance processInstance,
          MigrationDescriptor migrationDescriptor) {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    for (String className : migrationDescriptor.getMigrationHandlerClassNames()) {
      try {
        Class<?> clazz = classLoader.loadClass(className);
        MigrationHandler handler = (MigrationHandler)ReflectUtil.newInstance(clazz);
        handler.migrateInstance(processDefinition, processInstance, migrationDescriptor);
      } catch (ClassNotFoundException e) {
        log.error("Class " + className + " not found on the classpath.", e);
      }
    }
    //migrateExecutions(processDefinition, processInstance, migrationDescriptor);
    // migrateSwimlanes(processInstance, migrationDescriptor);
    // migrateVariables(processInstance, migrationDescriptor);
    //logMigration(processInstance, processDefinition);
  }

  private static 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)
//      return;
//    Activity newActivity = ((ProcessDefinitionImpl) processDefinition).getActivity(newName);
//    if (newActivity != null) {
//      ((ExecutionImpl) execution).setActivity(newActivity);
//    }
  }
 
  private static void migrateChildExecutions(ProcessDefinition processDefinition, Execution execution, MigrationDescriptor migrationDescriptor) {
    for (Execution child : execution.getExecutions()) {
      migrateExecutions(processDefinition, child, migrationDescriptor);
    }
  }

//  private static void logMigration(ProcessInstance processInstance, ProcessDefinition processDefinition) {
//    ProcessInstanceMigration processInstanceMigrate = new ProcessInstanceMigration(processInstance, processDefinition);
//    HistoryEvent.fire(processInstanceMigrate);
//  }
 
  private static List<ProcessInstance> getProcessInstancesToMigrate(String processDefinitionName, MigrationDescriptor migrationDescriptor) {
    List<ProcessInstance> result = new ArrayList<ProcessInstance>();
    ExecutionService executionService = (ExecutionService) EnvironmentImpl.getFromCurrent(ExecutionService.class);
    List<ProcessDefinition> processesToMigrate = getProcessesToMigrate(processDefinitionName, migrationDescriptor);
    for (ProcessDefinition processDefinition : processesToMigrate) {
      result.addAll(
              executionService
                .createProcessInstanceQuery()
                .processDefinitionId(processDefinition.getId()).list());
    }
    return result;
  }

  private static List<ProcessDefinition> getProcessesToMigrate(String processDefinitionName, MigrationDescriptor migrationDescriptor) {
    RepositorySession repositorySession = EnvironmentImpl.getFromCurrent(RepositorySession.class);
    List<ProcessDefinition> processDefinitions = repositorySession
        .createProcessDefinitionQuery()
        .processDefinitionName(processDefinitionName)
        .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)
        .list();
    int startIndex = calculateStartIndex(processDefinitions.size() - 1, migrationDescriptor);
    int endIndex = calculateEndIndex(processDefinitions.size() - 1, migrationDescriptor);
    if (startIndex > endIndex) startIndex = endIndex;
    return processDefinitions.subList(startIndex, endIndex);
  }
 
  private static int calculateStartIndex(int max, MigrationDescriptor migrationDescriptor) {
    int result = max - 1;
    if (migrationDescriptor.getStartVersion() != -1) {
      result = migrationDescriptor.getStartVersion() - 1;
    } else if (migrationDescriptor.getStartOffset() != -1) {
      result = max - migrationDescriptor.getStartOffset();
    }
    if (result < 0) result = 0;
    if (result > max - 1) result = max - 1;
    return result;
  }
 
  private static int calculateEndIndex(int max, MigrationDescriptor migrationDescriptor) {
    int result = max;
    if (migrationDescriptor.getEndVersion() != -1) {
      result = migrationDescriptor.getEndVersion();
    } else if (migrationDescriptor.getEndOffset() != -1) {
      result = max - migrationDescriptor.getEndOffset() + 1;
    }
    if (result < 1) result = 1;
    if (result > max - 1) result = max;
    return result;
  }
 
}
TOP

Related Classes of org.jbpm.pvm.internal.migration.InstanceMigrator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.