package net.conselldemallorca.helium.jbpm3.command; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.jbpm.JbpmContext; import org.jbpm.command.AbstractGetObjectBaseCommand; import org.jbpm.command.Command; import org.jbpm.taskmgmt.exe.TaskInstance; /** * Command per obtenir la llista de tasques personals * * @author Limit Tecnologies <limit@limit.es> */ public class GetPersonalTaskListCommand extends AbstractGetObjectBaseCommand implements Command { private static final long serialVersionUID = -1908847549444051495L; private List<Long> ids; private String actorId; public GetPersonalTaskListCommand() {} public GetPersonalTaskListCommand(String actorId, List<Long> ids) { super(); this.actorId = actorId; this.ids = ids; } public GetPersonalTaskListCommand(String actorId) { super(); this.actorId = actorId; } @SuppressWarnings("rawtypes") public Object execute(JbpmContext jbpmContext) throws Exception { setJbpmContext(jbpmContext); List result = new ArrayList<TaskInstance>(); if (ids != null) { if (ids.isEmpty()) { return result; } String hql = "select ti "+ " from org.jbpm.taskmgmt.exe.TaskInstance as ti "+ " where ti.isOpen = true " + " and ti.actorId = :actorId "+ " and ti.isSuspended != true "+ " and ti.id in (:ids)"; Query query = jbpmContext.getSession().createQuery(hql); query = translateIn(ids, query, "ids", "ti.id"); query.setString("actorId", actorId); result = query.list(); } else { result = jbpmContext.getTaskList(actorId); } return result; } public String getActorId() { return actorId; } public void setActorId(String actorId) { this.actorId = actorId; } public String getParametersToString() { return "GetPersonalTaskListCommand [ids=" + ids + ", actorId=" + actorId + "]"; } @Override public String getAdditionalToStringInformation() { return "actorId=" + actorId; } //methods for fluent programming public GetPersonalTaskListCommand actorId(String actorId) { setActorId(actorId); return this; } @SuppressWarnings("rawtypes") public List retrieveTaskInstanceDetails(List taskInstanceList) { for (Iterator iter = taskInstanceList.iterator(); iter.hasNext();) { retrieveTaskInstanceDetails((TaskInstance)iter.next()); } return taskInstanceList; } 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; } }