package nebula.data.db.serializer; import java.math.BigDecimal; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.EnumMap; import java.util.List; import java.util.regex.Pattern; import nebula.lang.RawTypes; public abstract class ListTypeAdapter<T> extends BasicTypeAdapter<List<T>> { private static EnumMap<RawTypes, ListTypeAdapter<?>> typeMaps = new EnumMap<RawTypes, ListTypeAdapter<?>>(RawTypes.class); static { typeMaps.put(RawTypes.Boolean, new DbBooleanTypeAdapter()); typeMaps.put(RawTypes.Long, new DbLong_BigInt_TypeAdapter()); typeMaps.put(RawTypes.Decimal, new DbDecimalDealer()); typeMaps.put(RawTypes.String, new DbString_Varchar_TypeAdapter()); typeMaps.put(RawTypes.Text, new DbTextBlock_Varchar_TypeAdapter()); typeMaps.put(RawTypes.Date, new DbDateTypeAdapter()); typeMaps.put(RawTypes.Time, new DbTimeTypeAdapter()); typeMaps.put(RawTypes.Datetime, new DbTimestampTypeAdapter()); typeMaps.put(RawTypes.Timestamp, new DbTimestampTypeAdapter()); }; public static ListTypeAdapter<?> getAdapter(RawTypes rawType){ return typeMaps.get(rawType); } static class DbBooleanTypeAdapter extends ListTypeAdapter<Boolean> { @Override public List<Boolean> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<Boolean>(); String[] strValues = strValue.split(","); List<Boolean> values = new ArrayList<Boolean>(strValues.length); for (String v : strValues) { values.add(Boolean.parseBoolean(v)); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<Boolean> values = (List<Boolean>) value; StringBuilder sb = new StringBuilder(); for (Boolean v : values) { sb.append(v); sb.append(','); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 1)); } else { res.setString(index, ""); } } } static class DbLong_BigInt_TypeAdapter extends ListTypeAdapter<Long> { @Override public List<Long> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<Long>(); String[] strValues = strValue.split(","); List<Long> values = new ArrayList<Long>(strValues.length); for (String v : strValues) { values.add(Long.parseLong(v, 10)); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<Long> values = (List<Long>) value; StringBuilder sb = new StringBuilder(); for (Long v : values) { sb.append(v); sb.append(','); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 1)); } else { res.setString(index, ""); } } } static class DbDecimalDealer extends ListTypeAdapter<BigDecimal> { @Override public List<BigDecimal> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<BigDecimal>(); String[] strValues = strValue.split(","); List<BigDecimal> values = new ArrayList<BigDecimal>(strValues.length); for (String v : strValues) { values.add(new BigDecimal(v)); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<BigDecimal> values = (List<BigDecimal>) value; StringBuilder sb = new StringBuilder(); for (BigDecimal v : values) { sb.append(v); sb.append(','); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 1)); } else { res.setString(index, ""); } } } static class DbTextBlock_Varchar_TypeAdapter extends ListTypeAdapter<String> { Pattern sep = Pattern.compile("\\]\\]\\^\\~\\[\\["); @Override public List<String> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<String>(); String[] strValues = sep.split(strValue, 0); List<String> values = new ArrayList<String>(strValues.length); for (String v : strValues) { values.add(v); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<String> values = (List<String>) value; StringBuilder sb = new StringBuilder(); for (String v : values) { sb.append(v); sb.append("]]^~[["); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 6)); } else { res.setString(index, ""); } } } static class DbString_Varchar_TypeAdapter extends ListTypeAdapter<String> { Pattern sep = Pattern.compile("(\\]\\]\\^\\~\\[\\[)"); @Override public List<String> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<String>(); String[] strValues = sep.split(strValue, 0); List<String> values = new ArrayList<String>(strValues.length); for (String v : strValues) { values.add(v); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<String> values = (List<String>) value; StringBuilder sb = new StringBuilder(); for (String v : values) { sb.append(v); sb.append("]]^~[["); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 6)); } else { res.setString(index, ""); } } } static class DbDateTypeAdapter extends ListTypeAdapter<Date> { @Override public List<Date> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<Date>(); String[] strValues = strValue.split(","); List<Date> values = new ArrayList<Date>(strValues.length); for (String v : strValues) { if(v.length()==0 || "null".equals(v)){ values.add(null); }else{ values.add(Date.valueOf(v)); } } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<Date> values = (List<Date>) value; StringBuilder sb = new StringBuilder(); for (Date v : values) { if(v!=null){ sb.append(v); } sb.append(','); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 1)); } else { res.setString(index, ""); } } } static class DbTimeTypeAdapter extends ListTypeAdapter<Time> { @Override public List<Time> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<Time>(); String[] strValues = strValue.split(","); List<Time> values = new ArrayList<Time>(strValues.length); for (String v : strValues) { values.add(Time.valueOf(v)); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<Time> values = (List<Time>) value; StringBuilder sb = new StringBuilder(); for (Time v : values) { sb.append(v); sb.append(','); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 1)); } else { res.setString(index, ""); } } } static class DbDatetimeTypeAdapter extends ListTypeAdapter<Timestamp> { @Override public List<Timestamp> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<Timestamp>(); String[] strValues = strValue.split(","); List<Timestamp> values = new ArrayList<Timestamp>(strValues.length); for (String v : strValues) { values.add(Timestamp.valueOf(v)); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<Timestamp> values = (List<Timestamp>) value; StringBuilder sb = new StringBuilder(); for (Timestamp v : values) { sb.append(v); sb.append(','); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 1)); } else { res.setString(index, ""); } } } static class DbTimestampTypeAdapter extends ListTypeAdapter<Timestamp> { @Override public List<Timestamp> readFrom(ResultSet res, int index) throws Exception { String strValue = res.getString(index); if (strValue == null || strValue.length() == 0) return new ArrayList<Timestamp>(); String[] strValues = strValue.split(","); List<Timestamp> values = new ArrayList<Timestamp>(strValues.length); for (String v : strValues) { values.add(Timestamp.valueOf(v)); } return values; } @Override public void writeTo(int index, Object value, PreparedStatement res) throws Exception { if (value == null) { res.setString(index, ""); return; } @SuppressWarnings("unchecked") List<Timestamp> values = (List<Timestamp>) value; StringBuilder sb = new StringBuilder(); for (Timestamp v : values) { sb.append(v); sb.append(','); } if (sb.length() > 0) { res.setString(index, sb.substring(0, sb.length() - 1)); } else { res.setString(index, ""); } } } }