Coverage Report - org.jbehave.core.reporters.StackTraceFormatter
 
Classes in this File Line Coverage Branch Coverage Complexity
StackTraceFormatter
91%
21/23
80%
8/10
2.2
StackTraceFormatter$1
N/A
N/A
2.2
StackTraceFormatter$Replacement
100%
5/5
N/A
2.2
 
 1  
 package org.jbehave.core.reporters;
 2  
 
 3  
 import java.io.ByteArrayOutputStream;
 4  
 import java.io.PrintStream;
 5  
 import java.util.regex.Pattern;
 6  
 
 7  
 import org.jbehave.core.failures.UUIDExceptionWrapper;
 8  
 
 9  
 public class StackTraceFormatter {
 10  
     
 11  
     private boolean compressFailureTrace;
 12  
     
 13  5
     public StackTraceFormatter(boolean compressFailureTrace) {
 14  5
         this.compressFailureTrace = compressFailureTrace;
 15  5
     }
 16  
 
 17  
     public String stackTrace(Throwable cause) {
 18  4
         if (cause.getClass().getName().equals(UUIDExceptionWrapper.class.getName())) {
 19  0
             cause = cause.getCause();
 20  
         }
 21  4
         ByteArrayOutputStream out = new ByteArrayOutputStream();
 22  4
         cause.printStackTrace(new PrintStream(out));
 23  4
         return stackTrace(out.toString());
 24  
     }
 25  
 
 26  
     protected String stackTrace(String stackTrace) {
 27  5
         if (!compressFailureTrace) {
 28  4
             return stackTrace;
 29  
         }
 30  
         // don't print past certain parts of the stack. Try them even though
 31  
         // they may be redundant.
 32  1
         stackTrace = cutOff(stackTrace, "org.jbehave.core.embedder.");
 33  1
         stackTrace = cutOff(stackTrace, "org.junit.runners.");
 34  1
         stackTrace = cutOff(stackTrace, "org.apache.maven.surefire.");
 35  
 
 36  
         // System.out.println("=====before>" + stackTrace + "<==========");
 37  
 
 38  
         // replace whole series of lines with '\t(summary)' The end-user
 39  
         // will thank us.
 40  9
         for (Replacement replacement : REPLACEMENTS) {
 41  8
             stackTrace = replacement.from.matcher(stackTrace).replaceAll(replacement.to);
 42  
         }
 43  1
         return stackTrace;
 44  
     }
 45  
 
 46  
     private String cutOff(String stackTrace, String at) {
 47  3
         if (stackTrace.indexOf(at) > -1) {
 48  1
             int ix = stackTrace.indexOf(at);
 49  1
             ix = stackTrace.indexOf("\n", ix);
 50  1
             if (ix != -1) {
 51  0
                 stackTrace = stackTrace.substring(0, ix);
 52  
             }
 53  
         }
 54  3
         return stackTrace;
 55  
     }
 56  
 
 57  24
     private static class Replacement {
 58  
         private final Pattern from;
 59  
         private final String to;
 60  
 
 61  8
         private Replacement(Pattern from, String to) {
 62  8
             this.from = from;
 63  8
             this.to = to;
 64  8
         }
 65  
     }
 66  
 
 67  1
     private static Replacement[] REPLACEMENTS = new Replacement[] {
 68  
             new Replacement(
 69  
                     Pattern.compile("\\tat sun.reflect.NativeMethodAccessorImpl.invoke0\\(Native Method\\)\\n"
 70  
                             + "\\tat sun.reflect.NativeMethodAccessorImpl.invoke\\(NativeMethodAccessorImpl.java:\\d+\\)\\n"
 71  
                             + "\\tat sun.reflect.DelegatingMethodAccessorImpl.invoke\\(DelegatingMethodAccessorImpl.java:\\d+\\)\\n"
 72  
                             + "\\tat java.lang.reflect.Method.invoke\\(Method.java:\\d+\\)"),
 73  
                     "\t(reflection-invoke)"),
 74  
             new Replacement(
 75  
                     Pattern.compile("\\tat org.codehaus.groovy.reflection.CachedMethod.invoke\\(CachedMethod.java:\\d+\\)\\n"
 76  
                             + "\\tat org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke\\(ClosureMetaMethod.java:\\d+\\)\\n"
 77  
                             + "\\tat org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite\\$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke\\(PojoMetaMethodSite.java:\\d+\\)\\n"
 78  
                             + "\\tat org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call\\(PojoMetaMethodSite.java:\\d+\\)\\n"
 79  
                             + "\\tat org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall\\(CallSiteArray.java:\\d+\\)\\n"
 80  
                             + "\\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.call\\(AbstractCallSite.java:\\d+\\)\\n"
 81  
                             + "\\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.call\\(AbstractCallSite.java:\\d+\\)"),
 82  
                     "\t(groovy-closure-invoke)"),
 83  
             new Replacement(
 84  
                     Pattern.compile("\\tat org.codehaus.groovy.reflection.CachedMethod.invoke\\(CachedMethod.java:\\d+\\)\\n"
 85  
                             + "\\tat groovy.lang.MetaMethod.doMethodInvoke\\(MetaMethod.java:\\d+\\)\\n"
 86  
                             + "\\tat org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod\\(ClosureMetaClass.java:\\d+\\)\\n"
 87  
                             + "\\tat org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN\\(ScriptBytecodeAdapter.java:\\d+\\)"),
 88  
                     "\t(groovy-instance-method-invoke)"),
 89  
             new Replacement(
 90  
                     Pattern.compile("\\tat org.codehaus.groovy.reflection.CachedMethod.invoke\\(CachedMethod.java:\\d+\\)\n"
 91  
                             + "\\tat org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke\\(ClosureMetaMethod.java:\\d+\\)\n"
 92  
                             + "\\tat org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite\\$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke\\(PojoMetaMethodSite.java:\\d+\\)\n"
 93  
                             + "\\tat org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call\\(PojoMetaMethodSite.java:\\d+\\)\n"
 94  
                             + "\\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.call\\(AbstractCallSite.java:\\d+\\)"),
 95  
                     "\t(groovy-abstract-method-invoke)"),
 96  
             new Replacement(
 97  
                     Pattern.compile("\\tat org.codehaus.groovy.reflection.CachedMethod.invoke\\(CachedMethod.java:\\d+\\)\\n"
 98  
                             + "\\tat groovy.lang.MetaMethod.doMethodInvoke\\(MetaMethod.java:\\d+\\)\\n"
 99  
                             + "\\tat groovy.lang.MetaClassImpl.invokeStaticMethod\\(MetaClassImpl.java:\\d+\\)\\n"
 100  
                             + "\\tat org.codehaus.groovy.runtime.InvokerHelper.invokeStaticMethod\\(InvokerHelper.java:\\d+\\)\\n"
 101  
                             + "\\tat org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeStaticMethodN\\(ScriptBytecodeAdapter.java:\\d+\\)"),
 102  
                     "\t(groovy-static-method-invoke)"),
 103  
             new Replacement(
 104  
                     Pattern.compile("\\tat sun.reflect.NativeConstructorAccessorImpl.newInstance0\\(Native Method\\)\\n"
 105  
                             + "\\tat sun.reflect.NativeConstructorAccessorImpl.newInstance\\(NativeConstructorAccessorImpl.java:\\d+\\)\\n"
 106  
                             + "\\tat sun.reflect.DelegatingConstructorAccessorImpl.newInstance\\(DelegatingConstructorAccessorImpl.java:\\d+\\)\\n"
 107  
                             + "\\tat java.lang.reflect.Constructor.newInstance\\(Constructor.java:\\d+\\)"),
 108  
                     "\t(reflection-construct)"),
 109  
             new Replacement(
 110  
                     Pattern.compile("\\tat org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(Current|)\\(CallSiteArray.java:\\d+\\)\\n"
 111  
                             + "\\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(Current|)\\(AbstractCallSite.java:\\d+\\)\\n"
 112  
                             + "\\tat org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(Current|)\\(AbstractCallSite.java:\\d+\\)"
 113  
 
 114  
                     ), "\t(groovy-call)"),
 115  
             // This one last.
 116  
             new Replacement(Pattern.compile("\\t\\(reflection\\-invoke\\)\\n" + "\\t\\(groovy\\-"), "\t(groovy-") };
 117  
 
 118  
 }