BeanVisualizer.java

biz/hammurapi/swing/BeanVisualizer.java

Violations

Inspector Message Severity Location
Java Inspector 048 Copyrights information should be present in each file. 1
Java Inspector 049 Use a Collection instead of arrays Object[] 2 73:51
Java Inspector 049 Use a Collection instead of arrays Object[] 2 92:50
Java Inspector 049 Use a Collection instead of arrays Object[] 2 125:51
Java Inspector 049 Use a Collection instead of arrays Object[] 2 152:50
Java Inspector 082 Parenthesis are redundant. 2 76:54
Java Inspector 082 Parenthesis are redundant. 2 128:54
Java Inspector 089 Type is not documented 2 45:1
Java Inspector 089 Undocumented method 2 64:9
Java Inspector 089 Undocumented method 2 67:25
Java Inspector 089 Undocumented method 2 70:41
Java Inspector 089 Undocumented method 2 110:41
Java Inspector 005 Classes, interfaces, methods, and variables should be named according to Sun's naming conventions. 3 47:9
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 85:132
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 111:62
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 112:101
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 119:71
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 123:121
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 138:118
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 141:110
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 144:107
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 164:110
Java Inspector 025 Avoid hardwired numeric literals. Allowed literals: [1, -1, 0] 3 167:107
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 68:88
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 68:118
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 77:100
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 85:135
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 85:177
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 87:99
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 100:121
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 100:156
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 103:91
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 113:87
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 113:99
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 113:107
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 117:63
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 121:63
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 122:63
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 129:100
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 140:95
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 141:95
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 147:99
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 163:95
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 164:95
Java Inspector 026 Avoid hardwired string literals. Allowed literals: [] 3 171:91

Source code

