/** * Generic method which will figure out to which task page must be jumped, based on the task data. * * <p>Note that, if possible, it is always more performant to use the more specific showXXXPage() * methods. */ public void showTaskPage(String taskId) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); String loggedInUserId = ExplorerApp.get().getLoggedInUser().getId(); if (task == null) { // If no runtime task exists, our only hope is the archive page boolean isOwner = historyService .createHistoricTaskInstanceQuery() .taskId(taskId) .taskOwner(loggedInUserId) .count() == 1; if (isOwner) { showArchivedPage(taskId); } else { showNavigationError(taskId); } } else if (loggedInUserId.equals(task.getOwner())) { showTasksPage(taskId); } else if (loggedInUserId.equals(task.getAssignee())) { showInboxPage(taskId); } else if (taskService.createTaskQuery().taskInvolvedUser(loggedInUserId).count() == 1) { showInvolvedPage(taskId); } else { // queued List<String> groupIds = getGroupIds(loggedInUserId); List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId()); Iterator<IdentityLink> identityLinkIterator = identityLinks.iterator(); boolean pageFound = false; while (!pageFound && identityLinkIterator.hasNext()) { IdentityLink identityLink = identityLinkIterator.next(); if (identityLink.getGroupId() != null && groupIds.contains(identityLink.getGroupId())) { showQueuedPage(identityLink.getGroupId(), task.getId()); pageFound = true; } } // We've tried hard enough, the user now gets a notification. He deserves it. if (!pageFound) { showNavigationError(taskId); } } }