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.Map;

import org.ow2.bonita.facade.def.majorElement.ActivityDefinition;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.runtime.InstanceState;
import org.ow2.bonita.facade.runtime.ProcessInstance;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.pvm.Execution;
import org.ow2.bonita.runtime.InternalExecution;
import org.ow2.bonita.runtime.InternalInstance;
import org.ow2.bonita.services.Querier;
import org.ow2.bonita.services.Recorder;
import org.ow2.bonita.util.EnvTool;


public class EndingNodeBehaviour extends AbstractActivity {

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

  protected EndingNodeBehaviour() {}
  
  public EndingNodeBehaviour(final ActivityDefinition activityDef) {
    super(activityDef);
  }


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

  @Override
  protected boolean executeBusinessLogic(final Execution execution) {
    final InternalExecution internalExecution =  (InternalExecution) execution;
    final InternalInstance instance = internalExecution.getInstance();
    instance.setInstanceState(InstanceState.FINISHED);
    final Recorder recorder = EnvTool.getRecorder();
    recorder.recordBodyEnded(internalExecution.getCurrentActivityInstanceUUID());

    recorder.recordInstanceEnded(instance.getUUID(), EnvTool.getUserId());

    final InternalExecution execToSignal = instance.getExecutionToSignal();
    if (execToSignal != null) {
      // We are in a subflow, create map of output parameters to signal parent instance
      
      InternalExecution exec = (InternalExecution)internalExecution;
      ProcessInstanceUUID instanceUUID = exec.getInstance().getUUID();
      
      Querier journal = EnvTool.getJournalQueriers();
      ActivityInstance activityInstance = journal.getActivityInstance(instanceUUID, exec.getNodeName(), exec.getIterationId(), exec.getActivityInstanceId());
      ProcessInstance inst = journal.getProcessInstance(instanceUUID);
      
      final Map activityVars = activityInstance.getLastKnownVariableValues();
      final Map instanceVars = inst.getLastKnownVariableValues();
      
      final Map allVars = new HashMap();
      if (instanceVars != null) {
      	allVars.putAll(instanceVars);
      }
      if (activityVars != null) {
      	allVars.putAll(activityVars);
      }
      
      execToSignal.signal(SubFlow.SUBFLOW_SIGNAL, allVars);
      instance.setExecutionToSignal(null);
    } else {
      // We are in main instance -> finish
      instance.finish();
    }
    return true;
  }

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy