package com.w11k.lsql.converter;
import com.google.common.collect.Maps;
import com.w11k.lsql.utils.SqlTypesNames;
import java.util.Map;
import static com.w11k.lsql.utils.JavaClassUtils.convertPrimitiveClassToWrapperClass;
public class ConverterRegistry {
private static class JavaSqlTypePair {
private final Class<?> clazz;
private final int sqlType;
public JavaSqlTypePair(Class<?> clazz, int sqlType) {
this.clazz = clazz;
this.sqlType = sqlType;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
JavaSqlTypePair that = (JavaSqlTypePair) o;
return this.sqlType == that.sqlType && this.clazz.equals(that.clazz);
}
@Override
public int hashCode() {
int result = this.clazz.hashCode();
result = 31 * result + this.sqlType;
return result;
}
@Override
public String toString() {
return "JavaSqlTypePair{" +
"clazz=" + this.clazz +
", sqlType=" + this.sqlType +
'}';
}
}
private final Map<Class<?>, Converter> defaultJavaToSqlConverters = Maps.newHashMap();
private final Map<Integer, Converter> defaultSqlToJavaConverters = Maps.newHashMap();
private final Map<JavaSqlTypePair, Converter> javaAndSqlTypePairConverters = Maps.newHashMap();
public Converter getConverterForSqlType(int sqlType) {
Converter converter = this.defaultSqlToJavaConverters.get(sqlType);
if (converter != null) {
return converter;
}
String msg = "No converter for SQL type '" + SqlTypesNames.getName(sqlType) + "'. ";
throw new IllegalArgumentException(msg);
}
public Converter getConverterForJavaType(Class<?> clazz) {
clazz = convertPrimitiveClassToWrapperClass(clazz);
Converter converter = this.defaultJavaToSqlConverters.get(clazz);
if (converter != null) {
return converter;
}
String msg = "No converter for Java type '" + clazz + "'. ";
throw new IllegalArgumentException(msg);
}
public void addConverter(Converter converter) {
for (int sqlType : converter.getSqlTypes()) {
this.defaultSqlToJavaConverters.put(sqlType, converter);
this.javaAndSqlTypePairConverters.put(
new JavaSqlTypePair(converter.getJavaType(), sqlType),
converter
);
}
this.defaultJavaToSqlConverters.put(converter.getJavaType(), converter);
}
}