1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.ibatis.common.beans;
17
18 import java.util.List;
19 import java.util.Map;
20 import java.util.StringTokenizer;
21
22
23
24
25
26
27
28
29
30
31
32 public class GenericProbe extends BaseProbe {
33
34
35 private static final BaseProbe BEAN_PROBE = new ComplexBeanProbe();
36
37
38 private static final BaseProbe DOM_PROBE = new DomProbe();
39
40
41
42
43 protected GenericProbe() {
44 }
45
46
47
48
49
50
51
52
53
54
55
56
57
58 @Override
59 public Object getObject(Object object, String name) {
60
61 if (object instanceof org.w3c.dom.Document) {
62 return DOM_PROBE.getObject(object, name);
63 }
64 if (object instanceof List || object instanceof Object[] || object instanceof char[] || object instanceof boolean[]
65 || object instanceof byte[] || object instanceof double[] || object instanceof float[]
66 || object instanceof int[] || object instanceof long[] || object instanceof short[]) {
67 return BEAN_PROBE.getIndexedProperty(object, name);
68 }
69 return BEAN_PROBE.getObject(object, name);
70 }
71
72
73
74
75
76
77
78
79
80
81
82
83
84 @Override
85 public void setObject(Object object, String name, Object value) {
86 if (object instanceof org.w3c.dom.Document) {
87 DOM_PROBE.setObject(object, name, value);
88 } else {
89 BEAN_PROBE.setObject(object, name, value);
90 }
91 }
92
93
94
95
96
97
98
99
100
101
102
103 @Override
104 public String[] getReadablePropertyNames(Object object) {
105 if (object instanceof org.w3c.dom.Document) {
106 return DOM_PROBE.getReadablePropertyNames(object);
107 }
108 return BEAN_PROBE.getReadablePropertyNames(object);
109 }
110
111
112
113
114
115
116
117
118
119
120
121 @Override
122 public String[] getWriteablePropertyNames(Object object) {
123 if (object instanceof org.w3c.dom.Document) {
124 return DOM_PROBE.getWriteablePropertyNames(object);
125 }
126 return BEAN_PROBE.getWriteablePropertyNames(object);
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140
141 @Override
142 public Class getPropertyTypeForSetter(Object object, String name) {
143 if (object instanceof Class) {
144 return getClassPropertyTypeForSetter((Class) object, name);
145 }
146 if (object instanceof org.w3c.dom.Document) {
147 return DOM_PROBE.getPropertyTypeForSetter(object, name);
148 }
149 return BEAN_PROBE.getPropertyTypeForSetter(object, name);
150 }
151
152
153
154
155
156
157
158
159
160
161
162
163
164 @Override
165 public Class getPropertyTypeForGetter(Object object, String name) {
166 if (object instanceof Class) {
167 return getClassPropertyTypeForGetter((Class) object, name);
168 }
169 if (object instanceof org.w3c.dom.Document) {
170 return DOM_PROBE.getPropertyTypeForGetter(object, name);
171 }
172 if (name.indexOf('[') > -1) {
173 return BEAN_PROBE.getIndexedType(object, name);
174 }
175 return BEAN_PROBE.getPropertyTypeForGetter(object, name);
176 }
177
178
179
180
181
182
183
184
185
186
187
188
189
190 @Override
191 public boolean hasWritableProperty(Object object, String propertyName) {
192 if (object instanceof org.w3c.dom.Document) {
193 return DOM_PROBE.hasWritableProperty(object, propertyName);
194 }
195 return BEAN_PROBE.hasWritableProperty(object, propertyName);
196 }
197
198
199
200
201
202
203
204
205
206
207
208
209
210 @Override
211 public boolean hasReadableProperty(Object object, String propertyName) {
212 if (object instanceof org.w3c.dom.Document) {
213 return DOM_PROBE.hasReadableProperty(object, propertyName);
214 }
215 return BEAN_PROBE.hasReadableProperty(object, propertyName);
216 }
217
218 @Override
219 protected void setProperty(Object object, String property, Object value) {
220 if (object instanceof org.w3c.dom.Document) {
221 DOM_PROBE.setProperty(object, property, value);
222 } else {
223 BEAN_PROBE.setProperty(object, property, value);
224 }
225 }
226
227 @Override
228 protected Object getProperty(Object object, String property) {
229 if (object instanceof org.w3c.dom.Document) {
230 return DOM_PROBE.getProperty(object, property);
231 }
232 return BEAN_PROBE.getProperty(object, property);
233 }
234
235
236
237
238
239
240
241
242
243
244
245 private Class getClassPropertyTypeForGetter(Class type, String name) {
246
247 if (name.indexOf('.') > -1) {
248 StringTokenizer parser = new StringTokenizer(name, ".");
249 while (parser.hasMoreTokens()) {
250 name = parser.nextToken();
251 if (Map.class.isAssignableFrom(type)) {
252 type = Object.class;
253 break;
254 }
255 type = ClassInfo.getInstance(type).getGetterType(name);
256 }
257 } else {
258 type = ClassInfo.getInstance(type).getGetterType(name);
259 }
260
261 return type;
262 }
263
264
265
266
267
268
269
270
271
272
273
274 private Class getClassPropertyTypeForSetter(Class type, String name) {
275
276 if (name.indexOf('.') > -1) {
277 StringTokenizer parser = new StringTokenizer(name, ".");
278 while (parser.hasMoreTokens()) {
279 name = parser.nextToken();
280 if (Map.class.isAssignableFrom(type)) {
281 type = Object.class;
282 break;
283 }
284 type = ClassInfo.getInstance(type).getSetterType(name);
285 }
286 } else {
287 type = ClassInfo.getInstance(type).getSetterType(name);
288 }
289
290 return type;
291 }
292
293 }