1 package org.apache.maven.surefire.report;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import org.apache.maven.surefire.util.internal.StringUtils;
24
25 import java.io.PrintWriter;
26 import java.io.StringWriter;
27
28
29
30
31
32
33 public class PojoStackTraceWriter
34 implements StackTraceWriter
35 {
36 private final Throwable t;
37
38 private final String testClass;
39
40 private final String testMethod;
41
42 public PojoStackTraceWriter( String testClass, String testMethod, Throwable t )
43 {
44 this.testClass = testClass;
45 this.testMethod = testMethod;
46 this.t = t;
47 }
48
49 @Override
50 public String writeTraceToString()
51 {
52 if ( t != null )
53 {
54 StringWriter w = new StringWriter();
55 try ( PrintWriter stackTrace = new PrintWriter( w ) )
56 {
57 t.printStackTrace( stackTrace );
58 }
59 StringBuffer builder = w.getBuffer();
60 if ( isMultiLineExceptionMessage( t ) )
61 {
62
63 String exc = t.getClass().getName() + ": ";
64 if ( StringUtils.startsWith( builder, exc ) )
65 {
66 builder.insert( exc.length(), '\n' );
67 }
68 }
69 return builder.toString();
70 }
71 return "";
72 }
73
74 @Override
75 public String smartTrimmedStackTrace()
76 {
77 return t == null ? "" : new SmartStackTraceParser( testClass, t, testMethod ).getString();
78 }
79
80 @Override
81 public String writeTrimmedTraceToString()
82 {
83 return t == null ? "" : SmartStackTraceParser.stackTraceWithFocusOnClassAsString( t, testClass );
84 }
85
86 @Override
87 public SafeThrowable getThrowable()
88 {
89 return t == null ? null : new SafeThrowable( t );
90 }
91
92 private static boolean isMultiLineExceptionMessage( Throwable t )
93 {
94 String msg = t.getLocalizedMessage();
95 if ( msg != null )
96 {
97 int countNewLines = 0;
98 for ( int i = 0, length = msg.length(); i < length; i++ )
99 {
100 if ( msg.charAt( i ) == '\n' )
101 {
102 if ( ++countNewLines == 2 )
103 {
104 break;
105 }
106 }
107 }
108 return countNewLines > 1 || countNewLines == 1 && !msg.trim().endsWith( "\n" );
109 }
110 return false;
111 }
112 }