package io.trygvis.persistence; import io.trygvis.container.compiler.InternalErrorException; import java.lang.reflect.Field; import java.sql.Types; import static java.sql.Types.*; public abstract class TypeHandler { private final String sqlType; private final int type; protected TypeHandler(String sqlType, int type) { this.sqlType = sqlType; this.type = type; } abstract String setter(int i, String expr); abstract String getter(String rs, int i); public String sqlType(FieldMirror field) { return sqlType; } public int type() { return type; } public final String typeName() { try { int type = type(); for (Field field : Types.class.getFields()) { Object o = field.get(null); if (o != null && o instanceof Integer && o.equals(type)) { return field.getName(); } } } catch (IllegalAccessException e) { throw new InternalErrorException(e); } throw new InternalErrorException("Unknown java.sql.Types: " + type); } // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- public static class IntTypeHandler extends TypeHandler { public IntTypeHandler() { super("INTEGER", INTEGER); } @Override public String setter(int i, String expr) { return "setInt(" + i + ", " + expr + ")"; } @Override public String getter(String rs, int i) { return rs + ".getInt(" + i + ")"; } } public static class LongTypeHandler extends TypeHandler { protected LongTypeHandler() { super("BIGINT", BIGINT); } @Override public String setter(int i, String expr) { return "setLong(" + i + ", " + expr + ")"; } @Override public String getter(String rs, int i) { return rs + ".getLong(" + i + ")"; } } public static class StringTypeHandler extends TypeHandler { protected StringTypeHandler() { super(null, VARCHAR); } @Override public String setter(int i, String expr) { return "setString(" + i + ", " + expr + ")"; } @Override public String getter(String rs, int i) { return rs + ".getString(" + i + ")"; } @Override public String sqlType(FieldMirror field) { return "VARCHAR(1000)"; } } public static class DateTypeHandler extends TypeHandler { protected DateTypeHandler() { super("TIMESTAMP", TIMESTAMP); } @Override public String setter(int i, String expr) { return "setTimestamp(" + i + ", new java.sql.Timestamp(" + expr + ".getTime()))"; } @Override public String getter(String rs, int i) { return "new java.util.Date(" + rs + ".getTimestamp(" + i + ").getTime())"; } } }