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    package org.apache.commons.beanutils.locale;
019    
020    
021    import org.apache.commons.beanutils.BeanUtils;
022    
023    import java.lang.reflect.InvocationTargetException;
024    import 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    
043    public 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