1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.uruma.viewer;
17
18 import java.lang.reflect.Method;
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import org.eclipse.swt.graphics.Image;
23 import org.seasar.framework.beans.BeanDesc;
24 import org.seasar.framework.beans.factory.BeanDescFactory;
25 import org.seasar.framework.util.MethodUtil;
26 import org.seasar.framework.util.StringUtil;
27 import org.seasar.uruma.core.UrumaConstants;
28 import org.seasar.uruma.util.AssertionUtil;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class PojoTableLabelProvider extends GenericTableLabelProvider implements
53 PojoLabelProvider {
54 protected Object pojo;
55
56 protected static final String GET_PREFIX = "get";
57
58 protected static final String TEXT_SUFFIX = "Text";
59
60 protected static final String IMAGE_SUFFIX = "Image";
61
62 protected Map<Integer, Method> textMethodCache = new HashMap<Integer, Method>();
63
64 protected Map<Integer, Method> imageMethodCache = new HashMap<Integer, Method>();
65
66 protected Map<Integer, String> columnNoToNameMap = new HashMap<Integer, String>();
67
68
69
70
71
72 @Override
73 public String getColumnText(final Object element, final int columnIndex) {
74 Method method = getMethod(columnIndex, TEXT_SUFFIX, String.class,
75 textMethodCache);
76 if (method != null) {
77 Class<?> paramType = method.getParameterTypes()[0];
78 if (paramType.isAssignableFrom(element.getClass())) {
79 String text = (String) MethodUtil.invoke(method, pojo,
80 new Object[] { paramType.cast(element) });
81 if (text == null) {
82 text = UrumaConstants.NULL_STRING;
83 }
84
85 return text;
86 }
87 }
88 return super.getColumnText(element, columnIndex);
89 }
90
91
92
93
94
95 @Override
96 public Image getColumnImage(final Object element, final int columnIndex) {
97 Method method = getMethod(columnIndex, IMAGE_SUFFIX, Image.class,
98 imageMethodCache);
99 if (method != null) {
100 Class<?> paramType = method.getParameterTypes()[0];
101 if (paramType.isAssignableFrom(element.getClass())) {
102 Image image = (Image) MethodUtil.invoke(method, pojo,
103 new Object[] { paramType.cast(element) });
104 return image;
105 }
106 }
107 return super.getColumnImage(element, columnIndex);
108 }
109
110 protected Method getMethod(final int columnIndex, final String suffix,
111 final Class<?> retClass, final Map<Integer, Method> cache) {
112 Method getMethod = cache.get(columnIndex);
113 if (getMethod == null) {
114 String columnName = columnNoToNameMap.get(columnIndex);
115 String methodName = GET_PREFIX + StringUtil.capitalize(columnName)
116 + suffix;
117 BeanDesc desc = BeanDescFactory.getBeanDesc(pojo.getClass());
118 if (desc.hasMethod(methodName)) {
119 Method[] methods = desc.getMethods(methodName);
120 for (int i = 0; i < methods.length; i++) {
121 Method method = methods[i];
122 if ((method.getParameterTypes().length == 1)
123 && (method.getReturnType() == retClass)) {
124 getMethod = method;
125 cache.put(columnIndex, getMethod);
126 }
127 }
128 }
129 }
130 return getMethod;
131 }
132
133
134
135
136 public void setPojo(final Object pojo) {
137 AssertionUtil.assertNotNull("pojo", pojo);
138 this.pojo = pojo;
139 }
140
141
142
143
144
145 @Override
146 public void addColumnMap(final int columnNo, final String columnName) {
147 super.addColumnMap(columnNo, columnName);
148 columnNoToNameMap.put(columnNo, columnName);
149 }
150
151 }