extends StringParser, StringFormatter, ScalarData
*/
public T parse(String value);
- /**
- * Convert the systemTimeMillis into the appropriate java object.
- *
- * For non dateTime types this will throw an exception.
- *
- */
- public T parseDateTime(long dateTime);
-
/**
* Return true if the type can accept long systemTimeMillis input.
*
* This is used to determine if is is sensible to use the
- * {@link #parseDateTime(long)} method.
+ * {@link #convertFromMillis(long)} method.
*
*
* This includes the Date, Calendar, sql Date, Time, Timestamp, JODA types
@@ -184,24 +176,32 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData
*/
public boolean isDateTimeCapable();
- /**
+ /**
+ * Convert the systemTimeMillis into the appropriate java object.
+ *
+ * For non dateTime types this will throw an exception.
+ *
+ */
+ public T convertFromMillis(long dateTime);
+
+ /**
* Read the value from binary input.
*/
- public Object readData(DataInput dataInput) throws IOException;
+ public T readData(DataInput dataInput) throws IOException;
/**
* Write the value to binary output.
*/
- public void writeData(DataOutput dataOutput, Object v) throws IOException;
+ public void writeData(DataOutput dataOutput, T v) throws IOException;
/**
* Read the value from JsonParser.
*/
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException;
+ public T jsonRead(JsonParser ctx, JsonToken event) throws IOException;
/**
* Write the value to the JsonGenerator.
*/
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException;
+ public void jsonWrite(JsonGenerator ctx, String name, T value) throws IOException;
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java
index 5d18df075..8f39b6cfd 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java
@@ -64,7 +64,7 @@ public abstract class ScalarTypeBaseDate extends ScalarTypeBase {
return convertFromDate(date);
}
- public T parseDateTime(long systemTimeMillis) {
+ public T convertFromMillis(long systemTimeMillis) {
Date ts = new Date(systemTimeMillis);
return convertFromDate(ts);
}
@@ -74,20 +74,20 @@ public abstract class ScalarTypeBaseDate extends ScalarTypeBase {
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public T jsonRead(JsonParser ctx, JsonToken event) throws IOException {
if (JsonToken.VALUE_NUMBER_INT == event) {
- return parseDateTime(ctx.getLongValue());
+ return convertFromMillis(ctx.getLongValue());
} else {
return convertFromDate(Date.valueOf(ctx.getText()));
}
}
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, T value) throws IOException {
long millis = convertToMillis(value);
ctx.writeNumberField(name, millis);
}
- public Object readData(DataInput dataInput) throws IOException {
+ public T readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
@@ -98,9 +98,8 @@ public abstract class ScalarTypeBaseDate extends ScalarTypeBase {
}
@SuppressWarnings("unchecked")
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, T value) throws IOException {
- T value = (T) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java
index f3f53de1f..b267544a3 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java
@@ -1,39 +1,69 @@
package com.avaje.ebeaninternal.server.type;
+import com.avaje.ebean.config.JsonConfig;
+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;
import java.io.IOException;
+import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonToken;
+import java.time.Instant;
/**
* Base type for DateTime types.
*/
public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase {
- protected DateTimeJsonParser dateTimeParser = new DateTimeJsonParser();
-
- public ScalarTypeBaseDateTime(Class type, boolean jdbcNative, int jdbcType) {
+
+ protected final DateTimeJsonParser dateTimeParser = new DateTimeJsonParser();
+
+ protected final JsonConfig.DateTime mode;
+
+ public ScalarTypeBaseDateTime(JsonConfig.DateTime mode, Class type, boolean jdbcNative, int jdbcType) {
super(type, jdbcNative, jdbcType);
+ this.mode = mode;
}
- public abstract long convertToMillis(Object value);
-
+ /**
+ * Convert the value to a Timestamp.
+ */
public abstract Timestamp convertToTimestamp(T t);
+ /**
+ * Convert to the value from a Timestamp.
+ */
public abstract T convertFromTimestamp(Timestamp ts);
+ /**
+ * Convert from epoch millis to the value.
+ */
+ public abstract T convertFromMillis(long systemTimeMillis);
+
+ /**
+ * Convert from the value to epoch millis.
+ */
+ public abstract long convertToMillis(T value);
+
+ /**
+ * Convert the value to time with nanos format.
+ */
+ protected abstract String toJsonNanos(T value);
+
+ /**
+ * Convert the value to ISO8601 format.
+ */
+ protected abstract String toJsonISO8601(T value);
+
public void bind(DataBind b, T value) throws SQLException {
if (value == null) {
b.setNull(Types.TIMESTAMP);
} else {
- Timestamp ts = convertToTimestamp(value);
- b.setTimestamp(ts);
+ b.setTimestamp(convertToTimestamp(value));
}
}
@@ -47,23 +77,49 @@ public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase {
}
}
+ /**
+ * Helper method that given epoch seconds and nanos return a JSON nanos formatted string.
+ */
+ protected String toJsonNanos(long epochSecs, int nanos) {
+ return DecimalUtils.toDecimal(epochSecs, nanos);
+ }
+
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public T jsonRead(JsonParser ctx, JsonToken event) throws IOException {
- if (JsonToken.VALUE_NUMBER_INT == event) {
- long millis = ctx.getLongValue();
- return parseDateTime(millis);
-
- } else {
- String jsonDateTime = ctx.getText();
- return convertFromTimestamp(dateTimeParser.parse(jsonDateTime));
+ switch (event) {
+ case VALUE_NUMBER_INT: {
+ return convertFromMillis(ctx.getLongValue());
+ }
+ case VALUE_NUMBER_FLOAT: {
+ BigDecimal value = ctx.getDecimalValue();
+ //Instant instant = DecimalUtils.toInstant(value);
+ Timestamp timestamp = DecimalUtils.toTimestamp(value);
+ convertFromTimestamp(timestamp);//Timestamp.from(instant));
+ }
+ default: {
+ String jsonDateTime = ctx.getText();
+ return convertFromTimestamp(dateTimeParser.parse(jsonDateTime));
+ }
}
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
- long millis = convertToMillis(value);
- ctx.writeNumberField(name, millis);
+ public void jsonWrite(JsonGenerator generator, String name, T value) throws IOException {
+
+ switch (mode) {
+ case ISO8601: {
+ generator.writeNumber(toJsonISO8601(value));
+ break;
+ }
+ case NANOS: {
+ generator.writeNumber(toJsonNanos(value));
+ break;
+ }
+ default: {
+ generator.writeNumberField(name, convertToMillis(value));
+ }
+ }
}
public String formatValue(T t) {
@@ -76,16 +132,12 @@ public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase {
return convertFromTimestamp(ts);
}
- public T parseDateTime(long systemTimeMillis) {
- Timestamp ts = new Timestamp(systemTimeMillis);
- return convertFromTimestamp(ts);
- }
public boolean isDateTimeCapable() {
return true;
}
- public Object readData(DataInput dataInput) throws IOException {
+ public T readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
@@ -95,10 +147,8 @@ public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase {
}
}
- @SuppressWarnings("unchecked")
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, T value) throws IOException {
- T value = (T) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java
index 0df4a1b06..750400b95 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java
@@ -86,7 +86,7 @@ public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase {
}
@Override
- public T parseDateTime(long systemTimeMillis) {
+ public T convertFromMillis(long systemTimeMillis) {
throw new TextException("Not Supported");
}
@@ -102,7 +102,7 @@ public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
+ public T readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
@@ -111,10 +111,8 @@ public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase {
}
}
- @SuppressWarnings("unchecked")
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, T value) throws IOException {
- T value = (T) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
@@ -125,12 +123,12 @@ public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase {
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public T jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return parse(ctx.getValueAsString());
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, T value) throws IOException {
ctx.writeStringField(name, format(value));
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java
index 4aee53063..23d4fad29 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java
@@ -17,75 +17,73 @@ import com.fasterxml.jackson.core.JsonToken;
*/
public class ScalarTypeBigDecimal extends ScalarTypeBase {
- public ScalarTypeBigDecimal() {
- super(BigDecimal.class, true, Types.DECIMAL);
- }
-
- public Object readData(DataInput dataInput) throws IOException {
- if (!dataInput.readBoolean()) {
- return null;
- } else {
- double val = dataInput.readDouble();
- return new BigDecimal(val);
- }
+ public ScalarTypeBigDecimal() {
+ super(BigDecimal.class, true, Types.DECIMAL);
+ }
+
+ public BigDecimal readData(DataInput dataInput) throws IOException {
+ if (!dataInput.readBoolean()) {
+ return null;
+ } else {
+ double val = dataInput.readDouble();
+ return new BigDecimal(val);
}
+ }
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
-
- BigDecimal b = (BigDecimal)v;
- if (b == null){
- dataOutput.writeBoolean(false);
- } else {
- dataOutput.writeBoolean(true);
- dataOutput.writeDouble(b.doubleValue());
- }
+ public void writeData(DataOutput dataOutput, BigDecimal b) throws IOException {
+
+ if (b == null) {
+ dataOutput.writeBoolean(false);
+ } else {
+ dataOutput.writeBoolean(true);
+ dataOutput.writeDouble(b.doubleValue());
}
-
- public void bind(DataBind b, BigDecimal value) throws SQLException {
- if (value == null){
- b.setNull(Types.DECIMAL);
- } else {
- b.setBigDecimal(value);
- }
- }
+ }
- public BigDecimal read(DataReader dataReader) throws SQLException {
-
- return dataReader.getBigDecimal();
- }
-
- public Object toJdbcType(Object value) {
- return BasicTypeConverter.toBigDecimal(value);
- }
-
- public BigDecimal toBeanType(Object value) {
- return BasicTypeConverter.toBigDecimal(value);
- }
-
- public String formatValue(BigDecimal t) {
- return t.toPlainString();
+ public void bind(DataBind b, BigDecimal value) throws SQLException {
+ if (value == null) {
+ b.setNull(Types.DECIMAL);
+ } else {
+ b.setBigDecimal(value);
}
+ }
- public BigDecimal parse(String value) {
- return new BigDecimal(value);
- }
+ public BigDecimal read(DataReader dataReader) throws SQLException {
- public BigDecimal parseDateTime(long systemTimeMillis) {
- return BigDecimal.valueOf(systemTimeMillis);
- }
+ return dataReader.getBigDecimal();
+ }
- public boolean isDateTimeCapable() {
- return true;
- }
+ public Object toJdbcType(Object value) {
+ return BasicTypeConverter.toBigDecimal(value);
+ }
+
+ public BigDecimal toBeanType(Object value) {
+ return BasicTypeConverter.toBigDecimal(value);
+ }
+
+ public String formatValue(BigDecimal t) {
+ return t.toPlainString();
+ }
+
+ public BigDecimal parse(String value) {
+ return new BigDecimal(value);
+ }
+
+ public BigDecimal convertFromMillis(long systemTimeMillis) {
+ return BigDecimal.valueOf(systemTimeMillis);
+ }
+
+ public boolean isDateTimeCapable() {
+ return true;
+ }
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public BigDecimal jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return ctx.getDecimalValue();
}
-
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
- ctx.writeNumberField(name, (BigDecimal)value);
+
+ public void jsonWrite(JsonGenerator ctx, String name, BigDecimal value) throws IOException {
+ ctx.writeNumberField(name, (BigDecimal) value);
}
-
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java
index 5a9db4c98..67780c3bb 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java
@@ -261,7 +261,7 @@ public class ScalarTypeBoolean {
return Boolean.valueOf(value);
}
- public Boolean parseDateTime(long systemTimeMillis) {
+ public Boolean convertFromMillis(long systemTimeMillis) {
throw new TextException("Not Supported");
}
@@ -269,32 +269,30 @@ public class ScalarTypeBoolean {
return false;
}
- public Object readData(DataInput dataInput) throws IOException {
+ public Boolean readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
- boolean val = dataInput.readBoolean();
- return Boolean.valueOf(val);
+ return dataInput.readBoolean();
}
}
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, Boolean val) throws IOException {
- Boolean val = (Boolean) v;
if (val == null) {
dataOutput.writeBoolean(false);
} else {
dataOutput.writeBoolean(true);
- dataOutput.writeBoolean(val.booleanValue());
+ dataOutput.writeBoolean(val);
}
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) {
+ public Boolean jsonRead(JsonParser ctx, JsonToken event) {
return JsonToken.VALUE_TRUE == event ? Boolean.TRUE : Boolean.FALSE;
}
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, Boolean value) throws IOException {
ctx.writeBooleanField(name, (Boolean) value);
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java
index f92cccf94..1ac6dfcf2 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java
@@ -42,12 +42,12 @@ public class ScalarTypeByte extends ScalarTypeBase {
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, Byte value) throws IOException {
throw new IOException("Not supported");
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public Byte jsonRead(JsonParser ctx, JsonToken event) throws IOException {
throw new IOException("Not supported");
}
@@ -59,7 +59,7 @@ public class ScalarTypeByte extends ScalarTypeBase {
throw new TextException("Not supported");
}
- public Byte parseDateTime(long systemTimeMillis) {
+ public Byte convertFromMillis(long systemTimeMillis) {
throw new TextException("Not Supported");
}
@@ -67,18 +67,16 @@ public class ScalarTypeByte extends ScalarTypeBase {
return false;
}
- public Object readData(DataInput dataInput) throws IOException {
+ public Byte readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
- byte val = dataInput.readByte();
- return Byte.valueOf(val);
+ return dataInput.readByte();
}
}
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, Byte val) throws IOException {
- Byte val = (Byte) v;
if (val == null) {
dataOutput.writeBoolean(false);
} else {
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java
index 73d198fbc..2f03c15aa 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java
@@ -45,12 +45,12 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase {
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, byte[] value) throws IOException {
ctx.writeBinaryField(name, (byte[]) value);
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public byte[] jsonRead(JsonParser ctx, JsonToken event) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(500);
ctx.readBinaryValue(out);
return out.toByteArray();
@@ -64,7 +64,7 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase {
throw new TextException("Not supported");
}
- public byte[] parseDateTime(long systemTimeMillis) {
+ public byte[] convertFromMillis(long systemTimeMillis) {
throw new TextException("Not supported");
}
@@ -72,7 +72,7 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase {
return false;
}
- public Object readData(DataInput dataInput) throws IOException {
+ public byte[] readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
@@ -83,10 +83,11 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase {
}
}
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, byte[] v) throws IOException {
if (v == null) {
dataOutput.writeBoolean(false);
} else {
+ dataOutput.writeBoolean(true);
byte[] bytes = convertToBytes(v);
dataOutput.writeInt(bytes.length);
dataOutput.write(bytes);
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java
index e2fe6aa48..4dfbc2b1f 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java
@@ -67,12 +67,12 @@ public class ScalarTypeBytesEncrypted implements ScalarType {
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, byte[] value) throws IOException {
ctx.writeBinaryField(name, (byte[]) value);
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public byte[] jsonRead(JsonParser ctx, JsonToken event) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(500);
ctx.readBinaryValue(out);
return out.toByteArray();
@@ -90,8 +90,8 @@ public class ScalarTypeBytesEncrypted implements ScalarType {
return baseType.parse(value);
}
- public byte[] parseDateTime(long systemTimeMillis) {
- return baseType.parseDateTime(systemTimeMillis);
+ public byte[] convertFromMillis(long systemTimeMillis) {
+ return baseType.convertFromMillis(systemTimeMillis);
}
public byte[] read(DataReader dataReader) throws SQLException {
@@ -113,17 +113,26 @@ public class ScalarTypeBytesEncrypted implements ScalarType {
baseType.accumulateScalarTypes(propName, list);
}
- public Object readData(DataInput dataInput) throws IOException {
- int len = dataInput.readInt();
- byte[] value = new byte[len];
- dataInput.readFully(value);
- return value;
+ public byte[] readData(DataInput dataInput) throws IOException {
+ if (!dataInput.readBoolean()) {
+ return null;
+ } else {
+ int len = dataInput.readInt();
+ byte[] value = new byte[len];
+ dataInput.readFully(value);
+ return value;
+ }
}
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
- byte[] value = (byte[]) v;
- dataOutput.writeInt(value.length);
- dataOutput.write(value);
+ public void writeData(DataOutput dataOutput, byte[] value) throws IOException {
+
+ if (value == null) {
+ dataOutput.writeBoolean(false);
+ } else {
+ dataOutput.writeBoolean(true);
+ dataOutput.writeInt(value.length);
+ dataOutput.write(value);
+ }
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCalendar.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCalendar.java
index ed214945d..ee790cc87 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCalendar.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCalendar.java
@@ -6,6 +6,7 @@ import java.sql.Timestamp;
import java.sql.Types;
import java.util.Calendar;
+import com.avaje.ebean.config.JsonConfig;
import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
/**
@@ -13,25 +14,32 @@ import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
*/
public class ScalarTypeCalendar extends ScalarTypeBaseDateTime {
- public ScalarTypeCalendar(int jdbcType) {
- super(Calendar.class, false, jdbcType);
+ public ScalarTypeCalendar(JsonConfig.DateTime mode, int jdbcType) {
+ super(mode, Calendar.class, false, jdbcType);
}
public void bind(DataBind b, Calendar value) throws SQLException {
if (value == null) {
b.setNull(Types.TIMESTAMP);
} else {
- Calendar date = (Calendar) value;
+
if (jdbcType == Types.TIMESTAMP) {
- Timestamp timestamp = new Timestamp(date.getTimeInMillis());
+ Timestamp timestamp = new Timestamp(value.getTimeInMillis());
b.setTimestamp(timestamp);
} else {
- Date d = new Date(date.getTimeInMillis());
+ Date d = new Date(value.getTimeInMillis());
b.setDate(d);
}
}
}
+ @Override
+ public Calendar convertFromMillis(long systemTimeMillis) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(systemTimeMillis);
+ return calendar;
+ }
+
@Override
public Calendar convertFromTimestamp(Timestamp ts) {
Calendar calendar = Calendar.getInstance();
@@ -40,8 +48,18 @@ public class ScalarTypeCalendar extends ScalarTypeBaseDateTime {
}
@Override
- public long convertToMillis(Object value) {
- return ((Calendar) value).getTimeInMillis();
+ protected String toJsonNanos(Calendar value) {
+ return String.valueOf(value.getTime());
+ }
+
+ @Override
+ protected String toJsonISO8601(Calendar value) {
+ return dateTimeParser.format(value.getTime());
+ }
+
+ @Override
+ public long convertToMillis(Calendar value) {
+ return value.getTimeInMillis();
}
@Override
@@ -49,10 +67,12 @@ public class ScalarTypeCalendar extends ScalarTypeBaseDateTime {
return new Timestamp(t.getTimeInMillis());
}
+ @Override
public Object toJdbcType(Object value) {
return BasicTypeConverter.convert(value, jdbcType);
}
+ @Override
public Calendar toBeanType(Object value) {
return BasicTypeConverter.toCalendar(value);
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java
index f9e96f15c..ec947202f 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java
@@ -64,11 +64,11 @@ public class ScalarTypeCharArray extends ScalarTypeBaseVarchar {
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public char[] jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return ctx.getValueAsString().toCharArray();
}
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, char[] value) throws IOException {
ctx.writeStringField(name, String.valueOf(value));
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java
index fa27077d4..10b5c97fe 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java
@@ -55,7 +55,7 @@ public class ScalarTypeDouble extends ScalarTypeBase {
}
@Override
- public Double parseDateTime(long systemTimeMillis) {
+ public Double convertFromMillis(long systemTimeMillis) {
return Double.valueOf(systemTimeMillis);
}
@@ -65,34 +65,32 @@ public class ScalarTypeDouble extends ScalarTypeBase {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
+ public Double readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
- double val = dataInput.readDouble();
- return Double.valueOf(val);
+ return dataInput.readDouble();
}
}
@Override
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, Double value) throws IOException {
- Double value = (Double) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
dataOutput.writeBoolean(true);
- dataOutput.writeDouble(value.doubleValue());
+ dataOutput.writeDouble(value);
}
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public Double jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return ctx.getDoubleValue();
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
- ctx.writeNumberField(name, (Double) value);
+ public void jsonWrite(JsonGenerator ctx, String name, Double value) throws IOException {
+ ctx.writeNumberField(name, value);
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDuration.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDuration.java
new file mode 100644
index 000000000..23cbbcd42
--- /dev/null
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDuration.java
@@ -0,0 +1,104 @@
+package com.avaje.ebeaninternal.server.type;
+
+import com.avaje.ebean.text.TextException;
+import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
+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;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.time.Duration;
+import java.time.LocalTime;
+
+/**
+ * ScalarType for java.time.Duration
+ */
+public class ScalarTypeDuration extends ScalarTypeBase {
+
+ public ScalarTypeDuration() {
+ super(Duration.class, false, Types.BIGINT);
+ }
+
+ protected ScalarTypeDuration(int jdbcType) {
+ super(Duration.class, false, jdbcType);
+ }
+
+ @Override
+ public void bind(DataBind bind, Duration value) throws SQLException {
+ if (value == null) {
+ bind.setNull(Types.BIGINT);
+ } else {
+ bind.setLong(value.getSeconds());
+ }
+ }
+
+ @Override
+ public Duration read(DataReader dataReader) throws SQLException {
+ return Duration.ofSeconds(dataReader.getLong());
+ }
+
+ @Override
+ public Duration readData(DataInput dataInput) throws IOException {
+ if (!dataInput.readBoolean()) {
+ return null;
+ } else {
+ return Duration.ofSeconds(dataInput.readLong());
+ }
+ }
+
+ @Override
+ public void writeData(DataOutput dataOutput, Duration value) throws IOException {
+ if (value == null) {
+ dataOutput.writeBoolean(false);
+ } else {
+ dataOutput.writeBoolean(true);
+ dataOutput.writeLong(value.getSeconds());
+ }
+ }
+
+ @Override
+ public Object toJdbcType(Object value) {
+ if (value instanceof Long) return value;
+ return ((Duration)value).getSeconds();
+ }
+
+ @Override
+ public Duration toBeanType(Object value) {
+ if (value instanceof Duration) return (Duration) value;
+ return Duration.ofSeconds(BasicTypeConverter.toLong(value));
+ }
+
+ @Override
+ public String formatValue(Duration v) {
+ return v.toString();
+ }
+
+ @Override
+ public Duration parse(String value) {
+ return Duration.parse(value);
+ }
+
+ @Override
+ public boolean isDateTimeCapable() {
+ return false;
+ }
+
+ @Override
+ public Duration convertFromMillis(long systemTimeMillis) {
+ throw new TextException("Not Supported");
+ }
+
+ @Override
+ public Duration jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ return Duration.parse(ctx.getValueAsString());
+ }
+
+ @Override
+ public void jsonWrite(JsonGenerator ctx, String name, Duration value) throws IOException {
+ ctx.writeStringField(name, value.toString());
+ }
+}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java
new file mode 100644
index 000000000..78d792614
--- /dev/null
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDurationWithNanos.java
@@ -0,0 +1,82 @@
+package com.avaje.ebeaninternal.server.type;
+
+import com.avaje.ebean.text.TextException;
+import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
+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;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.time.Duration;
+
+/**
+ * ScalarType for java.time.Duration with Nanos precision.
+ *
+ * Stored in the DB as DECIMAL value.
+ *
+ */
+public class ScalarTypeDurationWithNanos extends ScalarTypeDuration {
+
+ public ScalarTypeDurationWithNanos() {
+ super(Types.DECIMAL);
+ }
+
+ public BigDecimal convertToBigDecimal(Duration value) {
+ return DecimalUtils.toDecimal(value);
+ }
+
+ public Duration convertFromBigDecimal(BigDecimal value) {
+ return DecimalUtils.toDuration(value);
+ }
+
+ @Override
+ public void bind(DataBind bind, Duration value) throws SQLException {
+ if (value == null) {
+ bind.setNull(Types.DECIMAL);
+ } else {
+ bind.setBigDecimal(convertToBigDecimal(value));
+ }
+ }
+
+ @Override
+ public Duration read(DataReader dataReader) throws SQLException {
+ return convertFromBigDecimal(dataReader.getBigDecimal());
+ }
+
+ @Override
+ public Duration readData(DataInput dataInput) throws IOException {
+ if (!dataInput.readBoolean()) {
+ return null;
+ } else {
+ return convertFromBigDecimal(new BigDecimal(dataInput.readUTF()));
+ }
+ }
+
+ @Override
+ public void writeData(DataOutput dataOutput, Duration value) throws IOException {
+ if (value == null) {
+ dataOutput.writeBoolean(false);
+ } else {
+ dataOutput.writeBoolean(true);
+ dataOutput.writeUTF(convertToBigDecimal(value).toString());
+ }
+ }
+
+ @Override
+ public Object toJdbcType(Object value) {
+ if (value instanceof BigDecimal) return value;
+ return convertToBigDecimal((Duration)value);
+ }
+
+ @Override
+ public Duration toBeanType(Object value) {
+ if (value instanceof Duration) return (Duration) value;
+ return convertFromBigDecimal(BasicTypeConverter.toBigDecimal(value));
+ }
+
+}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java
index 9c3eeccdf..041fd9471 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java
@@ -34,12 +34,12 @@ public class ScalarTypeEncryptedWrapper implements ScalarType {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
+ public T readData(DataInput dataInput) throws IOException {
return wrapped.readData(dataInput);
}
@Override
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, T v) throws IOException {
wrapped.writeData(dataOutput, v);
}
@@ -113,8 +113,8 @@ public class ScalarTypeEncryptedWrapper implements ScalarType {
}
@Override
- public T parseDateTime(long systemTimeMillis) {
- return wrapped.parseDateTime(systemTimeMillis);
+ public T convertFromMillis(long systemTimeMillis) {
+ return wrapped.convertFromMillis(systemTimeMillis);
}
@Override
@@ -133,12 +133,12 @@ public class ScalarTypeEncryptedWrapper implements ScalarType {
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public T jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return wrapped.jsonRead(ctx, event);
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, T value) throws IOException {
wrapped.jsonWrite(ctx, name, value);
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java
index 6fdfb1e72..19ee664d6 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java
@@ -222,7 +222,7 @@ public class ScalarTypeEnumStandard {
}
@Override
- public Object parseDateTime(long systemTimeMillis) {
+ public Object convertFromMillis(long systemTimeMillis) {
throw new TextException("Not Supported");
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java
index 7fee93bd7..96807eab4 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java
@@ -55,7 +55,7 @@ public class ScalarTypeFloat extends ScalarTypeBase {
}
@Override
- public Float parseDateTime(long systemTimeMillis) {
+ public Float convertFromMillis(long systemTimeMillis) {
return Float.valueOf(systemTimeMillis);
}
@@ -65,7 +65,7 @@ public class ScalarTypeFloat extends ScalarTypeBase {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
+ public Float readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
@@ -75,24 +75,23 @@ public class ScalarTypeFloat extends ScalarTypeBase {
}
@Override
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, Float value) throws IOException {
- Float value = (Float) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
dataOutput.writeBoolean(true);
- dataOutput.writeFloat(value.floatValue());
+ dataOutput.writeFloat(value);
}
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public Float jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return ctx.getFloatValue();
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, Float value) throws IOException {
ctx.writeNumberField(name, (Float) value);
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInstant.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInstant.java
new file mode 100644
index 000000000..00997022d
--- /dev/null
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInstant.java
@@ -0,0 +1,59 @@
+package com.avaje.ebeaninternal.server.type;
+
+import com.avaje.ebean.config.JsonConfig;
+
+import java.sql.Timestamp;
+import java.sql.Types;
+import java.time.Instant;
+
+/**
+ * ScalarType for java.sql.Timestamp.
+ */
+public class ScalarTypeInstant extends ScalarTypeBaseDateTime {
+
+ public ScalarTypeInstant(JsonConfig.DateTime mode) {
+ super(mode, Instant.class, true, Types.TIMESTAMP);
+ }
+
+ @Override
+ protected String toJsonNanos(Instant value) {
+ return toJsonNanos(value.getEpochSecond(), value.getNano());
+ }
+
+ @Override
+ protected String toJsonISO8601(Instant value) {
+ return value.toString();
+ }
+
+ @Override
+ public long convertToMillis(Instant value) {
+ return value.toEpochMilli();
+ }
+
+ @Override
+ public Instant convertFromMillis(long systemTimeMillis) {
+ return Instant.ofEpochMilli(systemTimeMillis);
+ }
+
+ @Override
+ public Instant convertFromTimestamp(Timestamp ts) {
+ return ts.toInstant();
+ }
+
+ @Override
+ public Timestamp convertToTimestamp(Instant t) {
+ return Timestamp.from(t);
+ }
+
+ @Override
+ public Object toJdbcType(Object value) {
+ if (value instanceof Timestamp) return value;
+ return convertToTimestamp((Instant) value);
+ }
+
+ @Override
+ public Instant toBeanType(Object value) {
+ if (value instanceof Instant) return (Instant) value;
+ return convertFromTimestamp((Timestamp) value);
+ }
+}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java
index 101e84a6c..3199fb609 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java
@@ -36,13 +36,22 @@ public class ScalarTypeInteger extends ScalarTypeBase {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
- return Integer.valueOf(dataInput.readInt());
+ public Integer readData(DataInput dataInput) throws IOException {
+ if (!dataInput.readBoolean()) {
+ return null;
+ } else {
+ return Integer.valueOf(dataInput.readInt());
+ }
}
@Override
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
- dataOutput.writeInt((Integer) v);
+ public void writeData(DataOutput dataOutput, Integer value) throws IOException {
+ if (value == null) {
+ dataOutput.writeBoolean(false);
+ } else {
+ dataOutput.writeBoolean(true);
+ dataOutput.writeInt(value);
+ }
}
@Override
@@ -66,7 +75,7 @@ public class ScalarTypeInteger extends ScalarTypeBase {
}
@Override
- public Integer parseDateTime(long systemTimeMillis) {
+ public Integer convertFromMillis(long systemTimeMillis) {
throw new TextException("Not Supported");
}
@@ -76,12 +85,12 @@ public class ScalarTypeInteger extends ScalarTypeBase {
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public Integer jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return ctx.getIntValue();
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
- ctx.writeNumberField(name, (Integer) value);
+ public void jsonWrite(JsonGenerator ctx, String name, Integer value) throws IOException {
+ ctx.writeNumberField(name, value);
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java
index 5df0cf9b4..9f0d5de86 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java
@@ -3,22 +3,39 @@ package com.avaje.ebeaninternal.server.type;
import java.sql.Timestamp;
import java.sql.Types;
+import com.avaje.ebean.config.JsonConfig;
import org.joda.time.DateTime;
import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
+import org.joda.time.LocalDateTime;
/**
* ScalarType for Joda DateTime. This maps to a JDBC Timestamp.
*/
public class ScalarTypeJodaDateTime extends ScalarTypeBaseDateTime {
- public ScalarTypeJodaDateTime() {
- super(DateTime.class, false, Types.TIMESTAMP);
+ public ScalarTypeJodaDateTime(JsonConfig.DateTime mode) {
+ super(mode, DateTime.class, false, Types.TIMESTAMP);
}
@Override
- public long convertToMillis(Object value) {
- return ((DateTime) value).getMillis();
+ public long convertToMillis(DateTime value) {
+ return value.getMillis();
+ }
+
+ @Override
+ protected String toJsonNanos(DateTime value) {
+ return String.valueOf(value.toDateTime().getMillis());
+ }
+
+ @Override
+ protected String toJsonISO8601(DateTime value) {
+ return value.toString();
+ }
+
+ @Override
+ public DateTime convertFromMillis(long systemTimeMillis) {
+ return new DateTime(systemTimeMillis);
}
@Override
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java
index 1fe6822dd..20f125361 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDate.java
@@ -48,7 +48,7 @@ public class ScalarTypeJodaLocalDate extends ScalarTypeBaseDate {
}
@Override
- public LocalDate parseDateTime(long systemTimeMillis) {
+ public LocalDate convertFromMillis(long systemTimeMillis) {
return new LocalDate(systemTimeMillis);
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java
index d139a5da2..8f4c57745 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalDateTime.java
@@ -2,7 +2,9 @@ package com.avaje.ebeaninternal.server.type;
import java.sql.Timestamp;
import java.sql.Types;
+import java.util.Date;
+import com.avaje.ebean.config.JsonConfig;
import org.joda.time.LocalDateTime;
import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
@@ -12,13 +14,29 @@ import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
*/
public class ScalarTypeJodaLocalDateTime extends ScalarTypeBaseDateTime {
- public ScalarTypeJodaLocalDateTime() {
- super(LocalDateTime.class, false, Types.TIMESTAMP);
+ public ScalarTypeJodaLocalDateTime(JsonConfig.DateTime mode) {
+ super(mode, LocalDateTime.class, false, Types.TIMESTAMP);
}
@Override
- public long convertToMillis(Object value) {
- return ((LocalDateTime) value).toDateTime().getMillis();
+ protected String toJsonNanos(LocalDateTime value) {
+ return String.valueOf(value.toDateTime().getMillis());
+ }
+
+ @Override
+ protected String toJsonISO8601(LocalDateTime value) {
+ return value.toString();
+ }
+
+ @Override
+ public long convertToMillis(LocalDateTime value) {
+ return value.toDateTime().getMillis();
+ }
+
+
+ @Override
+ public LocalDateTime convertFromMillis(long systemTimeMillis) {
+ return new LocalDateTime(systemTimeMillis);
}
@Override
@@ -47,9 +65,4 @@ public class ScalarTypeJodaLocalDateTime extends ScalarTypeBaseDateTime {
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, LocalTime value) throws IOException {
ctx.writeStringField(name, value.toString());
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public LocalTime jsonRead(JsonParser ctx, JsonToken event) throws IOException {
if (JsonToken.VALUE_NUMBER_INT == event) {
long millis = ctx.getLongValue();
- return parseDateTime(millis);
+ return convertFromMillis(millis);
} else {
String string = ctx.getValueAsString();
throw new RuntimeException("convert " + string);
@@ -88,7 +88,7 @@ public class ScalarTypeJodaLocalTime extends ScalarTypeBase {
}
@Override
- public LocalTime parseDateTime(long systemTimeMillis) {
+ public LocalTime convertFromMillis(long systemTimeMillis) {
return new LocalTime(systemTimeMillis);
}
@@ -98,7 +98,7 @@ public class ScalarTypeJodaLocalTime extends ScalarTypeBase {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
+ public LocalTime readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
@@ -108,9 +108,8 @@ public class ScalarTypeJodaLocalTime extends ScalarTypeBase {
}
@Override
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, LocalTime value) throws IOException {
- Time value = (Time) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDate.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDate.java
index d69073fee..ed83eb957 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDate.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDate.java
@@ -52,7 +52,7 @@ public class ScalarTypeLocalDate extends ScalarTypeBaseDate {
}
@Override
- public LocalDate parseDateTime(long systemTimeMillis) {
+ public LocalDate convertFromMillis(long systemTimeMillis) {
return new Timestamp(systemTimeMillis).toLocalDateTime().toLocalDate();
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDateTime.java
index 3a937910b..2bce3d064 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDateTime.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalDateTime.java
@@ -1,21 +1,40 @@
package com.avaje.ebeaninternal.server.type;
+import com.avaje.ebean.config.JsonConfig;
+
import java.sql.Timestamp;
import java.sql.Types;
-import java.time.*;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
/**
* ScalarType for java.sql.Timestamp.
*/
public class ScalarTypeLocalDateTime extends ScalarTypeBaseDateTime {
- public ScalarTypeLocalDateTime() {
- super(LocalDateTime.class, true, Types.TIMESTAMP);
+ public ScalarTypeLocalDateTime(JsonConfig.DateTime mode) {
+ super(mode, LocalDateTime.class, true, Types.TIMESTAMP);
}
@Override
- public long convertToMillis(Object value) {
- return ((LocalDateTime) value).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+ public LocalDateTime convertFromMillis(long systemTimeMillis) {
+ return new Timestamp(systemTimeMillis).toLocalDateTime();
+ }
+
+ @Override
+ public long convertToMillis(LocalDateTime value) {
+ return value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+ }
+
+ @Override
+ protected String toJsonNanos(LocalDateTime value) {
+ return String.valueOf(convertToMillis(value));
+ }
+
+ @Override
+ protected String toJsonISO8601(LocalDateTime value) {
+ return value.toString();
}
@Override
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalTime.java
new file mode 100644
index 000000000..b8a24312c
--- /dev/null
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLocalTime.java
@@ -0,0 +1,100 @@
+package com.avaje.ebeaninternal.server.type;
+
+import com.avaje.ebean.text.TextException;
+import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
+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;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.time.LocalTime;
+import java.time.Year;
+
+/**
+ * ScalarType for java.time.Year
+ */
+public class ScalarTypeLocalTime extends ScalarTypeBase {
+
+ public ScalarTypeLocalTime() {
+ super(LocalTime.class, true, Types.BIGINT);
+ }
+
+ @Override
+ public void bind(DataBind bind, LocalTime value) throws SQLException {
+ if (value == null) {
+ bind.setNull(Types.BIGINT);
+ } else {
+ bind.setLong(value.toNanoOfDay());
+ }
+ }
+
+ @Override
+ public LocalTime read(DataReader dataReader) throws SQLException {
+ return LocalTime.ofNanoOfDay(dataReader.getLong());
+ }
+
+ @Override
+ public LocalTime readData(DataInput dataInput) throws IOException {
+ if (!dataInput.readBoolean()) {
+ return null;
+ } else {
+ return LocalTime.ofNanoOfDay(dataInput.readLong());
+ }
+ }
+
+ @Override
+ public void writeData(DataOutput dataOutput, LocalTime value) throws IOException {
+ if (value == null) {
+ dataOutput.writeBoolean(false);
+ } else {
+ dataOutput.writeBoolean(true);
+ dataOutput.writeLong(value.toNanoOfDay());
+ }
+ }
+
+ @Override
+ public Object toJdbcType(Object value) {
+ if (value instanceof Long) return value;
+ return ((LocalTime)value).toNanoOfDay();
+ }
+
+ @Override
+ public LocalTime toBeanType(Object value) {
+ if (value instanceof LocalTime) return (LocalTime) value;
+ return LocalTime.ofNanoOfDay(BasicTypeConverter.toLong(value));
+ }
+
+ @Override
+ public String formatValue(LocalTime v) {
+ return v.toString();
+ }
+
+ @Override
+ public LocalTime parse(String value) {
+ return LocalTime.parse(value);
+ }
+
+ @Override
+ public boolean isDateTimeCapable() {
+ return false;
+ }
+
+ @Override
+ public LocalTime convertFromMillis(long systemTimeMillis) {
+ throw new TextException("Not Supported");
+ }
+
+ @Override
+ public LocalTime jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ return LocalTime.parse(ctx.getValueAsString());
+ }
+
+ @Override
+ public void jsonWrite(JsonGenerator ctx, String name, LocalTime value) throws IOException {
+ ctx.writeStringField(name, value.toString());
+ }
+}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java
index 1427553b4..1bf541144 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java
@@ -55,8 +55,8 @@ public class ScalarTypeLong extends ScalarTypeBase {
}
@Override
- public Long parseDateTime(long systemTimeMillis) {
- return Long.valueOf(systemTimeMillis);
+ public Long convertFromMillis(long systemTimeMillis) {
+ return systemTimeMillis;
}
@Override
@@ -65,34 +65,32 @@ public class ScalarTypeLong extends ScalarTypeBase {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
+ public Long readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
- long val = dataInput.readLong();
- return Long.valueOf(val);
+ return dataInput.readLong();
}
}
@Override
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, Long value) throws IOException {
- Long value = (Long) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
dataOutput.writeBoolean(true);
- dataOutput.writeLong(value.longValue());
+ dataOutput.writeLong(value);
}
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public Long jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return ctx.getLongValue();
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, Long value) throws IOException {
ctx.writeNumberField(name, (Long) value);
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLongToTimestamp.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLongToTimestamp.java
index d01d67469..7a9b119d2 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLongToTimestamp.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLongToTimestamp.java
@@ -1,10 +1,12 @@
package com.avaje.ebeaninternal.server.type;
+import com.avaje.ebean.config.JsonConfig;
+
import java.sql.Timestamp;
public class ScalarTypeLongToTimestamp extends ScalarTypeWrapper {
- public ScalarTypeLongToTimestamp() {
- super(Long.class, new ScalarTypeTimestamp(), new LongToTimestampConverter());
+ public ScalarTypeLongToTimestamp(JsonConfig.DateTime mode) {
+ super(Long.class, new ScalarTypeTimestamp(mode), new LongToTimestampConverter());
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java
index 1ea865e7a..521462b65 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java
@@ -3,9 +3,11 @@ package com.avaje.ebeaninternal.server.type;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
+import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException;
import java.sql.Types;
+import java.time.Instant;
import com.avaje.ebeaninternal.server.core.BasicTypeConverter;
import com.fasterxml.jackson.core.JsonGenerator;
@@ -61,7 +63,7 @@ public class ScalarTypeMathBigInteger extends ScalarTypeBase {
}
@Override
- public BigInteger parseDateTime(long systemTimeMillis) {
+ public BigInteger convertFromMillis(long systemTimeMillis) {
return BigInteger.valueOf(systemTimeMillis);
}
@@ -71,19 +73,18 @@ public class ScalarTypeMathBigInteger extends ScalarTypeBase {
}
@Override
- public Object readData(DataInput dataInput) throws IOException {
+ public BigInteger readData(DataInput dataInput) throws IOException {
if (!dataInput.readBoolean()) {
return null;
} else {
long val = dataInput.readLong();
- return Long.valueOf(val);
+ return BigInteger.valueOf(val);
}
}
@Override
- public void writeData(DataOutput dataOutput, Object v) throws IOException {
+ public void writeData(DataOutput dataOutput, BigInteger value) throws IOException {
- Long value = (Long) v;
if (value == null) {
dataOutput.writeBoolean(false);
} else {
@@ -93,12 +94,12 @@ public class ScalarTypeMathBigInteger extends ScalarTypeBase {
}
@Override
- public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException {
+ public BigInteger jsonRead(JsonParser ctx, JsonToken event) throws IOException {
return ctx.getDecimalValue().toBigInteger();
}
@Override
- public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException {
+ public void jsonWrite(JsonGenerator ctx, String name, BigInteger value) throws IOException {
ctx.writeNumberField(name, ((BigInteger) value).longValue());
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java
index 8fc004792..9a5d99750 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeOffsetDateTime.java
@@ -1,7 +1,10 @@
package com.avaje.ebeaninternal.server.type;
+import com.avaje.ebean.config.JsonConfig;
+
import java.sql.Timestamp;
import java.sql.Types;
+import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
@@ -10,13 +13,28 @@ import java.time.ZoneId;
*/
public class ScalarTypeOffsetDateTime extends ScalarTypeBaseDateTime {
- public ScalarTypeOffsetDateTime() {
- super(OffsetDateTime.class, true, Types.TIMESTAMP);
+ public ScalarTypeOffsetDateTime(JsonConfig.DateTime mode) {
+ super(mode, OffsetDateTime.class, true, Types.TIMESTAMP);
}
@Override
- public long convertToMillis(Object value) {
- return ((OffsetDateTime) value).toInstant().toEpochMilli();
+ protected String toJsonNanos(OffsetDateTime value) {
+ return toJsonNanos(value.toEpochSecond(), value.getNano());
+ }
+
+ @Override
+ protected String toJsonISO8601(OffsetDateTime value) {
+ return value.toString();
+ }
+
+ @Override
+ public long convertToMillis(OffsetDateTime value) {
+ return value.toInstant().toEpochMilli();
+ }
+
+ @Override
+ public OffsetDateTime convertFromMillis(long systemTimeMillis) {
+ return OffsetDateTime.ofInstant(Instant.ofEpochMilli(systemTimeMillis), ZoneId.systemDefault());
}
@Override
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java
index 847f5fc4b..7b8a0e4c8 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java
@@ -88,7 +88,7 @@ public class ScalarTypePostgresHstore extends ScalarTypeBase