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

org.ow2.bonita.facade.runtime.impl.InternalProcessInstance Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2007  Bull S. A. S.
 * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA  02110-1301, USA.
 **/
package org.ow2.bonita.facade.runtime.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.ow2.bonita.definition.activity.ConnectorExecutor;
import org.ow2.bonita.facade.def.InternalActivityDefinition;
import org.ow2.bonita.facade.def.InternalProcessDefinition;
import org.ow2.bonita.facade.def.element.HookDefinition;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.runtime.AttachmentInstance;
import org.ow2.bonita.facade.runtime.Comment;
import org.ow2.bonita.facade.runtime.InstanceState;
import org.ow2.bonita.facade.runtime.InstanceStateUpdate;
import org.ow2.bonita.facade.runtime.ProcessInstance;
import org.ow2.bonita.facade.runtime.VariableUpdate;
import org.ow2.bonita.facade.uuid.ActivityDefinitionUUID;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.runtime.model.Execution;
import org.ow2.bonita.services.handlers.FinishedInstanceHandler;
import org.ow2.bonita.type.Variable;
import org.ow2.bonita.util.EnvTool;
import org.ow2.bonita.util.Misc;
import org.ow2.bonita.util.ProcessUtil;
import org.ow2.bonita.util.TransientData;
import org.ow2.bonita.util.VariableUtil;

public class InternalProcessInstance extends ProcessInstanceImpl {

  private static final long serialVersionUID = 370138202886825855L;
  protected long dbid;

  protected Execution rootExecution;
  protected long userXPRead = 0;
  protected Map transitionStates = new HashMap();
  protected Map variables;
  protected int nbOfAttachments;

  public enum TransitionState {
    /**
     * Transition is ready to be taken
     */
    READY,
    /**
     * An execution has taken this transition. However, the destination node has not been executed (e.g. node execution
     * is asynchronous)
     */
    TAKEN,
    /**
     * This transition cannot be taken. This has been aborted by the system (e.g. by a join XOR)
     */
    ABORTED
  }

  // mandatory for hibernate
  protected InternalProcessInstance() {
    super();
  }

  public InternalProcessInstance(final ProcessInstanceUUID instanceUUID, final InternalProcessDefinition process,
      final ProcessInstanceUUID rootInstanceUUID, final long iterationNb) {
    super(process.getUUID(), instanceUUID, rootInstanceUUID, iterationNb);
    nbOfAttachments = 0;
    final Map initialActivities = process.getInternalInitialActivities();
    if (initialActivities.size() == 1) {
      final InternalActivityDefinition initial = initialActivities.values().iterator().next();
      rootExecution = new Execution("Instance_" + getUUID().toString(), process, this, initial,
          Execution.STATE_CREATED, null);
    } else {
      // needs to create one root Execution (parent) and many other
      rootExecution = new Execution("Instance_" + getUUID().toString(), process, this, null, Execution.STATE_CREATED,
          null);
    }
  }

  public InternalProcessInstance(final ProcessInstance src) {
    super(src);
    activities = new HashSet();
    for (final ActivityInstance activity : src.getActivities()) {
      activities.add(new InternalActivityInstance(activity));
    }

    variableUpdates = null;
    for (final VariableUpdate varUpdate : src.getVariableUpdates()) {
      final Serializable value = varUpdate.getValue();
      addVariableUpdate(new InternalVariableUpdate(varUpdate.getDate(), varUpdate.getUserId(), varUpdate.getName(),
          VariableUtil.createVariable(src.getProcessDefinitionUUID(), varUpdate.getName(), value)));
    }
    setVariables(src.getInitialVariableValues());

    if (src.getClass().equals(InternalProcessInstance.class)) {
      final InternalProcessInstance other = (InternalProcessInstance) src;
      userXPRead = other.getUserXPRead();
      nbOfAttachments = other.nbOfAttachments;
    }
  }

  public void addVariableUpdate(final VariableUpdate varUpdate) {
    if (variableUpdates == null) {
      variableUpdates = new ArrayList();
    }
    variableUpdates.add(varUpdate);
  }

  public void setVariableValue(final String variableName, final Variable variable) {
    updateLastUpdateDate();
    variables.put(variableName, variable);
  }

  public void updateLastUpdateDate() {
    lastUpdate = System.currentTimeMillis();
  }

  public void addChildInstance(final ProcessInstanceUUID childInstanceUUID) {
    if (childrenInstanceUUID == null) {
      childrenInstanceUUID = new HashSet();
    }
    updateLastUpdateDate();
    childrenInstanceUUID.add(childInstanceUUID);
  }

  public void addComment(final Comment comment) {
    updateLastUpdateDate();
    commentFeed.add(comment);
  }

  public void addActivity(final ActivityInstance activity) {
    if (getActivities() == null) {
      activities = new HashSet();
    }
    updateLastUpdateDate();
    activities.add(activity);
  }

