Skip to content

Commit 3541043

Browse files
author
Mark
committed
add vpack utc date support for java 8 Instant
1 parent c2d9bc8 commit 3541043

File tree

8 files changed

+68
-0
lines changed

8 files changed

+68
-0
lines changed

src/main/java/com/arangodb/velocypack/VPack.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.lang.reflect.Type;
2727
import java.math.BigDecimal;
2828
import java.math.BigInteger;
29+
import java.time.Instant;
2930
import java.util.Collection;
3031
import java.util.Date;
3132
import java.util.HashMap;
@@ -112,6 +113,7 @@ public Builder() {
112113
serializers.put(Date.class, VPackSerializers.DATE);
113114
serializers.put(java.sql.Date.class, VPackSerializers.SQL_DATE);
114115
serializers.put(java.sql.Timestamp.class, VPackSerializers.SQL_TIMESTAMP);
116+
serializers.put(Instant.class, VPackSerializers.INSTANT);
115117
serializers.put(VPackSlice.class, VPackSerializers.VPACK);
116118

117119
deserializers.put(String.class, VPackDeserializers.STRING);
@@ -135,6 +137,7 @@ public Builder() {
135137
deserializers.put(Date.class, VPackDeserializers.DATE);
136138
deserializers.put(java.sql.Date.class, VPackDeserializers.SQL_DATE);
137139
deserializers.put(java.sql.Timestamp.class, VPackDeserializers.SQL_TIMESTAMP);
140+
deserializers.put(Instant.class, VPackDeserializers.INSTANT);
138141
deserializers.put(VPackSlice.class, VPackDeserializers.VPACK);
139142
}
140143

src/main/java/com/arangodb/velocypack/VPackBuilder.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.math.BigDecimal;
2525
import java.math.BigInteger;
2626
import java.sql.Timestamp;
27+
import java.time.Instant;
2728
import java.util.ArrayList;
2829
import java.util.Arrays;
2930
import java.util.Collection;
@@ -139,6 +140,9 @@ public static interface Appender<T> {
139140
private static final Appender<Timestamp> SQL_TIMESTAMP = (builder, value) -> {
140141
builder.appendSQLTimestamp(value);
141142
};
143+
private static final Appender<Instant> INSTANT = (builder, value) -> {
144+
builder.appendInstant(value);
145+
};
142146
private static final Appender<String> STRING = (builder, value) -> {
143147
builder.appendString(value);
144148
};
@@ -269,6 +273,10 @@ public VPackBuilder add(final java.sql.Timestamp value) throws VPackBuilderExcep
269273
return addInternal(SQL_TIMESTAMP, value);
270274
}
271275

276+
public VPackBuilder add(final Instant value) throws VPackBuilderException {
277+
return addInternal(INSTANT, value);
278+
}
279+
272280
public VPackBuilder add(final String value) throws VPackBuilderException {
273281
return addInternal(STRING, value);
274282
}
@@ -356,6 +364,10 @@ public VPackBuilder add(final String attribute, final java.sql.Timestamp value)
356364
return addInternal(attribute, SQL_TIMESTAMP, value);
357365
}
358366

367+
public VPackBuilder add(final String attribute, final Instant value) throws VPackBuilderException {
368+
return addInternal(attribute, INSTANT, value);
369+
}
370+
359371
public VPackBuilder add(final String attribute, final byte[] value) throws VPackBuilderException {
360372
return addInternal(attribute, BYTE_ARRAY, value);
361373
}
@@ -556,6 +568,11 @@ private void appendSQLTimestamp(final Timestamp value) {
556568
append(value.getTime(), Long.BYTES);
557569
}
558570

