Skip to content

Commit 87c84e2

Browse files
committed
instant coverter
1 parent a5dcc9b commit 87c84e2

File tree

4 files changed

+123
-0
lines changed

4 files changed

+123
-0
lines changed

src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.tarantool.driver.mappers;
22

3+
import io.tarantool.driver.mappers.converters.object.DefaultInstantToExtensionValueConverter;
34
import io.tarantool.driver.mappers.converters.object.DefaultNilValueToNullConverter;
45
import io.tarantool.driver.mappers.converters.object.DefaultBigDecimalToExtensionValueConverter;
56
import io.tarantool.driver.mappers.converters.object.DefaultBooleanToBooleanValueConverter;
@@ -16,6 +17,7 @@
1617
import io.tarantool.driver.mappers.converters.value.DefaultBinaryValueToByteArrayConverter;
1718
import io.tarantool.driver.mappers.converters.value.DefaultBooleanValueToBooleanConverter;
1819
import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToBigDecimalConverter;
20+
import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToInstantConverter;
1921
import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToUUIDConverter;
2022
import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToDoubleConverter;
2123
import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToFloatConverter;
@@ -39,6 +41,7 @@
3941
import org.msgpack.value.ValueType;
4042

4143
import java.math.BigDecimal;
44+
import java.time.Instant;
4245
import java.util.UUID;
4346

