package org.enumerable.lambda.exception;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@SuppressWarnings("serial")
public class UncheckedException extends RuntimeException {
public static Set<String> filteredPackages = new HashSet<String>();
static {
filteredPackages.add("sun.reflect");
filteredPackages.add("org.junit");
filteredPackages.add("org.eclipse.jdt.internal");
filteredPackages.add("java.lang.reflect");
}
Throwable wrapped;
/**
* Convenience method to throw exceptions from lambdas.
*/
public static Exception raise(Exception e) throws RuntimeException {
throw uncheck(e);
}
public static RuntimeException uncheck(Throwable t) {
if (t.getCause() != null)
return uncheck(t.getCause());
if (t instanceof RuntimeException) {
t.setStackTrace(filterStackTrace(t.getStackTrace()));
return (RuntimeException) t;
}
return new UncheckedException(t);
}
UncheckedException(Throwable t) {
super(t.getMessage(), t.getCause());
this.wrapped = t;
setStackTrace(filterStackTrace(t.getStackTrace()));
}
static StackTraceElement[] filterStackTrace(StackTraceElement[] stackTrace) {
List<StackTraceElement> trace = new ArrayList<StackTraceElement>();
for (StackTraceElement element : stackTrace)
if (!isFilteredPackage(element))
trace.add(element);
return trace.toArray(new StackTraceElement[0]);
}
static boolean isFilteredPackage(StackTraceElement element) {
for (String prefix : filteredPackages)
if (element.getClassName().startsWith(prefix))
return true;
return false;
}
public String toString() {
String s = wrapped.getClass().getName();
String message = getLocalizedMessage();
return (message != null) ? (s + ": " + message) : s;
}
}