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 
018package org.apache.commons.beanutils.locale;
019
020
021import org.apache.commons.beanutils.BeanUtils;
022
023import java.lang.reflect.InvocationTargetException;
024import java.util.Locale;
025
026
027
028/**
029 * <p>Utility methods for populating JavaBeans properties
030 * via reflection in a locale-dependent manner.</p>
031 *
032 * <p>The implementations for these methods are provided by <code>LocaleBeanUtilsBean</code>.
033 * For more details see {@link LocaleBeanUtilsBean}.</p>
034 *
035 * @author Craig R. McClanahan
036 * @author Ralph Schaer
037 * @author Chris Audley
038 * @author Rey Francois
039 * @author Gregor Rayman
040 * @author Yauheny Mikulski
041 */
042
043public class LocaleBeanUtils extends BeanUtils {
044
045
046    // ----------------------------------------------------- Instance Variables
047
048    /**
049     * <p>Gets the locale used when no locale is passed.</p>
050     *
051     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
052     *
053     * @return the default locale
054     * @see LocaleBeanUtilsBean#getDefaultLocale()
055     */
056    public static Locale getDefaultLocale() {
057
058        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getDefaultLocale();
059    }
060
061
062    /**
063     * <p>Sets the locale used when no locale is passed.</p>
064     *
065     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
066     *
067     * @param locale the default locale
068     * @see LocaleBeanUtilsBean#setDefaultLocale(Locale)
069     */
070    public static void setDefaultLocale(Locale locale) {
071
072        LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setDefaultLocale(locale);
073    }
074
075    /**
076     * <p>Gets whether the pattern is localized or not.</p>
077     *
078     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
079     *
080     * @return <code>true</code> if pattern is localized,
081     * otherwise <code>false</code>
082     * @see LocaleBeanUtilsBean#getApplyLocalized()
083     */
084    public static boolean getApplyLocalized() {
085
086        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getApplyLocalized();
087    }
088
089    /**
090     * <p>Sets whether the pattern is localized or not.</p>
091     *
092     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
093     *
094     * @param newApplyLocalized <code>true</code> if pattern is localized,
095     * otherwise <code>false</code>
096     * @see LocaleBeanUtilsBean#setApplyLocalized(boolean)
097     */
098    public static void setApplyLocalized(boolean newApplyLocalized) {
099
100        LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setApplyLocalized(newApplyLocalized);
101    }
102
103
104    // --------------------------------------------------------- Public Methods
105
106    /**
107     * <p>Return the value of the specified locale-sensitive indexed property
108     * of the specified bean, as a String.</p>
109     *
110     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
111     *
112     * @param bean Bean whose property is to be extracted
113     * @param name <code>propertyname[index]</code> of the property value
114     *  to be extracted
115     * @param pattern The conversion pattern
116     * @return The indexed property's value, converted to a String
117     *
118     * @exception IllegalAccessException if the caller does not have
119     *  access to the property accessor method
120     * @exception InvocationTargetException if the property accessor method
121     *  throws an exception
122     * @exception NoSuchMethodException if an accessor method for this
123     *  propety cannot be found
124     *
125     * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String, String)
126     */
127    public static String getIndexedProperty(Object bean, String name, String pattern)
128            throws IllegalAccessException, InvocationTargetException,
129            NoSuchMethodException {
130
131        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name, pattern);
132    }
133
134    /**
135     * Return the value of the specified locale-sensitive indexed property
136     * of the specified bean, as a String using the default conversion pattern of
137     * the corresponding {@link LocaleConverter}.
138     *
139     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
140     *
141     * @param bean Bean whose property is to be extracted
142     * @param name <code>propertyname[index]</code> of the property value
143     *  to be extracted
144     * @return The indexed property's value, converted to a String
145     *
146     * @exception IllegalAccessException if the caller does not have
147     *  access to the property accessor method
148     * @exception InvocationTargetException if the property accessor method
149     *  throws an exception
150     * @exception NoSuchMethodException if an accessor method for this
151     *  propety cannot be found
152     *
153     * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String)
154     */
155    public static String getIndexedProperty(Object bean, String name)
156            throws IllegalAccessException, InvocationTargetException,
157            NoSuchMethodException {
158
159        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name);
160    }
161
162    /**
163     * <p>Return the value of the specified locale-sensetive indexed property
164     * of the specified bean, as a String using the specified conversion pattern.</p>
165     *
166     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
167     *
168     * @param bean Bean whose property is to be extracted
169     * @param name Simple property name of the property value to be extracted
170     * @param index Index of the property value to be extracted
171     * @param pattern The conversion pattern
172     * @return The indexed property's value, converted to a String
173     *
174     * @exception IllegalAccessException if the caller does not have
175     *  access to the property accessor method
176     * @exception InvocationTargetException if the property accessor method
177     *  throws an exception
178     * @exception NoSuchMethodException if an accessor method for this
179     *  propety cannot be found
180     *
181     * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String, int, String)
182     */
183    public static String getIndexedProperty(Object bean,
184                                            String name, int index, String pattern)
185            throws IllegalAccessException, InvocationTargetException,
186            NoSuchMethodException {
187
188        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name, index, pattern);
189    }
190
191    /**
192     * <p>Return the value of the specified locale-sensetive indexed property
193     * of the specified bean, as a String using the default conversion pattern of
194     * the corresponding {@link LocaleConverter}.</p>
195     *
196     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
197     *
198     * @param bean Bean whose property is to be extracted
199     * @param name Simple property name of the property value to be extracted
200     * @param index Index of the property value to be extracted
201     * @return The indexed property's value, converted to a String
202     *
203     * @exception IllegalAccessException if the caller does not have
204     *  access to the property accessor method
205     * @exception InvocationTargetException if the property accessor method
206     *  throws an exception
207     * @exception NoSuchMethodException if an accessor method for this
208     *  propety cannot be found
209     *
210     * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String, int)
211     */
212    public static String getIndexedProperty(Object bean,
213                                            String name, int index)
214            throws IllegalAccessException, InvocationTargetException,
215            NoSuchMethodException {
216        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name, index);
217    }
218
219    /**
220     * <p>Return the value of the specified simple locale-sensitive property
221     * of the specified bean, converted to a String using the specified
222     * conversion pattern.</p>
223     *
224     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
225     *
226     * @param bean Bean whose property is to be extracted
227     * @param name Name of the property to be extracted
228     * @param pattern The conversion pattern
229     * @return The property's value, converted to a String
230     *
231     * @exception IllegalAccessException if the caller does not have
232     *  access to the property accessor method
233     * @exception InvocationTargetException if the property accessor method
234     *  throws an exception
235     * @exception NoSuchMethodException if an accessor method for this
236     *  propety cannot be found
237     *
238     * @see LocaleBeanUtilsBean#getSimpleProperty(Object, String, String)
239     */
240    public static String getSimpleProperty(Object bean, String name, String pattern)
241            throws IllegalAccessException, InvocationTargetException,
242            NoSuchMethodException {
243
244        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getSimpleProperty(bean, name, pattern);
245    }
246
247    /**
248     * <p>Return the value of the specified simple locale-sensitive property
249     * of the specified bean, converted to a String using the default
250     * conversion pattern of the corresponding {@link LocaleConverter}.</p>
251     *
252     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
253     *
254     * @param bean Bean whose property is to be extracted
255     * @param name Name of the property to be extracted
256     * @return The property's value, converted to a String
257     *
258     * @exception IllegalAccessException if the caller does not have
259     *  access to the property accessor method
260     * @exception InvocationTargetException if the property accessor method
261     *  throws an exception
262     * @exception NoSuchMethodException if an accessor method for this
263     *  propety cannot be found
264     *
265     * @see LocaleBeanUtilsBean#getSimpleProperty(Object, String)
266     */
267    public static String getSimpleProperty(Object bean, String name)
268            throws IllegalAccessException, InvocationTargetException,
269            NoSuchMethodException {
270
271        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getSimpleProperty(bean, name);
272    }
273
274    /**
275     * <p>Return the value of the specified mapped locale-sensitive property
276     * of the specified bean, as a String using the specified conversion pattern.</p>
277     *
278     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
279     *
280     * @param bean Bean whose property is to be extracted
281     * @param name Simple property name of the property value to be extracted
282     * @param key Lookup key of the property value to be extracted
283     * @param pattern The conversion pattern
284     * @return The mapped property's value, converted to a String
285     *
286     * @exception IllegalAccessException if the caller does not have
287     *  access to the property accessor method
288     * @exception InvocationTargetException if the property accessor method
289     *  throws an exception
290     * @exception NoSuchMethodException if an accessor method for this
291     *  propety cannot be found
292     *
293     * @see LocaleBeanUtilsBean#getMappedProperty(Object, String, String, String)
294     */
295    public static String getMappedProperty(Object bean,
296                                           String name, String key, String pattern)
297            throws IllegalAccessException, InvocationTargetException,
298            NoSuchMethodException {
299
300        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedProperty(bean, name, key, pattern);
301    }
302
303    /**
304     * <p>Return the value of the specified mapped locale-sensitive property
305     * of the specified bean, as a String
306     * The key is specified as a method parameter and must *not* be included
307     * in the property name expression.</p>
308     *
309     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
310     *
311     * @param bean Bean whose property is to be extracted
312     * @param name Simple property name of the property value to be extracted
313     * @param key Lookup key of the property value to be extracted
314     * @return The mapped property's value, converted to a String
315     *
316     * @exception IllegalAccessException if the caller does not have
317     *  access to the property accessor method
318     * @exception InvocationTargetException if the property accessor method
319     *  throws an exception
320     * @exception NoSuchMethodException if an accessor method for this
321     *  propety cannot be found
322     *
323     * @see LocaleBeanUtilsBean#getMappedProperty(Object, String, String)
324     */
325    public static String getMappedProperty(Object bean,
326                                           String name, String key)
327            throws IllegalAccessException, InvocationTargetException,
328            NoSuchMethodException {
329
330        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedProperty(bean, name, key);
331    }
332
333
334    /**
335     * <p>Return the value of the specified locale-sensitive mapped property
336     * of the specified bean, as a String using the specified pattern.</p>
337     *
338     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
339     *
340     * @param bean Bean whose property is to be extracted
341     * @param name <code>propertyname(index)</code> of the property value
342     *  to be extracted
343     * @param pattern The conversion pattern
344     * @return The mapped property's value, converted to a String
345     *
346     * @exception IllegalAccessException if the caller does not have
347     *  access to the property accessor method
348     * @exception InvocationTargetException if the property accessor method
349     *  throws an exception
350     * @exception NoSuchMethodException if an accessor method for this
351     *  propety cannot be found
352     *
353     * @see LocaleBeanUtilsBean#getMappedPropertyLocale(Object, String, String)
354     */
355    public static String getMappedPropertyLocale(Object bean, String name, String pattern)
356            throws IllegalAccessException, InvocationTargetException,
357            NoSuchMethodException {
358
359        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedPropertyLocale(bean, name, pattern);
360    }
361
362
363    /**
364     * <p>Return the value of the specified locale-sensitive mapped property
365     * of the specified bean, as a String using the default
366     * conversion pattern of the corresponding {@link LocaleConverter}.</p>
367     *
368     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
369     *
370     * @param bean Bean whose property is to be extracted
371     * @param name <code>propertyname(index)</code> of the property value
372     *  to be extracted
373     * @return The mapped property's value, converted to a String
374     *
375     * @exception IllegalAccessException if the caller does not have
376     *  access to the property accessor method
377     * @exception InvocationTargetException if the property accessor method
378     *  throws an exception
379     * @exception NoSuchMethodException if an accessor method for this
380     *  propety cannot be found
381     *
382     * @see LocaleBeanUtilsBean#getMappedProperty(Object, String)
383     */
384    public static String getMappedProperty(Object bean, String name)
385            throws IllegalAccessException, InvocationTargetException,
386            NoSuchMethodException {
387
388        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedProperty(bean, name);
389    }
390
391    /**
392     * <p>Return the value of the (possibly nested) locale-sensitive property
393     * of the specified name, for the specified bean,
394     * as a String using the specified pattern.</p>
395     *
396     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
397     *
398     * @param bean Bean whose property is to be extracted
399     * @param name Possibly nested name of the property to be extracted
400     * @param pattern The conversion pattern
401     * @return The nested property's value, converted to a String
402     *
403     * @exception IllegalAccessException if the caller does not have
404     *  access to the property accessor method
405     * @exception InvocationTargetException if the property accessor method
406     *  throws an exception
407     * @exception NoSuchMethodException if an accessor method for this
408     *  propety cannot be found
409     *
410     * @see LocaleBeanUtilsBean#getNestedProperty(Object, String, String)
411     */
412    public static String getNestedProperty(Object bean, String name, String pattern)
413            throws IllegalAccessException, InvocationTargetException,
414            NoSuchMethodException {
415
416        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getNestedProperty(bean, name, pattern);
417    }
418
419    /**
420     * <p>Return the value of the (possibly nested) locale-sensitive property
421     * of the specified name.</p>
422     *
423     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
424     *
425     * @param bean Bean whose property is to be extracted
426     * @param name Possibly nested name of the property to be extracted
427     * @return The nested property's value, converted to a String
428     *
429     * @exception IllegalAccessException if the caller does not have
430     *  access to the property accessor method
431     * @exception InvocationTargetException if the property accessor method
432     *  throws an exception
433     * @exception NoSuchMethodException if an accessor method for this
434     *  propety cannot be found
435     *
436     * @see LocaleBeanUtilsBean#getNestedProperty(Object, String)
437     */
438    public static String getNestedProperty(Object bean, String name)
439            throws IllegalAccessException, InvocationTargetException,
440            NoSuchMethodException {
441
442        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getNestedProperty(bean, name);
443    }
444
445    /**
446     * <p>Return the value of the specified locale-sensitive property
447     * of the specified bean.</p>
448     *
449     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
450     *
451     * @param bean Bean whose property is to be extracted
452     * @param name Possibly indexed and/or nested name of the property
453     *  to be extracted
454     * @param pattern The conversion pattern
455     * @return The nested property's value, converted to a String
456     *
457     * @exception IllegalAccessException if the caller does not have
458     *  access to the property accessor method
459     * @exception InvocationTargetException if the property accessor method
460     *  throws an exception
461     * @exception NoSuchMethodException if an accessor method for this
462     *  propety cannot be found
463     *
464     * @see LocaleBeanUtilsBean#getProperty(Object, String, String)
465     */
466    public static String getProperty(Object bean, String name, String pattern)
467            throws IllegalAccessException, InvocationTargetException,
468            NoSuchMethodException {
469
470        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getProperty(bean, name, pattern);
471    }
472
473    /**
474     * <p>Return the value of the specified locale-sensitive property
475     * of the specified bean.</p>
476     *
477     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
478     *
479     * @param bean Bean whose property is to be extracted
480     * @param name Possibly indexed and/or nested name of the property
481     *  to be extracted
482     * @return The property's value, converted to a String
483     *
484     * @exception IllegalAccessException if the caller does not have
485     *  access to the property accessor method
486     * @exception InvocationTargetException if the property accessor method
487     *  throws an exception
488     * @exception NoSuchMethodException if an accessor method for this
489     *  propety cannot be found
490     *
491     * @see LocaleBeanUtilsBean#getProperty(Object, String)
492     */
493    public static String getProperty(Object bean, String name)
494            throws IllegalAccessException, InvocationTargetException,
495            NoSuchMethodException {
496
497        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getProperty(bean, name);
498    }
499
500    /**
501     * <p>Set the specified locale-sensitive property value, performing type
502     * conversions as required to conform to the type of the destination property
503     * using the default conversion pattern of the corresponding {@link LocaleConverter}.</p>
504     *
505     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
506     *
507     * @param bean Bean on which setting is to be performed
508     * @param name Property name (can be nested/indexed/mapped/combo)
509     * @param value Value to be set
510     *
511     * @exception IllegalAccessException if the caller does not have
512     *  access to the property accessor method
513     * @exception InvocationTargetException if the property accessor method
514     *  throws an exception
515     *
516     * @see LocaleBeanUtilsBean#setProperty(Object, String, Object)
517     */
518    public static void setProperty(Object bean, String name, Object value)
519            throws IllegalAccessException, InvocationTargetException {
520
521        LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setProperty(bean, name, value);
522    }
523
524    /**
525     * <p>Set the specified locale-sensitive property value, performing type
526     * conversions as required to conform to the type of the destination
527     * property using the specified conversion pattern.</p>
528     *
529     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
530     *
531     * @param bean Bean on which setting is to be performed
532     * @param name Property name (can be nested/indexed/mapped/combo)
533     * @param value Value to be set
534     * @param pattern The conversion pattern
535     *
536     * @exception IllegalAccessException if the caller does not have
537     *  access to the property accessor method
538     * @exception InvocationTargetException if the property accessor method
539     *  throws an exception
540     *
541     * @see LocaleBeanUtilsBean#setProperty(Object, String, Object, String)
542     */
543    public static void setProperty(Object bean, String name, Object value, String pattern)
544            throws IllegalAccessException, InvocationTargetException {
545
546        LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setProperty(bean, name, value, pattern);
547     }
548
549    /**
550     * <p>Calculate the property type.</p>
551     *
552     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
553     *
554     * @param target The bean
555     * @param name The property name
556     * @param propName The Simple name of target property
557     * @return The property's type
558     *
559     * @exception IllegalAccessException if the caller does not have
560     *  access to the property accessor method
561     * @exception InvocationTargetException if the property accessor method
562     *  throws an exception
563     *
564     * @see LocaleBeanUtilsBean#definePropertyType(Object, String, String)
565     */
566    protected static Class definePropertyType(Object target, String name, String propName)
567            throws IllegalAccessException, InvocationTargetException {
568
569        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().definePropertyType(target, name, propName);
570    }
571
572    /**
573     * <p>Convert the specified value to the required type using the
574     * specified conversion pattern.</p>
575     *
576     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
577     *
578     * @param type The Java type of target property
579     * @param index The indexed subscript value (if any)
580     * @param value The value to be converted
581     * @param pattern The conversion pattern
582     * @return The converted value
583     * @see LocaleBeanUtilsBean#convert(Class, int, Object, String)
584     */
585    protected static Object convert(Class type, int index, Object value, String pattern) {
586
587        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().convert(type, index, value, pattern);
588    }
589
590    /**
591     * <p>Convert the specified value to the required type.</p>
592     *
593     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
594     *
595     * @param type The Java type of target property
596     * @param index The indexed subscript value (if any)
597     * @param value The value to be converted
598     * @return The converted value
599     * @see LocaleBeanUtilsBean#convert(Class, int, Object)
600     */
601    protected static Object convert(Class type, int index, Object value) {
602
603        return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().convert(type, index, value);
604    }
605
606    /**
607     * <p>Invoke the setter method.</p>
608     *
609     * <p>For more details see <code>LocaleBeanUtilsBean</code></p>
610     *
611     * @param target The bean
612     * @param propName The Simple name of target property
613     * @param key The Mapped key value (if any)
614     * @param index The indexed subscript value (if any)
615     * @param newValue The value to be set
616     *
617     * @exception IllegalAccessException if the caller does not have
618     *  access to the property accessor method
619     * @exception InvocationTargetException if the property accessor method
620     *  throws an exception
621     *
622     * @see LocaleBeanUtilsBean#invokeSetter(Object, String, String, int, Object)
623     */
624    protected static void invokeSetter(Object target, String propName, String key, int index, Object newValue)
625            throws IllegalAccessException, InvocationTargetException {
626
627       LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().invokeSetter(target, propName, key, index, newValue);
628    }
629
630    /**
631     * Resolve any nested expression to get the actual target bean.
632     *
633     * @deprecated moved into <code>LocaleBeanUtilsBean</code>
634     * @param bean The bean
635     * @param name The property name
636     * @return The property's descriptor
637     *
638     * @exception IllegalAccessException if the caller does not have
639     *  access to the property accessor method
640     * @exception InvocationTargetException if the property accessor method
641     *  throws an exception
642     */
643    protected static Descriptor calculate(Object bean, String name)
644            throws IllegalAccessException, InvocationTargetException {
645
646        org.apache.commons.beanutils.locale.LocaleBeanUtilsBean.Descriptor descriptor
647            = LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().calculate(bean, name);
648        return new Descriptor(
649                descriptor.getTarget(),
650                descriptor.getName(),
651                descriptor.getPropName(),
652                descriptor.getKey(),
653                descriptor.getIndex());
654    }
655
656    /** @deprecated moved into <code>LocaleBeanUtils</code> */
657    protected static class Descriptor {
658
659        private int index = -1;    // Indexed subscript value (if any)
660        private String name;
661        private String propName;   // Simple name of target property
662        private String key;        // Mapped key value (if any)
663        private Object target;
664
665        /**
666         * Construct a descriptor instance for the target bean and property.
667         *
668         * @param target The target bean
669         * @param name The property name (includes indexed/mapped expr)
670         * @param propName The property name
671         * @param key The mapped property key (if any)
672         * @param index The indexed property index (if any)
673         */
674        public Descriptor(Object target, String name, String propName, String key, int index) {
675
676            setTarget(target);
677            setName(name);
678            setPropName(propName);
679            setKey(key);
680            setIndex(index);
681        }
682
683        /**
684         * Return the target bean.
685         *
686         * @return The descriptors target bean
687         */
688        public Object getTarget() {
689            return target;
690        }
691
692        /**
693         * Set the target bean.
694         *
695         * @param target The target bean
696         */
697        public void setTarget(Object target) {
698            this.target = target;
699        }
700
701        /**
702         * Return the mapped property key.
703         *
704         * @return the mapped property key (if any)
705         */
706        public String getKey() {
707            return key;
708        }
709
710        /**
711         * Set the mapped property key.
712         *
713         * @param key The mapped property key (if any)
714         */
715        public void setKey(String key) {
716            this.key = key;
717        }
718
719        /**
720         * Return indexed property index.
721         *
722         * @return indexed property index (if any)
723         */
724        public int getIndex() {
725            return index;
726        }
727
728        /**
729         * Set the indexed property index.
730         *
731         * @param index The indexed property index (if any)
732         */
733        public void setIndex(int index) {
734            this.index = index;
735        }
736
737        /**
738         * Return property name (includes indexed/mapped expr).
739         *
740         * @return The property name (includes indexed/mapped expr)
741         */
742        public String getName() {
743            return name;
744        }
745
746        /**
747         * Set the property name (includes indexed/mapped expr).
748         *
749         * @param name The property name (includes indexed/mapped expr)
750         */
751        public void setName(String name) {
752            this.name = name;
753        }
754
755        /**
756         * Return the property name.
757         *
758         * @return The property name
759         */
760        public String getPropName() {
761            return propName;
762        }
763
764        /**
765         * Set the property name.
766         *
767         * @param propName The property name
768         */
769        public void setPropName(String propName) {
770            this.propName = propName;
771        }
772    }
773}
774
775