All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.camunda.bpm.engine.impl.migration.instance.parser.MigratingInstanceParser Maven / Gradle / Ivy

There is a newer version: 7.22.0-alpha1
Show newest version
/*
 * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH
 * under one or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information regarding copyright
 * ownership. Camunda licenses this file to you under the Apache License,
 * Version 2.0; you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.camunda.bpm.engine.impl.migration.instance.parser;

import java.util.List;

import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.impl.context.Context;
import org.camunda.bpm.engine.impl.interceptor.CommandContext;
import org.camunda.bpm.engine.impl.migration.instance.MigratingActivityInstance;
import org.camunda.bpm.engine.impl.migration.instance.MigratingProcessElementInstance;
import org.camunda.bpm.engine.impl.migration.instance.MigratingProcessInstance;
import org.camunda.bpm.engine.impl.migration.instance.MigratingTransitionInstance;
import org.camunda.bpm.engine.impl.migration.validation.instance.MigratingProcessInstanceValidationReportImpl;
import org.camunda.bpm.engine.impl.persistence.entity.EventSubscriptionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.ExternalTaskEntity;
import org.camunda.bpm.engine.impl.persistence.entity.IncidentEntity;
import org.camunda.bpm.engine.impl.persistence.entity.JobDefinitionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.JobEntity;
import org.camunda.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.camunda.bpm.engine.impl.persistence.entity.TaskEntity;
import org.camunda.bpm.engine.impl.persistence.entity.VariableInstanceEntity;
import org.camunda.bpm.engine.impl.tree.TreeVisitor;
import org.camunda.bpm.engine.migration.MigrationPlan;
import org.camunda.bpm.engine.runtime.ActivityInstance;
import org.camunda.bpm.engine.runtime.TransitionInstance;

/**
 * Builds a {@link MigratingProcessInstance}, a data structure that contains meta-data for the activity
 * instances that are migrated.
 *
 * @author Thorben Lindhauer
 */
public class MigratingInstanceParser {

  protected ProcessEngine engine;

  protected MigratingInstanceParseHandler activityInstanceHandler =
      new ActivityInstanceHandler();
  protected MigratingInstanceParseHandler transitionInstanceHandler =
      new TransitionInstanceHandler();
  protected MigratingInstanceParseHandler compensationInstanceHandler =
      new CompensationInstanceHandler();

  protected MigratingDependentInstanceParseHandler> dependentActivityInstanceJobHandler =
      new ActivityInstanceJobHandler();
  protected MigratingDependentInstanceParseHandler> dependentTransitionInstanceJobHandler =
      new TransitionInstanceJobHandler();
  protected MigratingDependentInstanceParseHandler> dependentEventSubscriptionHandler =
      new EventSubscriptionInstanceHandler();
  protected MigratingDependentInstanceParseHandler> dependentVariableHandler =
      new VariableInstanceHandler();
  protected MigratingInstanceParseHandler incidentHandler =
      new IncidentInstanceHandler();

  public MigratingInstanceParser(ProcessEngine engine) {
    this.engine = engine;
  }

