package org.limewire.ui.support; import javax.swing.SwingUtilities; import org.limewire.service.ErrorCallback; /** Forwards error messages to the BugManager on the Swing thread. */ public final class ErrorHandler implements ErrorCallback { /** Displays the error to the user. */ public void error(Throwable problem) { error(problem, null); } /** Displays the error to the user with a specific message. */ public void error(Throwable problem, String msg) { // ThreadDeath must NOT be caught, or a thread will be left zombied if(problem instanceof ThreadDeath) throw (ThreadDeath)problem; else { // force to end of queue, so we don't continue holding // any locks if this was already called from the UI thread. SwingUtilities.invokeLater(new Error(problem, msg)); } } /** This class handles error callbacks. */ private static class Error implements Runnable { /** The stack trace of the error. */ private final Throwable PROBLEM; /** An extra message associated with the error. */ private final String MESSAGE; /** The name of the thread the error occurred in. */ private final String CURRENT_THREAD_NAME; private Error(Throwable problem, String msg) { PROBLEM = problem; MESSAGE = msg; CURRENT_THREAD_NAME = Thread.currentThread().getName(); } public void run() { try { // TODO: Deal with startup dialogs? //GUIMediator.closeStartupDialogs(); BugManager.instance().handleBug(PROBLEM, CURRENT_THREAD_NAME, MESSAGE); } catch(Throwable ignored) { ignored.printStackTrace(); } } } }