1 package org.apache.onami.persist;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.PrintStream;
23 import java.io.PrintWriter;
24 import java.util.ArrayList;
25 import java.util.List;
26
27 import static org.apache.onami.persist.Preconditions.checkNotNull;
28
29
30
31
32 class AggregatedException
33 extends RuntimeException
34 {
35
36 private static final long serialVersionUID = 1L;
37
38
39
40
41 static class Builder
42 {
43
44
45
46
47 private List<Throwable> causes = new ArrayList<Throwable>();
48
49
50
51
52
53
54 void add( Throwable cause )
55 {
56 causes.add( checkNotNull( cause, "cause is mandatory!" ) );
57 }
58
59
60
61
62
63
64 void throwRuntimeExceptionIfHasCauses( String msg )
65 {
66 try
67 {
68 if ( !causes.isEmpty() )
69 {
70 throw getRuntimeException( msg );
71 }
72 }
73 finally
74 {
75 causes = null;
76 }
77 }
78
79
80
81
82
83
84
85 private RuntimeException getRuntimeException( String msg )
86 {
87 if ( causes.size() == 1 )
88 {
89 final Throwable cause = causes.get( 0 );
90 if ( cause instanceof RuntimeException )
91 {
92 return (RuntimeException) cause;
93 }
94 }
95 return new AggregatedException( msg, causes.toArray( new Throwable[causes.size()] ) );
96 }
97 }
98
99
100
101
102 private final Throwable[] causes;
103
104
105
106
107 private final int numCauses;
108
109
110
111
112
113
114
115 private AggregatedException( String message, Throwable[] causes )
116 {
117 super( message );
118 this.causes = causes;
119 this.numCauses = this.causes.length;
120 }
121
122
123
124
125 public Throwable[] getCauses()
126 {
127 return causes.clone();
128 }
129
130
131
132
133 public int getNumCauses()
134 {
135 return numCauses;
136 }
137
138
139
140
141 @Override
142 public void printStackTrace( PrintStream s )
143 {
144 synchronized ( s )
145 {
146
147 s.println( this );
148 StackTraceElement[] trace = getStackTrace();
149 for ( final StackTraceElement aTrace : trace )
150 {
151 s.println( "\tat " + aTrace );
152 }
153
154 for ( int i = 0; i < numCauses; i++ )
155 {
156 s.println( "Cause " + ( i + 1 ) + ":" );
157 causes[i].printStackTrace( s );
158 }
159 }
160 }
161
162
163
164
165 @Override
166 public void printStackTrace( PrintWriter s )
167 {
168 synchronized ( s )
169 {
170
171 s.println( this );
172 StackTraceElement[] trace = getStackTrace();
173 for ( final StackTraceElement aTrace : trace )
174 {
175 s.println( "\tat " + aTrace );
176 }
177
178 for ( int i = 0; i < numCauses; i++ )
179 {
180 s.println( "Cause " + ( i + 1 ) + ":" );
181 causes[i].printStackTrace( s );
182 }
183 }
184 }
185
186
187
188
189 @Override
190 public String toString()
191 {
192 return super.toString() + " (caused by " + numCauses + " causes)";
193 }
194
195 }