package org.limewire.ui.swing;
import java.util.ArrayList;
import java.util.List;
import org.limewire.service.ErrorService;
import com.limegroup.gnutella.util.LimeWireUtils;
public class UncaughtExceptionHandlerImpl implements Thread.UncaughtExceptionHandler {
private final List<StackTraceElement> filters;
public UncaughtExceptionHandlerImpl() {
filters = new ArrayList<StackTraceElement>();
filters.add(new StackTraceElement("javax.jmdns.DNSRecord", "suppressedBy", null, -1));
// add more filters here.
}
public void uncaughtException(Thread thread, Throwable throwable) {
if (LimeWireUtils.isTestingVersion()) {
StackTraceElement[] stackTraceElements = throwable.getStackTrace();
for (StackTraceElement stackTraceElement : stackTraceElements) {
if (matches(stackTraceElement)) {
throwable.printStackTrace();
return;
}
}
ErrorService.error(throwable, "Uncaught thread error: " + thread.getName());
}
}
/**
* Checks to see if the give stack trace matches any of the filters.
*/
private boolean matches(StackTraceElement stackTraceElement) {
for (StackTraceElement filter : filters) {
if (matches(filter, 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());
}
}