From 1cff21fa4aa22f0b79d0f244886d1c6debb29df9 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Fri, 26 Jul 2024 12:37:41 -0700 Subject: [PATCH 1/9] Add support for kotlinx-datetime serializers mapping to BSON - Add kotlinx-datetime serializers that map to BSON as the expected types. - Make it easily configurable via `@Contextual` annotation. JAVA-5330 --- bson-kotlinx/build.gradle.kts | 1 + .../bson/codecs/kotlinx/BsonSerializers.kt | 2 +- .../codecs/kotlinx/DateTimeSerializers.kt | 212 ++++++++++++++++++ .../kotlinx/KotlinSerializerCodecTest.kt | 46 ++++ .../codecs/kotlinx/samples/DataClasses.kt | 20 ++ 5 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt diff --git a/bson-kotlinx/build.gradle.kts b/bson-kotlinx/build.gradle.kts index bb9dd42e10b..f68ca055069 100644 --- a/bson-kotlinx/build.gradle.kts +++ b/bson-kotlinx/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { implementation(platform("org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.0")) implementation("org.jetbrains.kotlinx:kotlinx-serialization-core") + implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") api(project(path = ":bson", configuration = "default")) implementation("org.jetbrains.kotlin:kotlin-reflect") diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/BsonSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/BsonSerializers.kt index 05d84b65987..26c19c0fe17 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/BsonSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/BsonSerializers.kt @@ -61,7 +61,7 @@ import org.bson.types.ObjectId */ @ExperimentalSerializationApi public val defaultSerializersModule: SerializersModule = - ObjectIdSerializer.serializersModule + BsonValueSerializer.serializersModule + ObjectIdSerializer.serializersModule + BsonValueSerializer.serializersModule + dateTimeSerializersModule @ExperimentalSerializationApi @Serializer(forClass = ObjectId::class) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt new file mode 100644 index 00000000000..51474facfd2 --- /dev/null +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -0,0 +1,212 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * 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 + * + * 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.bson.codecs.kotlinx + +import java.time.ZoneOffset +import kotlinx.datetime.Instant +import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.LocalTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.UtcOffset +import kotlinx.datetime.atDate +import kotlinx.datetime.atStartOfDayIn +import kotlinx.datetime.toInstant +import kotlinx.datetime.toLocalDateTime +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerializationException +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.plus +import org.bson.BsonDateTime + +/** + * The default serializers module + * + * Handles: + * - ObjectId serialization + * - BsonValue serialization + * - Instant serialization + * - LocalDate serialization + * - LocalDateTime serialization + * - LocalTime serialization + */ +@ExperimentalSerializationApi +public val dateTimeSerializersModule: SerializersModule = + InstantAsBsonDateTime.serializersModule + + LocalDateAsBsonDateTime.serializersModule + + LocalDateTimeAsBsonDateTime.serializersModule + + LocalTimeAsBsonDateTime.serializersModule + +/** + * Instant KSerializer. + * + *

+ * Encodes and decodes {@code Instant} objects to and from {@code BsonDateTime}. Data is extracted via {@link + * Instant#fromEpochMilliseconds()} and stored to millisecond accuracy.

+ * + * @since 5.2 + */ +@ExperimentalSerializationApi +public object InstantAsBsonDateTime : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("InstantAsBsonDateTime", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Instant) { + when (encoder) { + is BsonEncoder -> encoder.encodeBsonValue(BsonDateTime(value.toEpochMilliseconds())) + else -> throw SerializationException("Instant is not supported by ${encoder::class}") + } + } + + override fun deserialize(decoder: Decoder): Instant { + return when (decoder) { + is BsonDecoder -> Instant.fromEpochMilliseconds(decoder.decodeBsonValue().asDateTime().value) + else -> throw SerializationException("Instant is not supported by ${decoder::class}") + } + } + + @Suppress("UNCHECKED_CAST") + public val serializersModule: SerializersModule = SerializersModule { + contextual(Instant::class, InstantAsBsonDateTime as KSerializer) + } +} + +/** + * LocalDate KSerializer. + * + *

Encodes and decodes {@code LocalDate} objects to and from {@code BsonDateTime}.

+ * + *

Converts the {@code LocalDate} values to and from {@code UTC}.

+ * + * @since 5.2 + */ +@ExperimentalSerializationApi +public object LocalDateAsBsonDateTime : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("LocalDateAsBsonDateTime", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: LocalDate) { + when (encoder) { + is BsonEncoder -> { + val epochMillis = value.atStartOfDayIn(TimeZone.UTC).toEpochMilliseconds() + encoder.encodeBsonValue(BsonDateTime(epochMillis)) + } + else -> throw SerializationException("LocalDate is not supported by ${encoder::class}") + } + } + + override fun deserialize(decoder: Decoder): LocalDate { + return when (decoder) { + is BsonDecoder -> + Instant.fromEpochMilliseconds(decoder.decodeBsonValue().asDateTime().value) + .toLocalDateTime(TimeZone.UTC) + .date + else -> throw SerializationException("LocalDate is not supported by ${decoder::class}") + } + } + + @Suppress("UNCHECKED_CAST") + public val serializersModule: SerializersModule = SerializersModule { + contextual(LocalDate::class, LocalDateAsBsonDateTime as KSerializer) + } +} + +/** + * LocalDateTime KSerializer. + * + *

Encodes and decodes {@code LocalDateTime} objects to and from {@code BsonDate}. Data is stored to millisecond + * accuracy.

+ * + *

Converts the {@code LocalDateTime} values to and from {@code UTC}.

+ * + * @since 5.2 + */ +@ExperimentalSerializationApi +public object LocalDateTimeAsBsonDateTime : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("LocalDateTimeAsBsonDateTime", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: LocalDateTime) { + when (encoder) { + is BsonEncoder -> { + val epochMillis = value.toInstant(UtcOffset(ZoneOffset.UTC)).toEpochMilliseconds() + encoder.encodeBsonValue(BsonDateTime(epochMillis)) + } + else -> throw SerializationException("LocalDateTime is not supported by ${encoder::class}") + } + } + + override fun deserialize(decoder: Decoder): LocalDateTime { + return when (decoder) { + is BsonDecoder -> + Instant.fromEpochMilliseconds(decoder.decodeBsonValue().asDateTime().value) + .toLocalDateTime(TimeZone.UTC) + else -> throw SerializationException("LocalDateTime is not supported by ${decoder::class}") + } + } + + @Suppress("UNCHECKED_CAST") + public val serializersModule: SerializersModule = SerializersModule { + contextual(LocalDateTime::class, LocalDateTimeAsBsonDateTime as KSerializer) + } +} + +/** + * LocalTime KSerializer. + * + *

Encodes and decodes {@code LocalTime} objects to and from {@code DateTime}. Data is stored to millisecond + * accuracy.

+ * + *

Converts the {@code LocalTime} values to and from EpochDay at {@code UTC}.

+ * + * @since 5.2 + */ +@ExperimentalSerializationApi +public object LocalTimeAsBsonDateTime : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("LocalTimeAsBsonDateTime", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: LocalTime) { + when (encoder) { + is BsonEncoder -> { + val epochMillis = + value.atDate(LocalDate.fromEpochDays(0)).toInstant(UtcOffset(ZoneOffset.UTC)).toEpochMilliseconds() + encoder.encodeBsonValue(BsonDateTime(epochMillis)) + } + else -> throw SerializationException("LocalTime is not supported by ${encoder::class}") + } + } + + override fun deserialize(decoder: Decoder): LocalTime { + return when (decoder) { + is BsonDecoder -> + Instant.fromEpochMilliseconds(decoder.decodeBsonValue().asDateTime().value) + .toLocalDateTime(TimeZone.UTC) + .time + else -> throw SerializationException("LocalTime is not supported by ${decoder::class}") + } + } + + @Suppress("UNCHECKED_CAST") + public val serializersModule: SerializersModule = SerializersModule { + contextual(LocalTime::class, LocalTimeAsBsonDateTime as KSerializer) + } +} diff --git a/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/KotlinSerializerCodecTest.kt b/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/KotlinSerializerCodecTest.kt index ed9e1bfb43a..4b8de707576 100644 --- a/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/KotlinSerializerCodecTest.kt +++ b/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/KotlinSerializerCodecTest.kt @@ -17,6 +17,10 @@ package org.bson.codecs.kotlinx import java.util.stream.Stream import kotlin.test.assertEquals +import kotlinx.datetime.Instant +import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.LocalTime import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.MissingFieldException import kotlinx.serialization.SerializationException @@ -71,7 +75,9 @@ import org.bson.codecs.kotlinx.samples.DataClassWithBsonIgnore import org.bson.codecs.kotlinx.samples.DataClassWithBsonProperty import org.bson.codecs.kotlinx.samples.DataClassWithBsonRepresentation import org.bson.codecs.kotlinx.samples.DataClassWithCollections +import org.bson.codecs.kotlinx.samples.DataClassWithContextualDateValues import org.bson.codecs.kotlinx.samples.DataClassWithDataClassMapKey +import org.bson.codecs.kotlinx.samples.DataClassWithDateValues import org.bson.codecs.kotlinx.samples.DataClassWithDefaults import org.bson.codecs.kotlinx.samples.DataClassWithEmbedded import org.bson.codecs.kotlinx.samples.DataClassWithEncodeDefault @@ -196,6 +202,46 @@ class KotlinSerializerCodecTest { assertDecodesTo(data, expectedDataClass) } + @Test + fun testDataClassWithDateValuesContextualSerialization() { + val expected = + "{\n" + + " \"instant\": {\"\$date\": \"2001-09-09T01:46:40Z\"}, \n" + + " \"localTime\": {\"\$date\": \"1970-01-01T00:00:10Z\"}, \n" + + " \"localDateTime\": {\"\$date\": \"2021-01-01T00:00:04Z\"}, \n" + + " \"localDate\": {\"\$date\": \"1970-10-28T00:00:00Z\"}\n" + + "}".trimMargin() + + val expectedDataClass = + DataClassWithContextualDateValues( + Instant.fromEpochMilliseconds(10_000_000_000_00), + LocalTime.fromMillisecondOfDay(10_000), + LocalDateTime.parse("2021-01-01T00:00:04"), + LocalDate.fromEpochDays(300)) + + assertRoundTrips(expected, expectedDataClass) + } + + @Test + fun testDataClassWithDateValuesStandard() { + val expected = + "{\n" + + " \"instant\": \"1970-01-01T00:00:01Z\", \n" + + " \"localTime\": \"00:00:01\", \n" + + " \"localDateTime\": \"2021-01-01T00:00:04\", \n" + + " \"localDate\": \"1970-01-02\"\n" + + "}".trimMargin() + + val expectedDataClass = + DataClassWithDateValues( + Instant.fromEpochMilliseconds(1000), + LocalTime.fromMillisecondOfDay(1000), + LocalDateTime.parse("2021-01-01T00:00:04"), + LocalDate.fromEpochDays(1)) + + assertRoundTrips(expected, expectedDataClass) + } + @Test fun testDataClassWithComplexTypes() { val expected = diff --git a/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/samples/DataClasses.kt b/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/samples/DataClasses.kt index 2511c7b0418..8499237ea6c 100644 --- a/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/samples/DataClasses.kt +++ b/bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/samples/DataClasses.kt @@ -15,6 +15,10 @@ */ package org.bson.codecs.kotlinx.samples +import kotlinx.datetime.Instant +import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.LocalTime import kotlinx.serialization.Contextual import kotlinx.serialization.EncodeDefault import kotlinx.serialization.ExperimentalSerializationApi @@ -63,6 +67,22 @@ data class DataClassWithSimpleValues( val string: String ) +@Serializable +data class DataClassWithContextualDateValues( + @Contextual val instant: Instant, + @Contextual val localTime: LocalTime, + @Contextual val localDateTime: LocalDateTime, + @Contextual val localDate: LocalDate, +) + +@Serializable +data class DataClassWithDateValues( + val instant: Instant, + val localTime: LocalTime, + val localDateTime: LocalDateTime, + val localDate: LocalDate, +) + @Serializable data class DataClassWithCollections( val listSimple: List, From edbf9a1c78869333d8faad80b91aaa016a174d7d Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Fri, 26 Jul 2024 12:39:49 -0700 Subject: [PATCH 2/9] Correct the doc. JAVA-5330 --- .../kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index 51474facfd2..7fc3c6adff3 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -51,7 +51,7 @@ import org.bson.BsonDateTime */ @ExperimentalSerializationApi public val dateTimeSerializersModule: SerializersModule = - InstantAsBsonDateTime.serializersModule + + InstantAsBsonDateTime.serializersModule + LocalDateAsBsonDateTime.serializersModule + LocalDateTimeAsBsonDateTime.serializersModule + LocalTimeAsBsonDateTime.serializersModule @@ -132,7 +132,7 @@ public object LocalDateAsBsonDateTime : KSerializer { /** * LocalDateTime KSerializer. * - *

Encodes and decodes {@code LocalDateTime} objects to and from {@code BsonDate}. Data is stored to millisecond + *

Encodes and decodes {@code LocalDateTime} objects to and from {@code BsonDateTime}. Data is stored to millisecond * accuracy.

* *

Converts the {@code LocalDateTime} values to and from {@code UTC}.

@@ -172,7 +172,7 @@ public object LocalDateTimeAsBsonDateTime : KSerializer { /** * LocalTime KSerializer. * - *

Encodes and decodes {@code LocalTime} objects to and from {@code DateTime}. Data is stored to millisecond + *

Encodes and decodes {@code LocalTime} objects to and from {@code BsonDateTime}. Data is stored to millisecond * accuracy.

* *

Converts the {@code LocalTime} values to and from EpochDay at {@code UTC}.

From 83fc3cf4f78dac9661a7f1e8e465dd09a7b707f3 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 19 Aug 2024 16:11:42 -0700 Subject: [PATCH 3/9] Add kotlinx datatime as optional dependency. JAVA-5330 --- bson-kotlinx/build.gradle.kts | 9 +++++- .../codecs/kotlinx/DateTimeSerializers.kt | 22 +++++++++++---- .../kotlinx/utils/SerializationModuleUtils.kt | 28 +++++++++++++++++++ gradle/publish.gradle | 2 ++ 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/utils/SerializationModuleUtils.kt diff --git a/bson-kotlinx/build.gradle.kts b/bson-kotlinx/build.gradle.kts index f68ca055069..5f707239581 100644 --- a/bson-kotlinx/build.gradle.kts +++ b/bson-kotlinx/build.gradle.kts @@ -38,6 +38,12 @@ description = "Bson Kotlinx Codecs" ext.set("pomName", "Bson Kotlinx") +ext.set("kotlinxDatetimeVersion", "0.4.0") + +val kotlinxDatetimeVersion: String by ext + +java { registerFeature("dateTimeSupport") { usingSourceSet(sourceSets["main"]) } } + dependencies { // Align versions of all Kotlin components implementation(platform("org.jetbrains.kotlin:kotlin-bom")) @@ -45,13 +51,14 @@ dependencies { implementation(platform("org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.0")) implementation("org.jetbrains.kotlinx:kotlinx-serialization-core") - implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") + "dateTimeSupportImplementation"("org.jetbrains.kotlinx:kotlinx-datetime:$kotlinxDatetimeVersion") api(project(path = ":bson", configuration = "default")) implementation("org.jetbrains.kotlin:kotlin-reflect") testImplementation("org.jetbrains.kotlin:kotlin-test-junit") testImplementation(project(path = ":driver-core", configuration = "default")) + testImplementation("org.jetbrains.kotlinx:kotlinx-datetime:$kotlinxDatetimeVersion") } kotlin { explicitApi() } diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index 7fc3c6adff3..9141438e848 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -37,6 +37,7 @@ import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.plus import org.bson.BsonDateTime +import org.bson.codecs.kotlinx.utils.SerializationModuleUtils.isClassAvailable /** * The default serializers module @@ -50,11 +51,22 @@ import org.bson.BsonDateTime * - LocalTime serialization */ @ExperimentalSerializationApi -public val dateTimeSerializersModule: SerializersModule = - InstantAsBsonDateTime.serializersModule + - LocalDateAsBsonDateTime.serializersModule + - LocalDateTimeAsBsonDateTime.serializersModule + - LocalTimeAsBsonDateTime.serializersModule +public val dateTimeSerializersModule: SerializersModule by lazy { + var module = SerializersModule {} + if (isClassAvailable("kotlinx.datetime.Instant")) { + module += InstantAsBsonDateTime.serializersModule + } + if (isClassAvailable("kotlinx.datetime.LocalDate")) { + module += LocalDateAsBsonDateTime.serializersModule + } + if (isClassAvailable("kotlinx.datetime.LocalDateTime")) { + module += LocalDateTimeAsBsonDateTime.serializersModule + } + if (isClassAvailable("kotlinx.datetime.LocalTime")) { + module += LocalTimeAsBsonDateTime.serializersModule + } + module +} /** * Instant KSerializer. diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/utils/SerializationModuleUtils.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/utils/SerializationModuleUtils.kt new file mode 100644 index 00000000000..306644c81ad --- /dev/null +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/utils/SerializationModuleUtils.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * 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 + * + * 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.bson.codecs.kotlinx.utils + +internal object SerializationModuleUtils { + @Suppress("SwallowedException") + fun isClassAvailable(className: String): Boolean { + return try { + Class.forName(className) + true + } catch (e: ClassNotFoundException) { + false + } + } +} diff --git a/gradle/publish.gradle b/gradle/publish.gradle index 498184db983..25edda53f49 100644 --- a/gradle/publish.gradle +++ b/gradle/publish.gradle @@ -100,6 +100,8 @@ configure(javaProjects) { project -> artifact sourcesJar artifact javadocJar + suppressPomMetadataWarningsFor("dateTimeSupportApiElements") + suppressPomMetadataWarningsFor("dateTimeRuntimeElements") } } From 755aad6a62dd1f29edba688660cbdf6c8fa24d14 Mon Sep 17 00:00:00 2001 From: Viacheslav Babanin Date: Wed, 28 Aug 2024 23:43:08 -0700 Subject: [PATCH 4/9] Update bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt Co-authored-by: Ross Lawley --- .../kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index 9141438e848..9b4e68a4c83 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -71,9 +71,8 @@ public val dateTimeSerializersModule: SerializersModule by lazy { /** * Instant KSerializer. * - *

- * Encodes and decodes {@code Instant} objects to and from {@code BsonDateTime}. Data is extracted via {@link - * Instant#fromEpochMilliseconds()} and stored to millisecond accuracy.

+ * Encodes and decodes `Instant` objects to and from `BsonDateTime`. Data is extracted via + * [kotlinx.datetime.Instant.fromEpochMilliseconds] and stored to millisecond accuracy. * * @since 5.2 */ From 92dfc2f3c00d98acb71ca1131b3136849619e0af Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Thu, 29 Aug 2024 00:02:32 -0700 Subject: [PATCH 5/9] Remove additional class checks. JAVA-5330 --- .../org/bson/codecs/kotlinx/DateTimeSerializers.kt | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index 9b4e68a4c83..3d0848e44d8 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -54,16 +54,10 @@ import org.bson.codecs.kotlinx.utils.SerializationModuleUtils.isClassAvailable public val dateTimeSerializersModule: SerializersModule by lazy { var module = SerializersModule {} if (isClassAvailable("kotlinx.datetime.Instant")) { - module += InstantAsBsonDateTime.serializersModule - } - if (isClassAvailable("kotlinx.datetime.LocalDate")) { - module += LocalDateAsBsonDateTime.serializersModule - } - if (isClassAvailable("kotlinx.datetime.LocalDateTime")) { - module += LocalDateTimeAsBsonDateTime.serializersModule - } - if (isClassAvailable("kotlinx.datetime.LocalTime")) { - module += LocalTimeAsBsonDateTime.serializersModule + module += InstantAsBsonDateTime.serializersModule + + LocalDateAsBsonDateTime.serializersModule + + LocalDateTimeAsBsonDateTime.serializersModule + + LocalTimeAsBsonDateTime.serializersModule } module } From 55e89d1fdb2fc530a987158feee56af47066c557 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Thu, 29 Aug 2024 16:45:40 +0100 Subject: [PATCH 6/9] Update bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt --- .../kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index 3d0848e44d8..753c5a7dc22 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -137,10 +137,10 @@ public object LocalDateAsBsonDateTime : KSerializer { /** * LocalDateTime KSerializer. * - *

Encodes and decodes {@code LocalDateTime} objects to and from {@code BsonDateTime}. Data is stored to millisecond - * accuracy.

+ * Encodes and decodes `LocalDateTime` objects to and from `BsonDateTime`. Data is stored to millisecond + * accuracy. * - *

Converts the {@code LocalDateTime} values to and from {@code UTC}.

+ * Converts the `LocalDateTime` values to and from `UTC`. * * @since 5.2 */ From 1e7d2585138b03adce2598c1eb55b59a81f403b3 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Thu, 29 Aug 2024 16:45:48 +0100 Subject: [PATCH 7/9] Update bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt --- .../kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index 753c5a7dc22..19764dfa09d 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -97,9 +97,9 @@ public object InstantAsBsonDateTime : KSerializer { /** * LocalDate KSerializer. * - *

Encodes and decodes {@code LocalDate} objects to and from {@code BsonDateTime}.

+ * Encodes and decodes `LocalDate` objects to and from `BsonDateTime`. * - *

Converts the {@code LocalDate} values to and from {@code UTC}.

+ * Converts the `LocalDate` values to and from `UTC`. * * @since 5.2 */ From 83cd3a145a8e586b1f18eef8707dcd2fb5fe7dca Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Thu, 29 Aug 2024 16:45:55 +0100 Subject: [PATCH 8/9] Update bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt --- .../kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index 19764dfa09d..ff097ee5363 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -177,10 +177,10 @@ public object LocalDateTimeAsBsonDateTime : KSerializer { /** * LocalTime KSerializer. * - *

Encodes and decodes {@code LocalTime} objects to and from {@code BsonDateTime}. Data is stored to millisecond - * accuracy.

+ * Encodes and decodes `LocalTime` objects to and from `BsonDateTime`. Data is stored to millisecond + * accuracy. * - *

Converts the {@code LocalTime} values to and from EpochDay at {@code UTC}.

+ * Converts the `LocalTime` values to and from EpochDay at `UTC`. * * @since 5.2 */ From e0735bb2d73e8669aa201b2be67e72ba46aa7f4c Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Thu, 29 Aug 2024 16:49:17 +0100 Subject: [PATCH 9/9] Spotless fix --- .../org/bson/codecs/kotlinx/DateTimeSerializers.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt index ff097ee5363..e3e228ecbfb 100644 --- a/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt +++ b/bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/DateTimeSerializers.kt @@ -54,7 +54,8 @@ import org.bson.codecs.kotlinx.utils.SerializationModuleUtils.isClassAvailable public val dateTimeSerializersModule: SerializersModule by lazy { var module = SerializersModule {} if (isClassAvailable("kotlinx.datetime.Instant")) { - module += InstantAsBsonDateTime.serializersModule + + module += + InstantAsBsonDateTime.serializersModule + LocalDateAsBsonDateTime.serializersModule + LocalDateTimeAsBsonDateTime.serializersModule + LocalTimeAsBsonDateTime.serializersModule @@ -137,8 +138,7 @@ public object LocalDateAsBsonDateTime : KSerializer { /** * LocalDateTime KSerializer. * - * Encodes and decodes `LocalDateTime` objects to and from `BsonDateTime`. Data is stored to millisecond - * accuracy. + * Encodes and decodes `LocalDateTime` objects to and from `BsonDateTime`. Data is stored to millisecond accuracy. * * Converts the `LocalDateTime` values to and from `UTC`. * @@ -177,8 +177,7 @@ public object LocalDateTimeAsBsonDateTime : KSerializer { /** * LocalTime KSerializer. * - * Encodes and decodes `LocalTime` objects to and from `BsonDateTime`. Data is stored to millisecond - * accuracy. + * Encodes and decodes `LocalTime` objects to and from `BsonDateTime`. Data is stored to millisecond accuracy. * * Converts the `LocalTime` values to and from EpochDay at `UTC`. *