1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.classic.pattern;
15
16 import ch.qos.logback.classic.spi.IThrowableProxy;
17 import ch.qos.logback.classic.spi.ThrowableProxyUtil;
18 import ch.qos.logback.core.CoreConstants;
19
20
21
22
23
24 public class RootCauseFirstThrowableProxyConverter extends ExtendedThrowableProxyConverter {
25
26 @Override
27 protected String throwableProxyToString(IThrowableProxy tp) {
28 StringBuilder buf = new StringBuilder(BUILDER_CAPACITY);
29 recursiveAppendRootCauseFirst(buf, null, ThrowableProxyUtil.REGULAR_EXCEPTION_INDENT, tp);
30 return buf.toString();
31 }
32
33 protected void recursiveAppendRootCauseFirst(StringBuilder sb, String prefix, int indent, IThrowableProxy tp) {
34 if (tp.getCause() != null) {
35 recursiveAppendRootCauseFirst(sb, prefix, indent, tp.getCause());
36 prefix = null;
37 }
38 ThrowableProxyUtil.indent(sb, indent - 1);
39 if (prefix != null) {
40 sb.append(prefix);
41 }
42 ThrowableProxyUtil.subjoinFirstLineRootCauseFirst(sb, tp);
43 sb.append(CoreConstants.LINE_SEPARATOR);
44 subjoinSTEPArray(sb, indent, tp);
45 IThrowableProxy[] suppressed = tp.getSuppressed();
46 if (suppressed != null) {
47 for (IThrowableProxy current : suppressed) {
48 recursiveAppendRootCauseFirst(sb, CoreConstants.SUPPRESSED,
49 indent + ThrowableProxyUtil.SUPPRESSED_EXCEPTION_INDENT, current);
50 }
51 }
52 }
53 }