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

org.ow2.bonita.definition.activity.EndingNodeBehaviour Maven / Gradle / Ivy

package org.ow2.bonita.definition.activity;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.ow2.bonita.definition.ActivityType;
import org.ow2.bonita.definition.ProcessParameter;
import org.ow2.bonita.definition.ProcessParameter.ParameterType;
import org.ow2.bonita.facade.runtime.InstanceState;
import org.ow2.bonita.pvm.Execution;
import org.ow2.bonita.runtime.XpdlExecution;
import org.ow2.bonita.runtime.XpdlInstance;
import org.ow2.bonita.services.Recorder;
import org.ow2.bonita.services.info.ActivityInstanceCurrentInfo;
import org.ow2.bonita.services.info.ProcessInstanceCurrentInfo;
import org.ow2.bonita.services.util.ServiceEnvTool;


public class EndingNodeBehaviour extends AbstractActivity {

  /**
   * 
   */
  private static final long serialVersionUID = 5317011615783376030L;

  public EndingNodeBehaviour() {
    super("BonitaEnd", JoinType.XOR, SplitType.AND, ActivityType.route, null);
  }


  @Override
  protected boolean bodyStartAutomatically() {
    return true;
  }

  @Override
  protected boolean executeBusinessLogic(final Execution execution) {
    final XpdlExecution xpdlExecution =  (XpdlExecution) execution;
    final XpdlInstance xpdlInstance = xpdlExecution.getXpdlInstance();
    xpdlInstance.setInstanceState(InstanceState.FINISHED);
    final Recorder recorder = ServiceEnvTool.getRecorder();
    final ActivityInstanceCurrentInfo activityInstanceCurrentInfo = new ActivityInstanceCurrentInfo(
        xpdlInstance.getPackageDefinitionUUID(),
        xpdlInstance.getProcessDefinitionUUID(),
        xpdlInstance.getUUID(),
        xpdlExecution.getCurrentActivityInstanceUUID(),
        this.getActivityType(),
        this.getActivityId(),
        xpdlExecution.getIterationId(),
        xpdlExecution.getActivityInstanceId(),
        xpdlExecution.getScopeVariables());

    recorder.recordBodyEnded(activityInstanceCurrentInfo);

    recorder.recordInstanceEnded(new ProcessInstanceCurrentInfo(
        xpdlInstance.getPackageDefinitionUUID(),
        xpdlInstance.getProcessDefinitionUUID(),
        xpdlInstance.getUUID(),
        (xpdlInstance.getParentInstance() != null) ? xpdlInstance.getParentInstance().getUUID() : null,
        xpdlExecution.getVariables(),
        ServiceEnvTool.getUserId())
    );

    final XpdlExecution execToSignal = xpdlInstance.getExecutionToSignal();
    if (execToSignal != null) {
      // We are in a subflow, create map of output parameters to signal parent instance
      Map parameterValues = null;
      final List processParameters = xpdlExecution.getProcessDefinition().getParameters();
      if (processParameters != null) {
        parameterValues = new HashMap();
        for (final ProcessParameter processParameter : processParameters) {
          if (processParameter.getType().equals(ParameterType.OUT)
              ||
              processParameter.getType().equals(ParameterType.INOUT)
          ) {
            final String parameterName = processParameter.getName();
            parameterValues.put(parameterName, xpdlExecution.getVariable(parameterName));
          }
        }
      }
      execToSignal.signal(SubFlow.SUBFLOW_SIGNAL, parameterValues);
      xpdlInstance.setExecutionToSignal(null);
    } else {
      // We are in main instance -> finish
      xpdlInstance.finish();
    }
    return true;
  }

  @Override
  protected void end(XpdlExecution xpdlExecution) {
    xpdlExecution = (XpdlExecution) xpdlExecution.destroyScope(xpdlExecution.getNode());
    xpdlExecution.end();
    final XpdlExecution parent = xpdlExecution.getParent();
    if (parent != null) {
      parent.removeExecution(xpdlExecution);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy