
io.micronaut.serde.support.serdes.SqlTimestampSerde Maven / Gradle / Ivy
/*
* Copyright 2017-2021 original authors
*
* Licensed 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
*
* https://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 io.micronaut.serde.support.serdes;
import io.micronaut.core.type.Argument;
import io.micronaut.serde.Decoder;
import io.micronaut.serde.Deserializer;
import io.micronaut.serde.Encoder;
import io.micronaut.serde.Serializer;
import io.micronaut.serde.exceptions.SerdeException;
import io.micronaut.serde.support.SerdeRegistrar;
import java.io.IOException;
import java.sql.Timestamp;
import java.time.Instant;
/**
* Serde for SQL timestamps.
*/
final class SqlTimestampSerde implements SerdeRegistrar {
private static final Argument INSTANT_ARGUMENT = Argument.of(Instant.class);
private final InstantSerde instantSerde;
SqlTimestampSerde(InstantSerde instantSerde) {
this.instantSerde = instantSerde;
}
@Override
public Serializer createSpecific(EncoderContext encoderContext, Argument extends Timestamp> type) {
final Argument argument = Argument.of(Instant.class, type.getAnnotationMetadata());
final Serializer specific = instantSerde.createSpecific(
encoderContext, argument
);
if (specific != instantSerde) {
return (encoder, context, t, value) -> specific.serialize(
encoder,
context,
argument, value.toInstant()
);
}
return this;
}
@Override
public Deserializer createSpecific(DecoderContext decoderContext, Argument super Timestamp> context)
throws SerdeException {
final Argument argument = Argument.of(Instant.class, context.getAnnotationMetadata());
final Deserializer specific = instantSerde.createSpecific(decoderContext, argument);
if (specific != instantSerde) {
return (decoder, subContext, type) -> {
final Instant i = specific.deserialize(
decoder,
subContext,
argument
);
if (i != null) {
return Timestamp.from(i);
}
return null;
};
}
return this;
}
@Override
public void serialize(Encoder encoder, EncoderContext context, Argument extends Timestamp> type, Timestamp value) throws IOException {
instantSerde.serialize(encoder, context, INSTANT_ARGUMENT, value.toInstant());
}
@Override
public Timestamp deserialize(Decoder decoder, DecoderContext decoderContext, Argument super Timestamp> type) throws IOException {
return Timestamp.from(instantSerde.deserialize(
decoder,
decoderContext,
INSTANT_ARGUMENT
));
}
@Override
public Argument getType() {
return Argument.of(Timestamp.class);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy