/*******************************************************************************
* Copyright (c) 2004, 2010 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.search;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.net.Policy;
import org.eclipse.mylyn.internal.tasks.core.ITaskList;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.RepositoryStatus;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.search.ui.text.Match;
import org.eclipse.ui.PlatformUI;
/**
* Used for returning results from Eclipse Search view. Collects results of a repository search.
*
* @author Rob Elves
* @author Steffen Pingel
*/
public class SearchHitCollector extends TaskDataCollector implements ISearchQuery {
private final ITaskList taskList;
private final TaskRepository repository;
private final IRepositoryQuery repositoryQuery;
private final RepositorySearchResult searchResult;
private AbstractRepositoryConnector connector;
public SearchHitCollector(ITaskList tasklist, TaskRepository repository, IRepositoryQuery repositoryQuery) {
this.taskList = tasklist;
this.repository = repository;
this.repositoryQuery = repositoryQuery;
this.searchResult = new RepositorySearchResult(this);
}
public void aboutToStart() {
searchResult.removeAll();
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
NewSearchUI.activateSearchResultView();
}
});
}
@Override
public void accept(TaskData taskData) {
ITask task = taskList.getTask(repository.getRepositoryUrl(), taskData.getTaskId());
if (task == null) {
task = TasksUi.getRepositoryModel().createTask(repository, taskData.getTaskId());
if (connector != null) {
connector.updateTaskFromTaskData(repository, task, taskData);
}
}
searchResult.addMatch(new Match(task, 0, 0));
}
public String getLabel() {
return Messages.SearchHitCollector_Querying_Repository_;
}
public boolean canRerun() {
return true;
}
public boolean canRunInBackground() {
return true;
}
public ISearchResult getSearchResult() {
return searchResult;
}
public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
monitor = Policy.monitorFor(monitor);
aboutToStart();
if (monitor.isCanceled()) {
throw new OperationCanceledException(Messages.SearchHitCollector_Search_cancelled);
}
connector = TasksUi.getRepositoryManager().getRepositoryConnector(repositoryQuery.getConnectorKind());
if (connector != null) {
final IStatus status = connector.performQuery(repository, repositoryQuery, this, null, monitor);
if (!status.isOK()) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
TasksUiInternal.displayStatus(Messages.SearchHitCollector_Search_failed, status);
}
});
} else {
if (searchResult.getMatchCount() >= TaskDataCollector.MAX_HITS) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
TasksUiInternal.displayStatus(
Messages.SearchHitCollector_Search_returned_maximum_number_of_hits,
RepositoryStatus.createStatus(repository.getRepositoryUrl(), IStatus.WARNING,
TasksUiPlugin.ID_PLUGIN,
Messages.SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded));
}
});
}
}
} else {
return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, IStatus.OK,
Messages.SearchHitCollector_Repository_connector_could_not_be_found, null);
}
return Status.OK_STATUS;
}
public IRepositoryQuery getRepositoryQuery() {
return repositoryQuery;
}
}