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

org.ow2.bonita.persistence.db.DbJournal Maven / Gradle / Ivy

/**
 * 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.
 * 
 * Modified by Matthieu Chaffotte - BonitaSoft S.A.
 **/
package org.ow2.bonita.persistence.db;

import java.util.Date;
import java.util.Map;
import java.util.Set;

import org.ow2.bonita.facade.def.majorElement.ActivityDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition.ProcessState;
import org.ow2.bonita.facade.def.majorElement.impl.ProcessDefinitionImpl;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.runtime.ActivityState;
import org.ow2.bonita.facade.runtime.InstanceState;
import org.ow2.bonita.facade.runtime.ProcessInstance;
import org.ow2.bonita.facade.runtime.StateUpdate;
import org.ow2.bonita.facade.runtime.TaskInstance;
import org.ow2.bonita.facade.runtime.VariableUpdate;
import org.ow2.bonita.facade.runtime.impl.ActivityInstanceImpl;
import org.ow2.bonita.facade.runtime.impl.ProcessInstanceImpl;
import org.ow2.bonita.facade.runtime.impl.VariableUpdateImpl;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.pvm.internal.type.Variable;
import org.ow2.bonita.services.Querier;
import org.ow2.bonita.services.Recorder;
import org.ow2.bonita.util.BonitaConstants;
import org.ow2.bonita.util.CopyTool;
import org.ow2.bonita.util.EnvTool;
import org.ow2.bonita.util.ExceptionManager;
import org.ow2.bonita.util.Misc;

/**
 * @author Guillaume Porcher
 *
 */
public class DbJournal extends AbstractDbQuerier implements Recorder, Querier {

  public DbJournal(final String persistenceServiceName) {
    super(persistenceServiceName, new DbQuerierBufferImpl());
  }

  public void remove(final ProcessDefinition pack) {
    Misc.checkArgsNotNull(pack);
    this.buffer.removeProcess(pack);
    getQuerierDbSession().delete(pack);
  }

  public void remove(final ProcessInstance processInst) {
    Misc.checkArgsNotNull(processInst);
    this.buffer.removeInstance(processInst);
    getQuerierDbSession().delete(processInst);
  }
  
  public void recordEnterActivity(
		  final ActivityDefinition activityDefinition,
		  final ActivityInstanceUUID activityInstanceUUID, 
		  final String iterationId,
		  final String activityInstanceId,
		  Map initialVariables) {
    Misc.checkArgsNotNull(activityDefinition, activityInstanceUUID, iterationId, activityInstanceId);
    
    ActivityInstanceImpl activityRecord = new ActivityInstanceImpl(
        activityInstanceUUID,
        activityDefinition.getName(),
        activityDefinition.getLabel(),
        activityDefinition.getDescription(),
        activityDefinition.getProcessDefinitionUUID(),
        activityInstanceUUID.getProcessInstanceUUID(),
        iterationId,
        activityInstanceId, 
        !activityDefinition.isAutomatic());

    activityRecord.setActivityState(ActivityState.READY, BonitaConstants.SYSTEM_USER);

    final ProcessInstance processInstance = getProcessInstance(activityInstanceUUID.getProcessInstanceUUID());
    ((ProcessInstanceImpl)processInstance).addActivity(activityRecord);
    activityRecord.setVariablesBeforeReady(initialVariables);
  }

  public void recordBodyStarted(final ActivityInstanceUUID activityInstanceUUID) {
	  Misc.checkArgsNotNull(activityInstanceUUID);

    final ActivityInstance activityInstance = getActivityInstance(activityInstanceUUID);
    if (!activityInstance.isTask()) {
      ((ActivityInstanceImpl)activityInstance).setActivityState(ActivityState.EXECUTING, BonitaConstants.SYSTEM_USER);
    }
  }

  public void recordBodyEnded(final ActivityInstanceUUID activityInstanceUUID) {
	  Misc.checkArgsNotNull(activityInstanceUUID);

    final ActivityInstance activityInstance = getActivityInstance(activityInstanceUUID);

    if (!activityInstance.isTask()) {
    	((ActivityInstanceImpl)activityInstance).setActivityState(ActivityState.FINISHED, BonitaConstants.SYSTEM_USER);
    }
  }

