001    /*
002     @license.text@
003      */
004    package biz.hammurapi.swing;
005    
006    import javax.swing.table.DefaultTableModel;
007    import javax.swing.table.TableModel;
008    import javax.swing.tree.DefaultMutableTreeNode;
009    import javax.swing.tree.MutableTreeNode;
010    
011    /**
012     * @author Pavel Vlasov
013     *
014     * @version $Revision: 1.1 $
015     */
016    public class ThrowableVisualizer {
017    
018            public Visualizable toVisualizable(final Throwable th) {
019                    return new Visualizable() {
020                            
021                            public MutableTreeNode toTree(final String title) {
022                                    DefaultMutableTreeNode ret=new DefaultMutableTreeNode(th) {
023                                            public String toString() {
024                                                    return title+" ["+th.getClass().getName()+"] "+th.getMessage();
025                                            }
026                                    }; 
027                                    
028                                    StackTraceElement[] st = th.getStackTrace();
029                                for (int i=0; i<st.length; i++) {
030                                    Visualizable ev=toVisualizable(st[i]);
031                                    if (ev!=null) {
032                                            ret.add(ev.toTree(null));
033                                    }
034                                }                   
035                                    
036                                if (th.getCause()!=null) {
037                                    Visualizable v=toVisualizable(th.getCause());
038                                    ret.add(v.toTree("cause"));
039                                }
040                                
041                                    return ret;
042                            }
043    
044                            public TableModel toTable() {
045                                    DefaultTableModel tm=new DefaultTableModel(th.getCause()==null ? 2 : 3, 2);
046                                    tm.setColumnIdentifiers(new String[] {"Property", "Value"});
047                                    tm.setValueAt("Class", 0, 0);
048                                    tm.setValueAt(th.getClass().getName(), 0, 1);
049                                    tm.setValueAt("Message", 1, 0);
050                                    tm.setValueAt(th.getMessage(), 1, 1);
051                                    
052                                    if (th.getCause()!=null) {
053                                            tm.setValueAt("Cause", 2, 0);
054                                            tm.setValueAt(th.getCause(), 2, 1);                                     
055                                    }
056                                    
057                                    return tm;
058                            }
059                            
060                    };
061            }
062    
063            public Visualizable toVisualizable(final StackTraceElement element) {
064                    return new Visualizable() {
065                            
066                            public MutableTreeNode toTree(final String title) {
067                                    DefaultMutableTreeNode ret=new DefaultMutableTreeNode(element) {
068                                            public String toString() {
069                                                    return element.toString();
070                                            }
071                                    }; 
072                                                                    
073                                    return ret;
074                            }
075    
076                            public TableModel toTable() {
077                                    DefaultTableModel tm=new DefaultTableModel(5, 2);
078                                    tm.setColumnIdentifiers(new String[] {"Property", "Value"});
079                                    tm.setValueAt("Class", 0, 0);
080                                    tm.setValueAt(element.getClassName(), 0, 1);
081                                    
082                                    tm.setValueAt("File", 1, 0);
083                                    tm.setValueAt(element.getFileName(), 1, 1);
084                                    
085                                    tm.setValueAt("Method", 2, 0);
086                                    tm.setValueAt(element.getMethodName(), 2, 1);
087                                    
088                                    tm.setValueAt("Line", 3, 0);
089                                    tm.setValueAt(String.valueOf(element.getLineNumber()), 3, 1);
090                                    
091                                    tm.setValueAt("Native", 4, 0);
092                                    tm.setValueAt(element.isNativeMethod() ? "yes" : "no", 4, 1);
093                                    
094                                    
095                                    return tm;
096                            }
097                            
098                    };
099            }
100    }