package de.axone.exception; import java.util.Arrays; import java.util.regex.Pattern; public abstract class Ex { public static <T extends Throwable> T up( T e ){ return up( e, 1 ); } public static <T extends Throwable> T up( T e, int steps ){ // This kills in combination with assert some debugging info. // Don't know why StackTraceElement [] trace = e.getStackTrace(); e.setStackTrace( Arrays.copyOfRange( trace, steps, trace.length ) ); return e; } public static String me(){ return me( new Throwable(), 1 ); } public static String me( int depth ){ return me( new Throwable(), depth+1 ); } public static String me( Throwable e, int depth ){ StackTraceElement[] elm = e.getStackTrace(); if( depth >= elm.length ) depth = elm.length-1; String clazz = simplifyClassName( elm[depth].getClassName() ); clazz = removeNestedClasses( clazz ); int line = elm[depth].getLineNumber(); return clazz + ".java:" + line; } public static String me( Throwable e, int start, int depth ){ StringBuilder result = new StringBuilder(); for( int i=start; i<depth+start; i++ ){ result.append( " < " ) .append( '(' ).append( Ex.me( i ) ).append( ')' ); } return result.toString(); } /* === HELPER === */ private static final Pattern NESTED_CLASS = Pattern.compile( "\\$[\\w_]+" ); static String removeNestedClasses( String className ){ return NESTED_CLASS.matcher( className ).replaceAll( "" ); } static String simplifyClassName( String className ){ int oldIndex = className.indexOf( '.' ); int index=oldIndex; if( oldIndex > 0 ){ while( ( index = className.indexOf( '.', index+1 ) ) > 0 ){ oldIndex = index; } return className.substring( oldIndex+1 ); } else { return className; } } }