package jef.tools.csvreader;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import jef.tools.IOUtils;
import jef.tools.support.JefBase64;
public class Codecs {
private Codecs(){
}
private static final Map<Type,Codec<?>> CACHE=new HashMap<Type,Codec<?>>();
static{
init();
}
private static Codec<String> STRING=new Codec<String>(){
public String toString(String t) {
return t;
}
public String fromString(String s) {
return s;
}
};
private static Codec<Integer> I=new Codec<Integer>(){
public String toString(Integer t) {
return String.valueOf(t);
}
public Integer fromString(String s) {
if(s==null||s.length()==0)return 0;
return Integer.parseInt(s);
}
};
private static Codec<Boolean> Z=new Codec<Boolean>(){
public String toString(Boolean t) {
return String.valueOf(t);
}
public Boolean fromString(String s) {
if(s==null||s.length()==0)return false;
return Boolean.parseBoolean(s);
}
};
private static Codec<Byte> B=new Codec<Byte>(){
public String toString(Byte t) {
return String.valueOf(t);
}
public Byte fromString(String s) {
if(s==null||s.length()==0)return 0;
return Byte.parseByte(s);
}
};
private static Codec<Short> S=new Codec<Short>(){
public String toString(Short t) {
return String.valueOf(t);
}
public Short fromString(String s) {
if(s==null||s.length()==0)return 0;
return Short.parseShort(s);
}
};
private static Codec<Double> D=new Codec<Double>(){
public String toString(Double t) {
return String.valueOf(t);
}
public Double fromString(String s) {
if(s==null||s.length()==0)return 0D;
return Double.parseDouble(s);
}
};
private static Codec<Long> L=new Codec<Long>(){
public String toString(Long t) {
return String.valueOf(t);
}
public Long fromString(String s) {
if(s==null||s.length()==0)return 0L;
return Long.parseLong(s);
}
};
private static Codec<Float> F=new Codec<Float>(){
public String toString(Float t) {
return String.valueOf(t);
}
public Float fromString(String s) {
if(s==null||s.length()==0)return 0F;
return Float.parseFloat(s);
}
};
private static Codec<Character> C=new Codec<Character>(){
public String toString(Character t) {
return String.valueOf(t);
}
public Character fromString(String s) {
if(s==null||s.length()==0)return 0;
return s.charAt(0);
}
};
private static Codec<Date> uDate=new Codec<Date>(){
public String toString(Date t) {
if(t==null)return "";
return String.valueOf(t.getTime());
}
public Date fromString(String s) {
if(s==null||s.length()==0)return null;
return new Date(Long.parseLong(s));
}
};
private static Codec<java.sql.Date> sDate=new Codec<java.sql.Date>(){
public String toString(java.sql.Date t) {
if(t==null)return "";
return String.valueOf(t.getTime());
}
public java.sql.Date fromString(String s) {
if(s==null||s.length()==0)return null;
return new java.sql.Date(Long.parseLong(s));
}
};
private static Codec<java.sql.Time> sTime=new Codec<java.sql.Time>(){
public String toString(java.sql.Time t) {
if(t==null)return "";
return String.valueOf(t.getTime());
}
public java.sql.Time fromString(String s) {
if(s==null||s.length()==0)return null;
return new java.sql.Time(Long.parseLong(s));
}
};
private static Codec<Timestamp> TIMESTAMP=new Codec<Timestamp>(){
public String toString(Timestamp t) {
if(t==null)return "";
return String.valueOf(t.getTime());
}
public Timestamp fromString(String s) {
if(s==null||s.length()==0)return null;
return new Timestamp(Long.parseLong(s));
}
};
private static Codec<byte[]> BIN=new Codec<byte[]>(){
public String toString(byte[] t) {
if(t==null)return "";
return JefBase64.encode(t);
}
public byte[] fromString(String s) {
if(s==null||s.length()==0)return null;
return JefBase64.decodeFast(s);
}
};
private static Codec<Serializable> OTHER=new Codec<Serializable>(){
public String toString(Serializable t) {
return JefBase64.encode(IOUtils.saveObject(t));
}
public Serializable fromString(String s) {
if(s==null||s.length()==0)return null;
return (Serializable) IOUtils.loadObject(JefBase64.decodeFast(s));
}
};
private static void init() {
CACHE.put(String.class, STRING);
CACHE.put(Integer.class, I);
CACHE.put(Integer.TYPE, I);
CACHE.put(Short.class, S);
CACHE.put(Short.TYPE, S);
CACHE.put(Long.class, L);
CACHE.put(Long.TYPE, L);
CACHE.put(Float.class, F);
CACHE.put(Float.TYPE, F);
CACHE.put(Double.class, D);
CACHE.put(Double.TYPE, D);
CACHE.put(Character.class, C);
CACHE.put(Character.TYPE, C);
CACHE.put(Byte.class, B);
CACHE.put(Byte.TYPE, B);
CACHE.put(Boolean.class, Z);
CACHE.put(Boolean.TYPE, Z);
CACHE.put(Byte[].class, BIN);
CACHE.put(Date.class, uDate);
CACHE.put(java.sql.Date.class, sDate);
CACHE.put(java.sql.Time.class, sTime);
CACHE.put(java.sql.Timestamp.class, TIMESTAMP);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static String toString(Object obj,Type type){
if(type instanceof Class<?>){
Class<?> clz=(Class<?>) type;
if(clz.isEnum()){
return ((Enum<?>)obj).name();
}
}
Codec codec=CACHE.get(type);
if(codec==null){
return OTHER.toString((Serializable) obj);
// throw new UnsupportedOperationException("Object to String error, type "+type+" was not supported.");
}
return codec.toString(obj);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Object fromString(String s,Type type){
if(type instanceof Class<?>){
Class<?> clz=(Class<?>) type;
if(clz.isEnum()){
return Enum.valueOf(clz.asSubclass(Enum.class), s);
}
}
Codec codec=CACHE.get(type);
if(codec==null){
return OTHER.fromString(s);
// throw new UnsupportedOperationException("Object to String error, type "+type+" was not supported.");
}
return codec.fromString(s);
}
}