package net.conselldemallorca.helium.jbpm3.command; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hibernate.Query; import org.jbpm.JbpmContext; import org.jbpm.command.AbstractGetObjectBaseCommand; import org.jbpm.command.Command; /** * Command per obtenir la llista de tasques personals * * @author Limit Tecnologies <limit@limit.es> */ public class GetRootProcessInstancesForExpedientsWithActiveTasksCommand extends AbstractGetObjectBaseCommand implements Command { private static final long serialVersionUID = -1908847549444051495L; private String actorId; private List<String> ids; private boolean pooled; private boolean nomesAmbPendents; private boolean nomesMeves; public GetRootProcessInstancesForExpedientsWithActiveTasksCommand() {} public GetRootProcessInstancesForExpedientsWithActiveTasksCommand( String actorId, List<String> ids, boolean pooled, boolean nomesAmbPendents, boolean nomesMeves) { super(); this.actorId = actorId; this.ids = ids; this.pooled = pooled; this.nomesAmbPendents = nomesAmbPendents; this.nomesMeves = nomesMeves; } @SuppressWarnings("unchecked") public Object execute(JbpmContext jbpmContext) throws Exception { setJbpmContext(jbpmContext); String hqlPersonal = "select " + " ti.processInstance.id, " + " ti.processInstance.superProcessToken.id, " + " ti.id " + "from " + " org.jbpm.taskmgmt.exe.TaskInstance as ti " + "where 1=1 " + ((nomesMeves) ? " and ti.actorId = :actorId " : " and ti.actorId is not null ") + ((nomesAmbPendents) ? " and ti.isSuspended = false and ti.isOpen = true " : " "); String hqlPooled = "select " + " ti.processInstance.id, " + " ti.processInstance.superProcessToken.id, " + " ti.id " + "from " + " org.jbpm.taskmgmt.exe.TaskInstance as ti " + " join ti.pooledActors pooledActor " + "where ti.actorId is null " + ((nomesMeves) ? " and pooledActor.actorId = :actorId " : " and pooledActor.actorId is not null ") + ((nomesAmbPendents) ? " and ti.isSuspended = false and ti.isOpen = true " : " "); String hql = pooled ? hqlPooled : hqlPersonal; Query query = jbpmContext.getSession().createQuery(hql); if (nomesMeves) query.setString("actorId", actorId); List<Object[]> llistaActorId = query.list(); Set<Long> superProcessTokenIds = new HashSet<Long>(); do { superProcessTokenIds.clear(); for (Object[] reg: llistaActorId) { if (reg[1] != null) superProcessTokenIds.add((Long)reg[1]); } if (superProcessTokenIds.size() > 0) { Query queryProcessInstancesPare = jbpmContext.getSession().createQuery( "select " + " t.processInstance.id, " + " t.processInstance.superProcessToken.id, " + " t.id " + "from " + " org.jbpm.graph.exe.Token as t " + "where " + " t.id in (:superProcessTokenIds)"); queryProcessInstancesPare.setParameterList( "superProcessTokenIds", superProcessTokenIds); List<Object[]> llistaProcessInstancesPare = queryProcessInstancesPare.list(); for (Object[] regAct: llistaActorId) { if (regAct[1] != null) { for (Object[] regSup: llistaProcessInstancesPare) { if (regSup[2].equals(regAct[1])) { regAct[0] = regSup[0]; regAct[1] = regSup[1]; break; } } } } } } while (superProcessTokenIds.size() > 0); List<Long> listadoTask = new ArrayList<Long>(); List<String> listadoExpedientes = new ArrayList<String>(); // Quitamos los expedientes sin tareas activas for (String id: ids) { for (Object[] fila : llistaActorId) { if (new Long(id).equals(fila[0]) && !listadoTask.contains(fila[2])) { listadoTask.add((Long)fila[2]); listadoExpedientes.add(id); } } } return listadoExpedientes; } public String getActorId() { return actorId; } public void setActorId(String actorId) { this.actorId = actorId; } @Override public String toString() { return "GetRootProcessInstancesForExpedientsWithActiveTasksCommand [actorId=" + actorId + ", ids=" + ids + ", pooled=" + pooled + ", nomesAmbPendents=" + nomesAmbPendents + ", nomesMeves=" + nomesMeves + "]"; } @Override public String getAdditionalToStringInformation() { return "actorId=" + actorId; } public GetRootProcessInstancesForExpedientsWithActiveTasksCommand actorId(String actorId) { setActorId(actorId); return this; } }