/**
*
*/
package net.conselldemallorca.helium.jbpm3.command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper.MostrarTasquesDto;
import net.conselldemallorca.helium.jbpm3.integracio.LlistatIds;
import net.conselldemallorca.helium.v3.core.api.dto.PaginacioParamsDto.OrdreDireccioDto;
import net.conselldemallorca.helium.v3.core.api.dto.PaginacioParamsDto.OrdreDto;
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 GetRootProcessInstancesForActiveTasksCommand extends AbstractGetObjectBaseCommand implements Command {
private static final long serialVersionUID = -1908847549444051495L;
private String actorId;
private List<Long> idsPIExpedients;
private String tascaSel;
private String titol;
private Date dataCreacioInici;
private Date dataCreacioFi;
private Integer prioritat;
private Date dataLimitInici;
private Date dataLimitFi;
private boolean mostrarTasquesTots = false;
private Boolean mostrarTasquesNomesGroup = false;
private Boolean mostrarTasquesNomesPersonals = false;
private int firstRow;
private int maxResults;
private String sort;
private boolean asc;
private boolean nomesActives = true;
public GetRootProcessInstancesForActiveTasksCommand() {}
public GetRootProcessInstancesForActiveTasksCommand(String actorId, List<Long> idsPIExpedients) {
super();
this.actorId = actorId;
this.idsPIExpedients = idsPIExpedients;
}
public GetRootProcessInstancesForActiveTasksCommand(String actorId, List<Long> idsPIExpedients, Boolean mostrarTasquesNomesGroup) {
super();
this.actorId = actorId;
this.idsPIExpedients = idsPIExpedients;
this.mostrarTasquesNomesPersonals = !mostrarTasquesNomesGroup;
this.mostrarTasquesNomesGroup = mostrarTasquesNomesGroup;
}
public GetRootProcessInstancesForActiveTasksCommand(String actorId, String titol, String tascaSel, List<Long> idsPIExpedients, Date dataCreacioInici, Date dataCreacioFi, Integer prioritat, Date dataLimitInici, Date dataLimitFi, String sort, boolean asc,Boolean mostrarTasquesNomesGroup) {
super();
this.actorId = actorId;
this.idsPIExpedients = idsPIExpedients;
this.titol = titol;
this.tascaSel = tascaSel;
this.dataCreacioInici = dataCreacioInici;
this.dataCreacioFi = dataCreacioFi;
this.prioritat = prioritat;
this.dataLimitInici = dataLimitInici;
this.dataLimitFi = dataLimitFi;
this.mostrarTasquesNomesPersonals = !mostrarTasquesNomesGroup;
this.mostrarTasquesNomesGroup = mostrarTasquesNomesGroup;
this.sort = sort;
this.asc = asc;
}
public GetRootProcessInstancesForActiveTasksCommand(String responsable, String titol, String tascaSel, List<Long> idsExpedients, Date dataCreacioInici, Date dataCreacioFi, Integer prioritat, Date dataLimitInici, Date dataLimitFi, List<OrdreDto> ordres, boolean mostrarTasquesPersonals, boolean mostrarTasquesGrup) {
super();
this.actorId = responsable;
this.idsPIExpedients = idsExpedients;
this.titol = titol == null ? null : titol.trim();
this.tascaSel = tascaSel;
this.dataCreacioInici = dataCreacioInici;
this.dataCreacioFi = dataCreacioFi;
this.prioritat = prioritat;
this.dataLimitInici = dataLimitInici;
this.dataLimitFi = dataLimitFi;
this.mostrarTasquesNomesPersonals = mostrarTasquesPersonals;
this.mostrarTasquesNomesGroup = mostrarTasquesGrup;
this.mostrarTasquesTots = !mostrarTasquesPersonals && !mostrarTasquesGrup;
for (OrdreDto or : ordres) {
this.asc = or.getDireccio().equals(OrdreDireccioDto.ASCENDENT);
this.sort = or.getCamp();
break;
}
}
public GetRootProcessInstancesForActiveTasksCommand(String actorId, String titol, String tascaSel, List<Long> idsPIExpedients, Date dataCreacioInici, Date dataCreacioFi, Integer prioritat, Date dataLimitInici, Date dataLimitFi, String sort, boolean asc, MostrarTasquesDto mostrarTasques) {
super();
this.actorId = actorId;
this.idsPIExpedients = idsPIExpedients;
this.titol = titol;
this.tascaSel = tascaSel;
this.dataCreacioInici = dataCreacioInici;
this.dataCreacioFi = dataCreacioFi;
this.prioritat = prioritat;
this.dataLimitInici = dataLimitInici;
this.dataLimitFi = dataLimitFi;
this.mostrarTasquesTots = mostrarTasques == MostrarTasquesDto.MOSTRAR_TASQUES_TOTS;
this.mostrarTasquesNomesGroup = mostrarTasques == MostrarTasquesDto.MOSTRAR_TASQUES_NOMES_GROUPS;
this.mostrarTasquesNomesPersonals = mostrarTasques == MostrarTasquesDto.MOSTRAR_TASQUES_NOMES_PERSONALS;
this.sort = sort;
this.asc = asc;
}
@SuppressWarnings("unchecked")
public Object execute(JbpmContext jbpmContext) throws Exception {
setJbpmContext(jbpmContext);
String hqlSenseActorId =
"select " +
" ti.processInstance.id, " +
" ti.processInstance.superProcessToken.id, " +
" ti.id," +
" ti.name" +
" from " +
" org.jbpm.taskmgmt.exe.TaskInstance as ti " +
" where " +
" ti.isSuspended = false and ti.isOpen = true " +
((nomesActives) ? "and ti.isSuspended = false and ti.isOpen = true " : " ") +
((!mostrarTasquesTots && mostrarTasquesNomesGroup) ? "and ti.actorId is null " : " ") +
((!mostrarTasquesTots && mostrarTasquesNomesPersonals) ? "and ti.actorId is not null " : " ");
boolean condicioPersonals = !mostrarTasquesTots && mostrarTasquesNomesPersonals;
boolean condicioGrup = !mostrarTasquesTots && mostrarTasquesNomesGroup;
boolean condicioPersonalsIGrup = mostrarTasquesTots && !mostrarTasquesNomesPersonals && !mostrarTasquesNomesGroup;
String hqlAmbActorId =
"select " +
" ti.processInstance.id, " +
" ti.processInstance.superProcessToken.id, " +
" ti.id," +
" ti.name" +
" from " +
" org.jbpm.taskmgmt.exe.TaskInstance as ti " +
" left join ti.pooledActors pooledActor " +
" where " +
((condicioPersonals) ? "ti.actorId is not null and ti.actorId = :actorId " : "") +
((condicioGrup) ? "ti.actorId is null and pooledActor.actorId = :actorId " : "") +
((condicioPersonalsIGrup) ? "((ti.actorId is not null and ti.actorId = :actorId) or (ti.actorId is null and pooledActor.actorId = :actorId)) " : "") +
((nomesActives) ? "and ti.isSuspended = false and ti.isOpen = true" : "");
/*String hqlPersonal =
"select " +
" ti.processInstance.id, " +
" ti.processInstance.superProcessToken.id, " +
" ti.id," +
" ti.name" +
" from " +
" org.jbpm.taskmgmt.exe.TaskInstance as ti " +
" left join ti.pooledActors pooledActor " +
" where " +
" ti.actorId = :actorId " +
((nomesActives) ? "and ti.isSuspended = false and ti.isOpen = true" : "");
String hqlPooled =
"select " +
" ti.processInstance.id, " +
" ti.processInstance.superProcessToken.id, " +
" ti.id," +
" ti.name" +
" from " +
" org.jbpm.taskmgmt.exe.TaskInstance as ti " +
" left join ti.pooledActors pooledActor " +
" where " +
" pooledActor.actorId = :actorId " +
"and ti.actorId is null " +
((nomesActives) ? "and ti.isSuspended = false and ti.isOpen = true" : "");*/
String hql = "";
if (dataCreacioInici != null) {
hql += " and ti.create >= :dataCreacioInici";
}
if (dataCreacioFi != null) {
hql += " and ti.create <= :dataCreacioFi";
}
if (dataLimitInici != null) {
hql += " and ti.dueDate >= :dataLimitInici";
}
if (dataLimitFi != null) {
hql += " and ti.dueDate <= :dataLimitFi";
}
if (prioritat != null) {
hql += " and ti.priority = :prioritat";
}
if (tascaSel != null && !"".equals(tascaSel)) {
hql += " and ti.task.name = :tascaSel";
}
if (titol != null && !"".equals(titol)) {
hql += " and upper(ti.description) like '%@#@TITOL@#@%'||:titol||'%@#@ENTORNID@#@%' ";
}
if ("createTime".equals(sort) || "dataCreacio".equals(sort)) {
hql += " order by ti.create " + (asc ? "asc" : "desc");
} else if ("prioritat".equals(sort)) {
hql += " order by ti.priority " + (asc ? "asc" : "desc");
} else if ("dueDate".equals(sort)) {
hql += " order by ti.dueDate " + (asc ? "asc" : "desc");
} else if ("titol".equals(sort)) {
hql += " order by ti.name " + (asc ? "asc" : "desc");
}
List<Object[]> llistaActorId = new ArrayList<Object[]>();
if (actorId == null || "".equals(actorId)) {
Query query = jbpmContext.getSession().createQuery(hqlSenseActorId + hql);
if (dataCreacioInici != null)
query.setDate("dataCreacioInici", dataCreacioInici);
if (dataCreacioFi != null)
query.setDate("dataCreacioFi", dataCreacioFi);
if (dataLimitInici != null)
query.setDate("dataLimitInici", dataLimitInici);
if (dataLimitFi != null)
query.setDate("dataLimitFi", dataLimitFi);
if (prioritat != null)
query.setInteger("prioritat",3-prioritat);
if (tascaSel != null && !"".equals(tascaSel))
query.setString("tascaSel", tascaSel);
if (titol != null && !"".equals(titol))
query.setString("titol", titol.toUpperCase());
if (mostrarTasquesTots || mostrarTasquesNomesPersonals || mostrarTasquesNomesGroup)
llistaActorId.addAll(query.list());
} else if (mostrarTasquesTots || mostrarTasquesNomesPersonals || mostrarTasquesNomesGroup) {
Query query = jbpmContext.getSession().createQuery(hqlAmbActorId + hql);
query.setString("actorId", actorId);
if (dataCreacioInici != null)
query.setDate("dataCreacioInici", dataCreacioInici);
if (dataCreacioFi != null)
query.setDate("dataCreacioFi", dataCreacioFi);
if (dataLimitInici != null)
query.setDate("dataLimitInici", dataLimitInici);
if (dataLimitFi != null)
query.setDate("dataLimitFi", dataLimitFi);
if (prioritat != null)
query.setInteger("prioritat",3-prioritat);
if (tascaSel != null && !"".equals(tascaSel))
query.setString("tascaSel", tascaSel);
if (titol != null && !"".equals(titol))
query.setString("titol", titol.toUpperCase());
llistaActorId.addAll(query.list());
/*Query queryPersonal = jbpmContext.getSession().createQuery(hqlPersonal + hql);
queryPersonal.setString("actorId", actorId);
Query queryPooled = jbpmContext.getSession().createQuery(hqlPooled + hql);
queryPooled.setString("actorId", actorId);
if (dataCreacioInici != null) {
queryPersonal.setDate("dataCreacioInici", dataCreacioInici);
queryPooled.setDate("dataCreacioInici", dataCreacioInici);
}
if (dataCreacioFi != null) {
queryPersonal.setDate("dataCreacioFi", dataCreacioFi);
queryPooled.setDate("dataCreacioFi", dataCreacioFi);
}
if (dataLimitInici != null) {
queryPersonal.setDate("dataLimitInici", dataLimitInici);
queryPooled.setDate("dataLimitInici", dataLimitInici);
}
if (dataLimitFi != null) {
queryPersonal.setDate("dataLimitFi", dataLimitFi);
queryPooled.setDate("dataLimitFi", dataLimitFi);
}
if (prioritat != null) {
queryPersonal.setInteger("prioritat",3-prioritat);
queryPooled.setInteger("prioritat",3-prioritat);
}
if (tascaSel != null && !"".equals(tascaSel)) {
queryPersonal.setString("tascaSel", tascaSel);
queryPooled.setString("tascaSel", tascaSel);
}
if (titol != null && !"".equals(titol)) {
queryPersonal.setString("titol", titol.toUpperCase());
queryPooled.setString("titol", titol.toUpperCase());
}
if (mostrarTasquesTots || mostrarTasquesNomesPersonals) {
llistaActorId.addAll(queryPersonal.list());
}
if (mostrarTasquesTots || mostrarTasquesNomesGroup) {
llistaActorId.addAll(queryPooled.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);
queryProcessInstancesPare = translateIn(superProcessTokenIds, queryProcessInstancesPare, "superProcessTokenIds", "t.id");
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>();
// Ordenamos la lista en el caso de que sea por expedientes
if ("expedientTitol".equals(sort) || "expedientIdentificador".equals(sort) || "expedientTipusNom".equals(sort)) {
for (Long id : idsPIExpedients) {
for (Object[] fila : llistaActorId) {
if (id.equals(fila[0]) && !listadoTask.contains(fila[2])) {
listadoTask.add((Long) fila[2]);
}
}
}
} else {
for (Object[] fila : llistaActorId) {
if (idsPIExpedients.contains(fila[0]) && !listadoTask.contains(fila[2])) {
listadoTask.add((Long) fila[2]);
}
}
}
LlistatIds listado = new LlistatIds();
if (getFirstRow() > listadoTask.size()) {
setFirstRow(0);
}
maxResults = (maxResults > listadoTask.size()) ? listadoTask.size() : maxResults;
int limit = (maxResults > 0)? getFirstRow()+maxResults : listadoTask.size();
limit = (limit > listadoTask.size()) ? listadoTask.size() : limit;
listado.setCount(listadoTask.size());
listado.setIds(listadoTask.subList(getFirstRow(), limit));
return listado;
}
public String getActorId() {
return actorId;
}
public void setActorId(String actorId) {
this.actorId = actorId;
}
public void setTitol(String titol) {
this.titol = titol;
}
public int getFirstRow() {
return firstRow;
}
public void setFirstRow(int firstRow) {
this.firstRow = firstRow;
}
public int getMaxResults() {
return maxResults;
}
public void setMaxResults(int maxResults) {
this.maxResults = maxResults;
}
public boolean isNomesActives() {
return nomesActives;
}
public void setNomesActives(boolean nomesActives) {
this.nomesActives = nomesActives;
}
@Override
public String getAdditionalToStringInformation() {
return "actorId=" + actorId;
}
public GetRootProcessInstancesForActiveTasksCommand actorId(String actorId) {
setActorId(actorId);
return this;
}
private Query translateIn(final Collection<?> values, final Query query, final String param, final String namedParam) {
final int size = values.size();
final int mod = (size % 1000);
final int numberOfIn = (size / 1000) + (mod == 0 ? 0 : 1);
final List<String> params = new ArrayList<String>();
final String regex = "([\\w\\.]+)\\s+(not\\s+)?in\\s*\\(\\s*:" + param + "\\s*\\)";
final StringBuilder in = new StringBuilder(" $2 (");
for (int i = 0; i < numberOfIn; i++) {
final StringBuilder newNameParam = new StringBuilder();
newNameParam.append(param);
newNameParam.append(i);
in.append("$1 in (:");
in.append(newNameParam.toString());
in.append(")");
params.add(newNameParam.toString());
if (i + 1 < numberOfIn) {
in.append(" or ");
}
}
in.append(") ");
final String newQueryString = query.getQueryString().replaceAll(regex, in.toString());
final Query newQuery = getJbpmContext().getSession().createQuery(newQueryString);
final List<Object> copy = new ArrayList<Object>(values);
for (int count = 0, from = 0, to = (size>1000) ? 1000 : size; count < numberOfIn; count++) {
final String nameParam = params.get(count);
newQuery.setParameterList(nameParam, copy.subList(from, to));
from = to;
if (count + 2 < numberOfIn) {
to += 1000;
}
else if (count + 2 == numberOfIn) {
to += (mod == 0) ? 1000 : mod;
}
}
return newQuery;
}
}