#585 - Refactor of ScalarType jsonWrite() method such that it only takes JsonGenerator - part 3, remove JsonToken from jsonRead()

This commit is contained in:
Robin Bygrave
2016-03-03 21:06:09 +13:00
parent a4f0e3936a
commit c315067ff0
37 changed files with 108 additions and 50 deletions
@@ -1262,7 +1262,7 @@ public class BeanProperty implements ElPropertyValue, Property {
// expect to read non-null json value
Object objValue;
if (scalarType != null) {
objValue = scalarType.jsonRead(ctx.getParser(), event);
objValue = scalarType.jsonRead(ctx.getParser());
} else {
try {
objValue = ctx.readValueUsingObjectMapper(propertyType);
@@ -5,7 +5,6 @@ import com.avaje.ebean.text.StringParser;
import com.avaje.ebeanservice.docstore.api.mapping.DocPropertyType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.DataInput;
import java.io.DataOutput;
@@ -203,7 +202,7 @@ public interface ScalarType<T> extends StringParser, StringFormatter, ScalarData
/**
* Read the value from JsonParser.
*/
T jsonRead(JsonParser parser, JsonToken event) throws IOException;
T jsonRead(JsonParser parser) throws IOException;
/**
* Write the value to the JsonGenerator.
@@ -70,8 +70,8 @@ public abstract class ScalarTypeBaseDate<T> extends ScalarTypeBase<T> {
}
@Override
public T jsonRead(JsonParser parser, JsonToken event) throws IOException {
if (JsonToken.VALUE_NUMBER_INT == event) {
public T jsonRead(JsonParser parser) throws IOException {
if (JsonToken.VALUE_NUMBER_INT == parser.getCurrentToken()) {
return convertFromMillis(parser.getLongValue());
} else {
return convertFromDate(Date.valueOf(parser.getText()));
@@ -85,9 +85,9 @@ public abstract class ScalarTypeBaseDateTime<T> extends ScalarTypeBase<T> {
}
@Override
public T jsonRead(JsonParser parser, JsonToken event) throws IOException {
public T jsonRead(JsonParser parser) throws IOException {
switch (event) {
switch (parser.getCurrentToken()) {
case VALUE_NUMBER_INT: {
return convertFromMillis(parser.getLongValue());
}
@@ -124,7 +124,7 @@ public abstract class ScalarTypeBaseVarchar<T> extends ScalarTypeBase<T> {
}
@Override
public T jsonRead(JsonParser parser, JsonToken event) throws IOException {
public T jsonRead(JsonParser parser) throws IOException {
return parse(parser.getValueAsString());
}
@@ -79,7 +79,7 @@ public class ScalarTypeBigDecimal extends ScalarTypeBase<BigDecimal> {
}
@Override
public BigDecimal jsonRead(JsonParser parser, JsonToken event) throws IOException {
public BigDecimal jsonRead(JsonParser parser) throws IOException {
return parser.getDecimalValue();
}
@@ -331,8 +331,8 @@ public class ScalarTypeBoolean {
}
@Override
public Boolean jsonRead(JsonParser parser, JsonToken event) {
return JsonToken.VALUE_TRUE == event ? Boolean.TRUE : Boolean.FALSE;
public Boolean jsonRead(JsonParser parser) {
return JsonToken.VALUE_TRUE == parser.getCurrentToken() ? Boolean.TRUE : Boolean.FALSE;
}
@Override
@@ -49,7 +49,7 @@ public class ScalarTypeByte extends ScalarTypeBase<Byte> {
}
@Override
public Byte jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Byte jsonRead(JsonParser parser) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
parser.readBinaryValue(os);
byte[] bytes = os.toByteArray();
@@ -47,7 +47,7 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase<byte[]> {
}
@Override
public byte[] jsonRead(JsonParser parser, JsonToken event) throws IOException {
public byte[] jsonRead(JsonParser parser) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(500);
parser.readBinaryValue(out);
return out.toByteArray();
@@ -3,7 +3,6 @@ package com.avaje.ebeaninternal.server.type;
import com.avaje.ebeanservice.docstore.api.mapping.DocPropertyType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
@@ -70,7 +69,7 @@ public class ScalarTypeBytesEncrypted implements ScalarType<byte[]> {
}
@Override
public byte[] jsonRead(JsonParser parser, JsonToken event) throws IOException {
public byte[] jsonRead(JsonParser parser) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(500);
parser.readBinaryValue(out);
return out.toByteArray();
@@ -64,7 +64,7 @@ public class ScalarTypeCharArray extends ScalarTypeBaseVarchar<char[]> {
}
@Override
public char[] jsonRead(JsonParser parser, JsonToken event) throws IOException {
public char[] jsonRead(JsonParser parser) throws IOException {
return parser.getValueAsString().toCharArray();
}
@@ -86,7 +86,7 @@ public class ScalarTypeDouble extends ScalarTypeBase<Double> {
}
@Override
public Double jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Double jsonRead(JsonParser parser) throws IOException {
return parser.getDoubleValue();
}
@@ -103,7 +103,7 @@ public class ScalarTypeDuration extends ScalarTypeBase<Duration> {
}
@Override
public Duration jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Duration jsonRead(JsonParser parser) throws IOException {
return Duration.parse(parser.getValueAsString());
}
@@ -134,8 +134,8 @@ public class ScalarTypeEncryptedWrapper<T> implements ScalarType<T> {
}
@Override
public T jsonRead(JsonParser parser, JsonToken event) throws IOException {
return wrapped.jsonRead(parser, event);
public T jsonRead(JsonParser parser) throws IOException {
return wrapped.jsonRead(parser);
}
@Override
@@ -233,7 +233,7 @@ public class ScalarTypeEnumStandard {
}
@Override
public Object jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Object jsonRead(JsonParser parser) throws IOException {
return parse(parser.getValueAsString());
}
@@ -118,7 +118,7 @@ public class ScalarTypeFile extends ScalarTypeBase<File> {
}
@Override
public File jsonRead(JsonParser parser, JsonToken event) throws IOException {
public File jsonRead(JsonParser parser) throws IOException {
File tempFile = File.createTempFile(prefix, suffix, directory);
OutputStream os = getOutputStream(tempFile);
parser.readBinaryValue(os);
@@ -86,7 +86,7 @@ public class ScalarTypeFloat extends ScalarTypeBase<Float> {
}
@Override
public Float jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Float jsonRead(JsonParser parser) throws IOException {
return parser.getFloatValue();
}
@@ -86,7 +86,7 @@ public class ScalarTypeInteger extends ScalarTypeBase<Integer> {
}
@Override
public Integer jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Integer jsonRead(JsonParser parser) throws IOException {
return parser.getIntValue();
}
@@ -77,13 +77,11 @@ public class ScalarTypeJodaLocalTime extends ScalarTypeBase<LocalTime> {
}
@Override
public LocalTime jsonRead(JsonParser parser, JsonToken event) throws IOException {
if (JsonToken.VALUE_NUMBER_INT == event) {
long millis = parser.getLongValue();
return convertFromMillis(millis);
public LocalTime jsonRead(JsonParser parser) throws IOException {
if (JsonToken.VALUE_NUMBER_INT == parser.getCurrentToken()) {
return convertFromMillis(parser.getLongValue());
} else {
String string = parser.getValueAsString();
throw new RuntimeException("convert " + string);
return parse(parser.getValueAsString());
}
}
@@ -204,11 +204,11 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase<Map> {
}
@Override
public Map jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Map jsonRead(JsonParser parser) throws IOException {
// at this point the BeanProperty has read the START_OBJECT token
// to check for a null value. Pass the START_OBJECT token through to
// the EJson parsing so that it knows the first token has been read
return EJson.parseObject(parser, event);
return EJson.parseObject(parser, parser.getCurrentToken());
}
}
@@ -216,7 +216,7 @@ public abstract class ScalarTypeJsonNode extends ScalarTypeBase<JsonNode> {
}
@Override
public JsonNode jsonRead(JsonParser parser, JsonToken event) throws IOException {
public JsonNode jsonRead(JsonParser parser) throws IOException {
// at this point the BeanProperty has read the START_OBJECT token
// to check for a null value.
return objectMapper.readValue(parser, JsonNode.class);
@@ -95,7 +95,7 @@ public class ScalarTypeLocalTime extends ScalarTypeBase<LocalTime> {
}
@Override
public LocalTime jsonRead(JsonParser parser, JsonToken event) throws IOException {
public LocalTime jsonRead(JsonParser parser) throws IOException {
return LocalTime.parse(parser.getValueAsString());
}
@@ -86,7 +86,7 @@ public class ScalarTypeLong extends ScalarTypeBase<Long> {
}
@Override
public Long jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Long jsonRead(JsonParser parser) throws IOException {
return parser.getLongValue();
}
@@ -93,7 +93,7 @@ public class ScalarTypeMathBigInteger extends ScalarTypeBase<BigInteger> {
}
@Override
public BigInteger jsonRead(JsonParser parser, JsonToken event) throws IOException {
public BigInteger jsonRead(JsonParser parser) throws IOException {
return parser.getDecimalValue().toBigInteger();
}
@@ -120,7 +120,7 @@ public class ScalarTypeMonthDay extends ScalarTypeBase<MonthDay> {
}
@Override
public MonthDay jsonRead(JsonParser parser, JsonToken event) throws IOException {
public MonthDay jsonRead(JsonParser parser) throws IOException {
return parse(parser.getValueAsString());
}
@@ -118,11 +118,11 @@ public class ScalarTypePostgresHstore extends ScalarTypeBase<Map> {
}
@Override
public Map jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Map jsonRead(JsonParser parser) throws IOException {
// at this point the BeanProperty has read the START_OBJECT token
// to check for a null value. Pass the START_OBJECT token through to
// the EJson parsing so that it knows the first token has been read
return EJson.parseObject(parser, event);
return EJson.parseObject(parser, parser.getCurrentToken());
}
@Override
@@ -87,7 +87,7 @@ public class ScalarTypeShort extends ScalarTypeBase<Short> {
}
@Override
public Short jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Short jsonRead(JsonParser parser) throws IOException {
return parser.getShortValue();
}
@@ -86,7 +86,7 @@ public class ScalarTypeString extends ScalarTypeBase<String> {
}
@Override
public String jsonRead(JsonParser parser, JsonToken event) throws IOException {
public String jsonRead(JsonParser parser) throws IOException {
return parser.getValueAsString();
}
@@ -88,7 +88,7 @@ public class ScalarTypeTime extends ScalarTypeBase<Time> {
}
@Override
public Time jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Time jsonRead(JsonParser parser) throws IOException {
return parse(parser.getValueAsString());
}
@@ -145,7 +145,7 @@ public class ScalarTypeUUIDBinary extends ScalarTypeBase<UUID> {
}
@Override
public UUID jsonRead(JsonParser parser, JsonToken event) throws IOException {
public UUID jsonRead(JsonParser parser) throws IOException {
return UUID.fromString(parser.getValueAsString());
}
@@ -105,7 +105,7 @@ public class ScalarTypeUUIDNative extends ScalarTypeBase<UUID> {
}
@Override
public UUID jsonRead(JsonParser parser, JsonToken event) throws IOException {
public UUID jsonRead(JsonParser parser) throws IOException {
String strValue = parser.getValueAsString();
return strValue == null ? null : parse(strValue);
}
@@ -183,8 +183,8 @@ public class ScalarTypeWrapper<B, S> implements ScalarType<B> {
}
@Override
public B jsonRead(JsonParser parser, JsonToken event) throws IOException {
S object = scalarType.jsonRead(parser, event);
public B jsonRead(JsonParser parser) throws IOException {
S object = scalarType.jsonRead(parser);
return converter.wrapValue(object);
}
@@ -90,7 +90,7 @@ public class ScalarTypeYear extends ScalarTypeBase<Year> {
}
@Override
public Year jsonRead(JsonParser parser, JsonToken event) throws IOException {
public Year jsonRead(JsonParser parser) throws IOException {
return Year.of(parser.getIntValue());
}
@@ -43,9 +43,9 @@ public class JsonTester<T> {
assertEquals(JsonToken.START_OBJECT, token);
token = parser.nextToken();
assertEquals(JsonToken.FIELD_NAME, token);
token = parser.nextToken();
parser.nextToken();
T val1 = type.jsonRead(parser, token);
T val1 = type.jsonRead(parser);
assertEquals(value, val1);
}
@@ -0,0 +1,45 @@
package com.avaje.ebeaninternal.server.type;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.text.json.JsonContext;
import com.avaje.tests.model.basic.TOne;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class ScalarTypeBooleanTest {
JsonContext jsonContext = Ebean.getDefaultServer().json();
@Test
public void json_true() {
TOne bean = new TOne();
bean.setId(42);
bean.setActive(true);
String json = jsonContext.toJson(bean);
TOne tOne = jsonContext.toBean(TOne.class, json);
assertTrue(tOne.isActive());
assertEquals(json, "{\"id\":42,\"active\":true}");
}
@Test
public void json_false() {
TOne bean = new TOne();
bean.setId(42);
bean.setActive(false);
String json = jsonContext.toJson(bean);
TOne tOne = jsonContext.toBean(TOne.class, json);
assertFalse(tOne.isActive());
assertEquals(json, "{\"id\":42,\"active\":false}");
}
}
@@ -1,5 +1,7 @@
package com.avaje.ebeaninternal.server.type;
import com.avaje.ebean.Ebean;
import com.avaje.tests.model.basic.TJodaEntity;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
@@ -43,4 +45,19 @@ public class ScalarTypeJodaLocalTimeTest {
assertEquals(ts1, ts2);
}
@Test
public void toJson() {
LocalTime now = new LocalTime();
TJodaEntity bean = new TJodaEntity();
bean.setId(42);
bean.setLocalTime(now);
String json = Ebean.json().toJson(bean);
TJodaEntity bean1 = Ebean.json().toBean(TJodaEntity.class, json);
assertEquals(bean1.getLocalTime(), now);
}
}
@@ -94,7 +94,7 @@ public class ScalarTypePostgresHstoreTest {
// simulate that here
JsonToken token = parser.nextToken();
assertEquals(JsonToken.START_OBJECT, token);
return (Map<String,Object>)hstore.jsonRead(parser, token);
return (Map<String,Object>)hstore.jsonRead(parser);
}
private String generateJson(Map<String, Object> map) throws IOException {