/******************************************************************************* * 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.bugs; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.Status; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.tasks.bugs.AbstractSupportHandler; import org.eclipse.mylyn.tasks.bugs.ISupportResponse; import org.eclipse.mylyn.tasks.bugs.ITaskContribution; /** * @author Steffen Pingel */ public class SupportHandlerManager { private static final String ELEMENT_CLASS = "class"; //$NON-NLS-1$ private static final String ELEMENT_TASK_HANDLER = "handler"; //$NON-NLS-1$ private static final String EXTENSION_ID_TASK_CONTRIBUTORS = "org.eclipse.mylyn.tasks.bugs.support"; //$NON-NLS-1$ private final DefaultSupportHandler defaultSupportHandler = new DefaultSupportHandler(); private boolean readExtensions; private final List<AbstractSupportHandler> taskContributors = new CopyOnWriteArrayList<AbstractSupportHandler>(); public SupportHandlerManager() { } public void addErrorReporter(AbstractSupportHandler taskContributor) { taskContributors.add(taskContributor); } public void process(final ITaskContribution contribution, final IProgressMonitor monitor) { readExtensions(); for (final AbstractSupportHandler contributor : taskContributors) { SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable e) { StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); //$NON-NLS-1$ } public void run() throws Exception { contributor.process(contribution, monitor); } }); if (contribution.isHandled()) { break; } } if (!contribution.isHandled()) { defaultSupportHandler.process(contribution, monitor); } } public void postProcess(final ISupportResponse response, final IProgressMonitor monitor) { readExtensions(); for (final AbstractSupportHandler contributor : taskContributors) { SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable e) { StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); //$NON-NLS-1$ } public void run() throws Exception { contributor.postProcess(response, monitor); } }); } defaultSupportHandler.postProcess(response, monitor); } public void preProcess(final SupportRequest request) { readExtensions(); for (final AbstractSupportHandler contributor : taskContributors) { SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable e) { StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); //$NON-NLS-1$ } public void run() throws Exception { contributor.preProcess(request); } }); } defaultSupportHandler.preProcess(request); } private synchronized void readExtensions() { if (readExtensions) { return; } readExtensions = true; IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_TASK_CONTRIBUTORS); IExtension[] extensions = extensionPoint.getExtensions(); for (IExtension extension : extensions) { IConfigurationElement[] elements = extension.getConfigurationElements(); for (IConfigurationElement element : elements) { if (element.getName().equals(ELEMENT_TASK_HANDLER)) { readTaskContributor(element); } } } } private void readTaskContributor(IConfigurationElement element) { try { Object object = element.createExecutableExtension(ELEMENT_CLASS); if (object instanceof AbstractSupportHandler) { taskContributors.add((AbstractSupportHandler) object); } else { StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, "Could not load task contributor extenstion: \"" + object.getClass().getCanonicalName() + "\"" //$NON-NLS-1$ //$NON-NLS-2$ + " does not implement \"" + AbstractSupportHandler.class.getCanonicalName() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$ } } catch (Throwable e) { StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, "Could not load task contributor extension", e)); //$NON-NLS-1$ } } public void removeErrorReporter(AbstractSupportHandler taskContributor) { taskContributors.remove(taskContributor); } }