| /******************************************************************************* |
| * Copyright (c) 2004, 2013 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.IProgressMonitor; |
| import org.eclipse.core.runtime.ISafeRunnable; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.MultiStatus; |
| import org.eclipse.core.runtime.SafeRunner; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.mylyn.commons.core.ExtensionPointReader; |
| 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 = "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; |
| |
| ExtensionPointReader<AbstractSupportHandler> reader = new ExtensionPointReader<AbstractSupportHandler>( |
| TasksBugsPlugin.ID_PLUGIN, EXTENSION_ID_TASK_CONTRIBUTORS, ELEMENT_TASK_HANDLER, |
| AbstractSupportHandler.class) { |
| @Override |
| protected AbstractSupportHandler readElement(IConfigurationElement element, |
| org.eclipse.core.runtime.MultiStatus result) { |
| return readTaskContributor(element, result); |
| } |
| }; |
| reader.read(); |
| taskContributors.addAll(reader.getItems()); |
| } |
| |
| private AbstractSupportHandler readTaskContributor(IConfigurationElement element, MultiStatus result) { |
| try { |
| Object object = element.createExecutableExtension(ELEMENT_CLASS); |
| if (object instanceof AbstractSupportHandler) { |
| return (AbstractSupportHandler) object; |
| } else { |
| result.add(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) { |
| result.add(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, |
| "Could not load task contributor extension", e)); //$NON-NLS-1$ |
| } |
| return null; |
| } |
| |
| public void removeErrorReporter(AbstractSupportHandler taskContributor) { |
| taskContributors.remove(taskContributor); |
| } |
| |
| } |