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

org.ow2.bonita.facade.impl.QueryRuntimeAPIImpl 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 Charles Souillard - BonitaSoft S.A.
 * Modified by Matthieu Chaffotte - BonitaSoft S.A.
 **/
package org.ow2.bonita.facade.impl;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.ow2.bonita.facade.exception.ActivityNotFoundException;
import org.ow2.bonita.facade.exception.InstanceNotFoundException;
import org.ow2.bonita.facade.exception.TaskNotFoundException;
import org.ow2.bonita.facade.exception.VariableNotFoundException;
import org.ow2.bonita.facade.internal.InternalQueryRuntimeAPI;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.runtime.ActivityState;
import org.ow2.bonita.facade.runtime.Comment;
import org.ow2.bonita.facade.runtime.ProcessInstance;
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.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.ProcessDefinitionUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.services.LargeDataRepository;
import org.ow2.bonita.services.Querier;
import org.ow2.bonita.util.EnvTool;
import org.ow2.bonita.util.Misc;


/**
 * @author Pierre Vigneras
 */
public class QueryRuntimeAPIImpl implements InternalQueryRuntimeAPI {

  /*
  public QueryRuntimeAPIImpl(String CONF_NAME) {
    this.confName = CONF_NAME;
  }
   */
  protected QueryRuntimeAPIImpl() {
  }

  public ProcessInstance getProcessInstance(final ProcessInstanceUUID instanceUUID, 
      final String queryList) throws InstanceNotFoundException {
    FacadeUtil.checkArgsNotNull(instanceUUID);
    final ProcessInstance result = EnvTool.getAllQueriers(queryList).getProcessInstance(instanceUUID);
    if (result == null) {
      throw new InstanceNotFoundException("bai_QRAPII_1", instanceUUID);
    }
    return new ProcessInstanceImpl(result);
  }

  public Set getProcessInstances(final String queryList) {
    final Set result = new HashSet();
    for (final ProcessInstance record : EnvTool.getAllQueriers(queryList).getProcessInstances()) {
      result.add(new ProcessInstanceImpl(record));
    }
    return result;
  }
  
  public Set getNewWebProcessInstances(Collection labelIds, String queryList) throws RemoteException {
    final Set result = new HashSet();
    for (final ProcessInstance record : EnvTool.getAllQueriers(queryList).getNewWebProcessInstances(EnvTool.getUserId())) {
      if (labelIds != null && !labelIds.isEmpty()) {
    	  ((ProcessInstanceImpl)record).addWebLabels(labelIds);
      }
      result.add(new ProcessInstanceImpl(record));
    }
    return result;
  }
  
  public Set getWebProcessInstances(String labelId, String queryList) throws RemoteException {
    //FacadeUtil.checkArgsNotNull(labelId); : allows null to get instances with no label
    final Set result = new HashSet();
    for (final ProcessInstance record : EnvTool.getAllQueriers(queryList).getWebProcessInstances(labelId)) {
      result.add(new ProcessInstanceImpl(record));
    }
    return result;
  }
  
  public Set getUserInstances(String queryList) throws RemoteException {
    final Set result = new HashSet();
    for (final ProcessInstance record : EnvTool.getAllQueriers(queryList).getUserInstances(EnvTool.getUserId())) {
      result.add(new ProcessInstanceImpl(record));
    }
    return result;
  }

  public Set getProcessInstances(
      Collection instanceUUIDs, String queryList)
      throws RemoteException {
    final Set result = new HashSet();
    if (instanceUUIDs == null || instanceUUIDs.isEmpty()) {
      return result;
    }
    for (final ProcessInstance record : EnvTool.getAllQueriers(queryList).getProcessInstances(instanceUUIDs)) {
      result.add(new ProcessInstanceImpl(record));
    }
    return result;
  }
  
  public Set getProcessInstancesWithTaskState(Collection activityStates, String queryList) throws RemoteException {
    final Set result = new HashSet();
    if (activityStates == null || activityStates.isEmpty()) {
      return result;
    }
    for (final ProcessInstance record : EnvTool.getAllQueriers(queryList).getProcessInstancesWithTaskState(activityStates)) {
      result.add(new ProcessInstanceImpl(record));
    }
    return result;
  }

  public Set getProcessInstances(final ProcessDefinitionUUID processUUID, final String queryList) {
    final Set result = new HashSet();
    for (final ProcessInstance record : EnvTool.getAllQueriers(queryList).getProcessInstances(processUUID)) {
      result.add(new ProcessInstanceImpl(record));
    }
    return result;
  }

  public ActivityInstance getActivityInstance(final ProcessInstanceUUID instanceUUID, final String activityId,
      final String iterationId, final String activityInstanceId, 
      final String queryList) throws ActivityNotFoundException, InstanceNotFoundException {
    final ActivityInstance result =
      EnvTool.getAllQueriers(queryList).getActivityInstance(instanceUUID, activityId, iterationId, activityInstanceId);
    if (result == null) {
      if (EnvTool.getAllQueriers(queryList).getProcessInstance(instanceUUID) == null) {
        throw new InstanceNotFoundException("bai_QRAPII_2", instanceUUID);
      }
      throw new ActivityNotFoundException("bai_QRAPII_3", instanceUUID, activityId, iterationId);
    }
    return new ActivityInstanceImpl(result);
  }
  
  public boolean canExecuteTask(ActivityInstanceUUID taskUUID, String queryList) throws TaskNotFoundException, RemoteException {
    TaskInstance task = getTask(taskUUID, queryList);
    if (task == null) {
      return false;
    }
    if (!task.getState().equals(ActivityState.READY)) {
      return false;
    }
    String userId = EnvTool.getUserId();
    if (task.isTaskAssigned()) {
      return task.getTaskUser().equals(userId);
    }
    return task.getTaskCandidates().contains(userId);
    
  }

  public Set getActivityInstances(final ProcessInstanceUUID instanceUUID, 
      final String queryList) {
    final Set result = new HashSet();
    for (final ActivityInstance record 
        : EnvTool.getAllQueriers(queryList).getActivityInstances(instanceUUID)) {
      result.add(new ActivityInstanceImpl(record));
    }
    return result;
  }

  public Set getActivityInstances(final ProcessInstanceUUID instanceUUID,
      final String activityId, final String queryList) throws ActivityNotFoundException {
    final Set result = new HashSet();
    for (final ActivityInstance record 
        : EnvTool.getAllQueriers(queryList).getActivityInstances(instanceUUID)) {
      if (record.getActivityName().equals(activityId)) {
        result.add(new ActivityInstanceImpl(record));
      }
    }
    if (result.isEmpty()) {
      throw new ActivityNotFoundException("bai_QRAPII_4", instanceUUID, activityId);
    }
    return result;
  }

  public Set getTasks(final ProcessInstanceUUID instanceUUID, final String queryList) {
    final Set result = new HashSet();
    for (final TaskInstance record : EnvTool.getAllQueriers(queryList).getTaskInstances(instanceUUID)) {
      result.add(new ActivityInstanceImpl(record));
    }
    return result;
  }

  public Collection getTaskList(final ProcessInstanceUUID instanceUUID,
      final ActivityState taskState, final String queryList) throws InstanceNotFoundException {
    return getTaskListUser(instanceUUID, EnvTool.getUserId(), taskState, queryList);
  }
  
  public Collection getTaskList(ProcessInstanceUUID instanceUUID, Collection taskStates, String queryList)
      throws InstanceNotFoundException, RemoteException {
      FacadeUtil.checkArgsNotNull(instanceUUID, taskStates);
	  final Collection todos = new HashSet();
	  for (ActivityState taskState : taskStates) {
		  Collection tasks = getTaskListUser(instanceUUID, EnvTool.getUserId(), taskState, queryList);
		  if (tasks != null) {
			  todos.addAll(tasks);
		  }
	  }
    return todos;
  }

  public Collection getTaskList(final ActivityState taskState, final String queryList) {
    return getTaskListUser(EnvTool.getUserId(), taskState, queryList);
  }

  public TaskInstance getTask(final ActivityInstanceUUID taskUUID, final String queryList) throws TaskNotFoundException {
    final TaskInstance taskInstance = EnvTool.getAllQueriers(queryList).getTaskInstance(taskUUID);
    if (taskInstance == null) {
      throw new TaskNotFoundException("bai_QRAPII_5", taskUUID);
    }
    return new ActivityInstanceImpl(taskInstance);
  }

  public Map getActivityInstanceVariables(final ProcessInstanceUUID instanceUUID,
      final String activityId, final String iterationId, final String activityInstanceId, 
      final String queryList) throws ActivityNotFoundException, InstanceNotFoundException {

    final ActivityInstance activityInst =
      getActivityInstance(instanceUUID, activityId, iterationId, activityInstanceId, queryList);
    if (activityInst == null) {
      throw new ActivityNotFoundException("bai_QRAPII_6", instanceUUID, activityId);
    }
    return activityInst.getLastKnownVariableValues();
  }

  public Object getActivityInstanceVariable(final ProcessInstanceUUID instanceUUID,
      final String activityId, final String iterationId,
      final String activityInstanceId, final String variableId, final String queryList) throws InstanceNotFoundException,
      ActivityNotFoundException, VariableNotFoundException {
    final Map variables = 
      getActivityInstanceVariables(instanceUUID, activityId, iterationId, activityInstanceId, queryList);
    if (variables == null || !variables.containsKey(variableId)) {
      throw new VariableNotFoundException("bai_QRAPII_7", instanceUUID, activityId, variableId);
    }
    return variables.get(variableId);
  }

  public Map getProcessInstanceVariables(
      final ProcessInstanceUUID instanceUUID, final String queryList) throws InstanceNotFoundException {
    final ProcessInstance processInstance = getProcessInstance(instanceUUID, queryList);
    if (processInstance == null) {
      throw new InstanceNotFoundException("bai_QRAPII_8", instanceUUID);
    }
    return processInstance.getLastKnownVariableValues();
  }

  private Map getProcessInstanceVariables(
      final ProcessInstanceUUID instanceUUID, final String queryList, final Date maxDate) throws InstanceNotFoundException {
    //take all initial instance var and for each varupdate being proceed before max date, replace the initial value by the new one  
    final ProcessInstance processInstance = getProcessInstance(instanceUUID, queryList);

    final Map instanceInitialVars = processInstance.getInitialVariableValues();
    final Map instanceVarBeforeMaxDate = new HashMap();
    instanceVarBeforeMaxDate.putAll(instanceInitialVars);

    final Map maxVarUpdates = new HashMap();

    for (VariableUpdate varUpdate : processInstance.getVariableUpdates()) {
      if (varUpdate.getDate().getTime() <= maxDate.getTime()) {
        VariableUpdate currentMax = maxVarUpdates.get(varUpdate.getName()); 
        if (currentMax == null || currentMax.getDate().getTime() <= varUpdate.getDate().getTime()) {
          maxVarUpdates.put(varUpdate.getName(), varUpdate);
          instanceVarBeforeMaxDate.put(varUpdate.getName(), varUpdate.getValue());
        }
      }
    }
    return instanceVarBeforeMaxDate;
  }

  private Object getProcessInstanceVariable(final ProcessInstanceUUID instanceUUID,
      final String variableId, final String queryList, 
      final Date maxDate) throws InstanceNotFoundException, VariableNotFoundException {
    final Map variables = getProcessInstanceVariables(instanceUUID, queryList, maxDate);
    if (variables == null || !variables.containsKey(variableId)) {
      throw new VariableNotFoundException("bai_QRAPII_9", instanceUUID, variableId);
    }
    return variables.get(variableId);
  }

