Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
BeanUtils |
|
| 1.15;1.15 |
1 | /* | |
2 | * Licensed to the Apache Software Foundation (ASF) under one or more | |
3 | * contributor license agreements. See the NOTICE file distributed with | |
4 | * this work for additional information regarding copyright ownership. | |
5 | * The ASF licenses this file to You under the Apache License, Version 2.0 | |
6 | * (the "License"); you may not use this file except in compliance with | |
7 | * the License. You may obtain a copy of the License at | |
8 | * | |
9 | * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | * | |
11 | * Unless required by applicable law or agreed to in writing, software | |
12 | * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | * See the License for the specific language governing permissions and | |
15 | * limitations under the License. | |
16 | */ | |
17 | ||
18 | ||
19 | package org.apache.commons.beanutils; | |
20 | ||
21 | import java.lang.reflect.InvocationTargetException; | |
22 | import java.util.Map; | |
23 | ||
24 | ||
25 | ||
26 | /** | |
27 | * <p>Utility methods for populating JavaBeans properties via reflection.</p> | |
28 | * | |
29 | * <p>The implementations are provided by {@link BeanUtilsBean}. | |
30 | * These static utility methods use the default instance. | |
31 | * More sophisticated behaviour can be provided by using a <code>BeanUtilsBean</code> instance.</p> | |
32 | * | |
33 | * @author Craig R. McClanahan | |
34 | * @author Ralph Schaer | |
35 | * @author Chris Audley | |
36 | * @author Rey Francois | |
37 | * @author Gregor Rayman | |
38 | * @version $Revision: 690380 $ $Date: 2008-08-29 16:04:38 -0400 (Fri, 29 Aug 2008) $ | |
39 | * @see BeanUtilsBean | |
40 | */ | |
41 | ||
42 | 0 | public class BeanUtils { |
43 | ||
44 | ||
45 | // ------------------------------------------------------ Private Variables | |
46 | ||
47 | ||
48 | /** | |
49 | * The debugging detail level for this component. | |
50 | * | |
51 | * Note that this static variable will have unexpected side-effects if | |
52 | * this class is deployed in a shared classloader within a container. | |
53 | * However as it is actually completely ignored by this class due to its | |
54 | * deprecated status, it doesn't do any actual harm. | |
55 | * | |
56 | * @deprecated BeanUtils now uses commons-logging for all log messages. | |
57 | * Use your favorite logging tool to configure logging for | |
58 | * this class. | |
59 | */ | |
60 | 1 | private static int debug = 0; |
61 | ||
62 | /** | |
63 | * The <code>debug</code> static property is no longer used | |
64 | * @return debug property | |
65 | * @deprecated BeanUtils now uses commons-logging for all log messages. | |
66 | * Use your favorite logging tool to configure logging for | |
67 | * this class. | |
68 | */ | |
69 | public static int getDebug() { | |
70 | 0 | return (debug); |
71 | } | |
72 | ||
73 | /** | |
74 | * The <code>debug</code> static property is no longer used | |
75 | * @param newDebug debug property | |
76 | * @deprecated BeanUtils now uses commons-logging for all log messages. | |
77 | * Use your favorite logging tool to configure logging for | |
78 | * this class. | |
79 | */ | |
80 | public static void setDebug(int newDebug) { | |
81 | 0 | debug = newDebug; |
82 | 0 | } |
83 | ||
84 | // --------------------------------------------------------- Class Methods | |
85 | ||
86 | ||
87 | /** | |
88 | * <p>Clone a bean based on the available property getters and setters, | |
89 | * even if the bean class itself does not implement Cloneable.</p> | |
90 | * | |
91 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
92 | * | |
93 | * @param bean Bean to be cloned | |
94 | * @return the cloned bean | |
95 | * | |
96 | * @exception IllegalAccessException if the caller does not have | |
97 | * access to the property accessor method | |
98 | * @exception InstantiationException if a new instance of the bean's | |
99 | * class cannot be instantiated | |
100 | * @exception InvocationTargetException if the property accessor method | |
101 | * throws an exception | |
102 | * @exception NoSuchMethodException if an accessor method for this | |
103 | * property cannot be found | |
104 | * @see BeanUtilsBean#cloneBean | |
105 | */ | |
106 | public static Object cloneBean(Object bean) | |
107 | throws IllegalAccessException, InstantiationException, | |
108 | InvocationTargetException, NoSuchMethodException { | |
109 | ||
110 | 1 | return BeanUtilsBean.getInstance().cloneBean(bean); |
111 | ||
112 | } | |
113 | ||
114 | ||
115 | /** | |
116 | * <p>Copy property values from the origin bean to the destination bean | |
117 | * for all cases where the property names are the same.</p> | |
118 | * | |
119 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
120 | * | |
121 | * @param dest Destination bean whose properties are modified | |
122 | * @param orig Origin bean whose properties are retrieved | |
123 | * | |
124 | * @exception IllegalAccessException if the caller does not have | |
125 | * access to the property accessor method | |
126 | * @exception IllegalArgumentException if the <code>dest</code> or | |
127 | * <code>orig</code> argument is null or if the <code>dest</code> | |
128 | * property type is different from the source type and the relevant | |
129 | * converter has not been registered. | |
130 | * @exception InvocationTargetException if the property accessor method | |
131 | * throws an exception | |
132 | * @see BeanUtilsBean#copyProperties | |
133 | */ | |
134 | public static void copyProperties(Object dest, Object orig) | |
135 | throws IllegalAccessException, InvocationTargetException { | |
136 | ||
137 | 11 | BeanUtilsBean.getInstance().copyProperties(dest, orig); |
138 | 11 | } |
139 | ||
140 | ||
141 | /** | |
142 | * <p>Copy the specified property value to the specified destination bean, | |
143 | * performing any type conversion that is required.</p> | |
144 | * | |
145 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
146 | * | |
147 | * @param bean Bean on which setting is to be performed | |
148 | * @param name Property name (can be nested/indexed/mapped/combo) | |
149 | * @param value Value to be set | |
150 | * | |
151 | * @exception IllegalAccessException if the caller does not have | |
152 | * access to the property accessor method | |
153 | * @exception InvocationTargetException if the property accessor method | |
154 | * throws an exception | |
155 | * @see BeanUtilsBean#copyProperty | |
156 | */ | |
157 | public static void copyProperty(Object bean, String name, Object value) | |
158 | throws IllegalAccessException, InvocationTargetException { | |
159 | ||
160 | 116 | BeanUtilsBean.getInstance().copyProperty(bean, name, value); |
161 | 116 | } |
162 | ||
163 | ||
164 | /** | |
165 | * <p>Return the entire set of properties for which the specified bean | |
166 | * provides a read method.</p> | |
167 | * | |
168 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
169 | * | |
170 | * @param bean Bean whose properties are to be extracted | |
171 | * @return Map of property descriptors | |
172 | * | |
173 | * @exception IllegalAccessException if the caller does not have | |
174 | * access to the property accessor method | |
175 | * @exception InvocationTargetException if the property accessor method | |
176 | * throws an exception | |
177 | * @exception NoSuchMethodException if an accessor method for this | |
178 | * property cannot be found | |
179 | * @see BeanUtilsBean#describe | |
180 | */ | |
181 | public static Map describe(Object bean) | |
182 | throws IllegalAccessException, InvocationTargetException, | |
183 | NoSuchMethodException { | |
184 | ||
185 | 5 | return BeanUtilsBean.getInstance().describe(bean); |
186 | } | |
187 | ||
188 | ||
189 | /** | |
190 | * <p>Return the value of the specified array property of the specified | |
191 | * bean, as a String array.</p> | |
192 | * | |
193 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
194 | * | |
195 | * @param bean Bean whose property is to be extracted | |
196 | * @param name Name of the property to be extracted | |
197 | * @return The array property value | |
198 | * | |
199 | * @exception IllegalAccessException if the caller does not have | |
200 | * access to the property accessor method | |
201 | * @exception InvocationTargetException if the property accessor method | |
202 | * throws an exception | |
203 | * @exception NoSuchMethodException if an accessor method for this | |
204 | * property cannot be found | |
205 | * @see BeanUtilsBean#getArrayProperty | |
206 | */ | |
207 | public static String[] getArrayProperty(Object bean, String name) | |
208 | throws IllegalAccessException, InvocationTargetException, | |
209 | NoSuchMethodException { | |
210 | ||
211 | 12 | return BeanUtilsBean.getInstance().getArrayProperty(bean, name); |
212 | } | |
213 | ||
214 | ||
215 | /** | |
216 | * <p>Return the value of the specified indexed property of the specified | |
217 | * bean, as a String.</p> | |
218 | * | |
219 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
220 | * | |
221 | * @param bean Bean whose property is to be extracted | |
222 | * @param name <code>propertyname[index]</code> of the property value | |
223 | * to be extracted | |
224 | * @return The indexed property's value, converted to a String | |
225 | * | |
226 | * @exception IllegalAccessException if the caller does not have | |
227 | * access to the property accessor method | |
228 | * @exception InvocationTargetException if the property accessor method | |
229 | * throws an exception | |
230 | * @exception NoSuchMethodException if an accessor method for this | |
231 | * property cannot be found | |
232 | * @see BeanUtilsBean#getIndexedProperty(Object, String) | |
233 | */ | |
234 | public static String getIndexedProperty(Object bean, String name) | |
235 | throws IllegalAccessException, InvocationTargetException, | |
236 | NoSuchMethodException { | |
237 | ||
238 | 8 | return BeanUtilsBean.getInstance().getIndexedProperty(bean, name); |
239 | ||
240 | } | |
241 | ||
242 | ||
243 | /** | |
244 | * Return the value of the specified indexed property of the specified | |
245 | * bean, as a String. The index is specified as a method parameter and | |
246 | * must *not* be included in the property name expression | |
247 | * | |
248 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
249 | * | |
250 | * @param bean Bean whose property is to be extracted | |
251 | * @param name Simple property name of the property value to be extracted | |
252 | * @param index Index of the property value to be extracted | |
253 | * @return The indexed property's value, converted to a String | |
254 | * | |
255 | * @exception IllegalAccessException if the caller does not have | |
256 | * access to the property accessor method | |
257 | * @exception InvocationTargetException if the property accessor method | |
258 | * throws an exception | |
259 | * @exception NoSuchMethodException if an accessor method for this | |
260 | * property cannot be found | |
261 | * @see BeanUtilsBean#getIndexedProperty(Object, String, int) | |
262 | */ | |
263 | public static String getIndexedProperty(Object bean, | |
264 | String name, int index) | |
265 | throws IllegalAccessException, InvocationTargetException, | |
266 | NoSuchMethodException { | |
267 | ||
268 | 6 | return BeanUtilsBean.getInstance().getIndexedProperty(bean, name, index); |
269 | ||
270 | } | |
271 | ||
272 | ||
273 | /** | |
274 | * </p>Return the value of the specified indexed property of the specified | |
275 | * bean, as a String.</p> | |
276 | * | |
277 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
278 | * | |
279 | * @param bean Bean whose property is to be extracted | |
280 | * @param name <code>propertyname(index)</code> of the property value | |
281 | * to be extracted | |
282 | * @return The mapped property's value, converted to a String | |
283 | * | |
284 | * @exception IllegalAccessException if the caller does not have | |
285 | * access to the property accessor method | |
286 | * @exception InvocationTargetException if the property accessor method | |
287 | * throws an exception | |
288 | * @exception NoSuchMethodException if an accessor method for this | |
289 | * property cannot be found | |
290 | * @see BeanUtilsBean#getMappedProperty(Object, String) | |
291 | */ | |
292 | public static String getMappedProperty(Object bean, String name) | |
293 | throws IllegalAccessException, InvocationTargetException, | |
294 | NoSuchMethodException { | |
295 | ||
296 | 0 | return BeanUtilsBean.getInstance().getMappedProperty(bean, name); |
297 | ||
298 | } | |
299 | ||
300 | ||
301 | /** | |
302 | * </p>Return the value of the specified mapped property of the specified | |
303 | * bean, as a String.</p> | |
304 | * | |
305 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
306 | * | |
307 | * @param bean Bean whose property is to be extracted | |
308 | * @param name Simple property name of the property value to be extracted | |
309 | * @param key Lookup key of the property value to be extracted | |
310 | * @return The mapped property's value, converted to a String | |
311 | * | |
312 | * @exception IllegalAccessException if the caller does not have | |
313 | * access to the property accessor method | |
314 | * @exception InvocationTargetException if the property accessor method | |
315 | * throws an exception | |
316 | * @exception NoSuchMethodException if an accessor method for this | |
317 | * property cannot be found | |
318 | * @see BeanUtilsBean#getMappedProperty(Object, String, String) | |
319 | */ | |
320 | public static String getMappedProperty(Object bean, | |
321 | String name, String key) | |
322 | throws IllegalAccessException, InvocationTargetException, | |
323 | NoSuchMethodException { | |
324 | ||
325 | 0 | return BeanUtilsBean.getInstance().getMappedProperty(bean, name, key); |
326 | ||
327 | } | |
328 | ||
329 | ||
330 | /** | |
331 | * <p>Return the value of the (possibly nested) property of the specified | |
332 | * name, for the specified bean, as a String.</p> | |
333 | * | |
334 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
335 | * | |
336 | * @param bean Bean whose property is to be extracted | |
337 | * @param name Possibly nested name of the property to be extracted | |
338 | * @return The nested property's value, converted to a String | |
339 | * | |
340 | * @exception IllegalAccessException if the caller does not have | |
341 | * access to the property accessor method | |
342 | * @exception IllegalArgumentException if a nested reference to a | |
343 | * property returns null | |
344 | * @exception InvocationTargetException if the property accessor method | |
345 | * throws an exception | |
346 | * @exception NoSuchMethodException if an accessor method for this | |
347 | * property cannot be found | |
348 | * @see BeanUtilsBean#getNestedProperty | |
349 | */ | |
350 | public static String getNestedProperty(Object bean, String name) | |
351 | throws IllegalAccessException, InvocationTargetException, | |
352 | NoSuchMethodException { | |
353 | ||
354 | 3 | return BeanUtilsBean.getInstance().getNestedProperty(bean, name); |
355 | ||
356 | } | |
357 | ||
358 | ||
359 | /** | |
360 | * <p>Return the value of the specified property of the specified bean, | |
361 | * no matter which property reference format is used, as a String.</p> | |
362 | * | |
363 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
364 | * | |
365 | * @param bean Bean whose property is to be extracted | |
366 | * @param name Possibly indexed and/or nested name of the property | |
367 | * to be extracted | |
368 | * @return The property's value, converted to a String | |
369 | * | |
370 | * @exception IllegalAccessException if the caller does not have | |
371 | * access to the property accessor method | |
372 | * @exception InvocationTargetException if the property accessor method | |
373 | * throws an exception | |
374 | * @exception NoSuchMethodException if an accessor method for this | |
375 | * property cannot be found | |
376 | * @see BeanUtilsBean#getProperty | |
377 | */ | |
378 | public static String getProperty(Object bean, String name) | |
379 | throws IllegalAccessException, InvocationTargetException, | |
380 | NoSuchMethodException { | |
381 | ||
382 | 9 | return BeanUtilsBean.getInstance().getProperty(bean, name); |
383 | ||
384 | } | |
385 | ||
386 | ||
387 | /** | |
388 | * <p>Return the value of the specified simple property of the specified | |
389 | * bean, converted to a String.</p> | |
390 | * | |
391 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
392 | * | |
393 | * @param bean Bean whose property is to be extracted | |
394 | * @param name Name of the property to be extracted | |
395 | * @return The property's value, converted to a String | |
396 | * | |
397 | * @exception IllegalAccessException if the caller does not have | |
398 | * access to the property accessor method | |
399 | * @exception InvocationTargetException if the property accessor method | |
400 | * throws an exception | |
401 | * @exception NoSuchMethodException if an accessor method for this | |
402 | * property cannot be found | |
403 | * @see BeanUtilsBean#getSimpleProperty | |
404 | */ | |
405 | public static String getSimpleProperty(Object bean, String name) | |
406 | throws IllegalAccessException, InvocationTargetException, | |
407 | NoSuchMethodException { | |
408 | ||
409 | 5 | return BeanUtilsBean.getInstance().getSimpleProperty(bean, name); |
410 | ||
411 | } | |
412 | ||
413 | ||
414 | /** | |
415 | * <p>Populate the JavaBeans properties of the specified bean, based on | |
416 | * the specified name/value pairs.</p> | |
417 | * | |
418 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
419 | * | |
420 | * @param bean JavaBean whose properties are being populated | |
421 | * @param properties Map keyed by property name, with the | |
422 | * corresponding (String or String[]) value(s) to be set | |
423 | * | |
424 | * @exception IllegalAccessException if the caller does not have | |
425 | * access to the property accessor method | |
426 | * @exception InvocationTargetException if the property accessor method | |
427 | * throws an exception | |
428 | * @see BeanUtilsBean#populate | |
429 | */ | |
430 | public static void populate(Object bean, Map properties) | |
431 | throws IllegalAccessException, InvocationTargetException { | |
432 | ||
433 | 19 | BeanUtilsBean.getInstance().populate(bean, properties); |
434 | 19 | } |
435 | ||
436 | ||
437 | /** | |
438 | * <p>Set the specified property value, performing type conversions as | |
439 | * required to conform to the type of the destination property.</p> | |
440 | * | |
441 | * <p>For more details see <code>BeanUtilsBean</code>.</p> | |
442 | * | |
443 | * @param bean Bean on which setting is to be performed | |
444 | * @param name Property name (can be nested/indexed/mapped/combo) | |
445 | * @param value Value to be set | |
446 | * | |
447 | * @exception IllegalAccessException if the caller does not have | |
448 | * access to the property accessor method | |
449 | * @exception InvocationTargetException if the property accessor method | |
450 | * throws an exception | |
451 | * @see BeanUtilsBean#setProperty | |
452 | */ | |
453 | public static void setProperty(Object bean, String name, Object value) | |
454 | throws IllegalAccessException, InvocationTargetException { | |
455 | ||
456 | 136 | BeanUtilsBean.getInstance().setProperty(bean, name, value); |
457 | 135 | } |
458 | ||
459 | /** | |
460 | * If we're running on JDK 1.4 or later, initialize the cause for the given throwable. | |
461 | * | |
462 | * @param throwable The throwable. | |
463 | * @param cause The cause of the throwable. | |
464 | * @return true if the cause was initialized, otherwise false. | |
465 | * @since 1.8.0 | |
466 | */ | |
467 | public static boolean initCause(Throwable throwable, Throwable cause) { | |
468 | 72 | return BeanUtilsBean.getInstance().initCause(throwable, cause); |
469 | } | |
470 | ||
471 | /** | |
472 | * Create a cache. | |
473 | * @return a new cache | |
474 | * @since 1.8.0 | |
475 | */ | |
476 | public static Map createCache() { | |
477 | 46 | return new WeakFastHashMap(); |
478 | } | |
479 | ||
480 | /** | |
481 | * Return whether a Map is fast | |
482 | * @param map The map | |
483 | * @return Whether it is fast or not. | |
484 | * @since 1.8.0 | |
485 | */ | |
486 | public static boolean getCacheFast(Map map) { | |
487 | 0 | if (map instanceof WeakFastHashMap) { |
488 | 0 | return ((WeakFastHashMap)map).getFast(); |
489 | } else { | |
490 | 0 | return false; |
491 | } | |
492 | } | |
493 | ||
494 | /** | |
495 | * Set whether fast on a Map | |
496 | * @param map The map | |
497 | * @param fast Whether it should be fast or not. | |
498 | * @since 1.8.0 | |
499 | */ | |
500 | public static void setCacheFast(Map map, boolean fast) { | |
501 | 166 | if (map instanceof WeakFastHashMap) { |
502 | 166 | ((WeakFastHashMap)map).setFast(fast); |
503 | } | |
504 | 166 | } |
505 | } |