1
2
3
4
5
6 package org.rcfaces.core.internal.util;
7
8 import java.text.DateFormat;
9 import java.text.ParseException;
10 import java.util.Arrays;
11 import java.util.Date;
12 import java.util.HashMap;
13 import java.util.Map;
14
15 import javax.faces.FacesException;
16 import javax.faces.context.FacesContext;
17
18 import org.rcfaces.core.internal.RcfacesContext;
19 import org.rcfaces.core.internal.adapter.IAdapterManager;
20 import org.rcfaces.core.internal.converter.LocaleConverter;
21 import org.rcfaces.core.internal.converter.TimeZoneConverter;
22 import org.rcfaces.core.lang.IAdaptable;
23
24
25
26
27
28
29
30 public final class Convertor {
31 private static final String REVISION = "$Revision: 1.18 $";
32
33
34
35
36 private static boolean logConvertor = false;
37
38 private static void log(String message, Throwable th) {
39 FacesContext facesContext = FacesContext.getCurrentInstance();
40
41 facesContext.getExternalContext().log(message, th);
42 }
43
44 public static Object convert(Object data, Class classRequested)
45 throws FacesException {
46
47 if (classRequested == null) {
48 return data;
49 }
50 if (data == null) {
51 if (classRequested.isPrimitive() == false) {
52 return null;
53 }
54
55 ClassConvertor cv = (ClassConvertor) classConvertors
56 .get(classRequested);
57 if (cv != null) {
58 return cv.getNullValue();
59 }
60
61 throw new FacesException("Can not convert primitive class '"
62 + classRequested.getName() + "' (value=null) to class '"
63 + classRequested.getName() + "'.", null);
64 }
65
66 Class cl = data.getClass();
67 if (cl == classRequested || classRequested.isAssignableFrom(cl)) {
68 return data;
69 }
70
71 if (cl.equals(String.class)) {
72 Callback Callback = (Callback) callbacksFromString
73 .get(classRequested);
74 if (Callback != null) {
75 return Callback.convert(data);
76 }
77 }
78
79 ClassConvertor cv = (ClassConvertor) classConvertors
80 .get(classRequested);
81 if (cv != null) {
82 Object ret = cv.convert(cl, data);
83
84 if (ret != null) {
85 return ret;
86 }
87 }
88
89 if (data instanceof IAdaptable) {
90 Object ret = ((IAdaptable) data).getAdapter(classRequested, null);
91 if (ret != null) {
92 return ret;
93 }
94 }
95
96 IAdapterManager adapterManager = RcfacesContext.getCurrentInstance()
97 .getAdapterManager();
98
99 if (adapterManager != null) {
100 Object ret = adapterManager.getAdapter(data, classRequested, null);
101 if (ret != null) {
102 return ret;
103 }
104 }
105
106 throw new FacesException("Can not convert class '" + cl.getName()
107 + "' to class '" + classRequested.getName() + "' value='"
108 + data + "'", null);
109 }
110
111 private interface ClassConvertor {
112 Object convert(Class cl, Object data);
113
114 Object getNullValue();
115 }
116
117 private interface Callback {
118 public Object convert(Object toConvert);
119 }
120
121 private static final ClassConvertor TO_INTEGER = new ClassConvertor() {
122 private static final String REVISION = "$Revision: 1.18 $";
123
124 private final Object DEFAULT_INTEGER = new Integer(0);
125
126 public Object convert(Class cl, Object data) {
127 if (cl.equals(Integer.class) || cl.equals(Integer.TYPE)) {
128 return data;
129 }
130
131 if (cl.isAssignableFrom(Number.class)) {
132 return new Integer(((Number) data).intValue());
133 }
134
135 return null;
136 }
137
138 public Object getNullValue() {
139 return DEFAULT_INTEGER;
140 }
141 };
142
143 private static final ClassConvertor TO_LONG = new ClassConvertor() {
144 private static final String REVISION = "$Revision: 1.18 $";
145
146 private final Object DEFAULT_LONG = new Long(0);
147
148 public Object convert(Class cl, Object data) {
149 if (cl.equals(Long.class) || cl.equals(Long.TYPE)) {
150 return data;
151 }
152
153 if (cl.isAssignableFrom(Number.class)) {
154 return new Long(((Number) data).longValue());
155 }
156
157 return null;
158 }
159
160 public Object getNullValue() {
161 return DEFAULT_LONG;
162 }
163 };
164
165 private static final ClassConvertor TO_DOUBLE = new ClassConvertor() {
166 private static final String REVISION = "$Revision: 1.18 $";
167
168 private final Object DEFAULT_DOUBLE = new Double(0);
169
170 public Object convert(Class cl, Object data) {
171 if (cl.equals(Double.class) || cl.equals(Double.TYPE)) {
172 return data;
173 }
174
175 if (cl.isAssignableFrom(Number.class)) {
176 return new Double(((Number) data).doubleValue());
177 }
178
179 return null;
180 }
181
182 public Object getNullValue() {
183 return DEFAULT_DOUBLE;
184 }
185 };
186
187 private static final ClassConvertor TO_FLOAT = new ClassConvertor() {
188 private static final String REVISION = "$Revision: 1.18 $";
189
190 private final Object DEFAULT_FLOAT = new Float(0);
191
192 public Object convert(Class cl, Object data) {
193 if (cl.equals(Float.class) || cl.equals(Float.TYPE)) {
194 return data;
195 }
196
197 if (cl.isAssignableFrom(Number.class)) {
198 return new Float(((Number) data).floatValue());
199 }
200
201 return null;
202 }
203
204 public Object getNullValue() {
205 return DEFAULT_FLOAT;
206 }
207 };
208
209 private static final ClassConvertor TO_SHORT = new ClassConvertor() {
210 private static final String REVISION = "$Revision: 1.18 $";
211
212 private final Object DEFAULT_SHORT = new Short((short) 0);
213
214 public Object convert(Class cl, Object data) {
215 if (cl.equals(Short.class) || cl.equals(Short.TYPE)) {
216 return data;
217 }
218
219 if (cl.isAssignableFrom(Number.class)) {
220 return new Short(((Number) data).shortValue());
221 }
222
223 return null;
224 }
225
226 public Object getNullValue() {
227 return DEFAULT_SHORT;
228 }
229 };
230
231 private static final ClassConvertor TO_BYTE = new ClassConvertor() {
232 private static final String REVISION = "$Revision: 1.18 $";
233
234 private final Object DEFAULT_BYTE = new Byte((byte) 0);
235
236 public Object convert(Class cl, Object data) {
237 if (cl.equals(Byte.class) || cl.equals(Byte.TYPE)) {
238 return data;
239 }
240
241 if (cl.isAssignableFrom(Number.class)) {
242 return new Short(((Number) data).byteValue());
243 }
244
245 return null;
246 }
247
248 public Object getNullValue() {
249 return DEFAULT_BYTE;
250 }
251 };
252
253 private static final ClassConvertor TO_BOOLEAN = new ClassConvertor() {
254 private static final String REVISION = "$Revision: 1.18 $";
255
256 private final Object DEFAULT_BOOLEAN = Boolean.FALSE;
257
258 public Object convert(Class cl, Object data) {
259 if (cl.equals(Boolean.class) || cl.equals(Boolean.TYPE)) {
260 return data;
261 }
262
263 if (cl.isAssignableFrom(Number.class)) {
264 if (((Number) data).intValue() == 0) {
265 return Boolean.FALSE;
266 }
267
268 return Boolean.TRUE;
269 }
270
271 return null;
272 }
273
274 public Object getNullValue() {
275 return DEFAULT_BOOLEAN;
276 }
277 };
278
279 private static final ClassConvertor TO_STRING = new ClassConvertor() {
280 private static final String REVISION = "$Revision: 1.18 $";
281
282 public Object convert(Class cl, Object data) {
283 Callback Callback = (Callback) callbacksToString.get(cl);
284 if (Callback != null) {
285 return Callback.convert(data);
286 }
287
288 return String.valueOf(data);
289 }
290
291 public Object getNullValue() {
292 return null;
293 }
294 };
295
296 private static final ClassConvertor TO_LIST = new ClassConvertor() {
297 private static final String REVISION = "$Revision: 1.18 $";
298
299 public Object convert(Class cl, Object data) {
300
301 if (cl.isArray()) {
302 return Arrays.asList((Object[]) data);
303 }
304
305 return null;
306 }
307
308 public Object getNullValue() {
309 return null;
310 }
311 };
312
313 private static final Callback String_to_integer = new Callback() {
314 private static final String REVISION = "$Revision: 1.18 $";
315
316 public Object convert(Object integer) {
317 return new Integer((String) integer);
318 }
319 };
320
321 private static final Callback String_to_short = new Callback() {
322 private static final String REVISION = "$Revision: 1.18 $";
323
324 public Object convert(Object integer) {
325 return new Short((String) integer);
326 }
327 };
328
329 private static final Callback String_to_long = new Callback() {
330 private static final String REVISION = "$Revision: 1.18 $";
331
332 public Object convert(Object integer) {
333 return new Long((String) integer);
334 }
335 };
336
337 private static final Callback String_to_float = new Callback() {
338 private static final String REVISION = "$Revision: 1.18 $";
339
340 public Object convert(Object integer) {
341 return new Float((String) integer);
342 }
343 };
344
345 private static final Callback String_to_double = new Callback() {
346 private static final String REVISION = "$Revision: 1.18 $";
347
348 public Object convert(Object integer) {
349 return new Double((String) integer);
350 }
351 };
352
353 private static final Callback String_to_byte = new Callback() {
354 private static final String REVISION = "$Revision: 1.18 $";
355
356 public Object convert(Object integer) {
357 return new Byte((String) integer);
358 }
359 };
360
361 private static final Callback String_to_boolean = new Callback() {
362 private static final String REVISION = "$Revision: 1.18 $";
363
364 public Object convert(Object bool) {
365 return Boolean.valueOf((String) bool);
366 }
367 };
368
369 private static final Callback String_to_Date = new Callback() {
370 private static final String REVISION = "$Revision: 1.18 $";
371
372 public Object convert(Object toConvert) {
373 String d = ((String) toConvert).trim();
374 if (d.length() < 1) {
375 return null;
376 }
377
378 DateFormat dateFormat = DateFormat
379 .getDateInstance(DateFormat.SHORT);
380
381 try {
382 toConvert = dateFormat.parse((String) toConvert);
383 if (logConvertor) {
384 log(
385 "Camelia.Convertor:CONVERT '" + d + "' => "
386 + toConvert, null);
387 }
388
389 return toConvert;
390 } catch (ParseException e) {
391 log("Camelia.Convertor:Error parsing date '" + d + "'", e);
392 return null;
393 }
394 }
395 };
396
397 private static final Callback String_to_Locale = new Callback() {
398 private static final String REVISION = "$Revision: 1.18 $";
399
400 public Object convert(Object toConvert) {
401 String d = ((String) toConvert).trim();
402 if (d.length() < 1) {
403 return null;
404 }
405
406 return LocaleConverter.SINGLETON.getAsObject(null, null,
407 (String) toConvert);
408 }
409 };
410
411 private static final Callback String_to_TimeZone = new Callback() {
412 private static final String REVISION = "$Revision: 1.18 $";
413
414 public Object convert(Object toConvert) {
415 String d = ((String) toConvert).trim();
416 if (d.length() < 1) {
417 return null;
418 }
419
420 return TimeZoneConverter.SINGLETON.getAsObject(null, null,
421 (String) toConvert);
422 }
423 };
424
425 private static final Callback integer_to_String = new Callback() {
426 private static final String REVISION = "$Revision: 1.18 $";
427
428 public Object convert(Object integer) {
429 return String.valueOf(integer);
430 }
431 };
432
433 private static final Callback short_to_String = new Callback() {
434 private static final String REVISION = "$Revision: 1.18 $";
435
436 public Object convert(Object integer) {
437 return String.valueOf(integer);
438 }
439 };
440
441 private static final Callback long_to_String = new Callback() {
442 private static final String REVISION = "$Revision: 1.18 $";
443
444 public Object convert(Object integer) {
445 return String.valueOf(integer);
446 }
447 };
448
449 private static final Callback float_to_String = new Callback() {
450 private static final String REVISION = "$Revision: 1.18 $";
451
452 public Object convert(Object integer) {
453 return String.valueOf(integer);
454 }
455 };
456
457 private static final Callback double_to_String = new Callback() {
458 private static final String REVISION = "$Revision: 1.18 $";
459
460 public Object convert(Object integer) {
461 return String.valueOf(integer);
462 }
463 };
464
465 private static final Callback byte_to_String = new Callback() {
466 private static final String REVISION = "$Revision: 1.18 $";
467
468 public Object convert(Object integer) {
469 return String.valueOf(integer);
470 }
471 };
472
473 private static final Callback boolean_to_String = new Callback() {
474 private static final String REVISION = "$Revision: 1.18 $";
475
476 public Object convert(Object bool) {
477 return String.valueOf(bool);
478 }
479 };
480
481 private static final Callback Date_to_String = new Callback() {
482 private static final String REVISION = "$Revision: 1.18 $";
483
484 public Object convert(Object toConvert) {
485 Date d = (Date) toConvert;
486
487 DateFormat dateFormat = DateFormat
488 .getDateInstance(DateFormat.SHORT);
489
490 toConvert = dateFormat.format(d);
491 if (logConvertor) {
492 log("Convertor: CONVERT '" + d + "' => " + toConvert, null);
493 }
494 return toConvert;
495 }
496 };
497
498 private static final Callback Locale_to_String = new Callback() {
499 private static final String REVISION = "$Revision: 1.18 $";
500
501 public Object convert(Object toConvert) {
502 return LocaleConverter.SINGLETON.getAsString(null, null, toConvert);
503 }
504 };
505
506 private static final Callback TimeZone_to_String = new Callback() {
507 private static final String REVISION = "$Revision: 1.18 $";
508
509 public Object convert(Object toConvert) {
510 return TimeZoneConverter.SINGLETON.getAsString(null, null,
511 toConvert);
512 }
513 };
514
515 private static final Map callbacksToString = new HashMap(32);
516
517 private static final Map classConvertors = new HashMap(32);
518
519 private static final Map callbacksFromString = new HashMap(32);
520
521 static {
522 callbacksToString.put(Short.TYPE, short_to_String);
523 callbacksToString.put(Short.class, short_to_String);
524 callbacksToString.put(Integer.TYPE, integer_to_String);
525 callbacksToString.put(Integer.class, integer_to_String);
526 callbacksToString.put(Long.TYPE, long_to_String);
527 callbacksToString.put(Long.class, long_to_String);
528 callbacksToString.put(Double.TYPE, double_to_String);
529 callbacksToString.put(Double.class, double_to_String);
530 callbacksToString.put(Float.TYPE, float_to_String);
531 callbacksToString.put(Float.class, float_to_String);
532 callbacksToString.put(Byte.TYPE, byte_to_String);
533 callbacksToString.put(Byte.class, byte_to_String);
534 callbacksToString.put(Boolean.TYPE, boolean_to_String);
535 callbacksToString.put(Boolean.class, boolean_to_String);
536 callbacksToString.put(java.util.Date.class, Date_to_String);
537 callbacksToString.put(java.util.Locale.class, Locale_to_String);
538 callbacksToString.put(java.util.TimeZone.class, TimeZone_to_String);
539
540 callbacksFromString.put(Integer.TYPE, String_to_integer);
541 callbacksFromString.put(Integer.class, String_to_integer);
542 callbacksFromString.put(Short.TYPE, String_to_short);
543 callbacksFromString.put(Short.class, String_to_short);
544 callbacksFromString.put(Long.TYPE, String_to_long);
545 callbacksFromString.put(Long.class, String_to_long);
546 callbacksFromString.put(Double.TYPE, String_to_double);
547 callbacksFromString.put(Double.class, String_to_double);
548 callbacksFromString.put(Float.TYPE, String_to_float);
549 callbacksFromString.put(Float.class, String_to_float);
550 callbacksFromString.put(Byte.TYPE, String_to_byte);
551 callbacksFromString.put(Byte.class, String_to_byte);
552 callbacksFromString.put(Boolean.TYPE, String_to_boolean);
553 callbacksFromString.put(Boolean.class, String_to_boolean);
554 callbacksFromString.put(java.util.Date.class, String_to_Date);
555 callbacksFromString.put(java.util.Locale.class, String_to_Locale);
556 callbacksFromString.put(java.util.TimeZone.class, String_to_TimeZone);
557
558 classConvertors.put(Double.class, TO_DOUBLE);
559 classConvertors.put(Double.TYPE, TO_DOUBLE);
560
561 classConvertors.put(Float.class, TO_FLOAT);
562 classConvertors.put(Float.TYPE, TO_FLOAT);
563
564 classConvertors.put(Long.class, TO_LONG);
565 classConvertors.put(Long.TYPE, TO_LONG);
566
567 classConvertors.put(Integer.class, TO_INTEGER);
568 classConvertors.put(Integer.TYPE, TO_INTEGER);
569
570 classConvertors.put(Short.class, TO_SHORT);
571 classConvertors.put(Short.TYPE, TO_SHORT);
572
573 classConvertors.put(Byte.class, TO_BYTE);
574 classConvertors.put(Byte.TYPE, TO_BYTE);
575
576 classConvertors.put(Boolean.class, TO_BOOLEAN);
577 classConvertors.put(Boolean.TYPE, TO_BOOLEAN);
578
579 classConvertors.put(String.class, TO_STRING);
580
581 classConvertors.put(java.util.List.class, TO_LIST);
582 }
583 }