571+
private void appendInstant(final Instant value) {
572+
add((byte) 0x1c);
573+
append(value.toEpochMilli(), Long.BYTES);
574+
}
575+
559576
private void appendString(final String value) throws VPackBuilderException {
560577
final int length = value.length();
561578
if (length <= 126) {

src/main/java/com/arangodb/velocypack/VPackSlice.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.io.Serializable;
2424
import java.math.BigDecimal;
2525
import java.math.BigInteger;
26+
import java.time.Instant;
2627
import java.util.Arrays;
2728
import java.util.Date;
2829
import java.util.Iterator;
@@ -284,6 +285,13 @@ public java.sql.Timestamp getAsSQLTimestamp() {
284285
return DateUtil.toSQLTimestamp(vpack, start + 1, length());
285286
}
286287

288+
public Instant getAsInstant() {
289+
if (!isDate()) {
290+
throw new VPackValueTypeException(ValueType.UTC_DATE);
291+
}
292+
return DateUtil.toInstant(vpack, start + 1, length());
293+
}
294+
287295
public String getAsString() {
288296
if (!isString()) {
289297
throw new VPackValueTypeException(ValueType.STRING);

src/main/java/com/arangodb/velocypack/internal/VPackDeserializers.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.math.BigDecimal;
2424
import java.math.BigInteger;
25+
import java.time.Instant;
2526
import java.util.Date;
2627

2728
import com.arangodb.velocypack.VPackDeserializer;
@@ -52,6 +53,7 @@ private VPackDeserializers() {
5253
public static final VPackDeserializer<java.sql.Date> SQL_DATE = (parent, vpack, context) -> vpack.getAsSQLDate();
5354
public static final VPackDeserializer<java.sql.Timestamp> SQL_TIMESTAMP = (parent, vpack, context) -> vpack
5455
.getAsSQLTimestamp();
56+
public static final VPackDeserializer<Instant> INSTANT = (parent, vpack, context) -> vpack.getAsInstant();
5557
public static final VPackDeserializer<VPackSlice> VPACK = (parent, vpack, context) -> vpack;
5658

5759
}

src/main/java/com/arangodb/velocypack/internal/VPackSerializers.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.math.BigDecimal;
2424
import java.math.BigInteger;
25+
import java.time.Instant;
2526
import java.util.Date;
2627

2728
import com.arangodb.velocypack.VPackSerializer;
@@ -61,6 +62,8 @@ private VPackSerializers() {
6162
.add(attribute, value);
6263
public static VPackSerializer<java.sql.Timestamp> SQL_TIMESTAMP = (builder, attribute, value, context) -> builder
6364
.add(attribute, value);
65+
public static VPackSerializer<Instant> INSTANT = (builder, attribute, value, context) -> builder.add(attribute,
66+
value);
6467
public static VPackSerializer<VPackSlice> VPACK = (builder, attribute, value, context) -> builder.add(attribute,
6568
value);
6669
}

src/main/java/com/arangodb/velocypack/internal/util/DateUtil.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
package com.arangodb.velocypack.internal.util;
2222

23+
import java.time.Instant;
24+
2325
/**
2426
* @author Mark - mark at arangodb.com
2527
*
@@ -45,4 +47,9 @@ public static java.sql.Timestamp toSQLTimestamp(final byte[] array, final int of
4547
return new java.sql.Timestamp(milliseconds);
4648
}
4749

50+
public static Instant toInstant(final byte[] array, final int offset, final int length) {
51+
final long milliseconds = NumberUtil.toLong(array, offset, length);
52+
return Instant.ofEpochMilli(milliseconds);
53+
}
54+
4855
}

src/test/java/com/arangodb/velocypack/VPackBuilderTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static org.junit.Assert.fail;
2727

2828
import java.math.BigInteger;
29+
import java.time.Instant;
2930
import java.util.Date;
3031

3132
import org.junit.Test;
@@ -279,6 +280,17 @@ public void addSqlTimestamp() throws VPackException {
279280
assertThat(slice.getAsSQLTimestamp(), is(timestamp));
280281
}
281282

283+
@Test
284+
public void addInstant() throws VPackException {
285+
final VPackBuilder builder = new VPackBuilder();
286+
final Instant now = Instant.now();
287+
builder.add(now);
288+
289+
final VPackSlice slice = builder.slice();
290+
assertThat(slice.isDate(), is(true));
291+
assertThat(slice.getAsInstant(), is(now));
292+
}
293+
282294
@Test
283295
public void addStringShort() throws VPackException {
284296
final VPackBuilder builder = new VPackBuilder();

src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import java.math.BigDecimal;
2929
import java.math.BigInteger;
30+
import java.time.Instant;
3031
import java.util.ArrayList;
3132
import java.util.Collection;
3233
import java.util.Date;
@@ -3210,6 +3211,7 @@ protected static class TestEntityDate {
32103211
private java.util.Date utilDate = new Date(1474988621);
32113212
private java.sql.Date sqlDate = new java.sql.Date(1474988621);
32123213
private java.sql.Timestamp timestamp = new java.sql.Timestamp(1474988621);
3214+
private Instant instant = Instant.ofEpochMilli(1474988621);
32133215

32143216
public java.util.Date getUtilDate() {
32153217
return utilDate;
@@ -3235,6 +3237,14 @@ public void setTimestamp(final java.sql.Timestamp timestamp) {
32353237
this.timestamp = timestamp;
32363238
}
32373239

3240+
public Instant getInstant() {
3241+
return instant;
3242+
}
3243+
3244+
public void setInstant(final Instant instant) {
3245+
this.instant = instant;
3246+
}
3247+
32383248
}
32393249

32403250
@Test
@@ -3254,6 +3264,10 @@ public void fromDate() throws VPackException {
32543264
assertThat(vpack.get("timestamp").isDate(), is(true));
32553265
assertThat(vpack.get("timestamp").getAsSQLTimestamp(), is(new java.sql.Timestamp(1474988621)));
32563266
}
3267+
{
3268+
assertThat(vpack.get("instant").isDate(), is(true));
3269+
assertThat(vpack.get("instant").getAsInstant(), is(Instant.ofEpochMilli(1474988621)));
3270+
}
32573271
}
32583272

32593273
@Test
@@ -3263,13 +3277,15 @@ public void toDate() throws VPackException {
32633277
builder.add("utilDate", new Date(1475062216));
32643278
builder.add("sqlDate", new java.sql.Date(1475062216));
32653279
builder.add("timestamp", new java.sql.Timestamp(1475062216));
3280+
builder.add("instant", Instant.ofEpochMilli(1475062216));
32663281
builder.close();
32673282

32683283
final TestEntityDate entity = new VPack.Builder().build().deserialize(builder.slice(), TestEntityDate.class);
32693284
assertThat(entity, is(notNullValue()));
32703285
assertThat(entity.utilDate, is(new Date(1475062216)));
32713286
assertThat(entity.sqlDate, is(new java.sql.Date(1475062216)));
32723287
assertThat(entity.timestamp, is(new java.sql.Timestamp(1475062216)));
3288+
assertThat(entity.instant, is(Instant.ofEpochMilli(1475062216)));
32733289
}
32743290

32753291
}

0 commit comments

Comments
 (0)