Copied from org.eclipse.team.internal.core Signed-off-by: Tor Arne Vestbø <torarnv@xxxxxxxxx> --- org.spearce.egit.core/META-INF/MANIFEST.MF | 5 +- .../core/internal/util/ExceptionCollector.java | 128 ++++++++++++++++++++ 2 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 org.spearce.egit.core/src/org/spearce/egit/core/internal/util/ExceptionCollector.java diff --git a/org.spearce.egit.core/META-INF/MANIFEST.MF b/org.spearce.egit.core/META-INF/MANIFEST.MF index e13732b..20df15f 100644 --- a/org.spearce.egit.core/META-INF/MANIFEST.MF +++ b/org.spearce.egit.core/META-INF/MANIFEST.MF @@ -12,8 +12,9 @@ Require-Bundle: org.eclipse.core.runtime, org.spearce.jgit, org.eclipse.core.filesystem, org.eclipse.ui -Export-Package: org.spearce.egit.core.internal.storage;x-friends:="org.spearce.egit.ui", - org.spearce.egit.core, +Export-Package: org.spearce.egit.core, + org.spearce.egit.core.internal.storage;x-friends:="org.spearce.egit.ui", + org.spearce.egit.core.internal.util;x-friends:="org.spearce.egit.ui", org.spearce.egit.core.op, org.spearce.egit.core.project Bundle-ActivationPolicy: lazy diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/internal/util/ExceptionCollector.java b/org.spearce.egit.core/src/org/spearce/egit/core/internal/util/ExceptionCollector.java new file mode 100644 index 0000000..d99d651 --- /dev/null +++ b/org.spearce.egit.core/src/org/spearce/egit/core/internal/util/ExceptionCollector.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2000, 2006 IBM Corporation 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.spearce.egit.core.internal.util; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.ILog; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Status; + +/** + * Collects exceptions and can be configured to ignore duplicates exceptions. + * Exceptions can be logged and a MultiStatus containing all collected + * exceptions can be returned. + * + * @see org.eclipse.core.runtime.MultiStatus + * @see org.eclipse.core.runtime.IStatus + * + * @since 3.0 + */ +public class ExceptionCollector { + + private final List<IStatus> statuses = new ArrayList<IStatus>(); + + private final String message; + + private final String pluginId; + + private final int severity; + + private final ILog log; + + /** + * Creates a collector and initializes the parameters for the top-level + * exception that would be returned from <code>getStatus</code> is + * exceptions are collected. + * + * @param message + * a human-readable message, localized to the current locale + * @param pluginId + * the unique identifier of the relevant plug-in + * @param severity + * the severity; one of <code>OK</code>, <code>ERROR</code>, + * <code>INFO</code>, or <code>WARNING</code> + * @param log + * the log to output the exceptions to, or <code>null</code> if + * exceptions should not be logged. + */ + public ExceptionCollector(String message, String pluginId, int severity, + ILog log) { + this.message = message; + this.pluginId = pluginId; + this.severity = severity; + this.log = log; + } + + /** + * Clears the exceptions collected. + */ + public void clear() { + statuses.clear(); + } + + /** + * Returns a status that represents the exceptions collected. If the + * collector is empty <code>IStatus.OK</code> is returned. Otherwise a + * MultiStatus containing all collected exceptions is returned. + * + * @return a multistatus containing the exceptions collected or IStatus.OK + * if the collector is empty. + */ + public IStatus getStatus() { + if (statuses.isEmpty()) { + return Status.OK_STATUS; + } else { + final MultiStatus multiStatus = new MultiStatus(pluginId, severity, + message, null); + final Iterator it = statuses.iterator(); + while (it.hasNext()) { + final IStatus status = (IStatus) it.next(); + multiStatus.merge(status); + } + return multiStatus; + } + } + + /** + * Add this exception to the collector. If a log was specified in the + * constructor then the exception will be output to the log. You can + * retreive exceptions using <code>getStatus</code>. + * + * @param exception + * the exception to collect + */ + public void handleException(CoreException exception) { + if (log != null) { + log.log(new Status(severity, pluginId, 0, message, exception)); + } + + // Record each status individually to flatten the resulting multi-status + final IStatus exceptionStatus = exception.getStatus(); + + // Wrap the exception so the stack trace is not lost. + final IStatus status = new Status(exceptionStatus.getSeverity(), + exceptionStatus.getPlugin(), exceptionStatus.getCode(), + exceptionStatus.getMessage(), exception); + + recordStatus(status); + for (IStatus childStatus : status.getChildren()) + recordStatus(childStatus); + } + + private void recordStatus(IStatus status) { + statuses.add(status); + } +} -- 1.6.1.2.309.g2ea3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html