Fix for issue 17, Fix JSON support for TimeZone

This commit is contained in:
Robin Bygrave
2013-04-24 00:08:25 +12:00
parent 5761816fc9
commit 85f3a8987d
9 changed files with 345 additions and 122 deletions
@@ -3,10 +3,18 @@ package com.avaje.ebeaninternal.server.type;
import java.io.IOException;
import com.avaje.ebean.text.TextException;
import com.avaje.ebean.util.StringHelper;
import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer;
public class EscapeJson {
/**
* Unescape the JSON escaped slash character.
*/
public static String unescapeSlash(String value) {
return StringHelper.replaceString(value, "\\/","/");
}
/**
* Escape and quote the string value.
*/
@@ -11,110 +11,108 @@ import com.avaje.ebean.text.json.JsonValueAdapter;
import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer;
/**
* Base ScalarType for types which converts to and from a VARCHAR database column.
* Base ScalarType for types which converts to and from a VARCHAR database
* column.
*/
public abstract class ScalarTypeBaseVarchar<T> extends ScalarTypeBase<T> {
public ScalarTypeBaseVarchar(Class<T> type) {
super(type, false, Types.VARCHAR);
}
public ScalarTypeBaseVarchar(Class<T> type, boolean jdbcNative, int jdbcType) {
super(type, jdbcNative, jdbcType);
}
public ScalarTypeBaseVarchar(Class<T> type) {
super(type, false, Types.VARCHAR);
}
public abstract String formatValue(T v);
public abstract T parse(String value);
public abstract T convertFromDbString(String dbValue);
public abstract String convertToDbString(T beanValue);
public void bind(DataBind b, T value) throws SQLException {
if (value == null){
b.setNull(Types.VARCHAR);
} else {
String s = convertToDbString(value);
b.setString(s);
}
}
public ScalarTypeBaseVarchar(Class<T> type, boolean jdbcNative, int jdbcType) {
super(type, jdbcNative, jdbcType);
}
public T read(DataReader dataReader) throws SQLException {
String s = dataReader.getString();
if (s == null){
return null;
} else {
return convertFromDbString(s);
}
}
@SuppressWarnings("unchecked")
public T toBeanType(Object value) {
if (value == null){
return null;
}
if (value instanceof String){
return parse((String)value);
}
return (T)value;
}
public Object toJdbcType(Object value){
if (value instanceof String){
return parse((String)value);
}
return value;
}
public T parseDateTime(long systemTimeMillis) {
throw new TextException("Not Supported");
}
public boolean isDateTimeCapable() {
return false;
}
@SuppressWarnings("unchecked")
public String format(Object v) {
return formatValue((T) v);
}
public T jsonFromString(String value, JsonValueAdapter ctx) {
return parse(value);
}
public abstract String formatValue(T v);
@Override
public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx) {
String s = format(value);
EscapeJson.escapeQuote(s, buffer);
}
public abstract T parse(String value);
public String toJsonString(Object value, JsonValueAdapter ctx) {
String s = format(value);
return EscapeJson.escapeQuote(s);
}
public Object readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
String val = dataInput.readUTF();
return convertFromDbString(val);
}
}
public abstract T convertFromDbString(String dbValue);
@SuppressWarnings("unchecked")
public void writeData(DataOutput dataOutput, Object v) throws IOException {
T value = (T)v;
if (value == null){
dataOutput.writeBoolean(false);
} else {
dataOutput.writeBoolean(true);
String s = convertToDbString(value);
dataOutput.writeUTF(s);
}
public abstract String convertToDbString(T beanValue);
public void bind(DataBind b, T value) throws SQLException {
if (value == null) {
b.setNull(Types.VARCHAR);
} else {
b.setString(convertToDbString(value));
}
}
public T read(DataReader dataReader) throws SQLException {
String s = dataReader.getString();
if (s == null) {
return null;
} else {
return convertFromDbString(s);
}
}
@SuppressWarnings("unchecked")
public T toBeanType(Object value) {
if (value == null) {
return null;
}
if (value instanceof String) {
return parse((String) value);
}
return (T) value;
}
public Object toJdbcType(Object value) {
if (value instanceof String) {
return parse((String) value);
}
return value;
}
public T parseDateTime(long systemTimeMillis) {
throw new TextException("Not Supported");
}
public boolean isDateTimeCapable() {
return false;
}
@SuppressWarnings("unchecked")
public String format(Object v) {
return formatValue((T) v);
}
public T jsonFromString(String value, JsonValueAdapter ctx) {
return parse(EscapeJson.unescapeSlash(value));
}
public String toJsonString(Object value, JsonValueAdapter ctx) {
return EscapeJson.escapeQuote(format(value));
}
@Override
public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx) {
EscapeJson.escapeQuote(format(value), buffer);
}
public Object readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
String val = dataInput.readUTF();
return convertFromDbString(val);
}
}
@SuppressWarnings("unchecked")
public void writeData(DataOutput dataOutput, Object v) throws IOException {
T value = (T) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
dataOutput.writeBoolean(true);
String s = convertToDbString(value);
dataOutput.writeUTF(s);
}
}
}
@@ -3,35 +3,36 @@ package com.avaje.ebeaninternal.server.type;
import java.util.TimeZone;
/**
* ScalarType for java.util.TimeZone which converts to and from a VARCHAR database column.
* ScalarType for java.util.TimeZone which converts to and from a VARCHAR
* database column.
*/
public class ScalarTypeTimeZone extends ScalarTypeBaseVarchar<TimeZone> {
public ScalarTypeTimeZone() {
super(TimeZone.class);
}
@Override
public int getLength() {
return 20;
}
@Override
public TimeZone convertFromDbString(String dbValue) {
return TimeZone.getTimeZone(dbValue);
}
public ScalarTypeTimeZone() {
super(TimeZone.class);
}
@Override
public String convertToDbString(TimeZone beanValue) {
return ((TimeZone)beanValue).getID();
}
@Override
public int getLength() {
return 20;
}
public String formatValue(TimeZone v) {
return v.toString();
}
@Override
public TimeZone convertFromDbString(String dbValue) {
return TimeZone.getTimeZone(dbValue);
}
@Override
public String convertToDbString(TimeZone beanValue) {
return ((TimeZone) beanValue).getID();
}
public String formatValue(TimeZone v) {
return v.getID();
}
public TimeZone parse(String value) {
return TimeZone.getTimeZone(value);
}
public TimeZone parse(String value) {
return TimeZone.getTimeZone(value);
}
}