| /******************************************************************************* |
| * Copyright (c) 2016 Tasktop Technologies and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Tasktop Technologies - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.internal.tasks.ui; |
| |
| import java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory; |
| import org.eclipse.mylyn.internal.tasks.core.LocalTask; |
| import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager; |
| import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil; |
| import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; |
| import org.eclipse.mylyn.tasks.core.IRepositoryManager; |
| import org.eclipse.mylyn.tasks.core.ITask; |
| import org.eclipse.mylyn.tasks.core.TaskRepository; |
| import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob; |
| import org.eclipse.mylyn.tasks.ui.TasksUi; |
| import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; |
| import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IEditorReference; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| |
| import com.google.common.collect.ArrayListMultimap; |
| import com.google.common.collect.ListMultimap; |
| |
| public class SynchronizeRelevantTasksJob extends Job { |
| |
| private final TaskActivityManager taskActivityManager; |
| |
| private final IRepositoryManager repositoryManager; |
| |
| private final ITaskJobFactory taskJobFactory; |
| |
| private static final int MAX_NUM_TASKS = 10; |
| |
| public SynchronizeRelevantTasksJob(TaskActivityManager taskActivityManager, IRepositoryManager repositoryManager, |
| ITaskJobFactory taskJobFactory) { |
| super(Messages.SynchronizeRelevantTasksJob_SynchronizingRelevantTasks); |
| this.taskActivityManager = taskActivityManager; |
| this.repositoryManager = repositoryManager; |
| this.taskJobFactory = taskJobFactory; |
| } |
| |
| @Override |
| protected IStatus run(IProgressMonitor monitor) { |
| HashSet<ITask> relevantTasks = new HashSet<ITask>(); |
| |
| addOpenEditorTasks(relevantTasks); |
| addActiveTask(relevantTasks); |
| addTodaysTasks(relevantTasks); |
| |
| ListMultimap<TaskRepository, ITask> repositoryMap = mapTasksToRepository(relevantTasks); |
| scheduleSynchronizationJobs(repositoryMap); |
| |
| return Status.OK_STATUS; |
| } |
| |
| private void scheduleSynchronizationJobs(ListMultimap<TaskRepository, ITask> repositoryMap) { |
| List<Job> jobs = new ArrayList<>(); |
| for (TaskRepository taskRepository : repositoryMap.keySet()) { |
| List<ITask> repositoryTasks = repositoryMap.get(taskRepository); |
| AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(taskRepository.getConnectorKind()); |
| SynchronizationJob synchronizationJob = taskJobFactory.createSynchronizeTasksJob(connector, taskRepository, |
| new HashSet<>(repositoryTasks)); |
| synchronizationJob.setUser(false); |
| synchronizationJob.setSystem(true); |
| synchronizationJob.schedule(); |
| jobs.add(synchronizationJob); |
| } |
| |
| for (Job job : jobs) { |
| try { |
| job.join(); |
| } catch (InterruptedException e) { |
| // Ignore |
| } |
| } |
| } |
| |
| private void addOpenEditorTasks(HashSet<ITask> relevantTasks) { |
| IWorkbenchWindow[] workbenchWindows = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| HashSet<ITask> openTasks = new HashSet<>(); |
| for (IWorkbenchWindow workbenchWindow : workbenchWindows) { |
| IWorkbenchPage[] workbenchPages = workbenchWindow.getPages(); |
| for (IWorkbenchPage workbenchPage : workbenchPages) { |
| IEditorReference[] editorReferences = workbenchPage.getEditorReferences(); |
| for (IEditorReference editorReference : editorReferences) { |
| IEditorPart editorPart = editorReference.getEditor(false); |
| if (editorPart instanceof TaskEditor) { |
| TaskEditorInput taskEditorInput = ((TaskEditor) editorPart).getTaskEditorInput(); |
| if (taskEditorInput.exists()) { |
| ITask task = taskEditorInput.getTask(); |
| openTasks.add(task); |
| } |
| } |
| } |
| } |
| } |
| if (openTasks.size() < MAX_NUM_TASKS) { |
| relevantTasks.addAll(openTasks); |
| } |
| } |
| |
| private void addActiveTask(HashSet<ITask> relevantTasks) { |
| ITask activeTask = taskActivityManager.getActiveTask(); |
| if (activeTask != null) { |
| relevantTasks.add(activeTask); |
| } |
| } |
| |
| private void addTodaysTasks(HashSet<ITask> relevantTasks) { |
| Set<ITask> scheduledTasks = taskActivityManager.getScheduledTasks(TaskActivityUtil.getCurrentWeek().getToday()); |
| for (Iterator<ITask> iterator = scheduledTasks.iterator(); iterator.hasNext();) { |
| ITask scheduledTask = iterator.next(); |
| if (scheduledTask.isCompleted()) { |
| iterator.remove(); |
| } |
| } |
| if (scheduledTasks.size() < MAX_NUM_TASKS) { |
| relevantTasks.addAll(scheduledTasks); |
| } |
| } |
| |
| private ListMultimap<TaskRepository, ITask> mapTasksToRepository(HashSet<ITask> relevantTasks) { |
| ListMultimap<TaskRepository, ITask> repositoryMap = ArrayListMultimap.create(); |
| for (ITask task : relevantTasks) { |
| if (!(task instanceof LocalTask)) { |
| String connectorKind = task.getConnectorKind(); |
| String repositoryUrl = task.getRepositoryUrl(); |
| TaskRepository taskRepository = repositoryManager.getRepository(connectorKind, repositoryUrl); |
| repositoryMap.put(taskRepository, task); |
| } |
| } |
| return repositoryMap; |
| } |
| } |