001 /*
002 @license.text@
003 */
004 package biz.hammurapi.swing;
005
006 import java.lang.reflect.Field;
007 import java.lang.reflect.InvocationTargetException;
008 import java.lang.reflect.Method;
009
010 import javax.swing.table.DefaultTableModel;
011 import javax.swing.table.TableModel;
012 import javax.swing.tree.DefaultMutableTreeNode;
013 import javax.swing.tree.MutableTreeNode;
014
015
016 /**
017 * @author Pavel Vlasov
018 *
019 * @version $Revision: 1.1 $
020 */
021 public class BeanVisualizer {
022
023 public Visualizable toVisualizable(final Object obj) {
024 return new Visualizable() {
025
026 public MutableTreeNode toTree(final String title) {
027 DefaultMutableTreeNode ret=new DefaultMutableTreeNode(obj) {
028 public String toString() {
029 return title+" ["+obj.getClass().getName()+"] "+obj;
030 }
031 };
032
033 return ret;
034 }
035
036 public TableModel toTable() {
037 int rowCount=2;
038 DefaultTableModel tm=new DefaultTableModel(rowCount,4);
039 tm.setColumnIdentifiers(new String[] {"Property", "Declared type", "Runtime type", "Value"});
040
041 Class beanClass=obj.getClass();
042
043 tm.setValueAt("this", 0, 0);
044 tm.setValueAt(beanClass.getName(), 0, 2);
045 tm.setValueAt(obj, 0, 3);
046
047 tm.setValueAt("Hash code", 1, 0);
048 tm.setValueAt("int", 1, 1);
049 tm.setValueAt("int", 1, 2);
050 tm.setValueAt(Integer.toString(obj.hashCode(), Character.MAX_RADIX), 1, 3);
051
052 Method[] methods = beanClass.getMethods();
053 for (int i=0; i<methods.length; i++) {
054 // getXXX() methods. Object.getClass() is not included.
055 if (!(methods[i].getDeclaringClass().equals(Object.class)) && methods[i].getName().startsWith("get") && methods[i].getParameterTypes().length==0 ) {
056 try {
057 Object value=methods[i].invoke(obj, null);
058 tm.setRowCount(++rowCount);
059 int idx = rowCount-1;
060 tm.setValueAt(methods[i].getName().substring(3), idx, 0);
061 tm.setValueAt(methods[i].getReturnType().getName(), idx, 1);
062 if (value==null) {
063 tm.setValueAt("(null)", idx, 2);
064 tm.setValueAt("(null)", idx, 3);
065 } else {
066 tm.setValueAt(value.getClass().getName(), idx, 2);
067 tm.setValueAt(value, idx, 3);
068 }
069 } catch (IllegalArgumentException e) {
070 e.printStackTrace();
071 } catch (IllegalAccessException e) {
072 e.printStackTrace();
073 } catch (InvocationTargetException e) {
074 e.printStackTrace();
075 }
076 }
077 }
078
079 Field[] fields = beanClass.getFields();
080 for (int i=0; i<fields.length; i++) {
081 try {
082 Object value=fields[i].get(obj);
083 tm.setRowCount(++rowCount);
084 int idx = rowCount-1;
085 tm.setValueAt(fields[i].getName().substring(3), idx, 0);
086 tm.setValueAt(fields[i].getType().getName(), idx, 1);
087 if (value==null) {
088 tm.setValueAt("(null)", idx, 2);
089 tm.setValueAt("(null)", idx, 3);
090 } else {
091 tm.setValueAt(value.getClass().getName(), idx, 2);
092 tm.setValueAt(value, idx, 3);
093 }
094 } catch (IllegalArgumentException e) {
095 e.printStackTrace();
096 } catch (IllegalAccessException e) {
097 e.printStackTrace();
098 }
099 }
100
101 return tm;
102 }
103
104 };
105
106 }
107 }