package de.axone.tools;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public abstract class Stack {
public static String toString( StackTraceElement ste ) {
String asString = ste.getClassName() + "(" + ste.getLineNumber() + ")";
List<String> asArray = Str.splitFastToList( asString, '.' );
asArray = asArray.subList( 2, asArray.size() );
return Str.join( ".", asArray );
}
public static List<StackTraceElement> trace() {
StackTraceElement [] trace = (new Throwable()).getStackTrace();
// cut 1 for call of 'trace()'
return Arrays.asList( trace ).subList( 1, trace.length );
}
public static <OUT extends Appendable> OUT print( OUT out, Throwable t ) throws IOException {
return print( out, t, 1 );
}
public static <OUT extends Appendable> OUT print( OUT out, Throwable t, int stepback ) throws IOException {
return print( out, t, stepback+1, 1000 );
}
public static <OUT extends Appendable> OUT print( OUT out, Throwable t, int stepback, int length ) throws IOException {
stepback+=2;
StackTraceElement [] stes = t.getStackTrace();
stepback = Math.min( stepback, stes.length-1 );
int end = Math.min( stepback + length, stes.length );
for( int i=stepback; i<end; i++ ){
if( i > stepback ) out.append( " / " );
out.append( toString( stes[ i ] ) );
}
return out;
}
public static String print() {
return print( 1 );
}
public static String print( int stepback ) {
return print( stepback+1, 1000 );
}
public static String print( int stepback, int length ) {
try {
return print( new StringBuilder(), new Throwable(), stepback+1, length ).toString();
} catch( IOException e ) {
throw new Error( "Error writing to StringBuilder" );
}
}
public static String print( Appendable out ) {
return print( out, 1 );
}
public static String print( Appendable out, int stepback ) {
return print( out, stepback+1, 1000 );
}
public static String print( Appendable out, int stepback, int length ) {
try {
return print( out, new Throwable(), stepback+1, length ).toString();
} catch( IOException e ) {
throw new Error( "Error writing to StringBuilder" );
}
}
public static String print( Throwable t ) {
return print( t, 1 );
}
public static String print( Throwable t, int stepback ) {
return print( t, stepback+1, 1000 );
}
public static String print( Throwable t, int stepback, int length ) {
try {
return print( new StringBuilder(), t, stepback+1, length ).toString();
} catch( IOException e ) {
throw new Error( "Error writing to StringBuilder" );
}
}
}