package org.limewire.ui.swing; import java.util.ArrayList; import java.util.List; import org.limewire.service.ErrorService; import com.sun.jna.Callback; /** * This class serves as the error handler for both java threads * as well as errors occurring in JNA callbacks. */ public class UncaughtExceptionHandlerImpl implements Thread.UncaughtExceptionHandler, Callback.UncaughtExceptionHandler { private final List<StackTraceElement> notReported; public UncaughtExceptionHandlerImpl() { notReported = new ArrayList<StackTraceElement>(); notReported.add(new StackTraceElement("javax.jmdns.DNSRecord", "suppressedBy", null, -1)); // add more unreported stacktraces here. } @Override public void uncaughtException(Thread thread, Throwable throwable) { handleUncaughtException(thread.getName(), throwable); } @Override public void uncaughtException(Callback c, Throwable e) { handleUncaughtException(Thread.currentThread().getName(), e); } private void handleUncaughtException(String name, Throwable throwable) { StackTraceElement[] stackTraceElements = throwable.getStackTrace(); for (StackTraceElement stackTraceElement : stackTraceElements) { if (matchesUnreported(stackTraceElement)) { throwable.printStackTrace(); return; } } ErrorService.error(throwable, "Uncaught thread error: " + name); } /** * Checks to see if the give stack trace matches any of the stacktraces * which we will NOT report. */ private boolean matchesUnreported(StackTraceElement stackTraceElement) { for (StackTraceElement notReportedStackTrace : notReported) { if (matches(notReportedStackTrace, stackTraceElement)) { return true; } } return false; } /** * Checks to see if a given stack trace element matches against a given * filter. For a match to be successful, either the ClassName methodName and * line number must match. Or the class name method name can match and the * filter line number can be a wild card by having a negative value. */ private boolean matches(StackTraceElement filter, StackTraceElement element) { return filter.getClassName().equals(element.getClassName()) && filter.getMethodName().equals(element.getMethodName()) && (filter.getLineNumber() < 0 || filter.getLineNumber() == element.getLineNumber()); } }