Skip to content

Commit baebf90

Browse files
authored
Simplify customization of bson-kotlinx (#1293)
Allow configuration to be set on the KotlinSerializerCodecProvider JAVA-5276
1 parent 0d8cc80 commit baebf90

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

bson-kotlinx/src/main/kotlin/org/bson/codecs/kotlinx/KotlinSerializerCodecProvider.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.bson.codecs.kotlinx
1717

18+
import kotlinx.serialization.ExperimentalSerializationApi
19+
import kotlinx.serialization.modules.SerializersModule
1820
import org.bson.codecs.Codec
1921
import org.bson.codecs.configuration.CodecProvider
2022
import org.bson.codecs.configuration.CodecRegistry
@@ -24,8 +26,12 @@ import org.bson.codecs.configuration.CodecRegistry
2426
*
2527
* The underlying class must be annotated with the `@Serializable`.
2628
*/
27-
public class KotlinSerializerCodecProvider : CodecProvider {
29+
@OptIn(ExperimentalSerializationApi::class)
30+
public class KotlinSerializerCodecProvider(
31+
private val serializersModule: SerializersModule = defaultSerializersModule,
32+
private val bsonConfiguration: BsonConfiguration = BsonConfiguration()
33+
) : CodecProvider {
2834

2935
override fun <T : Any> get(clazz: Class<T>, registry: CodecRegistry): Codec<T>? =
30-
KotlinSerializerCodec.create(clazz.kotlin)
36+
KotlinSerializerCodec.create(clazz.kotlin, serializersModule, bsonConfiguration)
3137
}

bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/KotlinSerializerCodecProviderTest.kt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ import kotlin.test.assertEquals
2020
import kotlin.test.assertNotNull
2121
import kotlin.test.assertNull
2222
import kotlin.test.assertTrue
23+
import kotlinx.serialization.ExperimentalSerializationApi
24+
import kotlinx.serialization.modules.SerializersModule
25+
import kotlinx.serialization.modules.plus
26+
import kotlinx.serialization.modules.polymorphic
27+
import kotlinx.serialization.modules.subclass
28+
import org.bson.BsonDocument
29+
import org.bson.BsonDocumentReader
30+
import org.bson.BsonDocumentWriter
31+
import org.bson.codecs.DecoderContext
32+
import org.bson.codecs.EncoderContext
33+
import org.bson.codecs.kotlinx.samples.DataClassContainsOpen
34+
import org.bson.codecs.kotlinx.samples.DataClassOpen
35+
import org.bson.codecs.kotlinx.samples.DataClassOpenA
36+
import org.bson.codecs.kotlinx.samples.DataClassOpenB
2337
import org.bson.codecs.kotlinx.samples.DataClassParameterized
2438
import org.bson.codecs.kotlinx.samples.DataClassWithSimpleValues
2539
import org.bson.conversions.Bson
@@ -60,4 +74,37 @@ class KotlinSerializerCodecProviderTest {
6074
assertTrue { codec is KotlinSerializerCodec }
6175
assertEquals(DataClassWithSimpleValues::class.java, codec.encoderClass)
6276
}
77+
78+
@OptIn(ExperimentalSerializationApi::class)
79+
@Test
80+
fun shouldAllowOverridingOfSerializersModuleAndBsonConfigurationInConstructor() {
81+
82+
val serializersModule =
83+
SerializersModule {
84+
this.polymorphic(DataClassOpen::class) {
85+
this.subclass(DataClassOpenA::class)
86+
this.subclass(DataClassOpenB::class)
87+
}
88+
} + defaultSerializersModule
89+
90+
val bsonConfiguration = BsonConfiguration(classDiscriminator = "__type")
91+
val dataClassContainsOpenB = DataClassContainsOpen(DataClassOpenB(1))
92+
93+
val codec =
94+
KotlinSerializerCodecProvider(serializersModule, bsonConfiguration)
95+
.get(DataClassContainsOpen::class.java, Bson.DEFAULT_CODEC_REGISTRY)!!
96+
97+
assertTrue { codec is KotlinSerializerCodec }
98+
val encodedDocument = BsonDocument()
99+
val writer = BsonDocumentWriter(encodedDocument)
100+
codec.encode(writer, dataClassContainsOpenB, EncoderContext.builder().build())
101+
writer.flush()
102+
103+
assertEquals(
104+
BsonDocument.parse("""{"open": {"__type": "org.bson.codecs.kotlinx.samples.DataClassOpenB", "b": 1}}"""),
105+
encodedDocument)
106+
107+
assertEquals(
108+
dataClassContainsOpenB, codec.decode(BsonDocumentReader(encodedDocument), DecoderContext.builder().build()))
109+
}
63110
}

0 commit comments

Comments
 (0)