1 package com.github.celldynamics.quimp;
2
3 import java.awt.Frame;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.EnumSet;
7 import java.util.List;
8 import java.util.Set;
9
10 import javax.swing.JOptionPane;
11
12 import org.slf4j.LoggerFactory;
13
14 import com.github.celldynamics.quimp.utils.QuimpToolsCollection;
15
16 import ch.qos.logback.classic.Logger;
17 import ij.IJ;
18
19
20
21
22
23
24
25
26
27 public class QuimpException extends Exception {
28
29
30
31
32
33 protected boolean persistent = false;
34
35
36
37 public Logger logger = (Logger) LoggerFactory.getLogger(this.getClass());
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 public enum MessageSinkTypes {
55
56
57
58
59 CONSOLE,
60
61
62
63 GUI,
64
65
66
67 IJERROR,
68
69
70
71
72
73 MESSAGE,
74
75
76
77 NONE;
78 }
79
80
81
82
83
84
85 protected EnumSet<MessageSinkTypes> messageSinkType;
86
87
88
89
90
91
92 public void setMessageSinkType(MessageSinkTypes... messageSinkType) {
93 if (persistent) {
94 return;
95 }
96 this.messageSinkType = EnumSet.copyOf(Arrays.asList(messageSinkType));
97 }
98
99
100
101
102
103
104 public void setMessageSinkType(Set<MessageSinkTypes> messageSinkType) {
105 if (persistent) {
106 return;
107 }
108 this.messageSinkType = EnumSet.copyOf(messageSinkType);
109 }
110
111
112
113
114
115
116 public Set<MessageSinkTypes> getMessageSinkType() {
117 return messageSinkType;
118 }
119
120
121
122
123 private static final long serialVersionUID = -7943488580659917234L;
124
125
126
127
128 public QuimpException() {
129 this.messageSinkType = EnumSet.of(MessageSinkTypes.CONSOLE);
130 }
131
132
133
134
135
136
137
138 public QuimpException(MessageSinkTypes... types) {
139 setMessageSinkType(types);
140 }
141
142
143
144
145
146
147
148 public QuimpException(MessageSinkTypes type) {
149 this.messageSinkType = EnumSet.of(type);
150 }
151
152
153
154
155
156
157 public QuimpException(String message) {
158 super(message);
159 this.messageSinkType = EnumSet.of(MessageSinkTypes.CONSOLE);
160 }
161
162
163
164
165
166
167
168 public QuimpException(String message, MessageSinkTypes type) {
169 super(message);
170 this.messageSinkType = EnumSet.of(type);
171 }
172
173
174
175
176
177
178
179
180 public QuimpException(String message, MessageSinkTypes type, boolean persistent) {
181 super(message);
182 this.messageSinkType = EnumSet.of(type);
183 this.persistent = persistent;
184 }
185
186
187
188
189
190
191
192 public QuimpException(String message, MessageSinkTypes... types) {
193 super(message);
194 setMessageSinkType(types);
195 }
196
197
198
199
200
201
202 public QuimpException(Throwable cause) {
203 super(cause);
204 this.messageSinkType = EnumSet.of(MessageSinkTypes.CONSOLE);
205 }
206
207
208
209
210
211
212
213 public QuimpException(Throwable cause, MessageSinkTypes type) {
214 super(cause);
215 this.messageSinkType = EnumSet.of(type);
216 }
217
218
219
220
221
222
223
224 public QuimpException(Throwable cause, MessageSinkTypes... types) {
225 super(cause);
226 setMessageSinkType(types);
227 }
228
229
230
231
232
233
234
235 public QuimpException(String message, Throwable cause) {
236 super(message, cause);
237 this.messageSinkType = EnumSet.of(MessageSinkTypes.CONSOLE);
238 }
239
240
241
242
243
244
245
246
247
248 public QuimpException(String message, Throwable cause, boolean enableSuppression,
249 boolean writableStackTrace) {
250 super(message, cause, enableSuppression, writableStackTrace);
251 this.messageSinkType = EnumSet.of(MessageSinkTypes.CONSOLE);
252 }
253
254
255
256
257
258
259
260
261 public QuimpException(String message, Throwable cause, MessageSinkTypes type) {
262 super(message, cause);
263 this.messageSinkType = EnumSet.of(type);
264 }
265
266
267
268
269
270
271
272
273 public QuimpException(String message, Throwable cause, MessageSinkTypes... types) {
274 super(message, cause);
275 setMessageSinkType(types);
276 }
277
278
279
280
281
282
283
284
285 public String handleException(Frame frame, String appendMessage) {
286 logger.debug(getMessage(), this);
287 String message = prepareMessage(this, appendMessage);
288
289 if (getMessageSinkType().contains(MessageSinkTypes.CONSOLE)) {
290 logger.error(message);
291 }
292 if (getMessageSinkType().contains(MessageSinkTypes.MESSAGE)) {
293 logger.info(message);
294 }
295 if (getMessageSinkType().contains(MessageSinkTypes.GUI)) {
296 showGuiWithMessage(frame, message);
297 }
298 if (getMessageSinkType().contains(MessageSinkTypes.IJERROR)) {
299 List<String> ex = getExceptionMessageChain(this);
300 if (ex.size() > 1) {
301 IJ.log("Error messages stack:");
302 for (int i = 0; i < ex.size(); i++) {
303 if (ex.get(i) != null) {
304 if (i == 0) {
305 IJ.log(" " + ex.get(i));
306 } else {
307 IJ.log(" ->" + ex.get(i));
308 }
309 }
310 }
311 }
312 IJ.handleException(this);
313 IJ.error(QuimpToolsCollection.stringWrap(message, QuimP.LINE_WRAP));
314 }
315 return message;
316 }
317
318
319
320
321
322
323
324 public static void showGuiWithMessage(Frame frame, String message) {
325 JOptionPane.showMessageDialog(frame, QuimpToolsCollection.stringWrap(message, QuimP.LINE_WRAP),
326 "Error", JOptionPane.ERROR_MESSAGE);
327 }
328
329
330
331
332
333
334
335
336 public static String prepareMessage(Exception ex, String appendMessage) {
337 String message = appendMessage;
338 List<String> ch = getExceptionMessageChain(ex);
339 int l = 0;
340 for (String c : ch) {
341 if (c != null) {
342 if (l == 0) {
343 message = message.concat(" (" + c);
344 } else {
345 message = message.concat(" -> " + c);
346 }
347 l++;
348 }
349 }
350 if (l > 0) {
351 message = message.concat(")");
352 }
353 return message;
354 }
355
356
357
358
359
360
361
362
363
364 public static List<String> getExceptionMessageChain(Throwable throwable) {
365 List<String> result = new ArrayList<String>();
366 while (throwable != null) {
367 result.add(throwable.getMessage());
368 throwable = throwable.getCause();
369 }
370 return result;
371 }
372
373 }