/******************************************************************************* * Copyright (c) 2015 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.core.util; import java.net.URL; import java.util.Collection; import java.util.List; import org.eclipse.mylyn.internal.tasks.core.AbstractTask; import org.eclipse.mylyn.internal.tasks.core.TaskList; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.IRepositoryManager; import org.eclipse.mylyn.tasks.core.TaskRepository; import com.google.common.base.Strings; import com.google.common.collect.Ordering; public class TasksCoreUtil { /** * Searches for a task whose URL matches * * @return first task with a matching URL. */ public static AbstractTask getTaskByUrl(TaskList taskList, IRepositoryManager repositoryManager, String taskUrl) { if (!Strings.isNullOrEmpty(taskUrl)) { Collection<AbstractTask> tasks = taskList.getAllTasks(); List<AbstractTask> sortedTasks = sortTasksByRepositoryUrl(tasks); AbstractRepositoryConnector connector = null; TaskRepository repository = null; for (AbstractTask task : sortedTasks) { if (taskUrl.equals(task.getUrl())) { return task; } else { String repositoryUrl = task.getRepositoryUrl(); if (repositoryUrl != null) { if (repository == null || !repositoryUrl.equals(repository.getUrl())) { connector = repositoryManager.getRepositoryConnector(task.getConnectorKind()); repository = repositoryManager.getRepository(task.getConnectorKind(), task.getRepositoryUrl()); } if (connector != null) { URL url = connector.getBrowserUrl(repository, task); if (url != null && taskUrl.equals(url.toString())) { return task; } } } } } } return null; } private static List<AbstractTask> sortTasksByRepositoryUrl(Collection<AbstractTask> tasks) { List<AbstractTask> sortedTasks = new Ordering<AbstractTask>() { @Override public int compare(AbstractTask left, AbstractTask right) { if (left.getRepositoryUrl() == null) { return 1; } if (right.getRepositoryUrl() == null) { return -1; } return left.getRepositoryUrl().compareTo(right.getRepositoryUrl()); } }.nullsLast().sortedCopy(tasks); return sortedTasks; } }