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