/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.explorer.navigation; import java.util.ArrayList; import java.util.List; import org.activiti.engine.ActivitiException; import org.activiti.engine.HistoryService; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; import org.activiti.engine.identity.Group; import org.activiti.engine.task.Task; import org.activiti.explorer.ExplorerApp; import org.activiti.explorer.Messages; import org.activiti.explorer.ViewManager; /** * @author Frederik Heremans * @author Joram Barrez */ public class TaskNavigator implements Navigator { public static final String TASK_URI_PART = "tasks"; public static final String CATEGORY_TASKS = "tasks"; public static final String CATEGORY_INBOX = "inbox"; public static final String CATEGORY_QUEUED = "queued"; public static final String CATEGORY_INVOLVED = "involved"; public static final String CATEGORY_ARCHIVED = "archived"; public static final String PARAMETER_CATEGORY = "category"; public static final String PARAMETER_GROUP = "group"; protected TaskService taskService; protected HistoryService historyService; protected IdentityService identityService; public TaskNavigator() { this.taskService = ProcessEngines.getDefaultProcessEngine().getTaskService(); this.identityService = ProcessEngines.getDefaultProcessEngine().getIdentityService(); this.historyService = ProcessEngines.getDefaultProcessEngine().getHistoryService(); } public String getTrigger() { return TASK_URI_PART; } public void handleNavigation(UriFragment uriFragment) { String category = uriFragment.getParameter(PARAMETER_CATEGORY); String taskId = uriFragment.getUriPart(1); if (taskId == null) { directToCategoryPage(category, uriFragment); } else { directToSpecificTaskPage(category, taskId, uriFragment); } } protected void directToCategoryPage(String category, UriFragment uriFragment) { ViewManager viewManager = ExplorerApp.get().getViewManager(); if (CATEGORY_TASKS.equals(category)) { viewManager.showTasksPage(); } else if (CATEGORY_INBOX.equals(category)) { viewManager.showInboxPage(); } else if(CATEGORY_QUEUED.equals(category)) { viewManager.showQueuedPage(uriFragment.getParameter(PARAMETER_GROUP)); } else if (CATEGORY_INVOLVED.equals(category)){ viewManager.showInvolvedPage(); } else if (CATEGORY_ARCHIVED.equals(category)) { viewManager.showArchivedPage(); } else { throw new ActivitiException("Couldn't find a matching category"); } } protected void directToSpecificTaskPage(String category, String taskId, UriFragment uriFragment) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); ViewManager viewManager = ExplorerApp.get().getViewManager(); String loggedInUserId = ExplorerApp.get().getLoggedInUser().getId(); boolean pageFound = false; if (CATEGORY_TASKS.equals(category)) { if (loggedInUserId.equals(task.getOwner())) { viewManager.showTasksPage(task.getId()); pageFound = true; } } else if (CATEGORY_INBOX.equals(category)) { if (loggedInUserId.equals(task.getAssignee())) { viewManager.showInboxPage(task.getId()); pageFound = true; } } else if(CATEGORY_QUEUED.equals(category)) { String groupId = uriFragment.getParameter(PARAMETER_GROUP); boolean isTaskAssignedToGroup = taskService.createTaskQuery() .taskId(task.getId()) .taskCandidateGroup(groupId) .count() == 1; boolean isUserMemberOfGroup = identityService.createGroupQuery() .groupMember(loggedInUserId) .groupId(groupId) .count() == 1; if (isTaskAssignedToGroup && isUserMemberOfGroup) { viewManager.showQueuedPage(groupId, task.getId()); pageFound = true; } } else if (CATEGORY_INVOLVED.equals(category)){ boolean isUserInvolved = taskService.createTaskQuery() .taskInvolvedUser(loggedInUserId) .count() == 1; if (isUserInvolved) { viewManager.showInvolvedPage(task.getId()); pageFound = true; } } else if (CATEGORY_ARCHIVED.equals(category)) { if (task == null) { boolean isOwner = historyService.createHistoricTaskInstanceQuery() .taskId(taskId) .taskOwner(loggedInUserId) .finished() .count() == 1; if (isOwner) { viewManager.showArchivedPage(taskId); pageFound = true; } } } else { throw new ActivitiException("Couldn't find a matching category"); } if (!pageFound) { // If URL doesnt match anymore, we must use the task data to redirect to the right page viewManager.showTaskPage(taskId); } } protected void showNavigationError(String taskId) { String description = ExplorerApp.get().getI18nManager().getMessage(Messages.NAVIGATION_ERROR_NOT_INVOLVED, taskId); ExplorerApp.get().getNotificationManager().showErrorNotification(Messages.NAVIGATION_ERROR_NOT_INVOLVED_TITLE, description); } protected List<String> getGroupIds(String userId) { List<String> groupIds = new ArrayList<String>(); List<Group> groups = identityService.createGroupQuery().groupMember(userId).list(); for (Group group : groups) { groupIds.add(group.getId()); } return groupIds; } }