1/*
2 * hgcommons 9
3 * Hammurapi Group Common Library
4 * Copyright (C) 2003 Hammurapi Group
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 * URL: http://www.hammurapi.biz/hammurapi-biz/ef/xmenu/hammurapi-group/products/products/hgcommons/index.html
21 * e-Mail: support@hammurapi.biz
22 */
23package biz.hammurapi.swing;
24
25import java.lang.reflect.Field;
26import java.lang.reflect.Method;
27import java.lang.reflect.Modifier;
28import java.util.ArrayList;
29import java.util.List;
30import java.util.logging.Level;
31import java.util.logging.Logger;
32
33import javax.swing.table.DefaultTableModel;
34import javax.swing.table.TableModel;
35import javax.swing.tree.TreeNode;
36
37import biz.hammurapi.convert.Converter;
38import biz.hammurapi.convert.ConvertingService;
39
40/**
41 * @author Pavel Vlasov
42 *
43 * @version $Revision: 1.1 $
44 */
45public class BeanVisualizer {
46
47 private static final Logger logger = Logger.getLogger(BeanVisualizer.class.getName());
48
49 private static boolean isPrimitive(Class klass) {
50 return String.class.equals(klass)
51 || Number.class.isAssignableFrom(klass)
52 || Character.class.equals(klass)
53 || Boolean.class.equals(klass)
54 || double.class.equals(klass)
55 || float.class.equals(klass)
56 || long.class.equals(klass)
57 || int.class.equals(klass)
58 || short.class.equals(klass)
59 || byte.class.equals(klass)
60 || char.class.equals(klass)
61 || boolean.class.equals(klass);
62 }
63
64 public Visualizable convert(final Object obj, Converter master) {
65 return new Visualizable() {
66
67 public TreeNode toTreeNode(TreeNode parent, String title) {
68 return new LazyTreeNodeTableVisualizable(parent, title+" ["+obj.getClass().getName()+"] "+obj) {
69
70 protected List loadChildren() {
71 List ret = new ArrayList();
72 Class beanClass=obj.getClass();
73 Method[] methods = beanClass.getMethods();
74 for (int i=0; i<methods.length; i++) {
75 // getXXX() methods. Object.getClass() is not included.
76 if (!(methods[i].getDeclaringClass().equals(Object.class))
77 && methods[i].getName().startsWith("get")
78 && methods[i].getParameterTypes().length==0
79 && !Modifier.isStatic(methods[i].getModifiers())
80 && methods[i].isSynthetic()
81 && !isPrimitive(methods[i].getReturnType())) {
82 try {
83 Object value=methods[i].invoke(obj, null);
84 Visualizable vs = (Visualizable) ConvertingService.convert(value, Visualizable.class);
85 ret.add(vs.toTreeNode(this, methods[i].getName().substring(3)+" ("+methods[i].getReturnType().getName()+")"));
86 } catch (Exception e) {
87 logger.log(Level.WARNING, "Could not retrieve value from "+methods[i], e);
88 }
89 }
90 }
91
92 Field[] fields = beanClass.getFields();
93 for (int i=0; i<fields.length; i++) {
94 try {
95 if (!isPrimitive(fields[i].getType())
96 && !Modifier.isStatic(methods[i].getModifiers())
97 && !fields[i].isSynthetic()) {
98 Object value=fields[i].get(obj);
99 Visualizable vs = (Visualizable) ConvertingService.convert(value, Visualizable.class);
100 ret.add(vs.toTreeNode(this, fields[i].getName()+" ("+fields[i].getType().getName()+")"));
101 }
102 } catch (Exception e) {
103 logger.log(Level.WARNING, "Could not retrieve value from "+methods[i], e);
104 }
105 }
106
107 return ret;
108 }
109
110 public TableModel toTable() {
111 int rowCount=2;
112 DefaultTableModel tm=new DefaultTableModel(rowCount,4);
113 tm.setColumnIdentifiers(new String[] {"Property", "Type", "Value"});
114
115 Class beanClass=obj.getClass();
116
117 tm.setValueAt("this", 0, 0);
118 tm.setValueAt(beanClass.getName(), 0, 1);
119 tm.setValueAt(obj, 0, 2);
120
121 tm.setValueAt("Hash code", 1, 0);
122 tm.setValueAt("int", 1, 1);
123 tm.setValueAt(Integer.toString(obj.hashCode(), Character.MAX_RADIX), 1, 2);
124
125 Method[] methods = beanClass.getMethods();
126 for (int i=0; i<methods.length; i++) {
127 // getXXX() methods. Object.getClass() is not included.
128 if (!(methods[i].getDeclaringClass().equals(Object.class))
129 && methods[i].getName().startsWith("get")
130 && methods[i].getParameterTypes().length==0
131 && !Modifier.isStatic(methods[i].getModifiers())
132 && methods[i].isSynthetic()
133 && isPrimitive(methods[i].getReturnType())) {
134 try {
135 Object value=methods[i].invoke(obj, null);
136 tm.setRowCount(++rowCount);
137 int idx = rowCount-1;
138 tm.setValueAt(methods[i].getName().substring(3), idx, 0);
139 if (value==null) {
140 tm.setValueAt("(null)", idx, 1);
141 tm.setValueAt("(null)", idx, 2);
142 } else {
143 tm.setValueAt(value.getClass().getName(), idx, 1);
144 tm.setValueAt(value, idx, 2);
145 }
146 } catch (Exception e) {
147 logger.log(Level.WARNING, "Could not retrieve value from "+methods[i], e);
148 }
149 }
150 }
151
152 Field[] fields = beanClass.getFields();
153 for (int i=0; i<fields.length; i++) {
154 try {
155 if (isPrimitive(fields[i].getType())
156 && !Modifier.isStatic(methods[i].getModifiers())
157 && !fields[i].isSynthetic()) {
158 Object value=fields[i].get(obj);
159 tm.setRowCount(++rowCount);
160 int idx = rowCount-1;
161 tm.setValueAt(fields[i].getName(), idx, 0);
162 if (value==null) {
163 tm.setValueAt("(null)", idx, 1);
164 tm.setValueAt("(null)", idx, 2);
165 } else {
166 tm.setValueAt(value.getClass().getName(), idx, 1);
167 tm.setValueAt(value, idx, 2);
168 }
169 }
170 } catch (Exception e) {
171 logger.log(Level.WARNING, "Could not retrieve value from "+methods[i], e);
172 }
173 }
174
175 return tm;
176 }
177
178 };
179 }
180
181 };
182 }
183
184}
185