Changed license to CC0
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / gui / dialog / ExceptionDialog.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.commons.gui.dialog;
6
7 import javax.swing.*;
8 import java.awt.*;
9
10 public class ExceptionDialog {
11
12     public ExceptionDialog(final Exception exception) {
13         showException(exception);
14     }
15
16     /**
17      * This method is for testing
18      *
19      * @param args commandline arguments
20      */
21     public static void main(final String[] args) {
22
23         final Throwable cause = new Throwable("details.....");
24
25         final Exception exception = new Exception("test", cause);
26
27         new ExceptionDialog(exception);
28     }
29
30     /**
31      * @param exception exception to show
32      */
33     public void showException(final Exception exception) {
34
35         final JFrame frame = new JFrame("Exception occurred!");
36         final JPanel contentPanel = new JPanel(new BorderLayout());
37         final Throwable cause = exception.getCause();
38
39         // build top panel
40         {
41             final JPanel topPanel = new JPanel();
42             topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
43
44             // add exception type
45             final JLabel exceptionType = new JLabel("Exception type: "
46                     + exception.getClass().getCanonicalName());
47             topPanel.add(exceptionType);
48
49             // add error message
50             final JLabel message = new JLabel("Error message: "
51                     + exception.getMessage());
52             topPanel.add(message);
53
54             // add cause message
55             if (cause != null)
56                 if (cause.getMessage() != null) {
57                     final JLabel message2 = new JLabel("Cause: "
58                             + cause.getMessage());
59                     topPanel.add(message2);
60                 }
61
62             contentPanel.add(topPanel, BorderLayout.NORTH);
63         }
64
65         // build stack trace view
66         {
67             final StringBuilder buffer = new StringBuilder();
68
69             // if cause is available, show original stack trace
70             if (cause != null) {
71                 buffer.append("Stack trace:\n");
72                 final StackTraceElement[] stackTrace = cause.getStackTrace();
73                 for (final StackTraceElement stackTraceElement : stackTrace)
74                     buffer.append(stackTraceElement.toString() + "\n");
75             } else {
76                 // otherwise show at least current stack trace
77                 buffer.append("Stack trace from original cause is not available.\nShowing current stack trace instead:\n");
78
79                 for (final StackTraceElement stackTraceElement : new Exception(
80                         "Stack trace").getStackTrace())
81                     buffer.append(stackTraceElement.toString() + "\n");
82             }
83
84             final TextArea textArea = new TextArea(buffer.toString());
85             contentPanel.add(textArea, BorderLayout.CENTER);
86         }
87
88         // finalize frame
89         frame.getContentPane().add(contentPanel);
90         frame.setSize(800, 600);
91         frame.setVisible(true);
92
93         // Thread.dumpStack();
94
95     }
96
97 }