1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.exception;
17
18 import org.apache.log4j.Logger;
19 import org.kuali.rice.core.api.exception.KualiException;
20 import org.kuali.rice.krad.service.KRADServiceLocator;
21
22 import java.io.PrintWriter;
23 import java.io.StringWriter;
24 import java.util.HashMap;
25 import java.util.Map;
26
27
28
29
30
31
32
33
34
35 public class ExceptionIncident implements KualiExceptionIncident {
36 private static final Logger LOG = Logger.getLogger(ExceptionIncident.class);
37 public static final String GENERIC_SYSTEM_ERROR_MESSAGE = "The system has" +
38 " encountered an error and is unable to complete your request at this time."+
39 " Please provide more information regarding this error by completing"+
40 " this Incident Report.";
41
42
43
44
45
46
47
48
49
50
51
52 protected Map<String, String> properties=new HashMap<String, String>();
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public ExceptionIncident(Exception exception,
71 Map<String,String> properties) {
72 if (LOG.isTraceEnabled()) {
73 String message=String.format("ENTRY %s%n%s",
74 (exception==null)?"null":exception.toString(),
75 (properties==null)?"":properties.toString());
76 LOG.trace(message);
77 }
78
79 initialize(exception, properties);
80
81 if (LOG.isTraceEnabled()) {
82 String message=String.format("EXIT %s", this.properties);
83 LOG.trace(message);
84 }
85
86 }
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 public ExceptionIncident(Map<String, String> inputs) {
105
106 this.properties=inputs;
107
108 }
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 private void initialize(Exception thrownException, Map<String, String> inputs) {
124 if (LOG.isTraceEnabled()) {
125 String lm=String.format("ENTRY %s%n%s",
126 thrownException.getMessage(),
127 (inputs==null)?"null":inputs.toString());
128 LOG.trace(lm);
129 }
130
131 properties=new HashMap<String, String>();
132
133 if (inputs != null) {
134 properties.putAll(inputs);
135 }
136
137 properties.putAll(getExceptionInfo(thrownException));
138
139 if (LOG.isTraceEnabled()) {
140 String lm=String.format("EXIT %s", properties.toString());
141 LOG.trace(lm);
142 }
143 }
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158 private Map<String, String> getExceptionInfo(Exception exception) {
159 if (LOG.isTraceEnabled()) {
160 String message=String.format("ENTRY");
161 LOG.trace(message);
162 }
163
164 Map<String, String> map=new HashMap<String, String>();
165 map.put(EXCEPTION_REPORT_SUBJECT, createReportSubject(exception));
166 map.put(EXCEPTION_MESSAGE, exception.getMessage());
167 map.put(DISPLAY_MESSAGE, getDisplayMessage(exception));
168 map.put(STACK_TRACE, getExceptionStackTrace(exception));
169 if(exception instanceof KualiException){
170 boolean hideIncidentReport = ((KualiException) exception).isHideIncidentReport();
171 map.put(EXCEPTION_HIDE_INCIDENT_REPORT, String.valueOf(hideIncidentReport));
172 }else{
173 map.put(EXCEPTION_HIDE_INCIDENT_REPORT, String.valueOf(false));
174 }
175
176 if (LOG.isTraceEnabled()) {
177 String message=String.format("ENTRY %s", map.toString());
178 LOG.trace(message);
179 }
180
181 return map;
182 }
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199 private String createReportSubject(Exception exception) {
200 if (LOG.isTraceEnabled()) {
201 String lm=String.format("ENTRY");
202 LOG.trace(lm);
203 }
204
205 String env= KRADServiceLocator.getKualiConfigurationService().
206 getPropertyValueAsString("environment");
207 String format="%s:%s:%s";
208 String componentName=properties.get(COMPONENT_NAME);
209 String subject=String.format(format,
210 env,
211 (componentName==null)?"":componentName,
212 exception.getMessage());
213
214 if (LOG.isTraceEnabled()) {
215 String lm=String.format("EXIT %s", subject);
216 LOG.trace(lm);
217 }
218
219 return subject;
220 }
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246 private String createReportMessage() {
247 if (LOG.isTraceEnabled()) {
248 String lm=String.format("ENTRY");
249 LOG.trace(lm);
250 }
251
252 String documentId=properties.get(DOCUMENT_ID);
253 String userEmail=properties.get(USER_EMAIL);
254 String uuid=properties.get(UUID);
255 String description=properties.get(DESCRIPTION);
256 String component=properties.get(COMPONENT_NAME);
257 String exceptionMessage=properties.get(EXCEPTION_MESSAGE);
258 String stackTrace=properties.get(STACK_TRACE);
259 String format="Document Id: %s%n"+
260 "User Email: %s%n"+
261 "Person User Identifier: %s%n"+
262 "User Input: %s%n"+
263 "component: %s%n"+
264 "errorMessage: %s%n"+
265 "%s%n";
266 String message=String.format(format,
267 (documentId==null)?"":documentId,
268 (userEmail==null)?"":userEmail,
269 (uuid==null)?"":uuid,
270 (description==null)?"":description,
271 (component==null)?"":component,
272 (exceptionMessage==null)?"":exceptionMessage,
273 (stackTrace==null)?"":stackTrace);
274
275 if (LOG.isTraceEnabled()) {
276 String lm=String.format("EXIT %s", message);
277 LOG.trace(lm);
278 }
279
280 return message;
281 }
282
283
284
285
286
287
288
289 public String getExceptionStackTrace(Exception thrownException) {
290 if (LOG.isTraceEnabled()) {
291 String lm=String.format("ENTRY");
292 LOG.trace(lm);
293 }
294
295 StringWriter wrt=new StringWriter();
296 PrintWriter pw=new PrintWriter(wrt);
297 thrownException.printStackTrace(pw);
298 pw.flush();
299 String stackTrace=wrt.toString();
300 try {
301 wrt.close();
302 pw.close();
303 } catch (Exception e) {
304 LOG.trace(e.getMessage(), e);
305 }
306
307 if (LOG.isTraceEnabled()) {
308 String lm=String.format("EXIT %s", stackTrace);
309 LOG.trace(lm);
310 }
311
312 return stackTrace;
313 }
314
315
316
317
318
319
320
321 public String getDisplayMessage(Exception exception) {
322 if (LOG.isTraceEnabled()) {
323 String message=String.format("ENTRY %s", exception.getMessage());
324 LOG.trace(message);
325 }
326
327
328 String displayMessage;
329 if (exception instanceof KualiException) {
330 displayMessage=exception.getMessage();
331 } else {
332 displayMessage=GENERIC_SYSTEM_ERROR_MESSAGE;
333 }
334
335 if (LOG.isTraceEnabled()) {
336 String message=String.format("EXIT %s", displayMessage);
337 LOG.trace(message);
338 }
339
340 return displayMessage;
341 }
342
343
344
345
346
347
348
349 public String getProperty(String key) {
350 if (LOG.isTraceEnabled()) {
351 String message=String.format("ENTRY %s", key);
352 LOG.trace(message);
353 }
354
355 String value;
356 if (key.equals(EXCEPTION_REPORT_MESSAGE) && !properties.containsKey(key)) {
357 value=createReportMessage();
358 properties.put(EXCEPTION_REPORT_MESSAGE, value);
359 } else {
360 value=properties.get(key);
361 }
362
363 if (LOG.isTraceEnabled()) {
364 String message=String.format("EXIT %s", value);
365 LOG.trace(message);
366 }
367
368 return value;
369 }
370
371
372
373
374
375
376 public Map<String, String> toProperties() {
377 if (LOG.isTraceEnabled()) {
378 String message=String.format("ENTRY");
379 LOG.trace(message);
380 }
381
382 if (LOG.isTraceEnabled()) {
383 String message=String.format("EXIT %s", properties.toString());
384 LOG.trace(message);
385 }
386
387 return properties;
388 }
389 }