/*******************************************************************************
* Copyright (c) 2010, 2011 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:
* Flavio Donze - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.search;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.internal.tasks.core.ITaskList;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.ui.IWorkbenchWindow;
/**
* Provides static utility methods to access the implementation that is contributed by the searchProvider extension
* point.
*
* @author Flavio Donze
* @author David Green
*/
public class SearchUtil {
private static class NullSearchProvider extends AbstractSearchProvider {
@Override
public void openSearchDialog(IWorkbenchWindow window) {
}
@Override
public void runSearchQuery(ITaskList tasklist, TaskRepository repository, IRepositoryQuery query,
boolean activateResultView) {
}
}
/** searchProvider extension point id */
private static final String EXTENSION_SEARCH_PROVIDER = "org.eclipse.mylyn.tasks.ui.searchProvider"; //$NON-NLS-1$
private static final String EXTENSION_SEARCH_HANDLER = "org.eclipse.mylyn.tasks.ui.searchHandler"; //$NON-NLS-1$
/** searchProvider attribute 'class' */
private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
private static AbstractSearchProvider provider;
/**
* Creates the search provider according to the defined extension point. Not synchronized since all invocations are
* from UI thread.
*/
private static final AbstractSearchProvider getSearchProvider() {
if (provider != null) {
return provider;
}
try {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement[] configurationElements = registry.getConfigurationElementsFor(EXTENSION_SEARCH_PROVIDER);
if (configurationElements.length > 0) {
if (configurationElements.length > 1) {
StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
"More than one search provider was registered.")); //$NON-NLS-1$
}
IConfigurationElement providerConfiguration = configurationElements[0];
Object object = providerConfiguration.createExecutableExtension(ATTR_CLASS);
if (object instanceof AbstractSearchProvider) {
provider = (AbstractSearchProvider) object;
return provider;
} else {
StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
"Specified search provider is not of type AbstractSearchProvider.")); //$NON-NLS-1$
}
} else {
StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
"No search provider was registed. Tasks search is not available.")); //$NON-NLS-1$
}
} catch (Throwable e) {
StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
"Loading of searchProvider extension failed.", e)); //$NON-NLS-1$
}
if (provider == null) {
provider = new NullSearchProvider();
}
return provider;
}
public static AbstractSearchHandler createSearchHandler() {
AbstractSearchHandler searchHandler = null;
try {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement[] configurationElements = registry.getConfigurationElementsFor(EXTENSION_SEARCH_HANDLER);
if (configurationElements.length > 0) {
if (configurationElements.length > 1) {
StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
"More than one task list search handler was registered.")); //$NON-NLS-1$
}
IConfigurationElement providerConfiguration = configurationElements[0];
searchHandler = (AbstractSearchHandler) providerConfiguration.createExecutableExtension(ATTR_CLASS);
}
} catch (Throwable e) {
StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
"Loading of searchHandler extension failed.", e)); //$NON-NLS-1$
}
if (searchHandler == null) {
searchHandler = new DefaultSearchHandler();
}
return searchHandler;
}
public static boolean supportsTaskSearch() {
return !(getSearchProvider() instanceof NullSearchProvider);
}
public static void openSearchDialog(IWorkbenchWindow window) {
getSearchProvider().openSearchDialog(window);
}
public static void runSearchQuery(ITaskList tasklist, TaskRepository repository, IRepositoryQuery repositoryQuery) {
getSearchProvider().runSearchQuery(tasklist, repository, repositoryQuery, false);
}
public static void runSearchQuery(ITaskList tasklist, TaskRepository repository, IRepositoryQuery repositoryQuery,
boolean activateResultView) {
getSearchProvider().runSearchQuery(tasklist, repository, repositoryQuery, activateResultView);
}
}