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

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

/**
 * Copyright (C) 2006  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.persistence.db;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.ow2.bonita.facade.def.majorElement.ActivityDefinition;
import org.ow2.bonita.facade.def.majorElement.PackageDefinition;
import org.ow2.bonita.facade.def.majorElement.PackageFullDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
import org.ow2.bonita.facade.def.majorElement.ProcessFullDefinition;
import org.ow2.bonita.facade.runtime.ActivityBody;
import org.ow2.bonita.facade.runtime.ActivityFullInstance;
import org.ow2.bonita.facade.runtime.ActivityState;
import org.ow2.bonita.facade.runtime.ProcessFullInstance;
import org.ow2.bonita.facade.runtime.TaskInstance;
import org.ow2.bonita.facade.uuid.ActivityDefinitionUUID;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.PackageDefinitionUUID;
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.persistence.QuerierDbSession;
import org.ow2.bonita.persistence.QuerierUtil;
import org.ow2.bonita.services.Querier;
import org.ow2.bonita.util.EnvTool;
import org.ow2.bonita.util.Misc;


public class AbstractDbQuerier implements Querier {

  private String persistenceServiceName;
  protected DbQuerierBuffer buffer;

  public AbstractDbQuerier(String persistenceServiceName, DbQuerierBuffer buffer) {
    super();
    this.persistenceServiceName = persistenceServiceName;
    this.buffer = buffer;
  }

  protected QuerierDbSession getQuerierDbSession() {
    return EnvTool.getQuerierDbSession(persistenceServiceName);
  }


  public ActivityDefinition getActivity(ActivityDefinitionUUID activityDefinitionUUID) {
    Misc.checkArgsNotNull(activityDefinitionUUID);
    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      Collection processes = pack.getProcesses();
      if (processes != null) {
        for (ProcessFullDefinition process : processes) {
          Set activities = process.getActivities();
          if (activities != null) {
            for (ActivityDefinition activity : activities) {
              if (activity.getUUID().equals(activityDefinitionUUID)) {
                return activity;
              }
            }
          }
        }
      }
    }

    ActivityDefinition dbAD = getQuerierDbSession().getActivityDefinition(activityDefinitionUUID);
    if (dbAD == null || buffer.isPackageRemoved(dbAD.getPackageDefinitionUUID())) {
      return null;
    }
    return dbAD;
  }

  public ActivityFullInstance getActivityInstance(
      ProcessInstanceUUID instanceUUID, String activityId, String iterationId,
      String activityInstanceId) {

    Misc.checkArgsNotNull(instanceUUID, activityId, iterationId, activityInstanceId);

    if (buffer.isInstanceRemoved(instanceUUID)) {
      return null;
    }

    ProcessFullInstance processFullInstance = buffer.getInstance(instanceUUID);
    if (processFullInstance != null) {
      return processFullInstance.getActivity(activityId, iterationId, activityInstanceId);
    }
    return getQuerierDbSession().getActivityInstance(instanceUUID, activityId, iterationId, activityInstanceId);
  }

  public ActivityFullInstance getActivityInstance(
      ActivityInstanceUUID activityInstanceUUID) {

    Misc.checkArgsNotNull(activityInstanceUUID);
    for (ProcessFullInstance instance : buffer.getInstances().values()) {
      Set> activities = instance.getActivities();
      if (activities != null) {
        for (ActivityFullInstance activity : activities) {
          if (activity.getUUID().equals(activityInstanceUUID)) {
            return activity;
          }
        }
      }
    }
    ActivityFullInstance aFI = 
      getQuerierDbSession().getActivityInstance(activityInstanceUUID);
    if (aFI == null || buffer.isInstanceRemoved(aFI.getProcessInstanceUUID())) {
      return null;
    }
    return aFI;
  }

  public Set> getActivityInstances(
      ProcessInstanceUUID instanceUUID) {

    Misc.checkArgsNotNull(instanceUUID);

    if (buffer.isInstanceRemoved(instanceUUID)) {
      return new HashSet>();
    }
    Set> activityInstances = null;
    ProcessFullInstance processFullInstance = buffer.getInstance(instanceUUID);
    if (processFullInstance != null) {
      return processFullInstance.getActivities();
    }

    activityInstances = getQuerierDbSession().getActivityInstances(instanceUUID);
    if (activityInstances != null) {
      return activityInstances;
    }
    return new HashSet>();
  }



  public PackageFullDefinition getPackage(PackageDefinitionUUID packageUUID) {
    Misc.checkArgsNotNull(packageUUID);

    if (buffer.isPackageRemoved(packageUUID)) {
      return null;
    }

    PackageFullDefinition pack = buffer.getPackage(packageUUID);
    if (pack != null) {
      return pack;
    }
    pack = getQuerierDbSession().getPackage(packageUUID);
    if (pack != null) {
      buffer.addPackage(pack);
    }
    return pack; 
  }

  public PackageFullDefinition getPackage(String packageId, String version) {
    Misc.checkArgsNotNull(packageId, version);

    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      if (pack.getPackageId().equals(packageId) && pack.getVersion().equals(version)) {
        return pack;
      }
    }
    PackageFullDefinition pack = getQuerierDbSession().getPackage(packageId, version);
    if (pack == null || buffer.isPackageRemoved(pack.getUUID())) {
      return null;
    }
    return pack;
  }

  public ProcessFullDefinition getPackageProcess(
      PackageDefinitionUUID packageUUID, String processId) {
    Misc.checkArgsNotNull(packageUUID, processId);

    if (buffer.isPackageRemoved(packageUUID)) {
      return null;
    }

    PackageFullDefinition packageDef = buffer.getPackage(packageUUID);
    if (packageDef != null) {
      Set processes = packageDef.getProcesses();
      for (ProcessFullDefinition process : processes) {
        if (process.getProcessId().equals(processId)) {
          return process;
        }
      }
    }

    return getQuerierDbSession().getPackageProcess(packageUUID, processId);
  }

  public Set getPackageProcesses(
      PackageDefinitionUUID packageUUID) {
    Misc.checkArgsNotNull(packageUUID);

    if (buffer.isPackageRemoved(packageUUID)) {
      return null;
    }

    PackageFullDefinition packageDef = buffer.getPackage(packageUUID);
    if (packageDef != null) {
      return packageDef.getProcesses();
    }
    return getQuerierDbSession().getPackageProcesses(packageUUID);
  }

  public Set getPackages() {
    Set dbPackages = getQuerierDbSession().getPackages();
    for (PackageFullDefinition pack : dbPackages) {
      if (!buffer.containsPackage(pack.getUUID()) && !buffer.isPackageRemoved(pack.getUUID())) {
        buffer.addPackage(pack);
      }
    }
    return buffer.getPackagesSet();
  }

  public Set getPackages(String packageId) {
    Misc.checkArgsNotNull(packageId);

    Set dbPackages = getQuerierDbSession().getPackages(packageId);
    for (PackageFullDefinition pack : dbPackages) {
      if (!buffer.containsPackage(pack.getUUID()) && !buffer.isPackageRemoved(pack.getUUID())) {
        buffer.addPackage(pack);
      }
    }

    Set packages = new HashSet();
    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      if (pack.getPackageId().equals(packageId)) {
        packages.add(pack);
      }
    }

    return packages;
  }

  public Set getPackages(PackageDefinition.PackageState packageState) {
    Misc.checkArgsNotNull(packageState);

    Set dbPackages = getQuerierDbSession().getPackages(packageState);
    for (PackageFullDefinition pack : dbPackages) {
      if (!buffer.containsPackage(pack.getUUID()) && !buffer.isPackageRemoved(pack.getUUID())) {
        buffer.addPackage(pack);
      }
    }

    Set packages = new HashSet();
    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      if (PackageDefinition.PackageState.DEPLOYED.equals(packageState) && pack.getUndeployedBy() == null) {
        packages.add(pack);
      } else if (PackageDefinition.PackageState.UNDEPLOYED.equals(packageState)) {
        packages.add(pack);
      }
    }

    return packages;
  }

  public Set getPackages(String packageId,
      PackageDefinition.PackageState packageState) {
    Misc.checkArgsNotNull(packageId, packageState);

    Set dbPackages = getQuerierDbSession().getPackages(packageId, packageState);
    for (PackageFullDefinition pack : dbPackages) {
      if (!buffer.containsPackage(pack.getUUID()) && !buffer.isPackageRemoved(pack.getUUID())) {
        buffer.addPackage(pack);
      }
    }

    Set packages = new HashSet();
    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      if (pack.getPackageId().equals(packageId)) {
        if (PackageDefinition.PackageState.DEPLOYED.equals(packageState) && pack.getUndeployedBy() == null) {
          packages.add(pack);
        } else if (PackageDefinition.PackageState.UNDEPLOYED.equals(packageState)) {
          packages.add(pack);
        }
      }
    }

    return packages;
  }

  public ProcessFullInstance getProcessInstance(ProcessInstanceUUID instanceUUID) {
    Misc.checkArgsNotNull(instanceUUID);

    if (buffer.isInstanceRemoved(instanceUUID)) {
      return null;
    }
    ProcessFullInstance processFullInstance = buffer.getInstance(instanceUUID);
    if (processFullInstance != null) {
      return processFullInstance;
    }
    processFullInstance = getQuerierDbSession().getProcessInstance(instanceUUID);
    if (processFullInstance != null) {
      buffer.addInstance(processFullInstance);
    }
    return processFullInstance;
  }

  public Set getProcessInstances() {
    Set dbInstances = getQuerierDbSession().getProcessInstances();
    for (ProcessFullInstance instance : dbInstances) {
      if (!buffer.containsInstance(instance.getUUID()) && !buffer.isInstanceRemoved(instance.getUUID())) {
        buffer.addInstance(instance);
      }
    }
    return buffer.getInstancesSet();
  }

  public Set getProcessInstances(
      ProcessDefinitionUUID processUUID) {
    Misc.checkArgsNotNull(processUUID);

    Set dbInstances = getQuerierDbSession().getProcessInstances(processUUID);
    for (ProcessFullInstance instance : dbInstances) {
      if (!buffer.containsInstance(instance.getUUID()) && !buffer.isInstanceRemoved(instance.getUUID())) {
        buffer.addInstance(instance);
      }
    }

    Set instances = new HashSet();
    for (ProcessFullInstance instance : buffer.getInstances().values()) {
      if (instance.getProcessDefinitionUUID().equals(processUUID)) {
        instances.add(instance);
      }
    }
    return instances;
  }

  public Set getProcesses(String processId, String version) {
    Misc.checkArgsNotNull(processId, version);
    
    Set processes = getQuerierDbSession().getProcesses(processId, version);
    return mergeBuffer(processes);
  }
  
  public ProcessFullDefinition getProcess(String packageId, String processId, String version) {
    Misc.checkArgsNotNull(packageId, processId, version);

    for (PackageFullDefinition pack : buffer.getPackages(packageId).values()) {
      Set processes = pack.getProcesses();
      if (processes != null && !processes.isEmpty()) {
        for (ProcessFullDefinition process : processes) {
          if (process.getProcessId().equals(processId) && process.getVersion().equals(version)) {
            return process;
          }
        }
      }
    }

    ProcessFullDefinition process = getQuerierDbSession().getProcess(packageId, processId, version);
    if (process == null || buffer.isPackageRemoved(process.getPackageDefinitionUUID())) {
      return null;
    }
    return process;
  }

  public ProcessFullDefinition getProcess(ProcessDefinitionUUID processUUID) {
    Misc.checkArgsNotNull(processUUID);

    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      Set processes = pack.getProcesses();
      if (processes != null && !processes.isEmpty()) {
        for (ProcessFullDefinition process : processes) {
          if (process.getUUID().equals(processUUID)) {
            return process;
          }
        }
      }
    }

    ProcessFullDefinition process = getQuerierDbSession().getProcess(processUUID);
    if (process == null || buffer.isPackageRemoved(process.getPackageDefinitionUUID())) {
      return null;
    }
    return process;

  }

  public Set getProcesses() {
    Set processes = getQuerierDbSession().getProcesses();
    return mergeBuffer(processes);
  }

  public Set getProcesses(String processId) {
    Misc.checkArgsNotNull(processId);

    Set processes = getQuerierDbSession().getProcesses(processId);
    return mergeBuffer(processes);
  }

  public Set getProcesses(ProcessDefinition.ProcessState processState) {
    Misc.checkArgsNotNull(processState);

    Set processes = getQuerierDbSession().getProcesses(processState);
    return mergeBuffer(processes);
  }

  public Set getProcesses(String processId,
      ProcessDefinition.ProcessState processState) {
    Misc.checkArgsNotNull(processId, processState);

    Set processes = getQuerierDbSession().getProcesses(processId, processState);
    return mergeBuffer(processes);
  }

  public Set getPackageProcesses(String packageId, String processId) {
    Misc.checkArgsNotNull(packageId, processId);
    
    Set processes = getQuerierDbSession().getProcesses(packageId, processId);
    return mergeBuffer(processes);
  }

  public Set getProcesses(String packageId, 
      String processId, ProcessDefinition.ProcessState processState) {
    Misc.checkArgsNotNull(packageId, processId, processState);
    
    Set processes = getQuerierDbSession().getProcesses(packageId, processId, processState);
    return mergeBuffer(processes);
  }

  @SuppressWarnings("unchecked")
  public ActivityFullInstance getTaskInstance(TaskUUID taskUUID) {
    Misc.checkArgsNotNull(taskUUID);

    for (ProcessFullInstance instance : buffer.getInstances().values()) {
      Set> activities = instance.getActivities();
      if (activities != null) {
        for (ActivityFullInstance< ? > activity : activities) {
          if (activity.getBody() != null && activity.getBody().getUUID().equals(taskUUID)) {
            return (ActivityFullInstance) activity;
          }
        }
      }
    }
    ActivityFullInstance aFI = 
      getQuerierDbSession().getTaskInstance(taskUUID);
    if (aFI == null || buffer.isInstanceRemoved(aFI.getProcessInstanceUUID())) {
      return null;
    }
    return aFI;

  }

  @SuppressWarnings("unchecked")
  public Set> getTaskInstances(
      ProcessInstanceUUID instanceUUID) {
    Misc.checkArgsNotNull(instanceUUID);

    if (buffer.isInstanceRemoved(instanceUUID)) {
      return new HashSet>();
    }

    Set>taskActivities = new HashSet>();

    ProcessFullInstance instance = buffer.getInstance(instanceUUID);
    if (instance != null) {
      Set> activities = instance.getActivities();
      if (activities != null) {
        for (ActivityFullInstance< ? > activity : activities) {
          if (activity.getBody() != null && activity.getBody() instanceof TaskInstance) {
            taskActivities.add((ActivityFullInstance) activity);
          }
        }
      }
      return taskActivities;
    }
    return getQuerierDbSession().getTaskInstances(instanceUUID);
  }

  public Set> getUserInstanceTasks(
      String userId, ProcessInstanceUUID instanceUUID, ActivityState taskState) {
    Misc.checkArgsNotNull(userId, instanceUUID, taskState);

    if (buffer.isInstanceRemoved(instanceUUID)) {
      return new HashSet>();
    }

    Set> taskActivities = new HashSet>();

    ProcessFullInstance instance = buffer.getInstance(instanceUUID);
    if (instance != null) {
      taskActivities.addAll(QuerierUtil.getUserTasks(instance.getActivities(), userId, taskState));
      return taskActivities;
    }

    return getQuerierDbSession().getUserInstanceTasks(userId, instanceUUID, taskState);
  }

  public Set> getUserTasks(String userId,
      ActivityState taskState) {
    Misc.checkArgsNotNull(userId, taskState);

    Set> bufferTaskActivities = 
      new HashSet>();
    for (ProcessFullInstance instance : buffer.getInstances().values()) {
      bufferTaskActivities.addAll(QuerierUtil.getUserTasks(instance.getActivities(), userId, taskState));
    }

    Map> taskActivities = 
      new HashMap>();

    for (ActivityFullInstance taskActivity : bufferTaskActivities) {
      taskActivities.put(taskActivity.getUUID(), taskActivity);
    }

    Set> dbTaskActivities = getQuerierDbSession().getUserTasks(userId, taskState);
    if (dbTaskActivities != null) {
      for (ActivityFullInstance activity : dbTaskActivities) {
        if (!buffer.isInstanceRemoved(activity.getProcessInstanceUUID()) && !taskActivities.containsKey(activity.getUUID())) {
          taskActivities.put(activity.getUUID(), activity);
        }
      }
    }

    Set> result =  new HashSet>();
    result.addAll(taskActivities.values());
    return result;
  }

  /*
   *SPECIFIC
   */

  public Set getDependentPackages(PackageDefinitionUUID packageUUID) {
    Misc.checkArgsNotNull(packageUUID);

    Set uuidDeps = new HashSet();
    Set deps = getQuerierDbSession().getDependentPackages(packageUUID);
    if (deps != null) {
      for (PackageFullDefinition pack : deps) {
        uuidDeps.add(pack.getUUID());
        if (buffer.isPackageRemoved(pack.getUUID())) {
          deps.remove(pack);
        }
      }
    }

    if (deps == null) {
      deps = new HashSet();
    }
    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      boolean isDep = !pack.getPackageDefinitionUUID().equals(packageUUID)
        && pack.getPackageDependencies() != null && pack.getPackageDependencies().contains(packageUUID);
      if (isDep && !uuidDeps.contains(pack.getUUID())) {
        uuidDeps.add(pack.getUUID());
        deps.add(pack);

      }
    }

    return deps;
  }

  public PackageFullDefinition getLastDeployedPackage(String packageId, PackageDefinition.PackageState packageState) {
    Misc.checkArgsNotNull(packageId);

    PackageFullDefinition last = getQuerierDbSession().getLastDeployedPackage(packageId, packageState);

    for (PackageFullDefinition pack : buffer.getPackages().values()) {
      boolean match = false;
      if (pack.getPackageId().equals(packageId)) {
        if (PackageDefinition.PackageState.DEPLOYED.equals(packageState) && pack.getUndeployedBy() == null) {
          match = true;
        } else if (PackageDefinition.PackageState.UNDEPLOYED.equals(packageState)) {
          match = true;
        }
      }

      if (match && (last == null || pack.getDeployedDate().after(last.getDeployedDate()))) {
        last = pack;
      }
    }
    return last;
  }

  public ProcessFullDefinition getLastDeployedProcess(
    String packageId, String processId, ProcessDefinition.ProcessState processState) {
    Misc.checkArgsNotNull(packageId, processId, processState);
    
    ProcessFullDefinition lastProcess = getQuerierDbSession().getLastDeployedProcess(packageId, processId, processState);
    if (lastProcess == null || buffer.isPackageRemoved(lastProcess.getPackageDefinitionUUID())) {
      return null;
    }
    return lastProcess;
  }
  
  private Set mergeBuffer(Set processes) {
    if (processes == null) {
      return new HashSet();
    }
    for (ProcessFullDefinition process : processes) {
      if (buffer.isPackageRemoved(process.getPackageDefinitionUUID())) {
        processes.remove(process);
      }
    }
    return processes;
  }
}






© 2015 - 2025 Weber Informatics LLC | Privacy Policy