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.
 **/
package org.ow2.bonita.facade.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
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.ActivityBody;
import org.ow2.bonita.facade.runtime.ActivityFullInstance;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.runtime.ActivityState;
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.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.ProcessDefinitionUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.facade.uuid.TaskUUID;
import org.ow2.bonita.services.Querier;
import org.ow2.bonita.util.EngineEnvTool;
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 = EngineEnvTool.getAllQueriers(queryList).getProcessInstance(instanceUUID);
    if (result == null) {
      throw new InstanceNotFoundException(instanceUUID);
    }
    return new ProcessInstanceImpl(result);
  }

  public Set getProcessInstances(final String queryList) {
    final Set result = new HashSet();
    for (final ProcessInstance record : EngineEnvTool.getAllQueriers(queryList).getProcessInstances()) {
      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 : EngineEnvTool.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 =
      EngineEnvTool.getAllQueriers(queryList).getActivityInstance(instanceUUID, activityId, iterationId, activityInstanceId);
    if (result == null) {
      if (EngineEnvTool.getAllQueriers(queryList).getProcessInstance(instanceUUID) == null) {
        throw new InstanceNotFoundException(instanceUUID);
      }
      throw new ActivityNotFoundException(instanceUUID, activityId, iterationId);
    }
    return new ActivityInstanceImpl(result);
  }

  public Set> getActivityInstances(final ProcessInstanceUUID instanceUUID, 
      final String queryList) {
    final Set> result = new HashSet>();
    for (final ActivityInstance record 
        : EngineEnvTool.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 
        : EngineEnvTool.getAllQueriers(queryList).getActivityInstances(instanceUUID)) {
      if (record.getActivityId().equals(activityId)) {
        result.add(new ActivityInstanceImpl(record));
      }
    }
    if (result.isEmpty()) {
      throw new ActivityNotFoundException(instanceUUID, activityId);
    }
    return result;
  }

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

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

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

  public ActivityInstance< TaskInstance > getTask(final TaskUUID taskUUID, final String queryList) throws TaskNotFoundException {
    final ActivityInstance< TaskInstance > taskInstance = EngineEnvTool.getAllQueriers(queryList).getTaskInstance(taskUUID);
    if (taskInstance == null) {
      throw new TaskNotFoundException(taskUUID);
    }
    return new ActivityInstanceImpl< TaskInstance >(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(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(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(instanceUUID);
    }
    return processInstance.getLastKnownVariableValues();
  }

  private Map getProcessInstanceVariables(
      final ProcessInstanceUUID instanceUUID, final String queryList, final Date maxDate) throws InstanceNotFoundException {
    final ProcessInstance processInstance = getProcessInstance(instanceUUID, queryList);
    Map vars = processInstance.getInitialVariableValues();
    Map activityDateValue = new HashMap();
    VariableUpdate last = null;
    for (VariableUpdate varUpdate : processInstance.getVariableUpdates()) {
      last = activityDateValue.get(varUpdate.getName());
      if (varUpdate.getDate().getTime() <= maxDate.getTime()) {
        if (last == null || last.getDate().getTime() <= varUpdate.getDate().getTime()) {
          activityDateValue.put(varUpdate.getName(), varUpdate);
          vars.put(varUpdate.getName(), varUpdate.getValue());
        }
      }
    }
    return vars;
  }

  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(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(instanceUUID, variableId);
    }
    return variables.get(variableId);
  }

  /*
  private Map getVariablesInitialValue(List variableDefinitions) {
    final Map values = new HashMap();
    if (variableDefinitions != null) {
      for (VariableDefinitionImpl variableDefinition : variableDefinitions) {
        final String variableId = variableDefinition.getKey();
        Object initialValue = null;
        if (variableDefinition.getSourceDescriptor() != null) {
          initialValue = variableDefinition.getSourceDescriptor().cget();
        }
        values.put(variableId, initialValue);
      }
    }
    return values;
  }

  @SuppressWarnings("unchecked")
  public Map getActivityVariableDefinitions(ProcessDefinitionUUID processId,
      String activityId) throws ProcessNotFoundException, ActivityNotFoundException {
    final XpdlProcess process  = EnvTool.getRepository().findXpdlProcessById(processId);
    if (process == null) {
      throw new ProcessNotFoundException(processId);
    }
    final NodeImpl node = process.getNode(activityId);
    if (node == null) {
      throw new ActivityNotFoundException(processId, activityId);
    }
    final AbstractActivity activity = (AbstractActivity) node.getBehaviour();
    final List variableDefinitions = new ArrayList();
    if (activity.getVariableDefinitions() != null) {
      variableDefinitions.addAll(activity.getVariableDefinitions());
    }
    if (process.getVariableDefinitions() != null) {
      variableDefinitions.addAll(process.getVariableDefinitions());
    }
    return getVariablesInitialValue((List) variableDefinitions);
  }

  @SuppressWarnings("unchecked")
  public Map getProcessVariableDefinitions(ProcessDefinitionUUID processId) throws ProcessNotFoundException {
    final XpdlProcess process  = EnvTool.getRepository().findXpdlProcessById(processId);
    if (process == null) {
      throw new ProcessNotFoundException(processId);
    }
    final List variableDefinitions = process.getVariableDefinitions();
    return getVariablesInitialValue((List) variableDefinitions);
  }

   */

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

  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(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(instanceUUID);
    }
    final Querier journal = EngineEnvTool.getAllQueriers(queryList);
    final Set> userInstanceTasks =
      journal.getUserInstanceTasks(userId, instanceUUID, taskState);

    final Collection> todos = new ArrayList>();
    for (final ActivityInstance 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 = EngineEnvTool.getAllQueriers(queryList);
    final Set> taskActivities = querier.getUserTasks(userId, taskState);
    for (final ActivityFullInstance 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.getBody());

      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 ActivityFullInstance activity = EngineEnvTool.getAllQueriers(queryList).getActivityInstance(activityUUID);
    if (activity == null) {
      throw new ActivityNotFoundException(activityUUID);
    }
    Date maxDate = getMaxDate(activity.getBody());
    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(ActivityBody body) {
    Date maxDate = body.getEndedDate();
    if (maxDate == null) {
      for (StateUpdate stateUpdate : body.getStateUpdates()) {
        Date updateDate = stateUpdate.getUpdatedDate();
        if (maxDate == null || updateDate.getTime() >= maxDate.getTime()) {
          maxDate = updateDate;
        }
      }
    }
    return maxDate;

  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy