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 }