  public void addAttachment(final AttachmentInstance attachment) {
    if (attachments == null) {
      attachments = new ArrayList();
    }
    attachments.add(attachment);
  }

  public Map getInitialVariables() {
    return variables;
  }

  @Override
  public Map getInitialVariableValues() {
    if (variables != null) {
      return VariableUtil.getVariableValues(variables);
    }
    return null;
  }

  private void setVariables(final Map variables) {
    this.variables = VariableUtil.createVariableMap(getProcessDefinitionUUID(), variables);
    clientVariables = null;
  }

  public void begin(final ActivityDefinitionUUID activityUUID) {
    if (rootExecution.getNode() != null) {
      rootExecution.beginWithOneStartNode();
    } else {
      rootExecution.beginWithManyStartNodes(activityUUID);
    }
  }

  public void setInitialVaribales(final Map initialVariables) {
    variables = initialVariables;
  }

  public boolean isInstanceState(final InstanceState state) {
    return getInstanceState().equals(state);
  }

  public TransitionState getTransitionState(final String transitionName) {
    if (!transitionStates.containsKey(transitionName)) {
      return null;
    }
    return TransitionState.valueOf(transitionStates.get(transitionName));
  }

  public void setTransitionState(final String transitionName, final TransitionState state) {
    transitionStates.put(transitionName, state.toString());
  }

  public void removeTransitionState(final String transitionName) {
    transitionStates.remove(transitionName);
  }

  public Map getTransitionsStates() {
    return Collections.unmodifiableMap(transitionStates);
  }

  public Execution getRootExecution() {
    return rootExecution;
  }

  @Override
  public String toString() {
    String value = "Instance " + getUUID() + "(state:" + getInstanceState();
    if (getParentInstanceUUID() != null) {
      value += ", child of " + getParentInstanceUUID();
    }
    value += ")";
    return value;
  }

  public List getExecOnNode(final String nodeName) {
    return this.getExecOnNode(getRootExecution(), nodeName);
  }

  private List getExecOnNode(final Execution exec, final String nodeName) {
    Misc.checkArgsNotNull(exec, nodeName);
    final List res = new ArrayList();
    if (exec.getExecutions() == null || exec.getExecutions().isEmpty()) {
      if (exec.getNode() != null && exec.getNode().getName().equals(nodeName)) {
        res.add(exec);
      }
    }
    if (exec.getExecutions() != null) {
      for (final Execution child : exec.getExecutions()) {
        res.addAll(this.getExecOnNode(child, nodeName));
      }
    }
    return res;
  }

  public void cancel() {
    ConnectorExecutor.executeConnectors(getRootExecution(), HookDefinition.Event.instanceOnCancel);
    // cancel execution
    getRootExecution().cancel();
    // record cancel
    EnvTool.getRecorder().recordInstanceCancelled(getUUID(), EnvTool.getUserId());
    ProcessUtil.removeInternalInstanceEvents(getUUID());
    // execute finished instance handler
    if (getParentInstanceUUID() == null) {
      finish();
    }
  }

  public void finish() {
    final FinishedInstanceHandler handler = EnvTool.getFinishedInstanceHandler();
    handler.handleFinishedInstance(this);
  }

  public void setInstanceState(final InstanceState newState, final String userId) {
    updateLastUpdateDate();
    final InstanceState oldState = getInstanceState();
    state = newState;
    if (getInstanceStateUpdates() == null) {
      instanceStateUpdates = new ArrayList();
    }
    // add a state update
    final Date newDate = new Date();
    getInstanceStateUpdates().add(new InstanceStateUpdateImpl(newDate, userId, oldState, newState));
    if (newState.equals(InstanceState.STARTED)) {
      startedDate = newDate.getTime();
      startedBy = userId;
    } else {
      endedDate = newDate.getTime();
      endedBy = userId;
      if (activities != null) {
        for (final ActivityInstance activity : activities) {
          if (activity.getEndedDate() == null) {
            EnvTool.getRecorder().recordBodyAborted(activity);
            TransientData.removeTransientData(activity.getUUID());
          }
        }
      }
    }
  }

  public void setUserXPRead(final Date d) {
    userXPRead = d.getTime();
  }

  public long getUserXPRead() {
    return userXPRead;
  }

  public void setParentUUIDs(final ProcessInstanceUUID instanceUUID, final ActivityInstanceUUID activityUUID) {
    parentInstanceUUID = instanceUUID;
    parentActivityUUID = activityUUID;
  }

  public void removeAttachment(final String name) {
    final List removeAttachments = new ArrayList();
    for (final AttachmentInstance attachment : attachments) {
      if (attachment.getName().equals(name)) {
        removeAttachments.add(attachment);
      }
    }
    attachments.removeAll(removeAttachments);
    updateLastUpdateDate();
  }

  public void removeAttachments() {
    attachments = null;
  }

  public int getNbOfAttachments() {
    return nbOfAttachments;
  }

  public void setNbOfAttachments(final int nbOfAttachments) {
    this.nbOfAttachments = nbOfAttachments;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy