From 066999e6bf8a5d46ede99df1032ca7380699c0de Mon Sep 17 00:00:00 2001 From: Vasco Veloso Date: Thu, 16 Feb 2017 11:02:14 +0000 Subject: [PATCH] Support byte and Byte serialization and deserialization by default. --- .../java/com/arangodb/velocypack/VPack.java | 4 ++ .../com/arangodb/velocypack/VPackBuilder.java | 15 +++++ .../com/arangodb/velocypack/VPackSlice.java | 4 ++ .../internal/VPackDeserializers.java | 9 +++ .../velocypack/internal/VPackSerializers.java | 10 ++++ .../VPackSerializeDeserializeTest.java | 55 +++++++++++++++++++ 6 files changed, 97 insertions(+) diff --git a/src/main/java/com/arangodb/velocypack/VPack.java b/src/main/java/com/arangodb/velocypack/VPack.java index 7f7db5bb5..fa7b967dc 100644 --- a/src/main/java/com/arangodb/velocypack/VPack.java +++ b/src/main/java/com/arangodb/velocypack/VPack.java @@ -126,6 +126,8 @@ public Builder() { serializers.put(VPackSlice.class, VPackSerializers.VPACK); serializers.put(UUID.class, VPackSerializers.UUID); serializers.put(new byte[] {}.getClass(), VPackSerializers.BYTE_ARRAY); + serializers.put(Byte.class, VPackSerializers.BYTE); + serializers.put(byte.class, VPackSerializers.BYTE); deserializers.put(String.class, VPackDeserializers.STRING); deserializers.put(Boolean.class, VPackDeserializers.BOOLEAN); @@ -151,6 +153,8 @@ public Builder() { deserializers.put(VPackSlice.class, VPackDeserializers.VPACK); deserializers.put(UUID.class, VPackDeserializers.UUID); deserializers.put(new byte[] {}.getClass(), VPackDeserializers.BYTE_ARRAY); + deserializers.put(Byte.class, VPackDeserializers.BYTE); + deserializers.put(byte.class, VPackDeserializers.BYTE); annotationFieldFilter.put(Expose.class, new VPackAnnotationFieldFilter() { @Override diff --git a/src/main/java/com/arangodb/velocypack/VPackBuilder.java b/src/main/java/com/arangodb/velocypack/VPackBuilder.java index 1c1377c4b..0e300379c 100644 --- a/src/main/java/com/arangodb/velocypack/VPackBuilder.java +++ b/src/main/java/com/arangodb/velocypack/VPackBuilder.java @@ -152,6 +152,17 @@ public void append(final VPackBuilder builder, final Short value) throws VPackBu } } }; + private static final Appender BYTE = new Appender() { + @Override + public void append(final VPackBuilder builder, final Byte value) { + if (value <= 9 && value >= -6) { + builder.appendSmallInt(value); + } else { + builder.add((byte) 0x23); + builder.append(value, INTEGER_BYTES); + } + } + }; private static final Appender BIG_INTEGER = new Appender() { @Override public void append(final VPackBuilder builder, final BigInteger value) throws VPackBuilderException { @@ -381,6 +392,10 @@ public VPackBuilder add(final String attribute, final Short value) throws VPackB return addInternal(attribute, SHORT, value); } + public VPackBuilder add(final String attribute, final Byte value) throws VPackBuilderException { + return addInternal(attribute, BYTE, value); + } + public VPackBuilder add(final String attribute, final BigInteger value) throws VPackBuilderException { return addInternal(attribute, BIG_INTEGER, value); } diff --git a/src/main/java/com/arangodb/velocypack/VPackSlice.java b/src/main/java/com/arangodb/velocypack/VPackSlice.java index be743aa31..d443aca71 100644 --- a/src/main/java/com/arangodb/velocypack/VPackSlice.java +++ b/src/main/java/com/arangodb/velocypack/VPackSlice.java @@ -253,6 +253,10 @@ public short getAsShort() { return getAsNumber().shortValue(); } + public byte getAsByte() { + return getAsNumber().byteValue(); + } + public BigInteger getAsBigInteger() { if (isSmallInt() || isInt()) { return BigInteger.valueOf(getAsLong()); diff --git a/src/main/java/com/arangodb/velocypack/internal/VPackDeserializers.java b/src/main/java/com/arangodb/velocypack/internal/VPackDeserializers.java index 89a80bae8..3fb115f4b 100644 --- a/src/main/java/com/arangodb/velocypack/internal/VPackDeserializers.java +++ b/src/main/java/com/arangodb/velocypack/internal/VPackDeserializers.java @@ -231,5 +231,14 @@ public byte[] deserialize( } }; + public static final VPackDeserializer BYTE = new VPackDeserializer() { + @Override + public Byte deserialize( + final VPackSlice parent, + final VPackSlice vpack, + final VPackDeserializationContext context) { + return vpack.getAsByte(); + } + }; } diff --git a/src/main/java/com/arangodb/velocypack/internal/VPackSerializers.java b/src/main/java/com/arangodb/velocypack/internal/VPackSerializers.java index b78e74448..26726c85a 100644 --- a/src/main/java/com/arangodb/velocypack/internal/VPackSerializers.java +++ b/src/main/java/com/arangodb/velocypack/internal/VPackSerializers.java @@ -215,4 +215,14 @@ public void serialize( builder.add(attribute, DatatypeConverter.printBase64Binary(value)); } }; + public static final VPackSerializer BYTE = new VPackSerializer() { + @Override + public void serialize( + final VPackBuilder builder, + final String attribute, + final Byte value, + final VPackSerializationContext context) { + builder.add(attribute, value); + } + }; } diff --git a/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java b/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java index bc8a3f9ba..18ad6a254 100644 --- a/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java +++ b/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java @@ -438,6 +438,61 @@ public void toShort() throws VPackException { assertThat(entity.s2, is(new Short((short) 3))); } + + protected static class TestEntityByte { + private byte b1 = 1; // short integer path + private Byte b2 = 100; // integer path + + public byte getB1() { + return b1; + } + + public void setB1(final byte b1) { + this.b1 = b1; + } + + public Byte getB2() { + return b2; + } + + public void setB2(final Byte b2) { + this.b2 = b2; + } + } + + @Test + public void fromByte() throws VPackException { + final VPackSlice vpack = new VPack.Builder().build().serialize(new TestEntityByte()); + assertThat(vpack, is(notNullValue())); + assertThat(vpack.isObject(), is(true)); + { + final VPackSlice b1 = vpack.get("b1"); + assertThat(b1.isInteger(), is(true)); + assertThat(b1.getAsByte(), is((byte) 1)); + } + { + final VPackSlice b2 = vpack.get("b2"); + assertThat(b2.isInteger(), is(true)); + assertThat(b2.getAsByte(), is((byte) 100)); + } + } + + @Test + public void toByte() throws VPackException { + final VPackBuilder builder = new VPackBuilder(); + { + builder.add(ValueType.OBJECT); + builder.add("b1", 30); // integer path + builder.add("b2", 4); // short integer path + builder.close(); + } + final VPackSlice vpack = builder.slice(); + final TestEntityByte entity = new VPack.Builder().build().deserialize(vpack, TestEntityByte.class); + assertThat(entity, is(notNullValue())); + assertThat(entity.b1, is((byte) 30)); + assertThat(entity.b2, is(new Byte((byte) 4))); + } + protected static class TestEntityDouble { private Double d1 = 1.5; private double d2 = 1.5;