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

org.ow2.bonita.services.impl.DbJournal 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.
 * 
 * Modified by Matthieu Chaffotte, Elias Ricken de Medeiros, Charles Souillard - BonitaSoft S.A.
 **/
package org.ow2.bonita.services.impl;

import java.util.Date;
import java.util.List;
import java.util.Set;

import org.ow2.bonita.facade.def.InternalProcessDefinition;
import org.ow2.bonita.facade.def.element.MetaData;
import org.ow2.bonita.facade.def.element.impl.MetaDataImpl;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition.ProcessState;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.runtime.ActivityState;
import org.ow2.bonita.facade.runtime.Category;
import org.ow2.bonita.facade.runtime.InstanceState;
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.InternalActivityInstance;
import org.ow2.bonita.facade.runtime.impl.InternalProcessInstance;
import org.ow2.bonita.facade.runtime.impl.InternalVariableUpdate;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.persistence.JournalDbSession;
import org.ow2.bonita.runtime.VariablesOptions;
import org.ow2.bonita.runtime.event.Master;
import org.ow2.bonita.services.Journal;
import org.ow2.bonita.type.Variable;
import org.ow2.bonita.util.BonitaConstants;
import org.ow2.bonita.util.EnvTool;
import org.ow2.bonita.util.ExceptionManager;
import org.ow2.bonita.util.Misc;
import org.ow2.bonita.util.VariableUtil;

/**
 * @author Guillaume Porcher
 * 
 */
public class DbJournal extends AbstractDbQuerier implements Journal {

  public DbJournal(final String persistenceServiceName) {
    super(persistenceServiceName);
  }

  @Override
  public JournalDbSession getDbSession() {
    return EnvTool.getJournalDbSession(getPersistenceServiceName());
  }

  @Override
  public List getInstanceIdsFromMetadata(final int index, final int maxResult) {
    return getDbSession().getInstanceIdsFromMetadata(index, maxResult);
  }

  @Override
  public void remove(final InternalProcessDefinition pack) {
    Misc.checkArgsNotNull(pack);
    getDbSession().delete(pack);
  }

  @Override
  public void removeExecution(final long id) {
    Misc.checkArgsNotNull(id);
    getDbSession().deleteExecution(id);
  }

  @Override
  public void remove(final InternalProcessInstance processInst) {
    Misc.checkArgsNotNull(processInst);
    processInst.removeAttachments();
    getDbSession().delete(processInst);
    // TODO
  }

  @Override
  public void recordEnterActivity(final ActivityInstance activityInstance) {
    Misc.checkArgsNotNull(activityInstance);

    final InternalProcessInstance processInstance = getProcessInstance(activityInstance.getProcessInstanceUUID());
    processInstance.addActivity(activityInstance);
  }

  @Override
  public void recordBodyStarted(final ActivityInstance activityInstance) {
    Misc.checkArgsNotNull(activityInstance);
    if (!activityInstance.isTask()) {
      ((InternalActivityInstance) activityInstance).setActivityState(ActivityState.EXECUTING,
          BonitaConstants.SYSTEM_USER);
    }
  }

  @Override
  public void recordBodyEnded(final ActivityInstance activityInstance) {
    Misc.checkArgsNotNull(activityInstance);
    if (!activityInstance.isTask()) {
      ((InternalActivityInstance) activityInstance).setActivityState(ActivityState.FINISHED,
          BonitaConstants.SYSTEM_USER);
    }
  }

  @Override
  public void recordBodyAborted(final ActivityInstance activityInstance) {
    Misc.checkArgsNotNull(activityInstance);
    ((InternalActivityInstance) activityInstance).setActivityState(ActivityState.ABORTED, BonitaConstants.SYSTEM_USER);
  }

  @Override
  public void recordBodyCancelled(final ActivityInstance activityInstance) {
    Misc.checkArgsNotNull(activityInstance);
    ((InternalActivityInstance) activityInstance).setActivityState(ActivityState.CANCELLED, EnvTool.getUserId());
  }

  @Override
  public void recordActivityFailed(final ActivityInstance activityInstance) {
    Misc.checkArgsNotNull(activityInstance);
    ((InternalActivityInstance) activityInstance).setActivityState(ActivityState.FAILED, BonitaConstants.SYSTEM_USER);
  }

  @Override
  public void recordActivitySkipped(final ActivityInstance activityInstance, final String loggedInUserId) {
    Misc.checkArgsNotNull(activityInstance, loggedInUserId);
    ((InternalActivityInstance) activityInstance).setActivityState(ActivityState.SKIPPED, loggedInUserId);
  }

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

    final InternalProcessInstance instanceRecord = getProcessInstance(instanceUUID);

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

  }

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

    final InternalProcessInstance instanceRecord = getProcessInstance(instanceUUID);

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

  }

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

    final InternalProcessInstance instanceRecord = getProcessInstance(instanceUUID);

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

  @Override
  public void recordInstanceStarted(final InternalProcessInstance instance, final String loggedInUserId) {
    Misc.checkArgsNotNull(instance);

    if (instance.getParentInstanceUUID() != null) {
      final InternalProcessInstance parentInstance = getProcessInstance(instance.getParentInstanceUUID());
      parentInstance.addChildInstance(instance.getUUID());
    }

    final String message = ExceptionManager.getInstance().getFullMessage("bsi_DJ_4");
    Misc.badStateIfNull(loggedInUserId, message);
    instance.setInstanceState(InstanceState.STARTED, loggedInUserId);
    getDbSession().save(instance);
  }

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

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

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

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

  }

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

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

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

    final TaskInstance task = getTaskInstance(taskUUID);
    ActivityState stateBeforeSuspend = null;
    for (final StateUpdate su : task.getStateUpdates()) {
      if (su.getActivityState().equals(ActivityState.SUSPENDED)) {
        stateBeforeSuspend = su.getInitialState();
      }
    }

    ((InternalActivityInstance) task).setActivityState(stateBeforeSuspend, loggedInUserId);
  }

  @Override
  public void recordTaskSuspended(final ActivityInstanceUUID taskUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(taskUUID);

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

  @Override
  public void recordTaskSkipped(final ActivityInstanceUUID taskUUID, final String loggedInUserId) {
    Misc.checkArgsNotNull(taskUUID);
    final TaskInstance activity = getTaskInstance(taskUUID);
    ((InternalActivityInstance) activity).setActivityState(ActivityState.SKIPPED, loggedInUserId);

  }

  @Override
  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);
    if (assignedUserId != null) {
      ((InternalActivityInstance) activity).setTaskAssign(taskState, loggedInUserId, assignedUserId);
    } else {
      ((InternalActivityInstance) activity).setTaskAssign(taskState, loggedInUserId, candidates);
    }
  }

  @Override
  public void recordProcessDeployed(final InternalProcessDefinition processDef, final String userId) {
    Misc.checkArgsNotNull(processDef);
    processDef.setState(ProcessState.ENABLED);
    processDef.setDeployedDate(new Date());
    processDef.setDeployedBy(userId);
    getDbSession().save(processDef);
  }

  @Override
  public void recordProcessEnable(final InternalProcessDefinition processDef) {
    Misc.checkArgsNotNull(processDef);
    processDef.setState(ProcessState.ENABLED);
  }

  @Override
  public void recordProcessDisable(final InternalProcessDefinition processDef) {
    Misc.checkArgsNotNull(processDef);
    processDef.setState(ProcessState.DISABLED);
  }

  @Override
  public void recordProcessArchive(final InternalProcessDefinition processDef, final String userId) {
    Misc.checkArgsNotNull(processDef);
    processDef.setUndeployedBy(userId);
    processDef.setUndeployedDate(new Date());
    processDef.setState(ProcessState.ARCHIVED);
  }

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

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

    final ActivityInstance activityInst = getActivityInstance(activityUUID);
    final Variable v = VariableUtil.createVariable(activityInst.getProcessDefinitionUUID(), variableId, variableValue);

    final VariablesOptions variablesOptions = EnvTool.getVariablesOptions();
    if (variablesOptions.isStoreHistory()) {
      final VariableUpdate varUpdate = new InternalVariableUpdate(new Date(), userId, variableId, v);
      ((InternalActivityInstance) activityInst).addVariableUpdate(varUpdate);
      ((InternalActivityInstance) activityInst).updateLastUpdateDate();
    } else {
      ((InternalActivityInstance) activityInst).setVariableValue(variableId, v);
    }
  }

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

    final InternalProcessInstance processInst = getProcessInstance(instanceUUID);
    final Variable v = VariableUtil.createVariable(processInst.getProcessDefinitionUUID(), variableId, variableValue);

    final VariablesOptions variablesOptions = EnvTool.getVariablesOptions();
    if (variablesOptions.isStoreHistory()) {
      final VariableUpdate varUpdate = new InternalVariableUpdate(new Date(), userId, variableId, v);
      processInst.addVariableUpdate(varUpdate);
      processInst.updateLastUpdateDate();
    } else {
      processInst.setVariableValue(variableId, v);
    }
  }

  @Override
  public void recordActivityPriorityUpdated(final ActivityInstanceUUID activityUUID, final int priority) {
    Misc.checkArgsNotNull(activityUUID);
    final ActivityInstance activityInstance = getActivityInstance(activityUUID);
    ((InternalActivityInstance) activityInstance).setPriority(priority);
  }

  @Override
  public void storeMetaData(final String key, final String value) {
    Misc.checkArgsNotNull(key, value);
    MetaDataImpl data = getInternalMetaData(key);
    if (data == null) {
      data = new MetaDataImpl(key, value);
      getDbSession().save(data);
    } else {
      data.setValue(value);
    }
  }

  private MetaDataImpl getInternalMetaData(final String key) {
    Misc.checkArgsNotNull(key);
    return getDbSession().getMetaData(key);
  }

  @Override
  public String getMetaData(final String key) {
    final MetaData data = getInternalMetaData(key);
    if (data == null) {
      return null;
    }
    return data.getValue();
  }

  @Override
  public void deleteMetaData(final String key) {
    Misc.checkArgsNotNull(key);
    final MetaDataImpl data = getInternalMetaData(key);
    if (data != null) {
      getDbSession().delete(data);
    }
  }

  @Override
  public long getLockedMetadata(final String key) {
    Misc.checkArgsNotNull(key);
    return getDbSession().getLockedMetadata(key);
  }

  @Override
  public void removeLockedMetadata(final String key) {
    Misc.checkArgsNotNull(key);
    getDbSession().lockMetadata(key);
  }

  @Override
  public void lockMetadata(final String key) {
    Misc.checkArgsNotNull(key);
    getDbSession().lockMetadata(key);
  }

  @Override
  public void updateLockedMetadata(final String key, final long value) {
    Misc.checkArgsNotNull(key);
    getDbSession().updateLockedMetadata(key, value);
  }

  @Override
  public void recordNewCategory(final Category category) {
    Misc.checkArgsNotNull(category);
    getDbSession().save(category);
  }
  
  @Override
	public void recordNewMaster(Master master) {
	  Misc.checkArgsNotNull(master);
	  getDbSession().save(master);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy