blob: 85bb3c023b0b55e257b324a39e9ff521675215a5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tinkerpop.gremlin.structure.io.gryo;
import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.InputShim;
import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShim;
import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.OutputShim;
import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.SerializerShim;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.MonthDay;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.Period;
import java.time.Year;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
/**
* Serializers for classes in the {@code java.time} package.
*/
final class JavaTimeSerializers {
private JavaTimeSerializers() {}
/**
* Serializer for the {@link Duration} class.
*/
final static class DurationSerializer implements SerializerShim<Duration> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final Duration duration) {
output.writeLong(duration.toNanos());
}
@Override
public <I extends InputShim> Duration read(final KryoShim<I, ?> kryo, final I input, final Class<Duration> durationClass) {
return Duration.ofNanos(input.readLong());
}
}
/**
* Serializer for the {@link Instant} class.
*/
final static class InstantSerializer implements SerializerShim<Instant> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final Instant instant) {
output.writeLong(instant.getEpochSecond());
output.writeInt(instant.getNano());
}
@Override
public <I extends InputShim> Instant read(final KryoShim<I, ?> kryo, final I input, final Class<Instant> aClass) {
return Instant.ofEpochSecond(input.readLong(), input.readInt());
}
}
/**
* Serializer for the {@link LocalDate} class.
*/
final static class LocalDateSerializer implements SerializerShim<LocalDate> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final LocalDate localDate) {
output.writeLong(localDate.toEpochDay());
}
@Override
public <I extends InputShim> LocalDate read(final KryoShim<I, ?> kryo, final I input, final Class<LocalDate> clazz) {
return LocalDate.ofEpochDay(input.readLong());
}
}
/**
* Serializer for the {@link LocalDateTime} class.
*/
final static class LocalDateTimeSerializer implements SerializerShim<LocalDateTime> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final LocalDateTime localDateTime) {
output.writeInt(localDateTime.getYear());
output.writeInt(localDateTime.getMonthValue());
output.writeInt(localDateTime.getDayOfMonth());
output.writeInt(localDateTime.getHour());
output.writeInt(localDateTime.getMinute());
output.writeInt(localDateTime.getSecond());
output.writeInt(localDateTime.getNano());
}
@Override
public <I extends InputShim> LocalDateTime read(final KryoShim<I, ?> kryo, final I input, final Class<LocalDateTime> clazz) {
return LocalDateTime.of(input.readInt(), input.readInt(), input.readInt(), input.readInt(), input.readInt(), input.readInt(), input.readInt());
}
}
/**
* Serializer for the {@link LocalTime} class.
*/
final static class LocalTimeSerializer implements SerializerShim<LocalTime> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final LocalTime localTime) {
output.writeLong(localTime.toNanoOfDay());
}
@Override
public <I extends InputShim> LocalTime read(final KryoShim<I, ?> kryo, final I input, final Class<LocalTime> clazz) {
return LocalTime.ofNanoOfDay(input.readLong());
}
}
/**
* Serializer for the {@link MonthDay} class.
*/
final static class MonthDaySerializer implements SerializerShim<MonthDay> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final MonthDay monthDay) {
output.writeInt(monthDay.getMonthValue());
output.writeInt(monthDay.getDayOfMonth());
}
@Override
public <I extends InputShim> MonthDay read(final KryoShim<I, ?> kryo, final I input, final Class<MonthDay> clazz) {
return MonthDay.of(input.readInt(), input.readInt());
}
}
/**
* Serializer for the {@link OffsetDateTime} class.
*/
final static class OffsetDateTimeSerializer implements SerializerShim<OffsetDateTime> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final OffsetDateTime offsetDateTime) {
kryo.writeObject(output, offsetDateTime.toLocalDateTime());
kryo.writeObject(output, offsetDateTime.getOffset());
}
@Override
public <I extends InputShim> OffsetDateTime read(final KryoShim<I, ?> kryo, final I input, final Class<OffsetDateTime> clazz) {
return OffsetDateTime.of(kryo.readObject(input, LocalDateTime.class), kryo.readObject(input, ZoneOffset.class));
}
}
/**
* Serializer for the {@link OffsetTime} class.
*/
final static class OffsetTimeSerializer implements SerializerShim<OffsetTime> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final OffsetTime offsetTime) {
kryo.writeObject(output, offsetTime.toLocalTime());
kryo.writeObject(output, offsetTime.getOffset());
}
@Override
public <I extends InputShim> OffsetTime read(final KryoShim<I, ?> kryo, final I input, final Class<OffsetTime> clazz) {
return OffsetTime.of(kryo.readObject(input, LocalTime.class), kryo.readObject(input, ZoneOffset.class));
}
}
/**
* Serializer for the {@link Period} class.
*/
final static class PeriodSerializer implements SerializerShim<Period> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final Period period) {
output.writeInt(period.getYears());
output.writeInt(period.getMonths());
output.writeInt(period.getDays());
}
@Override
public <I extends InputShim> Period read(final KryoShim<I, ?> kryo, final I input, final Class<Period> clazz) {
return Period.of(input.readInt(), input.readInt(), input.readInt());
}
}
/**
* Serializer for the {@link Year} class.
*/
final static class YearSerializer implements SerializerShim<Year> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final Year year) {
output.writeInt(year.getValue());
}
@Override
public <I extends InputShim> Year read(final KryoShim<I, ?> kryo, final I input, final Class<Year> clazz) {
return Year.of(input.readInt());
}
}
/**
* Serializer for the {@link YearMonth} class.
*/
final static class YearMonthSerializer implements SerializerShim<YearMonth> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final YearMonth monthDay) {
output.writeInt(monthDay.getYear());
output.writeInt(monthDay.getMonthValue());
}
@Override
public <I extends InputShim> YearMonth read(final KryoShim<I, ?> kryo, final I input, final Class<YearMonth> clazz) {
return YearMonth.of(input.readInt(), input.readInt());
}
}
/**
* Serializer for the {@link ZonedDateTime} class.
*/
final static class ZonedDateTimeSerializer implements SerializerShim<ZonedDateTime> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final ZonedDateTime zonedDateTime) {
output.writeInt(zonedDateTime.getYear());
output.writeInt(zonedDateTime.getMonthValue());
output.writeInt(zonedDateTime.getDayOfMonth());
output.writeInt(zonedDateTime.getHour());
output.writeInt(zonedDateTime.getMinute());
output.writeInt(zonedDateTime.getSecond());
output.writeInt(zonedDateTime.getNano());
output.writeString(zonedDateTime.getZone().getId());
}
@Override
public <I extends InputShim> ZonedDateTime read(final KryoShim<I, ?> kryo, final I input, final Class<ZonedDateTime> clazz) {
return ZonedDateTime.of(input.readInt(), input.readInt(), input.readInt(),
input.readInt(), input.readInt(), input.readInt(), input.readInt(),
ZoneId.of(input.readString()));
}
}
/**
* Serializer for the {@link ZoneOffset} class.
*/
final static class ZoneOffsetSerializer implements SerializerShim<ZoneOffset> {
@Override
public <O extends OutputShim> void write(final KryoShim<?, O> kryo, final O output, final ZoneOffset zoneOffset) {
output.writeString(zoneOffset.getId());
}
@Override
public <I extends InputShim> ZoneOffset read(final KryoShim<I, ?> kryo, final I input, final Class<ZoneOffset> clazz) {
return ZoneOffset.of(input.readString());
}
}
}