001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    
019    package org.apache.commons.beanutils;
020    
021    import java.beans.PropertyDescriptor;
022    import java.lang.reflect.InvocationTargetException;
023    import java.lang.reflect.Method;
024    import java.util.Map;
025    
026    import org.apache.commons.collections.FastHashMap;
027    
028    
029    /**
030     * <p>Utility methods for using Java Reflection APIs to facilitate generic
031     * property getter and setter operations on Java objects.</p>
032     *
033     * <p>The implementations for these methods are provided by <code>PropertyUtilsBean</code>.
034     * For more details see {@link PropertyUtilsBean}.</p>
035     *
036     * @author Craig R. McClanahan
037     * @author Ralph Schaer
038     * @author Chris Audley
039     * @author Rey Francois
040     * @author Gregor Rayman
041     * @author Jan Sorensen
042     * @author Scott Sanders
043     * @version $Revision: 644137 $ $Date: 2008-04-03 03:30:23 +0100 (Thu, 03 Apr 2008) $
044     * @see PropertyUtilsBean
045     * @see org.apache.commons.beanutils.expression.Resolver
046     */
047    
048    public class PropertyUtils {
049    
050    
051        // ----------------------------------------------------- Manifest Constants
052    
053    
054        /**
055         * The delimiter that preceeds the zero-relative subscript for an
056         * indexed reference.
057         *
058         * @deprecated The notation used for property name expressions is now
059         * dependant on the {@link org.apache.commons.beanutils.expression.Resolver}
060         * implementation being used.
061         */
062        public static final char INDEXED_DELIM = '[';
063    
064    
065        /**
066         * The delimiter that follows the zero-relative subscript for an
067         * indexed reference.
068         *
069         * @deprecated The notation used for property name expressions is now
070         * dependant on the {@link org.apache.commons.beanutils.expression.Resolver}
071         * implementation being used.
072         */
073        public static final char INDEXED_DELIM2 = ']';
074    
075    
076        /**
077         * The delimiter that preceeds the key of a mapped property.
078         *
079         * @deprecated The notation used for property name expressions is now
080         * dependant on the {@link org.apache.commons.beanutils.expression.Resolver}
081         * implementation being used.
082         */
083        public static final char MAPPED_DELIM = '(';
084    
085    
086        /**
087         * The delimiter that follows the key of a mapped property.
088         *
089         * @deprecated The notation used for property name expressions is now
090         * dependant on the {@link org.apache.commons.beanutils.expression.Resolver}
091         * implementation being used.
092         */
093        public static final char MAPPED_DELIM2 = ')';
094    
095    
096        /**
097         * The delimiter that separates the components of a nested reference.
098         *
099         * @deprecated The notation used for property name expressions is now
100         * dependant on the {@link org.apache.commons.beanutils.expression.Resolver}
101         * implementation being used.
102         */
103        public static final char NESTED_DELIM = '.';
104    
105    
106        // ------------------------------------------------------- Static Variables
107    
108    
109        /**
110         * The debugging detail level for this component.
111         * 
112         * Note that this static variable will have unexpected side-effects if
113         * this class is deployed in a shared classloader within a container.
114         * However as it is actually completely ignored by this class due to its
115         * deprecated status, it doesn't do any actual harm.
116         *
117         * @deprecated The <code>debug</code> static property is no longer used
118         */
119        private static int debug = 0;
120    
121        /**
122         * The <code>debug</code> static property is no longer used
123         * @return debug property
124         * @deprecated The <code>debug</code> static property is no longer used
125         */
126        public static int getDebug() {
127            return (debug);
128        }
129    
130        /**
131         * The <code>debug</code> static property is no longer used
132         * @param newDebug debug property
133         * @deprecated The <code>debug</code> static property is no longer used
134         */
135        public static void setDebug(int newDebug) {
136            debug = newDebug;
137        }
138    
139        // --------------------------------------------------------- Public Methods
140    
141    
142        /**
143         * Clear any cached property descriptors information for all classes
144         * loaded by any class loaders.  This is useful in cases where class
145         * loaders are thrown away to implement class reloading.
146         *
147         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
148         *
149         * @see PropertyUtilsBean#clearDescriptors  
150         */
151        public static void clearDescriptors() {
152    
153            PropertyUtilsBean.getInstance().clearDescriptors();
154    
155        }
156    
157    
158        /**
159         * <p>Copy property values from the "origin" bean to the "destination" bean
160         * for all cases where the property names are the same (even though the
161         * actual getter and setter methods might have been customized via
162         * <code>BeanInfo</code> classes).</p>
163         *
164         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
165         *
166         * @param dest Destination bean whose properties are modified
167         * @param orig Origin bean whose properties are retrieved
168         *
169         * @exception IllegalAccessException if the caller does not have
170         *  access to the property accessor method
171         * @exception IllegalArgumentException if the <code>dest</code> or
172         *  <code>orig</code> argument is null
173         * @exception InvocationTargetException if the property accessor method
174         *  throws an exception
175         * @exception NoSuchMethodException if an accessor method for this
176         *  propety cannot be found
177         * @see PropertyUtilsBean#copyProperties  
178         */
179        public static void copyProperties(Object dest, Object orig)
180                throws IllegalAccessException, InvocationTargetException,
181                NoSuchMethodException {
182    
183            PropertyUtilsBean.getInstance().copyProperties(dest, orig);
184        }
185    
186    
187        /**
188         * <p>Return the entire set of properties for which the specified bean
189         * provides a read method.</p>
190         *
191         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
192         *
193         * @param bean Bean whose properties are to be extracted
194         * @return The set of properties for the bean
195         *
196         * @exception IllegalAccessException if the caller does not have
197         *  access to the property accessor method
198         * @exception IllegalArgumentException if <code>bean</code> is null
199         * @exception InvocationTargetException if the property accessor method
200         *  throws an exception
201         * @exception NoSuchMethodException if an accessor method for this
202         *  propety cannot be found
203         * @see PropertyUtilsBean#describe  
204         */
205        public static Map describe(Object bean)
206                throws IllegalAccessException, InvocationTargetException,
207                NoSuchMethodException {
208    
209            return (PropertyUtilsBean.getInstance().describe(bean));
210    
211        }
212    
213    
214        /**
215         * <p>Return the value of the specified indexed property of the specified
216         * bean, with no type conversions.</p>
217         *
218         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
219         *
220         * @param bean Bean whose property is to be extracted
221         * @param name <code>propertyname[index]</code> of the property value
222         *  to be extracted
223         * @return the indexed property value
224         *
225         * @exception IndexOutOfBoundsException if the specified index
226         *  is outside the valid range for the underlying property
227         * @exception IllegalAccessException if the caller does not have
228         *  access to the property accessor method
229         * @exception IllegalArgumentException if <code>bean</code> or
230         *  <code>name</code> is null
231         * @exception InvocationTargetException if the property accessor method
232         *  throws an exception
233         * @exception NoSuchMethodException if an accessor method for this
234         *  propety cannot be found
235         * @see PropertyUtilsBean#getIndexedProperty(Object,String)  
236         */
237        public static Object getIndexedProperty(Object bean, String name)
238                throws IllegalAccessException, InvocationTargetException,
239                NoSuchMethodException {
240    
241            return (PropertyUtilsBean.getInstance().getIndexedProperty(bean, name));
242    
243        }
244    
245    
246        /**
247         * <p>Return the value of the specified indexed property of the specified
248         * bean, with no type conversions.</p>
249         *
250         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
251         *
252         * @param bean Bean whose property is to be extracted
253         * @param name Simple property name of the property value to be extracted
254         * @param index Index of the property value to be extracted
255         * @return the indexed property value
256         *
257         * @exception IndexOutOfBoundsException if the specified index
258         *  is outside the valid range for the underlying property
259         * @exception IllegalAccessException if the caller does not have
260         *  access to the property accessor method
261         * @exception IllegalArgumentException if <code>bean</code> or
262         *  <code>name</code> is null
263         * @exception InvocationTargetException if the property accessor method
264         *  throws an exception
265         * @exception NoSuchMethodException if an accessor method for this
266         *  propety cannot be found
267         * @see PropertyUtilsBean#getIndexedProperty(Object,String, int)  
268         */
269        public static Object getIndexedProperty(Object bean,
270                                                String name, int index)
271                throws IllegalAccessException, InvocationTargetException,
272                NoSuchMethodException {
273    
274            return (PropertyUtilsBean.getInstance().getIndexedProperty(bean, name, index));
275        }
276    
277    
278        /**
279         * <p>Return the value of the specified mapped property of the
280         * specified bean, with no type conversions.</p>
281         *
282         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
283         *
284         * @param bean Bean whose property is to be extracted
285         * @param name <code>propertyname(key)</code> of the property value
286         *  to be extracted
287         * @return the mapped property value
288         *
289         * @exception IllegalAccessException if the caller does not have
290         *  access to the property accessor method
291         * @exception InvocationTargetException if the property accessor method
292         *  throws an exception
293         * @exception NoSuchMethodException if an accessor method for this
294         *  propety cannot be found
295         * @see PropertyUtilsBean#getMappedProperty(Object,String)  
296         */
297        public static Object getMappedProperty(Object bean, String name)
298                throws IllegalAccessException, InvocationTargetException,
299                NoSuchMethodException {
300    
301            return (PropertyUtilsBean.getInstance().getMappedProperty(bean, name));
302    
303        }
304    
305    
306        /**
307         * <p>Return the value of the specified mapped property of the specified
308         * bean, with no type conversions.</p>
309         *
310         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
311         *
312         * @param bean Bean whose property is to be extracted
313         * @param name Mapped property name of the property value to be extracted
314         * @param key Key of the property value to be extracted
315         * @return the mapped property value
316         *
317         * @exception IllegalAccessException if the caller does not have
318         *  access to the property accessor method
319         * @exception InvocationTargetException if the property accessor method
320         *  throws an exception
321         * @exception NoSuchMethodException if an accessor method for this
322         *  propety cannot be found
323         * @see PropertyUtilsBean#getMappedProperty(Object,String, String)  
324         */
325        public static Object getMappedProperty(Object bean,
326                                               String name, String key)
327                throws IllegalAccessException, InvocationTargetException,
328                NoSuchMethodException {
329    
330            return PropertyUtilsBean.getInstance().getMappedProperty(bean, name, key);
331    
332        }
333    
334    
335        /**
336         * <p>Return the mapped property descriptors for this bean class.</p>
337         *
338         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
339         *
340         * @param beanClass Bean class to be introspected
341         * @return the mapped property descriptors
342         * @see PropertyUtilsBean#getMappedPropertyDescriptors(Class)
343         * @deprecated This method should not be exposed
344         */
345        public static FastHashMap getMappedPropertyDescriptors(Class beanClass) {
346    
347            return PropertyUtilsBean.getInstance().getMappedPropertyDescriptors(beanClass);
348    
349        }
350    
351    
352        /**
353         * <p>Return the mapped property descriptors for this bean.</p>
354         *
355         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
356         *
357         * @param bean Bean to be introspected
358         * @return the mapped property descriptors
359         * @see PropertyUtilsBean#getMappedPropertyDescriptors(Object)
360         * @deprecated This method should not be exposed
361         */
362        public static FastHashMap getMappedPropertyDescriptors(Object bean) {
363    
364            return PropertyUtilsBean.getInstance().getMappedPropertyDescriptors(bean);
365    
366        }
367    
368    
369        /**
370         * <p>Return the value of the (possibly nested) property of the specified
371         * name, for the specified bean, with no type conversions.</p>
372         *
373         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
374         *
375         * @param bean Bean whose property is to be extracted
376         * @param name Possibly nested name of the property to be extracted
377         * @return the nested property value
378         *
379         * @exception IllegalAccessException if the caller does not have
380         *  access to the property accessor method
381         * @exception IllegalArgumentException if <code>bean</code> or
382         *  <code>name</code> is null
383         * @exception NestedNullException if a nested reference to a
384         *  property returns null
385         * @exception InvocationTargetException 
386         * if the property accessor method throws an exception
387         * @exception NoSuchMethodException if an accessor method for this
388         *  propety cannot be found
389         * @see PropertyUtilsBean#getNestedProperty
390         */
391        public static Object getNestedProperty(Object bean, String name)
392                throws IllegalAccessException, InvocationTargetException,
393                NoSuchMethodException {
394    
395            return PropertyUtilsBean.getInstance().getNestedProperty(bean, name);
396            
397        }
398    
399    
400        /**
401         * <p>Return the value of the specified property of the specified bean,
402         * no matter which property reference format is used, with no
403         * type conversions.</p>
404         *
405         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
406         *
407         * @param bean Bean whose property is to be extracted
408         * @param name Possibly indexed and/or nested name of the property
409         *  to be extracted
410         * @return the property value
411         *
412         * @exception IllegalAccessException if the caller does not have
413         *  access to the property accessor method
414         * @exception IllegalArgumentException if <code>bean</code> or
415         *  <code>name</code> is null
416         * @exception InvocationTargetException if the property accessor method
417         *  throws an exception
418         * @exception NoSuchMethodException if an accessor method for this
419         *  propety cannot be found
420         * @see PropertyUtilsBean#getProperty
421         */
422        public static Object getProperty(Object bean, String name)
423                throws IllegalAccessException, InvocationTargetException,
424                NoSuchMethodException {
425    
426            return (PropertyUtilsBean.getInstance().getProperty(bean, name));
427    
428        }
429    
430    
431        /**
432         * <p>Retrieve the property descriptor for the specified property of the
433         * specified bean, or return <code>null</code> if there is no such
434         * descriptor.</p>
435         *
436         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
437         *
438         * @param bean Bean for which a property descriptor is requested
439         * @param name Possibly indexed and/or nested name of the property for
440         *  which a property descriptor is requested
441         * @return the property descriptor
442         *
443         * @exception IllegalAccessException if the caller does not have
444         *  access to the property accessor method
445         * @exception IllegalArgumentException if <code>bean</code> or
446         *  <code>name</code> is null
447         * @exception IllegalArgumentException if a nested reference to a
448         *  property returns null
449         * @exception InvocationTargetException if the property accessor method
450         *  throws an exception
451         * @exception NoSuchMethodException if an accessor method for this
452         *  propety cannot be found
453         * @see PropertyUtilsBean#getPropertyDescriptor
454         */
455        public static PropertyDescriptor getPropertyDescriptor(Object bean,
456                                                               String name)
457                throws IllegalAccessException, InvocationTargetException,
458                NoSuchMethodException {
459    
460            return PropertyUtilsBean.getInstance().getPropertyDescriptor(bean, name);
461    
462        }
463    
464    
465        /**
466         * <p>Retrieve the property descriptors for the specified class,
467         * introspecting and caching them the first time a particular bean class
468         * is encountered.</p>
469         *
470         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
471         *
472         * @param beanClass Bean class for which property descriptors are requested
473         * @return the property descriptors
474         * @exception IllegalArgumentException if <code>beanClass</code> is null
475         * @see PropertyUtilsBean#getPropertyDescriptors(Class)
476         */
477        public static PropertyDescriptor[]
478                getPropertyDescriptors(Class beanClass) {
479    
480            return PropertyUtilsBean.getInstance().getPropertyDescriptors(beanClass);
481    
482        }
483    
484    
485        /**
486         * <p>Retrieve the property descriptors for the specified bean,
487         * introspecting and caching them the first time a particular bean class
488         * is encountered.</p>
489         *
490         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
491         *
492         * @param bean Bean for which property descriptors are requested
493         * @return the property descriptors
494         * @exception IllegalArgumentException if <code>bean</code> is null
495         * @see PropertyUtilsBean#getPropertyDescriptors(Object)
496         */
497        public static PropertyDescriptor[] getPropertyDescriptors(Object bean) {
498    
499            return PropertyUtilsBean.getInstance().getPropertyDescriptors(bean);
500    
501        }
502    
503    
504        /**
505         * <p>Return the Java Class repesenting the property editor class that has
506         * been registered for this property (if any).</p>
507         *
508         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
509         *
510         * @param bean Bean for which a property descriptor is requested
511         * @param name Possibly indexed and/or nested name of the property for
512         *  which a property descriptor is requested
513         * @return the property editor class
514         *
515         * @exception IllegalAccessException if the caller does not have
516         *  access to the property accessor method
517         * @exception IllegalArgumentException if <code>bean</code> or
518         *  <code>name</code> is null
519         * @exception IllegalArgumentException if a nested reference to a
520         *  property returns null
521         * @exception InvocationTargetException if the property accessor method
522         *  throws an exception
523         * @exception NoSuchMethodException if an accessor method for this
524         *  propety cannot be found
525         * @see PropertyUtilsBean#getPropertyEditorClass(Object,String)
526         */
527        public static Class getPropertyEditorClass(Object bean, String name)
528                throws IllegalAccessException, InvocationTargetException,
529                NoSuchMethodException {
530    
531            return PropertyUtilsBean.getInstance().getPropertyEditorClass(bean, name);
532    
533        }
534    
535    
536        /**
537         * <p>Return the Java Class representing the property type of the specified
538         * property, or <code>null</code> if there is no such property for the
539         * specified bean.</p>
540         *
541         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
542         *
543         * @param bean Bean for which a property descriptor is requested
544         * @param name Possibly indexed and/or nested name of the property for
545         *  which a property descriptor is requested
546         * @return The property type
547         *
548         * @exception IllegalAccessException if the caller does not have
549         *  access to the property accessor method
550         * @exception IllegalArgumentException if <code>bean</code> or
551         *  <code>name</code> is null
552         * @exception IllegalArgumentException if a nested reference to a
553         *  property returns null
554         * @exception InvocationTargetException if the property accessor method
555         *  throws an exception
556         * @exception NoSuchMethodException if an accessor method for this
557         *  propety cannot be found
558         * @see PropertyUtilsBean#getPropertyType(Object, String)
559         */
560        public static Class getPropertyType(Object bean, String name)
561                throws IllegalAccessException, InvocationTargetException,
562                NoSuchMethodException {
563    
564            return PropertyUtilsBean.getInstance().getPropertyType(bean, name);
565        }
566    
567    
568        /**
569         * <p>Return an accessible property getter method for this property,
570         * if there is one; otherwise return <code>null</code>.</p>
571         *
572         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
573         *
574         * @param descriptor Property descriptor to return a getter for
575         * @return The read method
576         * @see PropertyUtilsBean#getReadMethod(PropertyDescriptor)
577         */
578        public static Method getReadMethod(PropertyDescriptor descriptor) {
579    
580            return (PropertyUtilsBean.getInstance().getReadMethod(descriptor));
581    
582        }
583    
584    
585        /**
586         * <p>Return the value of the specified simple property of the specified
587         * bean, with no type conversions.</p>
588         *
589         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
590         *
591         * @param bean Bean whose property is to be extracted
592         * @param name Name of the property to be extracted
593         * @return The property value
594         *
595         * @exception IllegalAccessException if the caller does not have
596         *  access to the property accessor method
597         * @exception IllegalArgumentException if <code>bean</code> or
598         *  <code>name</code> is null
599         * @exception IllegalArgumentException if the property name
600         *  is nested or indexed
601         * @exception InvocationTargetException if the property accessor method
602         *  throws an exception
603         * @exception NoSuchMethodException if an accessor method for this
604         *  propety cannot be found
605         * @see PropertyUtilsBean#getSimpleProperty
606         */
607        public static Object getSimpleProperty(Object bean, String name)
608                throws IllegalAccessException, InvocationTargetException,
609                NoSuchMethodException {
610    
611            return PropertyUtilsBean.getInstance().getSimpleProperty(bean, name);
612            
613        }
614    
615    
616        /**
617         * <p>Return an accessible property setter method for this property,
618         * if there is one; otherwise return <code>null</code>.</p>
619         *
620         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
621         *
622         * @param descriptor Property descriptor to return a setter for
623         * @return The write method
624         * @see PropertyUtilsBean#getWriteMethod(PropertyDescriptor)
625         */
626        public static Method getWriteMethod(PropertyDescriptor descriptor) {
627    
628            return PropertyUtilsBean.getInstance().getWriteMethod(descriptor);
629    
630        }
631    
632    
633        /**
634         * <p>Return <code>true</code> if the specified property name identifies
635         * a readable property on the specified bean; otherwise, return
636         * <code>false</code>.</p>
637         *
638         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
639         *
640         * @param bean Bean to be examined (may be a {@link DynaBean}
641         * @param name Property name to be evaluated
642         * @return <code>true</code> if the property is readable,
643         * otherwise <code>false</code>
644         *
645         * @exception IllegalArgumentException if <code>bean</code>
646         *  or <code>name</code> is <code>null</code>
647         * @see PropertyUtilsBean#isReadable
648         * @since BeanUtils 1.6
649         */
650        public static boolean isReadable(Object bean, String name) {
651    
652            return PropertyUtilsBean.getInstance().isReadable(bean, name);
653        }
654    
655    
656        /**
657         * <p>Return <code>true</code> if the specified property name identifies
658         * a writeable property on the specified bean; otherwise, return
659         * <code>false</code>.</p>
660         *
661         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
662         *
663         * @param bean Bean to be examined (may be a {@link DynaBean}
664         * @param name Property name to be evaluated
665         * @return <code>true</code> if the property is writeable,
666         * otherwise <code>false</code>
667         *
668         * @exception IllegalArgumentException if <code>bean</code>
669         *  or <code>name</code> is <code>null</code>
670         * @see PropertyUtilsBean#isWriteable
671         * @since BeanUtils 1.6
672         */
673        public static boolean isWriteable(Object bean, String name) {
674    
675            return PropertyUtilsBean.getInstance().isWriteable(bean, name);
676        }
677    
678    
679        /**
680         * <p>Sets the value of the specified indexed property of the specified
681         * bean, with no type conversions.</p>
682         *
683         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
684         *
685         * @param bean Bean whose property is to be modified
686         * @param name <code>propertyname[index]</code> of the property value
687         *  to be modified
688         * @param value Value to which the specified property element
689         *  should be set
690         *
691         * @exception IndexOutOfBoundsException if the specified index
692         *  is outside the valid range for the underlying property
693         * @exception IllegalAccessException if the caller does not have
694         *  access to the property accessor method
695         * @exception IllegalArgumentException if <code>bean</code> or
696         *  <code>name</code> is null
697         * @exception InvocationTargetException if the property accessor method
698         *  throws an exception
699         * @exception NoSuchMethodException if an accessor method for this
700         *  propety cannot be found
701         * @see PropertyUtilsBean#setIndexedProperty(Object, String, Object)
702         */
703        public static void setIndexedProperty(Object bean, String name,
704                                              Object value)
705                throws IllegalAccessException, InvocationTargetException,
706                NoSuchMethodException {
707    
708            PropertyUtilsBean.getInstance().setIndexedProperty(bean, name, value);
709    
710        }
711    
712    
713        /**
714         * <p>Sets the value of the specified indexed property of the specified
715         * bean, with no type conversions.</p>
716         *
717         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
718         *
719         * @param bean Bean whose property is to be set
720         * @param name Simple property name of the property value to be set
721         * @param index Index of the property value to be set
722         * @param value Value to which the indexed property element is to be set
723         *
724         * @exception IndexOutOfBoundsException if the specified index
725         *  is outside the valid range for the underlying property
726         * @exception IllegalAccessException if the caller does not have
727         *  access to the property accessor method
728         * @exception IllegalArgumentException if <code>bean</code> or
729         *  <code>name</code> is null
730         * @exception InvocationTargetException if the property accessor method
731         *  throws an exception
732         * @exception NoSuchMethodException if an accessor method for this
733         *  propety cannot be found
734         * @see PropertyUtilsBean#setIndexedProperty(Object, String, Object)
735         */
736        public static void setIndexedProperty(Object bean, String name,
737                                              int index, Object value)
738                throws IllegalAccessException, InvocationTargetException,
739                NoSuchMethodException {
740    
741            PropertyUtilsBean.getInstance().setIndexedProperty(bean, name, index, value);
742        }
743    
744    
745        /**
746         * <p>Sets the value of the specified mapped property of the
747         * specified bean, with no type conversions.</p>
748         *
749         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
750         *
751         * @param bean Bean whose property is to be set
752         * @param name <code>propertyname(key)</code> of the property value
753         *  to be set
754         * @param value The property value to be set
755         *
756         * @exception IllegalAccessException if the caller does not have
757         *  access to the property accessor method
758         * @exception InvocationTargetException if the property accessor method
759         *  throws an exception
760         * @exception NoSuchMethodException if an accessor method for this
761         *  propety cannot be found
762         * @see PropertyUtilsBean#setMappedProperty(Object, String, Object)
763         */
764        public static void setMappedProperty(Object bean, String name,
765                                             Object value)
766                throws IllegalAccessException, InvocationTargetException,
767                NoSuchMethodException {
768    
769            PropertyUtilsBean.getInstance().setMappedProperty(bean, name, value);
770        }
771    
772    
773        /**
774         * <p>Sets the value of the specified mapped property of the specified
775         * bean, with no type conversions.</p>
776         *
777         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
778         *
779         * @param bean Bean whose property is to be set
780         * @param name Mapped property name of the property value to be set
781         * @param key Key of the property value to be set
782         * @param value The property value to be set
783         *
784         * @exception IllegalAccessException if the caller does not have
785         *  access to the property accessor method
786         * @exception InvocationTargetException if the property accessor method
787         *  throws an exception
788         * @exception NoSuchMethodException if an accessor method for this
789         *  propety cannot be found
790         * @see PropertyUtilsBean#setMappedProperty(Object, String, String, Object)
791         */
792        public static void setMappedProperty(Object bean, String name,
793                                             String key, Object value)
794                throws IllegalAccessException, InvocationTargetException,
795                NoSuchMethodException {
796    
797            PropertyUtilsBean.getInstance().setMappedProperty(bean, name, key, value);
798        }
799    
800    
801        /**
802         * <p>Sets the value of the (possibly nested) property of the specified
803         * name, for the specified bean, with no type conversions.</p>
804         *
805         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
806         *
807         * @param bean Bean whose property is to be modified
808         * @param name Possibly nested name of the property to be modified
809         * @param value Value to which the property is to be set
810         *
811         * @exception IllegalAccessException if the caller does not have
812         *  access to the property accessor method
813         * @exception IllegalArgumentException if <code>bean</code> or
814         *  <code>name</code> is null
815         * @exception IllegalArgumentException if a nested reference to a
816         *  property returns null
817         * @exception InvocationTargetException if the property accessor method
818         *  throws an exception
819         * @exception NoSuchMethodException if an accessor method for this
820         *  propety cannot be found
821         * @see PropertyUtilsBean#setNestedProperty
822         */
823        public static void setNestedProperty(Object bean,
824                                             String name, Object value)
825                throws IllegalAccessException, InvocationTargetException,
826                NoSuchMethodException {
827    
828            PropertyUtilsBean.getInstance().setNestedProperty(bean, name, value);
829        }
830    
831    
832        /**
833         * <p>Set the value of the specified property of the specified bean,
834         * no matter which property reference format is used, with no
835         * type conversions.</p>
836         *
837         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
838         *
839         * @param bean Bean whose property is to be modified
840         * @param name Possibly indexed and/or nested name of the property
841         *  to be modified
842         * @param value Value to which this property is to be set
843         *
844         * @exception IllegalAccessException if the caller does not have
845         *  access to the property accessor method
846         * @exception IllegalArgumentException if <code>bean</code> or
847         *  <code>name</code> is null
848         * @exception InvocationTargetException if the property accessor method
849         *  throws an exception
850         * @exception NoSuchMethodException if an accessor method for this
851         *  propety cannot be found
852         * @see PropertyUtilsBean#setProperty
853         */
854        public static void setProperty(Object bean, String name, Object value)
855                throws IllegalAccessException, InvocationTargetException,
856                NoSuchMethodException {
857    
858            PropertyUtilsBean.getInstance().setProperty(bean, name, value);
859    
860        }
861    
862    
863        /**
864         * <p>Set the value of the specified simple property of the specified bean,
865         * with no type conversions.</p>
866         *
867         * <p>For more details see <code>PropertyUtilsBean</code>.</p>
868         *
869         * @param bean Bean whose property is to be modified
870         * @param name Name of the property to be modified
871         * @param value Value to which the property should be set
872         *
873         * @exception IllegalAccessException if the caller does not have
874         *  access to the property accessor method
875         * @exception IllegalArgumentException if <code>bean</code> or
876         *  <code>name</code> is null
877         * @exception IllegalArgumentException if the property name is
878         *  nested or indexed
879         * @exception InvocationTargetException if the property accessor method
880         *  throws an exception
881         * @exception NoSuchMethodException if an accessor method for this
882         *  propety cannot be found
883         * @see PropertyUtilsBean#setSimpleProperty
884         */
885        public static void setSimpleProperty(Object bean,
886                                             String name, Object value)
887                throws IllegalAccessException, InvocationTargetException,
888                NoSuchMethodException {
889    
890            PropertyUtilsBean.getInstance().setSimpleProperty(bean, name, value);
891        }
892    
893    
894    }