1 package org.weda.converter.impl;
2
3 import java.sql.Time;
4 import java.sql.Timestamp;
5 import java.text.ParseException;
6 import java.text.SimpleDateFormat;
7 import java.util.Date;
8 import java.util.HashMap;
9 import java.util.Map;
10 import org.weda.converter.ValueTypeConverter;
11 import org.weda.converter.ValueTypeConverterException;
12
13 /**Цель: преобразование строки к дате и наооборот
14 *
15 * @author tim
16 */
17 public class DateConverter extends AbstractConverter {
18 private final static ThreadLocal formatters =
19 new ThreadLocal(){
20 protected Object initialValue(){
21 return new HashMap();
22 }
23 };
24
25 public Object convert(Class toType, Object value, String pattern)
26 throws ValueTypeConverterException
27 {
28 if (String.class.equals(toType) && value instanceof Date){
29 if (pattern==null)
30 return value.toString();
31 else{
32 SimpleDateFormat formatter = getFormatter(pattern);
33 return formatter.format(value);
34 }
35 }else if ( Date.class.isAssignableFrom(toType)
36 && value instanceof String)
37 {
38 try{
39 Date date = getFormatter(pattern).parse((String)value);
40 if (Date.class.equals(toType)){
41 return date;
42 }else if (Timestamp.class.equals(toType)){
43 return new Timestamp(date.getTime());
44 }else if (java.sql.Date.class.equals(toType)){
45 return new java.sql.Date(date.getTime());
46 }else if (Time.class.equals(toType)){
47 return new Time(date.getTime()%86400000);
48 }else
49 throw new ValueTypeConverterException(
50 getMessages().format(
51 "UnknownDateType"
52 , date.getClass().getName()));
53 }catch(ParseException e){
54 throw new ValueTypeConverterException(
55 getMessages().format(
56 "ConversionError"
57 , value, toType.getName(), pattern==null?"":pattern)
58 , e);
59 }
60 }else
61 throw new ValueTypeConverterException(
62 getMessages().format(
63 "UnknownToType"
64 , toType.getName(), value.getClass().getName()));
65 }
66
67 private final static SimpleDateFormat getFormatter(String pattern) {
68 SimpleDateFormat formatter =
69 (SimpleDateFormat)((Map)formatters.get()).get(pattern);
70 if (formatter==null){
71 if (pattern==null)
72 formatter = new SimpleDateFormat();
73 else
74 formatter = new SimpleDateFormat(pattern);
75 ((Map)formatters.get()).put(pattern, formatter);
76 }
77 return formatter;
78 }
79
80
81 }