  public MigratingProcessInstance parse(String processInstanceId, MigrationPlan migrationPlan, MigratingProcessInstanceValidationReportImpl processInstanceReport) {

    CommandContext commandContext = Context.getCommandContext();
    List eventSubscriptions = fetchEventSubscriptions(commandContext, processInstanceId);
    List executions = fetchExecutions(commandContext, processInstanceId);
    List externalTasks = fetchExternalTasks(commandContext, processInstanceId);
    List incidents = fetchIncidents(commandContext, processInstanceId);
    List jobs = fetchJobs(commandContext, processInstanceId);
    List tasks = fetchTasks(commandContext, processInstanceId);
    List variables = fetchVariables(commandContext, processInstanceId);

    ExecutionEntity processInstance = commandContext.getExecutionManager().findExecutionById(processInstanceId);
    processInstance.restoreProcessInstance(executions, eventSubscriptions, variables, tasks, jobs, incidents, externalTasks);

    ProcessDefinitionEntity targetProcessDefinition = Context
      .getProcessEngineConfiguration()
      .getDeploymentCache()
      .findDeployedProcessDefinitionById(migrationPlan.getTargetProcessDefinitionId());
    List targetJobDefinitions = fetchJobDefinitions(commandContext, targetProcessDefinition.getId());

    final MigratingInstanceParseContext parseContext = new MigratingInstanceParseContext(this, migrationPlan, processInstance, targetProcessDefinition)
      .eventSubscriptions(eventSubscriptions)
      .externalTasks(externalTasks)
      .incidents(incidents)
      .jobs(jobs)
      .tasks(tasks)
      .targetJobDefinitions(targetJobDefinitions)
      .variables(variables);

    ActivityInstance activityInstance = engine.getRuntimeService().getActivityInstance(processInstanceId);

    ActivityInstanceWalker activityInstanceWalker = new ActivityInstanceWalker(activityInstance);

    activityInstanceWalker.addPreVisitor(new TreeVisitor() {
      @Override
      public void visit(ActivityInstance obj) {
        activityInstanceHandler.handle(parseContext, obj);
      }
    });

    activityInstanceWalker.walkWhile();

    CompensationEventSubscriptionWalker compensateSubscriptionsWalker = new CompensationEventSubscriptionWalker(
        parseContext.getMigratingActivityInstances());

    compensateSubscriptionsWalker.addPreVisitor(new TreeVisitor() {
      @Override
      public void visit(EventSubscriptionEntity obj) {
        compensationInstanceHandler.handle(parseContext, obj);
      }
    });

    compensateSubscriptionsWalker.walkWhile();

    for (IncidentEntity incidentEntity : incidents) {
      incidentHandler.handle(parseContext, incidentEntity);
    }

    parseContext.validateNoEntitiesLeft(processInstanceReport);

    return parseContext.getMigratingProcessInstance();
  }

  public MigratingInstanceParseHandler getActivityInstanceHandler() {
    return activityInstanceHandler;
  }

  public MigratingInstanceParseHandler getTransitionInstanceHandler() {
    return transitionInstanceHandler;
  }

  public MigratingDependentInstanceParseHandler> getDependentEventSubscriptionHandler() {
    return dependentEventSubscriptionHandler;
  }

  public MigratingDependentInstanceParseHandler> getDependentActivityInstanceJobHandler() {
    return dependentActivityInstanceJobHandler;
  }

  public MigratingDependentInstanceParseHandler> getDependentTransitionInstanceJobHandler() {
    return dependentTransitionInstanceJobHandler;
  }

  public MigratingInstanceParseHandler getIncidentHandler() {
    return incidentHandler;
  }

  public MigratingDependentInstanceParseHandler> getDependentVariablesHandler() {
    return dependentVariableHandler;
  }

  protected List fetchExecutions(CommandContext commandContext, String processInstanceId) {
    return commandContext.getExecutionManager().findExecutionsByProcessInstanceId(processInstanceId);
  }

  protected List fetchEventSubscriptions(CommandContext commandContext, String processInstanceId) {
    return commandContext.getEventSubscriptionManager().findEventSubscriptionsByProcessInstanceId(processInstanceId);
  }

  protected List fetchExternalTasks(CommandContext commandContext, String processInstanceId) {
    return commandContext.getExternalTaskManager().findExternalTasksByProcessInstanceId(processInstanceId);
  }

  protected List fetchJobs(CommandContext commandContext, String processInstanceId) {
    return commandContext.getJobManager().findJobsByProcessInstanceId(processInstanceId);
  }

  protected List fetchIncidents(CommandContext commandContext, String processInstanceId) {
    return commandContext.getIncidentManager().findIncidentsByProcessInstance(processInstanceId);
  }

  protected List fetchTasks(CommandContext commandContext, String processInstanceId) {
    return commandContext.getTaskManager().findTasksByProcessInstanceId(processInstanceId);
  }

  protected List fetchJobDefinitions(CommandContext commandContext, String processDefinitionId) {
    return commandContext.getJobDefinitionManager().findByProcessDefinitionId(processDefinitionId);
  }

  protected List fetchVariables(CommandContext commandContext, String processInstanceId) {
    return commandContext.getVariableInstanceManager().findVariableInstancesByProcessInstanceId(processInstanceId);
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy