diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/history/HistoricTaskInstanceQuery.java b/modules/activiti-engine/src/main/java/org/activiti/engine/history/HistoricTaskInstanceQuery.java index 77fb9537d6986065cf0b3a19535fab8681aac4ee..ee06895ad701ad825eaebf767ddc6f2be5fba503 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/history/HistoricTaskInstanceQuery.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/history/HistoricTaskInstanceQuery.java @@ -15,6 +15,7 @@ package org.activiti.engine.history; import java.io.Serializable; import java.util.Date; +import java.util.List; import org.activiti.engine.query.Query; import org.activiti.engine.task.Task; @@ -144,10 +145,26 @@ public interface HistoricTaskInstanceQuery extends Querynull. + */ + HistoricTaskInstanceQuery taskCandidateGroupIn(List candidateGroups); + /** * Only select historic task instances with the given priority. */ diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/HistoricTaskInstanceQueryImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/HistoricTaskInstanceQueryImpl.java index 2ffb672c592407d1ce1c6f4dba3f53fd979f3025..4c5563f1be98871de8f099028308a614a9411536 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/HistoricTaskInstanceQueryImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/HistoricTaskInstanceQueryImpl.java @@ -13,11 +13,14 @@ package org.activiti.engine.impl; +import java.util.ArrayList; import java.util.Date; import java.util.List; +import org.activiti.engine.ActivitiIllegalArgumentException; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.history.HistoricTaskInstanceQuery; +import org.activiti.engine.identity.Group; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.interceptor.CommandExecutor; @@ -53,6 +56,9 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl candidateGroups; protected String involvedUser; protected Integer taskPriority; protected Integer taskMinPriority; @@ -392,6 +398,53 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl candidateGroups) { + if(candidateGroups == null) { + throw new ActivitiIllegalArgumentException("Candidate group list is null"); + } + if(candidateGroups.size()== 0) { + throw new ActivitiIllegalArgumentException("Candidate group list is empty"); + } + + if (candidateUser != null) { + throw new ActivitiIllegalArgumentException("Invalid query usage: cannot set both candidateGroupIn and candidateUser"); + } + if (candidateGroup != null) { + throw new ActivitiIllegalArgumentException("Invalid query usage: cannot set both candidateGroupIn and candidateGroup"); + } + + this.candidateGroups = candidateGroups; + return this; + } + @Override public HistoricTaskInstanceQuery taskInvolvedUser(String involvedUser) { this.involvedUser = involvedUser; @@ -503,7 +556,34 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl getCandidateGroups() { + if (candidateGroup!=null) { + List candidateGroupList = new java.util.ArrayList(1); + candidateGroupList.add(candidateGroup); + return candidateGroupList; + } else if (candidateUser != null) { + return getGroupsForCandidateUser(candidateUser); + } else if(candidateGroups != null) { + return candidateGroups; + } + return null; + } + + protected List getGroupsForCandidateUser(String candidateUser) { + // TODO: Discuss about removing this feature? Or document it properly and maybe recommend to not use it + // and explain alternatives + List groups = Context + .getCommandContext() + .getGroupIdentityManager() + .findGroupsByUser(candidateUser); + List groupIds = new ArrayList(); + for (Group group : groups) { + groupIds.add(group.getId()); + } + return groupIds; + } + // getters and setters ////////////////////////////////////////////////////// public String getProcessInstanceId() { @@ -566,6 +646,12 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl + + inner join ${prefix}ACT_HI_IDENTITYLINK HI on HI.TASK_ID_ = RES.ID_ + inner join ${prefix}ACT_HI_PROCINST HPI ON RES.PROC_INST_ID_ = HPI.ID_ @@ -377,6 +380,26 @@ and RES.END_TIME_ > #{completedAfterDate} + + and RES.ASSIGNEE_ is null + and HI.TYPE_ = 'candidate' + and + ( + + HI.USER_ID_ = #{candidateUser} + + + or + + + HI.GROUP_ID_ IN + + #{group} + + + ) + and ( exists(select LINK.USER_ID_ from ${prefix}ACT_HI_IDENTITYLINK LINK where USER_ID_ = #{involvedUser} and LINK.TASK_ID_ = RES.ID_) @@ -459,23 +482,23 @@