  public void recordBodyAborted(final ActivityInstanceUUID activityInstanceUUID) {
    Misc.checkArgsNotNull(activityInstanceUUID);

    final ActivityInstance activityInstance = getActivityInstance(activityInstanceUUID);

    ((ActivityInstanceImpl)activityInstance).setActivityState(ActivityState.ABORTED, BonitaConstants.SYSTEM_USER);
  }

  public void recordBodyCancelled(final ActivityInstanceUUID activityInstanceUUID) {
	  Misc.checkArgsNotNull(activityInstanceUUID);

    final ActivityInstance activityInstance = getActivityInstance(activityInstanceUUID);

    ((ActivityInstanceImpl)activityInstance).setActivityState(ActivityState.CANCELLED, EnvTool.getUserId());
  }

  public void recordInstanceEnded(final ProcessInstanceUUID instanceUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(instanceUUID);

    final ProcessInstance instanceRecord = getProcessInstance(instanceUUID);

    String message = ExceptionManager.getInstance().getFullMessage(
  			"bsi_DJ_1", instanceUUID);
    Misc.badStateIfNull(instanceRecord, message);
    ((ProcessInstanceImpl)instanceRecord).setInstanceState(InstanceState.FINISHED, loggedInUserId);

  }

  public void recordInstanceAborted(final ProcessInstanceUUID instanceUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(instanceUUID);

    final ProcessInstance instanceRecord = getProcessInstance(instanceUUID);

    String message = ExceptionManager.getInstance().getFullMessage(
  			"bsi_DJ_2", instanceUUID);
    Misc.badStateIfNull(instanceRecord, message);
    ((ProcessInstanceImpl)instanceRecord).setInstanceState(InstanceState.ABORTED, loggedInUserId);

  }

  public void recordInstanceCancelled(final ProcessInstanceUUID instanceUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(instanceUUID);

    final ProcessInstance instanceRecord = getProcessInstance(instanceUUID);

    String message = ExceptionManager.getInstance().getFullMessage(
  			"bsi_DJ_3", instanceUUID);
    Misc.badStateIfNull(instanceRecord, message);
    ((ProcessInstanceImpl)instanceRecord).setInstanceState(InstanceState.CANCELLED, loggedInUserId);
  }

  public void recordInstanceStarted(final ProcessInstanceUUID instanceUUID, final ProcessInstanceUUID parentInstanceUUID, final String loggedInUserId, Map variables) {
    Misc.checkArgsNotNull(instanceUUID);

    if (parentInstanceUUID != null) {
    	ProcessInstance instance = getProcessInstance(parentInstanceUUID);
    	((ProcessInstanceImpl)instance).addChildInstance(instanceUUID);
    }
    final ProcessInstance instanceRecord =
      new ProcessInstanceImpl(instanceUUID,
          instanceUUID.getProcessDefinitionUUID(),
          parentInstanceUUID, variables);
    String message = ExceptionManager.getInstance().getFullMessage("bsi_DJ_4");
    Misc.badStateIfNull(loggedInUserId, message);
    ((ProcessInstanceImpl)instanceRecord).setInstanceState(InstanceState.STARTED, loggedInUserId);
    this.buffer.addInstance(instanceRecord);
    getQuerierDbSession().save(instanceRecord);
  }

  public void recordTaskFinished(final ActivityInstanceUUID taskUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(taskUUID);

    final TaskInstance activity = getTaskInstance(taskUUID);
    String message = ExceptionManager.getInstance().getFullMessage(
  			"bsi_DJ_5", taskUUID);
    Misc.badStateIfNull(activity, message);
    ((ActivityInstanceImpl)activity).setActivityState(ActivityState.FINISHED, loggedInUserId);
  }

  public void recordTaskReady(final ActivityInstanceUUID taskUUID, final Set candidates, final String userId) {
    Misc.checkArgsNotNull(taskUUID);

    final TaskInstance activity = getTaskInstance(taskUUID);
    String message = ExceptionManager.getInstance().getFullMessage(
  			"bsi_DJ_6", taskUUID);
    Misc.badStateIfNull(activity, message);
    ((ActivityInstanceImpl)activity).setTaskAssign(ActivityState.READY, BonitaConstants.SYSTEM_USER, candidates, userId);
  }

