package core.framework.impl.mongo;
import org.bson.BsonReader;
import org.bson.BsonType;
import org.bson.BsonWriter;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
/**
* @author neo
*/
public class ZonedDateTimeCodec implements Codec<ZonedDateTime> {
private static final Logger LOGGER = LoggerFactory.getLogger(ZonedDateTimeCodec.class);
static void write(BsonWriter writer, ZonedDateTime value) {
if (value == null) writer.writeNull();
else writer.writeDateTime(value.toInstant().toEpochMilli());
}
static ZonedDateTime read(BsonReader reader, String field) {
BsonType currentType = reader.getCurrentBsonType();
if (currentType == BsonType.NULL) {
reader.readNull();
return null;
} else if (currentType == BsonType.DATE_TIME) {
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(reader.readDateTime()), ZoneId.systemDefault());
} else {
LOGGER.warn("unexpected field type, field={}, type={}", field, currentType);
reader.skipValue();
return null;
}
}
@Override
public void encode(BsonWriter writer, ZonedDateTime value, EncoderContext context) {
write(writer, value);
}
@Override
public ZonedDateTime decode(BsonReader reader, DecoderContext context) {
return read(reader, reader.getCurrentName());
}
@Override
public Class<ZonedDateTime> getEncoderClass() {
return ZonedDateTime.class;
}
}