1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.beanutils2.locale;
19
20 import java.lang.reflect.InvocationTargetException;
21 import java.util.Locale;
22
23 /**
24 * <p>
25 * Utility methods for populating JavaBeans properties via reflection in a locale-dependent manner.
26 * </p>
27 *
28 * <p>
29 * The implementations for these methods are provided by {@code LocaleBeanUtilsBean}. For more details see {@link LocaleBeanUtilsBean}.
30 * </p>
31 */
32 public final class LocaleBeanUtils {
33
34 /**
35 * <p>
36 * Converts the specified value to the required type.
37 * </p>
38 *
39 * <p>
40 * For more details see {@code LocaleBeanUtilsBean}
41 * </p>
42 *
43 * @param type The Java type of target property
44 * @param index The indexed subscript value (if any)
45 * @param value The value to be converted
46 * @return The converted value
47 * @see LocaleBeanUtilsBean#convert(Class, int, Object)
48 */
49 protected static Object convert(final Class<?> type, final int index, final Object value) {
50 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().convert(type, index, value);
51 }
52
53 /**
54 * <p>
55 * Converts the specified value to the required type using the specified conversion pattern.
56 * </p>
57 *
58 * <p>
59 * For more details see {@code LocaleBeanUtilsBean}
60 * </p>
61 *
62 * @param type The Java type of target property
63 * @param index The indexed subscript value (if any)
64 * @param value The value to be converted
65 * @param pattern The conversion pattern
66 * @return The converted value
67 * @see LocaleBeanUtilsBean#convert(Class, int, Object, String)
68 */
69 protected static Object convert(final Class<?> type, final int index, final Object value, final String pattern) {
70 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().convert(type, index, value, pattern);
71 }
72
73 /**
74 * <p>
75 * Calculate the property type.
76 * </p>
77 *
78 * <p>
79 * For more details see {@code LocaleBeanUtilsBean}
80 * </p>
81 *
82 * @param target The bean
83 * @param name The property name
84 * @param propName The Simple name of target property
85 * @return The property's type
86 * @throws IllegalAccessException if the caller does not have access to the property accessor method
87 * @throws InvocationTargetException if the property accessor method throws an exception
88 * @see LocaleBeanUtilsBean#definePropertyType(Object, String, String)
89 */
90 protected static Class<?> definePropertyType(final Object target, final String name, final String propName)
91 throws IllegalAccessException, InvocationTargetException {
92 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().definePropertyType(target, name, propName);
93 }
94
95 /**
96 * <p>
97 * Gets whether the pattern is localized or not.
98 * </p>
99 *
100 * <p>
101 * For more details see {@code LocaleBeanUtilsBean}
102 * </p>
103 *
104 * @return {@code true} if pattern is localized, otherwise {@code false}
105 * @see LocaleBeanUtilsBean#getApplyLocalized()
106 */
107 public static boolean getApplyLocalized() {
108 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getApplyLocalized();
109 }
110
111 /**
112 * <p>
113 * Gets the locale used when no locale is passed.
114 * </p>
115 *
116 * <p>
117 * For more details see {@code LocaleBeanUtilsBean}
118 * </p>
119 *
120 * @return the default locale
121 * @see LocaleBeanUtilsBean#getDefaultLocale()
122 */
123 public static Locale getDefaultLocale() {
124 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getDefaultLocale();
125 }
126
127 /**
128 * Gets the value of the specified locale-sensitive indexed property of the specified bean, as a String using the default conversion pattern of the
129 * corresponding {@link LocaleConverter}.
130 *
131 * <p>
132 * For more details see {@code LocaleBeanUtilsBean}
133 * </p>
134 *
135 * @param bean Bean whose property is to be extracted
136 * @param name {@code propertyname[index]} of the property value to be extracted
137 * @return The indexed property's value, converted to a String
138 * @throws IllegalAccessException if the caller does not have access to the property accessor method
139 * @throws InvocationTargetException if the property accessor method throws an exception
140 * @throws NoSuchMethodException if an accessor method for this property cannot be found
141 * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String)
142 */
143 public static String getIndexedProperty(final Object bean, final String name)
144 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
145 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name);
146 }
147
148 /**
149 * <p>
150 * Return the value of the specified locale-sensitive indexed property of the specified bean, as a String using the default conversion pattern of the
151 * corresponding {@link LocaleConverter}.
152 * </p>
153 *
154 * <p>
155 * For more details see {@code LocaleBeanUtilsBean}
156 * </p>
157 *
158 * @param bean Bean whose property is to be extracted
159 * @param name Simple property name of the property value to be extracted
160 * @param index Index of the property value to be extracted
161 * @return The indexed property's value, converted to a String
162 * @throws IllegalAccessException if the caller does not have access to the property accessor method
163 * @throws InvocationTargetException if the property accessor method throws an exception
164 * @throws NoSuchMethodException if an accessor method for this property cannot be found
165 * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String, int)
166 */
167 public static String getIndexedProperty(final Object bean, final String name, final int index)
168 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
169 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name, index);
170 }
171
172 /**
173 * <p>
174 * Return the value of the specified locale-sensitive indexed property of the specified bean, as a String using the specified conversion pattern.
175 * </p>
176 *
177 * <p>
178 * For more details see {@code LocaleBeanUtilsBean}
179 * </p>
180 *
181 * @param bean Bean whose property is to be extracted
182 * @param name Simple property name of the property value to be extracted
183 * @param index Index of the property value to be extracted
184 * @param pattern The conversion pattern
185 * @return The indexed property's value, converted to a String
186 * @throws IllegalAccessException if the caller does not have access to the property accessor method
187 * @throws InvocationTargetException if the property accessor method throws an exception
188 * @throws NoSuchMethodException if an accessor method for this property cannot be found
189 * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String, int, String)
190 */
191 public static String getIndexedProperty(final Object bean, final String name, final int index, final String pattern)
192 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
193 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name, index, pattern);
194 }
195
196 /**
197 * <p>
198 * Return the value of the specified locale-sensitive indexed property of the specified bean, as a String.
199 * </p>
200 *
201 * <p>
202 * For more details see {@code LocaleBeanUtilsBean}
203 * </p>
204 *
205 * @param bean Bean whose property is to be extracted
206 * @param name {@code propertyname[index]} of the property value to be extracted
207 * @param pattern The conversion pattern
208 * @return The indexed property's value, converted to a String
209 * @throws IllegalAccessException if the caller does not have access to the property accessor method
210 * @throws InvocationTargetException if the property accessor method throws an exception
211 * @throws NoSuchMethodException if an accessor method for this property cannot be found
212 * @see LocaleBeanUtilsBean#getIndexedProperty(Object, String, String)
213 */
214 public static String getIndexedProperty(final Object bean, final String name, final String pattern)
215 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
216 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getIndexedProperty(bean, name, pattern);
217 }
218
219 /**
220 * <p>
221 * Return the value of the specified locale-sensitive mapped property of the specified bean, as a String using the default conversion pattern of the
222 * corresponding {@link LocaleConverter}.
223 * </p>
224 *
225 * <p>
226 * For more details see {@code LocaleBeanUtilsBean}
227 * </p>
228 *
229 * @param bean Bean whose property is to be extracted
230 * @param name {@code propertyname(index)} of the property value to be extracted
231 * @return The mapped property's value, converted to a String
232 * @throws IllegalAccessException if the caller does not have access to the property accessor method
233 * @throws InvocationTargetException if the property accessor method throws an exception
234 * @throws NoSuchMethodException if an accessor method for this property cannot be found
235 * @see LocaleBeanUtilsBean#getMappedProperty(Object, String)
236 */
237 public static String getMappedProperty(final Object bean, final String name)
238 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
239 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedProperty(bean, name);
240 }
241
242 /**
243 * <p>
244 * Return the value of the specified mapped locale-sensitive property of the specified bean, as a String The key is specified as a method parameter and must
245 * *not* be included in the property name expression.
246 * </p>
247 *
248 * <p>
249 * For more details see {@code LocaleBeanUtilsBean}
250 * </p>
251 *
252 * @param bean Bean whose property is to be extracted
253 * @param name Simple property name of the property value to be extracted
254 * @param key Lookup key of the property value to be extracted
255 * @return The mapped property's value, converted to a String
256 * @throws IllegalAccessException if the caller does not have access to the property accessor method
257 * @throws InvocationTargetException if the property accessor method throws an exception
258 * @throws NoSuchMethodException if an accessor method for this property cannot be found
259 * @see LocaleBeanUtilsBean#getMappedProperty(Object, String, String)
260 */
261 public static String getMappedProperty(final Object bean, final String name, final String key)
262 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
263 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedProperty(bean, name, key);
264 }
265
266 /**
267 * <p>
268 * Return the value of the specified mapped locale-sensitive property of the specified bean, as a String using the specified conversion pattern.
269 * </p>
270 *
271 * <p>
272 * For more details see {@code LocaleBeanUtilsBean}
273 * </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 * @throws IllegalAccessException if the caller does not have access to the property accessor method
281 * @throws InvocationTargetException if the property accessor method throws an exception
282 * @throws NoSuchMethodException if an accessor method for this property cannot be found
283 * @see LocaleBeanUtilsBean#getMappedProperty(Object, String, String, String)
284 */
285 public static String getMappedProperty(final Object bean, final String name, final String key, final String pattern)
286 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
287 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedProperty(bean, name, key, pattern);
288 }
289
290 /**
291 * <p>
292 * Return the value of the specified locale-sensitive mapped property of the specified bean, as a String using the specified pattern.
293 * </p>
294 *
295 * <p>
296 * For more details see {@code LocaleBeanUtilsBean}
297 * </p>
298 *
299 * @param bean Bean whose property is to be extracted
300 * @param name {@code propertyname(index)} of the property value to be extracted
301 * @param pattern The conversion pattern
302 * @return The mapped property's value, converted to a String
303 * @throws IllegalAccessException if the caller does not have access to the property accessor method
304 * @throws InvocationTargetException if the property accessor method throws an exception
305 * @throws NoSuchMethodException if an accessor method for this property cannot be found
306 * @see LocaleBeanUtilsBean#getMappedPropertyLocale(Object, String, String)
307 */
308 public static String getMappedPropertyLocale(final Object bean, final String name, final String pattern)
309 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
310 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getMappedPropertyLocale(bean, name, pattern);
311 }
312
313 /**
314 * <p>
315 * Return the value of the (possibly nested) locale-sensitive property of the specified name.
316 * </p>
317 *
318 * <p>
319 * For more details see {@code LocaleBeanUtilsBean}
320 * </p>
321 *
322 * @param bean Bean whose property is to be extracted
323 * @param name Possibly nested name of the property to be extracted
324 * @return The nested property's value, converted to a String
325 * @throws IllegalAccessException if the caller does not have access to the property accessor method
326 * @throws InvocationTargetException if the property accessor method throws an exception
327 * @throws NoSuchMethodException if an accessor method for this property cannot be found
328 * @see LocaleBeanUtilsBean#getNestedProperty(Object, String)
329 */
330 public static String getNestedProperty(final Object bean, final String name)
331 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
332 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getNestedProperty(bean, name);
333 }
334
335 /**
336 * <p>
337 * Return the value of the (possibly nested) locale-sensitive property of the specified name, for the specified bean, as a String using the specified
338 * pattern.
339 * </p>
340 *
341 * <p>
342 * For more details see {@code LocaleBeanUtilsBean}
343 * </p>
344 *
345 * @param bean Bean whose property is to be extracted
346 * @param name Possibly nested name of the property to be extracted
347 * @param pattern The conversion pattern
348 * @return The nested property's value, converted to a String
349 * @throws IllegalAccessException if the caller does not have access to the property accessor method
350 * @throws InvocationTargetException if the property accessor method throws an exception
351 * @throws NoSuchMethodException if an accessor method for this property cannot be found
352 * @see LocaleBeanUtilsBean#getNestedProperty(Object, String, String)
353 */
354 public static String getNestedProperty(final Object bean, final String name, final String pattern)
355 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
356 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getNestedProperty(bean, name, pattern);
357 }
358
359 /**
360 * <p>
361 * Return the value of the specified locale-sensitive property of the specified bean.
362 * </p>
363 *
364 * <p>
365 * For more details see {@code LocaleBeanUtilsBean}
366 * </p>
367 *
368 * @param bean Bean whose property is to be extracted
369 * @param name Possibly indexed and/or nested name of the property to be extracted
370 * @return The property's value, converted to a String
371 * @throws IllegalAccessException if the caller does not have access to the property accessor method
372 * @throws InvocationTargetException if the property accessor method throws an exception
373 * @throws NoSuchMethodException if an accessor method for this property cannot be found
374 * @see LocaleBeanUtilsBean#getProperty(Object, String)
375 */
376 public static String getProperty(final Object bean, final String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
377 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getProperty(bean, name);
378 }
379
380 /**
381 * <p>
382 * Return the value of the specified locale-sensitive property of the specified bean.
383 * </p>
384 *
385 * <p>
386 * For more details see {@code LocaleBeanUtilsBean}
387 * </p>
388 *
389 * @param bean Bean whose property is to be extracted
390 * @param name Possibly indexed and/or nested name of the property to be extracted
391 * @param pattern The conversion pattern
392 * @return The nested property's value, converted to a String
393 * @throws IllegalAccessException if the caller does not have access to the property accessor method
394 * @throws InvocationTargetException if the property accessor method throws an exception
395 * @throws NoSuchMethodException if an accessor method for this property cannot be found
396 * @see LocaleBeanUtilsBean#getProperty(Object, String, String)
397 */
398 public static String getProperty(final Object bean, final String name, final String pattern)
399 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
400 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getProperty(bean, name, pattern);
401 }
402
403 /**
404 * <p>
405 * Return the value of the specified simple locale-sensitive property of the specified bean, converted to a String using the default conversion pattern of
406 * the corresponding {@link LocaleConverter}.
407 * </p>
408 *
409 * <p>
410 * For more details see {@code LocaleBeanUtilsBean}
411 * </p>
412 *
413 * @param bean Bean whose property is to be extracted
414 * @param name Name of the property to be extracted
415 * @return The property's value, converted to a String
416 * @throws IllegalAccessException if the caller does not have access to the property accessor method
417 * @throws InvocationTargetException if the property accessor method throws an exception
418 * @throws NoSuchMethodException if an accessor method for this property cannot be found
419 * @see LocaleBeanUtilsBean#getSimpleProperty(Object, String)
420 */
421 public static String getSimpleProperty(final Object bean, final String name)
422 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
423 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getSimpleProperty(bean, name);
424 }
425
426 /**
427 * <p>
428 * Return the value of the specified simple locale-sensitive property of the specified bean, converted to a String using the specified conversion pattern.
429 * </p>
430 *
431 * <p>
432 * For more details see {@code LocaleBeanUtilsBean}
433 * </p>
434 *
435 * @param bean Bean whose property is to be extracted
436 * @param name Name of the property to be extracted
437 * @param pattern The conversion pattern
438 * @return The property's value, converted to a String
439 * @throws IllegalAccessException if the caller does not have access to the property accessor method
440 * @throws InvocationTargetException if the property accessor method throws an exception
441 * @throws NoSuchMethodException if an accessor method for this property cannot be found
442 * @see LocaleBeanUtilsBean#getSimpleProperty(Object, String, String)
443 */
444 public static String getSimpleProperty(final Object bean, final String name, final String pattern)
445 throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
446 return LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().getSimpleProperty(bean, name, pattern);
447 }
448
449 /**
450 * <p>
451 * Invoke the setter method.
452 * </p>
453 *
454 * <p>
455 * For more details see {@code LocaleBeanUtilsBean}
456 * </p>
457 *
458 * @param target The bean
459 * @param propName The Simple name of target property
460 * @param key The Mapped key value (if any)
461 * @param index The indexed subscript value (if any)
462 * @param newValue The value to be set
463 * @throws IllegalAccessException if the caller does not have access to the property accessor method
464 * @throws InvocationTargetException if the property accessor method throws an exception
465 * @see LocaleBeanUtilsBean#invokeSetter(Object, String, String, int, Object)
466 */
467 protected static void invokeSetter(final Object target, final String propName, final String key, final int index, final Object newValue)
468 throws IllegalAccessException, InvocationTargetException {
469 LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().invokeSetter(target, propName, key, index, newValue);
470 }
471
472 /**
473 * <p>
474 * Sets whether the pattern is localized or not.
475 * </p>
476 *
477 * <p>
478 * For more details see {@code LocaleBeanUtilsBean}
479 * </p>
480 *
481 * @param newApplyLocalized {@code true} if pattern is localized, otherwise {@code false}
482 * @see LocaleBeanUtilsBean#setApplyLocalized(boolean)
483 */
484 public static void setApplyLocalized(final boolean newApplyLocalized) {
485 LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setApplyLocalized(newApplyLocalized);
486 }
487
488 /**
489 * <p>
490 * Sets the locale used when no locale is passed.
491 * </p>
492 *
493 * <p>
494 * For more details see {@code LocaleBeanUtilsBean}
495 * </p>
496 *
497 * @param locale the default locale
498 * @see LocaleBeanUtilsBean#setDefaultLocale(Locale)
499 */
500 public static void setDefaultLocale(final Locale locale) {
501 LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setDefaultLocale(locale);
502 }
503
504 /**
505 * <p>
506 * Set the specified locale-sensitive property value, performing type conversions as required to conform to the type of the destination property using the
507 * default conversion pattern of the corresponding {@link LocaleConverter}.
508 * </p>
509 *
510 * <p>
511 * For more details see {@code LocaleBeanUtilsBean}
512 * </p>
513 *
514 * @param bean Bean on which setting is to be performed
515 * @param name Property name (can be nested/indexed/mapped/combo)
516 * @param value Value to be set
517 * @throws IllegalAccessException if the caller does not have access to the property accessor method
518 * @throws InvocationTargetException if the property accessor method throws an exception
519 * @see LocaleBeanUtilsBean#setProperty(Object, String, Object)
520 */
521 public static void setProperty(final Object bean, final String name, final Object value) throws IllegalAccessException, InvocationTargetException {
522 LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setProperty(bean, name, value);
523 }
524
525 /**
526 * <p>
527 * Set the specified locale-sensitive property value, performing type conversions as required to conform to the type of the destination property using the
528 * specified conversion pattern.
529 * </p>
530 *
531 * <p>
532 * For more details see {@code LocaleBeanUtilsBean}
533 * </p>
534 *
535 * @param bean Bean on which setting is to be performed
536 * @param name Property name (can be nested/indexed/mapped/combo)
537 * @param value Value to be set
538 * @param pattern The conversion pattern
539 * @throws IllegalAccessException if the caller does not have access to the property accessor method
540 * @throws InvocationTargetException if the property accessor method throws an exception
541 * @see LocaleBeanUtilsBean#setProperty(Object, String, Object, String)
542 */
543 public static void setProperty(final Object bean, final String name, final Object value, final String pattern)
544 throws IllegalAccessException, InvocationTargetException {
545 LocaleBeanUtilsBean.getLocaleBeanUtilsInstance().setProperty(bean, name, value, pattern);
546 }
547
548 private LocaleBeanUtils() {
549 // empty
550 }
551 }