  public Object getProcessInstanceVariable(final ProcessInstanceUUID instanceUUID,
      final String variableId, final String queryList) throws InstanceNotFoundException, VariableNotFoundException {
    final Map variables = getProcessInstanceVariables(instanceUUID, queryList);
    if (variables == null || !variables.containsKey(variableId)) {
      throw new VariableNotFoundException("bai_QRAPII_10", instanceUUID, variableId);
    }
    return variables.get(variableId);
  }

  public ActivityInstance getActivityInstance(
      final ActivityInstanceUUID activityUUID, final String queryList) throws ActivityNotFoundException {
    final ActivityInstance activity = EnvTool.getAllQueriers(queryList).getActivityInstance(activityUUID);
    if (activity == null) {
      throw new ActivityNotFoundException("bai_QRAPII_11", activityUUID);
    }
    return new ActivityInstanceImpl(activity);
  }

  public ActivityState getActivityInstanceState(final ActivityInstanceUUID activityUUID,
      final String queryList) throws ActivityNotFoundException {
    FacadeUtil.checkArgsNotNull(activityUUID);
    final Querier querier = EnvTool.getAllQueriers(queryList);
    ActivityState state = querier.getActivityInstanceState(activityUUID);
    if (state == null) {
    	throw new ActivityNotFoundException("bai_QRAPII_3", activityUUID.getProcessInstanceUUID(), activityUUID.getActivityName(), activityUUID.getActivityNb());
    }
    return state;
  }
  
  public Object getActivityInstanceVariable(final ActivityInstanceUUID activityUUID,
      final String variableId, final String queryList) throws ActivityNotFoundException,
      VariableNotFoundException {
    final ActivityInstance activity = getActivityInstance(activityUUID, queryList);
    final Map variableValues = activity.getLastKnownVariableValues();

    if (!variableValues.containsKey(variableId)) {
      throw new VariableNotFoundException("bai_QRAPII_12", activityUUID, variableId);
    }
    return activity.getLastKnownVariableValues().get(variableId);
  }

  public Map getActivityInstanceVariables(
      final ActivityInstanceUUID activityUUID, final String queryList) throws ActivityNotFoundException {
    final ActivityInstance activity = getActivityInstance(activityUUID, queryList);
    return activity.getLastKnownVariableValues();
  }

  public Collection getTaskList(final ProcessInstanceUUID instanceUUID,
      final String userId, final ActivityState taskState, final String queryList) throws InstanceNotFoundException {
    return getTaskListUser(instanceUUID, userId, taskState, queryList);
  }

  public Collection getTaskList(
      final String userId, final ActivityState taskState, final String queryList) {
    return getTaskListUser(userId, taskState, queryList);
  }

  private Collection getTaskListUser(final ProcessInstanceUUID instanceUUID, final String userId,
      final ActivityState taskState, final String queryList) throws InstanceNotFoundException {
    FacadeUtil.checkArgsNotNull(instanceUUID, taskState, userId);
    final ProcessInstance processInstance = getProcessInstance(instanceUUID, queryList);
    if (processInstance == null) {
      throw new InstanceNotFoundException("bai_QRAPII_13", instanceUUID);
    }
    final Querier journal = EnvTool.getAllQueriers(queryList);
    final Set userInstanceTasks =
      journal.getUserInstanceTasks(userId, instanceUUID, taskState);

    final Collection todos = new ArrayList();
    for (final TaskInstance taskActivity : userInstanceTasks) {
      todos.add(new ActivityInstanceImpl(taskActivity));
    }
    return todos;
  }
  private Collection getTaskListUser(
      final String userId, final ActivityState taskState, final String queryList) {
    FacadeUtil.checkArgsNotNull(userId, taskState);
    final Collection todos = new ArrayList();
    final Querier querier = EnvTool.getAllQueriers(queryList);
    final Set taskActivities = querier.getUserTasks(userId, taskState);
    for (final TaskInstance taskActivity : taskActivities) {
      todos.add(new ActivityInstanceImpl(taskActivity));
    }
    return todos;
  }