4447
/**
@@ -77,6 +80,7 @@ private DefaultMessagePackMapperFactory() {
7780
.withValueConverter(ValueType.EXTENSION, UUID.class, new DefaultExtensionValueToUUIDConverter())
7881
.withValueConverter(ValueType.EXTENSION, BigDecimal.class,
7982
new DefaultExtensionValueToBigDecimalConverter())
83+
.withValueConverter(ValueType.EXTENSION, Instant.class, new DefaultExtensionValueToInstantConverter())
8084
.withValueConverter(ValueType.NIL, Object.class, new DefaultNilValueToNullConverter())
8185
//TODO: Potential issue https://github.com/tarantool/cartridge-java/issues/118
8286
.withObjectConverter(Character.class, StringValue.class, new DefaultCharacterToStringValueConverter())
@@ -91,6 +95,7 @@ private DefaultMessagePackMapperFactory() {
9195
.withObjectConverter(UUID.class, ExtensionValue.class, new DefaultUUIDToExtensionValueConverter())
9296
.withObjectConverter(BigDecimal.class, ExtensionValue.class,
9397
new DefaultBigDecimalToExtensionValueConverter())
98+
.withObjectConverter(Instant.class, ExtensionValue.class, new DefaultInstantToExtensionValueConverter())
9499
.build();
95100
}
96101

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.tarantool.driver.mappers.converters.object;
2+
3+
import io.tarantool.driver.mappers.converters.ObjectConverter;
4+
import org.msgpack.value.ExtensionValue;
5+
import org.msgpack.value.ValueFactory;
6+
7+
import java.nio.ByteBuffer;
8+
import java.time.Instant;
9+
10+
/**
11+
* Default {@link java.time.Instant} to {@link ExtensionValue} converter
12+
*
13+
* @author
14+
*/
15+
public class DefaultInstantToExtensionValueConverter implements ObjectConverter<Instant, ExtensionValue> {
16+
17+
private static final long serialVersionUID = 20220418L;
18+
19+
private static final byte DATETIME_TYPE = 0x04;
20+
21+
private byte[] toBytes(Instant value) {
22+
ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
23+
buffer.putLong(0, value.getEpochSecond());
24+
return buffer.array();
25+
}
26+
27+
@Override
28+
public ExtensionValue toValue(Instant object) {
29+
return ValueFactory.newExtension(DATETIME_TYPE, toBytes(object));
30+
}
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.tarantool.driver.mappers.converters.value;
2+
3+
import io.tarantool.driver.mappers.converters.ValueConverter;
4+
import org.msgpack.value.ExtensionValue;
5+
6+
import java.nio.ByteBuffer;
7+
import java.time.Instant;
8+
9+
/**
10+
* Default {@link ExtensionValue} to {@link java.time.Instant} converter
11+
*
12+
* @author
13+
*/
14+
public class DefaultExtensionValueToInstantConverter implements ValueConverter<ExtensionValue, Instant> {
15+
private static final byte DATETIME_TYPE = 0x04;
16+
17+
private Instant fromBytes(byte[] bytes) {
18+
ByteBuffer buffer = ByteBuffer.wrap(bytes);
19+
return Instant.ofEpochSecond(buffer.getLong());
20+
}
21+
22+
@Override
23+
public Instant fromValue(ExtensionValue value) {
24+
return fromBytes(value.getData());
25+
}
26+
27+
@Override
28+
public boolean canConvertValue(ExtensionValue value) {
29+
return value.getType() == DATETIME_TYPE;
30+
}
31+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.tarantool.driver.mappers;
2+
3+
import io.tarantool.driver.mappers.converters.object.DefaultInstantToExtensionValueConverter;
4+
import io.tarantool.driver.mappers.converters.object.DefaultUUIDToExtensionValueConverter;
5+
import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToInstantConverter;
6+
import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToUUIDConverter;
7+
import org.junit.jupiter.api.Test;
8+
import org.msgpack.core.MessageBufferPacker;
9+
import org.msgpack.core.MessagePack;
10+
import org.msgpack.core.MessagePacker;
11+
import org.msgpack.value.ExtensionValue;
12+
import org.msgpack.value.ImmutableExtensionValue;
13+
import org.msgpack.value.ValueFactory;
14+
15+
import java.io.IOException;
16+
import java.time.Instant;
17+
import java.time.LocalDateTime;
18+
import java.time.ZoneId;
19+
import java.time.ZoneOffset;
20+
import java.util.Base64;
21+
import java.util.UUID;
22+
23+
import static org.junit.jupiter.api.Assertions.assertEquals;
24+
import static org.junit.jupiter.api.Assertions.assertFalse;
25+
import static org.junit.jupiter.api.Assertions.assertTrue;
26+
27+
class DefaultInstantConverterTest {
28+
@Test
29+
void toValue() throws IOException {
30+
DefaultInstantToExtensionValueConverter converter = new DefaultInstantToExtensionValueConverter();
31+
MessagePacker packer = MessagePack.newDefaultBufferPacker();
32+
Base64.Encoder encoder = Base64.getEncoder();
33+
Instant instant = LocalDateTime.parse("2022-10-25T12:03:58").toInstant(ZoneOffset.UTC);
34+
byte[] result = ((MessageBufferPacker) packer.packValue(converter.toValue(instant))).toByteArray();
35+
assertEquals("2AQAAAAAY1fQrgAAAAAAAAAA", encoder.encodeToString(result));
36+
}
37+
38+
@Test
39+
void fromValue() throws IOException {
40+
DefaultExtensionValueToInstantConverter converter = new DefaultExtensionValueToInstantConverter();
41+
Base64.Decoder base64decoder = Base64.getDecoder();
42+
Instant instant = LocalDateTime.parse("2022-10-25T12:03:58").toInstant(ZoneOffset.UTC);
43+
byte[] packed = base64decoder.decode("2AQAAAAAY1fQrgAAAAAAAAAA");
44+
ExtensionValue value = MessagePack.newDefaultUnpacker(packed).unpackValue().asExtensionValue();
45+
assertEquals(instant, converter.fromValue(value));
46+
}
47+
48+
@Test
49+
void canConvertValue() {
50+
DefaultExtensionValueToInstantConverter converter = new DefaultExtensionValueToInstantConverter();
51+
assertFalse(converter.canConvertValue(ValueFactory.newExtension((byte) 100, new byte[]{0})));
52+
assertFalse(converter.canConvertValue(ValueFactory.newExtension((byte) 0x01, new byte[]{0})));
53+
ImmutableExtensionValue value = ValueFactory.newExtension((byte) 0x04, new byte[]{0});
54+
assertTrue(converter.canConvertValue(value));
55+
}
56+
}

0 commit comments

Comments
 (0)