return null;
}
@Override
public BpmTask getPastOrActualTask(final ProcessInstanceLog log, ProcessToolContext ctx) {
final UserData user = log.getUser();
final ProcessInstance pi = log.getOwnProcessInstance();
final Calendar minDate = log.getEntryDate();
final Set<String> taskNames = new HashSet<String>();
if (log.getState() != null && Strings.hasText(log.getState().getName())) {
taskNames.add(log.getState().getName());
}
Command<List<HistoryActivityInstance>> cmd = new Command<List<HistoryActivityInstance>>() {
@Override
public List<HistoryActivityInstance> execute(Environment environment) throws Exception {
AbstractQuery q = new AbstractQuery() {
@Override
protected void applyPage(Query query) {
query.setFirstResult(0);
query.setMaxResults(1);
}
@Override
protected void applyParameters(Query query) {
query.setString("userIds", user.getLogin());
query.setString("internalIds", log.getExecutionId());
query.setDate("minDate", minDate.getTime());
if (!taskNames.isEmpty()) {
query.setParameterList("taskName", taskNames);
}
}
@Override
public String hql() {
StringBuilder hql = new StringBuilder()
.append("select act ")
.append("from ")
.append(HistoryTaskInstanceImpl.class.getName()).append(" as act, ")
.append(HistoryProcessInstanceImpl.class.getName()).append(" as proc, ")
.append(HistoryTaskImpl.class.getName()).append(" as task ")
.append(" where act.historyProcessInstance = proc ")
.append(" and act.historyTask = task ")
.append(" and act.endTime is not null ");
if (!taskNames.isEmpty()) {
hql.append(" and act.activityName in (:taskName) ");
}
hql.append(" and task.assignee = :userIds ")
.append(" and task.endTime > :minDate ")
.append(" and act.executionId = :internalIds ")
.append(" order by act.endTime asc ");
return hql.toString();
}
};
return (List<HistoryActivityInstance>) q.execute(environment);
}
};
List<HistoryActivityInstance> pastTasks = getProcessEngine(ctx).execute(cmd);
if (!pastTasks.isEmpty()) {
return collectHistoryActivity(pastTasks.get(0), pi, user, ctx);
}
else {
List<BpmTask> actualTasks = findProcessTasks(pi, user.getLogin(), taskNames, ctx);
if (!actualTasks.isEmpty()) {
return actualTasks.get(0);
}
}
return null;