  public Object getVariable(final ActivityInstanceUUID activityUUID, final String variableId, 
      final String queryList) throws ActivityNotFoundException, VariableNotFoundException {
    try {
      return getActivityInstanceVariable(activityUUID, variableId, queryList);
    } catch (final VariableNotFoundException e) {
      final ActivityInstance activity = getActivityInstance(activityUUID, queryList);
      Date maxDate = getMaxDate(activity);

      try {
        return getProcessInstanceVariable(activity.getProcessInstanceUUID(), variableId, queryList, maxDate);
      } catch (final InstanceNotFoundException e1) {
        // If activity exists, the process instance must exist too.
        Misc.unreachableStatement();
        return null;
      }
    }
  }

  public Map getVariables(final ActivityInstanceUUID activityUUID, 
      final String queryList) throws ActivityNotFoundException {
    final ActivityInstance activity = EnvTool.getAllQueriers(queryList).getActivityInstance(activityUUID);
    if (activity == null) {
      throw new ActivityNotFoundException("bai_QRAPII_14", activityUUID);
    }
    Date maxDate = getMaxDate(activity);
    try {
      final Map allVariables = new HashMap();
      final Map localVariables = activity.getLastKnownVariableValues();
      final Map globalVariables = 
        getProcessInstanceVariables(activity.getProcessInstanceUUID(), queryList, maxDate);
      //add global first because if some variables are in both local and global
      //we want to keep local value
      allVariables.putAll(globalVariables);
      allVariables.putAll(localVariables);
      return allVariables;
    } catch (final InstanceNotFoundException e) {
      // If activity exists, the process instance must exist too.
      Misc.unreachableStatement();
      return null;
    }
  }

  private Date getMaxDate(ActivityInstance activity) {
    Date endedDate = activity.getEndedDate();
    if (endedDate == null) {
      return new Date();
    }
    return endedDate;

  }

  public List getCommentFeed(ProcessInstanceUUID instanceUUID, String queryList) throws InstanceNotFoundException {
	  ProcessInstance instance =
      EnvTool.getAllQueriers(queryList).getProcessInstance(instanceUUID);
    if (instance == null) {
      throw new InstanceNotFoundException("bai_QRAPII_15", instanceUUID);
    }
    ProcessInstance process = new ProcessInstanceImpl(instance);
    return process.getCommentFeed();
  }
  
  public byte[] getAttachment(ProcessInstanceUUID instanceUUID, String attachmentName, String queryList) {
    FacadeUtil.checkArgsNotNull(instanceUUID);
    LargeDataRepository largeDataRepository = EnvTool.getLargeDataRepository();
    return largeDataRepository.getData(byte[].class, Misc.getAttachmentCategories(instanceUUID), attachmentName);
  }
  
  public Map getAttachments(ProcessInstanceUUID instanceUUID, String queryList) {
    FacadeUtil.checkArgsNotNull(instanceUUID);
    LargeDataRepository largeDataRepository = EnvTool.getLargeDataRepository();
    return largeDataRepository.getData(byte[].class, Misc.getAttachmentCategories(instanceUUID));
  }
  
  public Map getAttachments(ProcessInstanceUUID instanceUUID, Set attachmentNames, String queryList) {
    FacadeUtil.checkArgsNotNull(instanceUUID);
    LargeDataRepository largeDataRepository = EnvTool.getLargeDataRepository();
    return largeDataRepository.getData(byte[].class, Misc.getAttachmentCategories(instanceUUID), attachmentNames);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy