View Javadoc

1   /*
2    * $Id: Convertor.java,v 1.18 2011/06/16 09:29:41 jbmeslin Exp $
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   * Classe de conversion de certains types/objets java en d'autres ...
26   * 
27   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
28   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
29   */
30  public final class Convertor {
31      private static final String REVISION = "$Revision: 1.18 $";
32  
33      // private static final DateFormat dateFormat = new
34      // SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH);
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 }