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
019package org.apache.commons.beanutils;
020
021import java.beans.PropertyDescriptor;
022import java.lang.reflect.InvocationTargetException;
023import java.lang.reflect.Method;
024import java.util.Map;
025
026import 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
048public 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}