  public void recordTaskStarted(final ActivityInstanceUUID taskUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(taskUUID);

    final TaskInstance activity = getTaskInstance(taskUUID);
    String message = ExceptionManager.getInstance().getFullMessage(
  			"bsi_DJ_7", taskUUID);
    Misc.badStateIfNull(activity, message);
    ((ActivityInstanceImpl)activity).setActivityState(ActivityState.EXECUTING, loggedInUserId);
  }

  public void recordTaskResumed(final ActivityInstanceUUID taskUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(taskUUID);

    final TaskInstance task = getTaskInstance(taskUUID);
    ActivityState stateBeforeSuspend = null;
	for (StateUpdate su : task.getStateUpdates()) {
		if (su.getActivityState().equals(ActivityState.SUSPENDED)) {
			stateBeforeSuspend = su.getInitialState();
		}
	}
	
    ((ActivityInstanceImpl)task).setActivityState(stateBeforeSuspend, loggedInUserId);
  }
  public void recordTaskSuspended(final ActivityInstanceUUID taskUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(taskUUID);

    final TaskInstance activity = getTaskInstance(taskUUID);
    ((ActivityInstanceImpl)activity).setActivityState(ActivityState.SUSPENDED, loggedInUserId);
  }

  public void recordTaskAssigned(final ActivityInstanceUUID taskUUID, 
		  final ActivityState taskState, final String loggedInUserId,
		  final Set candidates, final String assignedUserId) {
    Misc.checkArgsNotNull(taskUUID);

    final TaskInstance activity = getTaskInstance(taskUUID);
    ((ActivityInstanceImpl)activity).setTaskAssign(taskState, loggedInUserId, candidates, assignedUserId);
  }

  public void recordProcessDeployed(final ProcessDefinition processDef, final String userId) {
    Misc.checkArgsNotNull(processDef);
    this.buffer.addProcess(processDef);
    ((ProcessDefinitionImpl)processDef).setState(ProcessState.ENABLED);
    ((ProcessDefinitionImpl)processDef).setDeployedDate(new Date());
    ((ProcessDefinitionImpl)processDef).setDeployedBy(userId);
    getQuerierDbSession().save(processDef);
  }
  
  public void recordProcessEnable(final ProcessDefinition processDef) {
    Misc.checkArgsNotNull(processDef);
    this.buffer.addProcess(processDef);
    ((ProcessDefinitionImpl)processDef).setState(ProcessState.ENABLED);
  }
  
  public void recordProcessDisable(final ProcessDefinition processDef) {
    Misc.checkArgsNotNull(processDef);
    this.buffer.removeProcess(processDef);
    ((ProcessDefinitionImpl)processDef).setState(ProcessState.DISABLED);
  }

  public void recordProcessArchive(final ProcessDefinition processDef, final String userId) {
    Misc.checkArgsNotNull(processDef);
    ProcessDefinitionImpl impl = (ProcessDefinitionImpl) processDef;
    impl.setUndeployedBy(userId);
    impl.setUndeployedDate(new Date());
    impl.setState(ProcessState.ARCHIVED);
  }

  public void recordProcessUndeployed(final ProcessDefinition processDef) {
    recordProcessDisable(processDef);
  }

  public void recordActivityVariableUpdated(final String variableId,
      final Object variableValue, final ActivityInstanceUUID activityUUID,
      final String userId) {
    Misc.checkArgsNotNull(variableId, variableValue, activityUUID, userId);

    final ActivityInstance activityInst = getActivityInstance(activityUUID);
    final Variable v = CopyTool.createVariable(variableId, variableValue);
    final VariableUpdate varUpdate = new VariableUpdateImpl(new Date(), userId, variableId, v);
    ((ActivityInstanceImpl)activityInst).addVariableUpdate(varUpdate);
  }

  public void recordInstanceVariableUpdated(final String variableId, final Object variableValue,
      final ProcessInstanceUUID instanceUUID, final String userId) {
    Misc.checkArgsNotNull(variableId, variableValue, instanceUUID, userId);

    final ProcessInstance processInst = getProcessInstance(instanceUUID);
    final Variable v = CopyTool.createVariable(variableId, variableValue);
    final VariableUpdate varUpdate = new VariableUpdateImpl(new Date(), userId, variableId, v);
    ((ProcessInstanceImpl)processInst).addVariableUpdate(varUpdate);
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy