package nebula.data.json; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import nebula.data.TypeAdapter; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonToken; import org.joda.time.DateTime; import org.joda.time.ReadableInstant; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; abstract class DefaultTypeAdapter<T> implements TypeAdapter<T, JsonParser, JsonGenerator> { public T readFrom(JsonParser in, int index) throws Exception { throw new UnsupportedOperationException("readFrom(JsonParser in,int index)"); } public void writeTo(int index, Object value, JsonGenerator gen) throws Exception { throw new UnsupportedOperationException("writeTo(int index, Object value,JsonGenerator gen)"); } } class BooleanJsonDataDealer extends DefaultTypeAdapter<Boolean> { public Boolean readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_TRUE || token == JsonToken.VALUE_FALSE; return parser.getValueAsBoolean(); } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeBoolean(value != null ? (Boolean) value : false); } } class LongJsonDataDealer extends DefaultTypeAdapter<Long> { public Long readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_NUMBER_INT; return parser.getLongValue(); } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeNumber(value != null ? (Long) value : 0L); } } class DecimalJsonDataDealer extends DefaultTypeAdapter<BigDecimal> { public BigDecimal readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_NUMBER_FLOAT; return parser.getDecimalValue(); } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeNumber(value != null ? (BigDecimal) value : new BigDecimal(0)); } } class StringJsonDataDealer extends DefaultTypeAdapter<String> { public String readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_STRING; return parser.getText(); } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeString(value != null ? (String) value : ""); } } class TextBlockJsonDataDealer extends DefaultTypeAdapter<String> { public String readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_STRING; return parser.getText(); } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeString(value != null ? (String) value : ""); } } class DateJsonDataDealer extends DefaultTypeAdapter<DateTime> { final DateTimeFormatter formater = DateTimeFormat.forPattern("yyyy-MM-dd"); public DateTime readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_STRING; return parser.getText().length() >= 10 ? formater.parseDateTime(parser.getText()) : null; } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeString(value != null ? formater.print((ReadableInstant)value) : ""); } } class TimeJsonDataDealer extends DefaultTypeAdapter<DateTime> { final DateTimeFormatter formaterHHMMSS = DateTimeFormat.forPattern("kk:mm:ss"); final DateTimeFormatter formaterHHMM = DateTimeFormat.forPattern("kk:mm"); final DateTimeFormatter formaterHH = DateTimeFormat.forPattern("kk"); public DateTime readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_STRING; String value = parser.getText(); int len = value.length(); if(len==8){ return formaterHHMMSS.parseDateTime(parser.getText()); }else if(len==5){ return formaterHHMM.parseDateTime(parser.getText()); }else if(len==2){ return formaterHH.parseDateTime(parser.getText()); }else if(len==1){ return formaterHH.parseDateTime(parser.getText()); }else { return null; } } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeString(value != null ? formaterHHMMSS.print((ReadableInstant)value) : ""); } } class DatetimeJsonDataDealer extends DefaultTypeAdapter<DateTime> { final DateTimeFormatter formater = DateTimeFormat.forPattern("yyyy-MM-dd kk:mm:ss"); public DateTime readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_STRING; return parser.getText().length() >= 19 ? formater.parseDateTime(parser.getText()) : null; } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeString(value != null ? formater.print((ReadableInstant)value) : ""); } } class TimestampJsonDataDealer extends DefaultTypeAdapter<Long> { final DateTimeFormatter formater = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS"); public Long readFrom(JsonParser parser, String name) throws Exception { JsonToken token = parser.getCurrentToken(); assert token == JsonToken.VALUE_STRING; return parser.getText().length() >= 22 ? formater.parseDateTime(parser.getText()).getMillis(): null; } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeString(value != null ? formater.print(new DateTime((Long)value)) : ""); } } class ListJsonDataDealer<T> extends DefaultTypeAdapter<List<T>> { final DefaultTypeAdapter<T> jsonFieldDealer; public ListJsonDataDealer(DefaultTypeAdapter<T> jsonFieldDealer) { this.jsonFieldDealer = jsonFieldDealer; } public List<T> readFrom(JsonParser parser, String name) throws Exception { List<T> vList = new ArrayList<T>(); JsonToken token; token = parser.getCurrentToken(); assert token == JsonToken.START_ARRAY; while ((token = parser.nextToken()) != JsonToken.END_ARRAY) { vList.add(jsonFieldDealer.readFrom(parser, name)); } assert token == JsonToken.END_ARRAY; return vList; } public void writeTo(String name, Object value, JsonGenerator gen) throws Exception { gen.writeStartArray(); @SuppressWarnings("unchecked") List<T> entityList = (List<T>) value; for (T entity : entityList) { jsonFieldDealer.writeTo(name, entity, gen); } gen.writeEndArray(); } }