mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
Fix for issue 17, Fix JSON support for TimeZone
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user