Skip to content

Commit cca5d3b

Browse files
authored
ObjectMapper is the first class citizen for ser/de #34 (#35)
* ObjectMapper is the first class citizen for ser/de #34 * add byConfiguring * apply ktlint * add elasticsearch to the coverage
1 parent 1ae3989 commit cca5d3b

File tree

15 files changed

+84
-118
lines changed

15 files changed

+84
-118
lines changed

.editorconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ root = true
22

33
[*]
44
insert_final_newline = true
5-
disabled_rules = no-wildcard-imports, filename, import-ordering
5+
ktlint_disabled_rules = no-wildcard-imports, filename, import-ordering
66

77
[{*.kt,*.kts}]
88
ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
kotlin("jvm").version(libs.versions.kotlin)
77
alias(libs.plugins.dokka)
88
alias(libs.plugins.ktlint)
9-
alias(libs.plugins.palantirGitVersioning)
9+
alias(libs.plugins.gitVersioning)
1010
id("stove-publishing") apply false
1111
id("coverage")
1212
java

buildSrc/src/main/kotlin/coverage.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ plugins {
77
dependencies {
88
jacocoAggregation(project(":lib:stove-testing-e2e"))
99
jacocoAggregation(project(":lib:stove-testing-e2e-couchbase"))
10+
jacocoAggregation(project(":lib:stove-testing-e2e-elasticsearch"))
1011
jacocoAggregation(project(":lib:stove-testing-e2e-http"))
1112
jacocoAggregation(project(":lib:stove-testing-e2e-kafka"))
1213
jacocoAggregation(project(":lib:stove-testing-e2e-wiremock"))

gradle/libs.versions.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,5 @@ ktlint = { id = "org.jlleitschuh.gradle.ktlint", version = "11.2.0" }
7676
dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
7777
knit = { id = "org.jetbrains.kotlinx:kotlinx-knit", version.ref = "knit" }
7878
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
79-
gitVersioning = { id = "me.qoomon.git-versioning", version = "6.4.0" }
80-
palantirGitVersioning = { id = "com.palantir.git-version", version = "1.0.0" }
79+
gitVersioning = { id = "com.palantir.git-version", version = "1.0.0" }
8180

lib/stove-testing-e2e-couchbase/src/main/kotlin/com/trendyol/stove/testing/e2e/couchbase/CouchbaseSystem.kt

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,20 @@ package com.trendyol.stove.testing.e2e.couchbase
55
import arrow.core.getOrElse
66
import com.couchbase.client.core.msg.kv.DurabilityLevel.PERSIST_TO_MAJORITY
77
import com.couchbase.client.java.*
8-
import com.couchbase.client.java.codec.JsonSerializer
8+
import com.couchbase.client.java.codec.JacksonJsonSerializer
99
import com.couchbase.client.java.env.ClusterEnvironment
1010
import com.couchbase.client.java.json.JsonObject
11+
import com.couchbase.client.java.json.JsonValueModule
1112
import com.couchbase.client.java.kv.InsertOptions
1213
import com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS
14+
import com.fasterxml.jackson.databind.ObjectMapper
1315
import com.trendyol.stove.functional.Try
1416
import com.trendyol.stove.functional.recover
1517
import com.trendyol.stove.testing.e2e.containers.DEFAULT_REGISTRY
1618
import com.trendyol.stove.testing.e2e.containers.withProvidedRegistry
1719
import com.trendyol.stove.testing.e2e.couchbase.ClusterExtensions.executeQueryAs
1820
import com.trendyol.stove.testing.e2e.database.DocumentDatabaseSystem
19-
import com.trendyol.stove.testing.e2e.serialization.StoveJacksonJsonSerializer
20-
import com.trendyol.stove.testing.e2e.serialization.StoveJsonSerializer
21+
import com.trendyol.stove.testing.e2e.serialization.StoveObjectMapper
2122
import com.trendyol.stove.testing.e2e.system.TestSystem
2223
import com.trendyol.stove.testing.e2e.system.abstractions.ConfiguresExposedConfiguration
2324
import com.trendyol.stove.testing.e2e.system.abstractions.ExposedConfiguration
@@ -31,7 +32,6 @@ import org.slf4j.Logger
3132
import org.slf4j.LoggerFactory
3233
import org.testcontainers.couchbase.BucketDefinition
3334
import org.testcontainers.couchbase.CouchbaseContainer
34-
import kotlin.jvm.internal.Reflection
3535
import kotlin.reflect.KClass
3636

3737
data class CouchbaseExposedConfiguration(
@@ -45,7 +45,7 @@ data class CouchbaseSystemOptions(
4545
val defaultBucket: String,
4646
val registry: String = DEFAULT_REGISTRY,
4747
override val configureExposedConfiguration: (CouchbaseExposedConfiguration) -> List<String> = { _ -> listOf() },
48-
val jsonSerializer: StoveJsonSerializer = StoveJacksonJsonSerializer(),
48+
val objectMapper: ObjectMapper = StoveObjectMapper.byConfiguring { registerModule(JsonValueModule()) },
4949
) : SystemOptions, ConfiguresExposedConfiguration<CouchbaseExposedConfiguration>
5050

5151
fun TestSystem.withCouchbase(
@@ -82,7 +82,7 @@ class CouchbaseSystem internal constructor(
8282
private lateinit var collection: ReactiveCollection
8383
private lateinit var exposedConfiguration: CouchbaseExposedConfiguration
8484

85-
private val objectMapper: StoveJsonSerializer = context.options.jsonSerializer
85+
private val objectMapper: ObjectMapper = context.options.objectMapper
8686
private val logger: Logger = LoggerFactory.getLogger(javaClass)
8787

8888
override suspend fun run() {
@@ -119,8 +119,8 @@ class CouchbaseSystem internal constructor(
119119
val result = cluster.executeQueryAs<Any>(query) { queryOptions -> queryOptions.scanConsistency(REQUEST_PLUS) }
120120

121121
val objects = result
122-
.map { objectMapper.serialize(it) }
123-
.map { objectMapper.deserialize(it, clazz) }
122+
.map { objectMapper.writeValueAsString(it) }
123+
.map { objectMapper.readValue(it, clazz.java) }
124124

125125
assertion(objects)
126126
return this
@@ -157,7 +157,7 @@ class CouchbaseSystem internal constructor(
157157
.collection(collection)
158158
.insert(
159159
id,
160-
JsonObject.fromJson(objectMapper.serialize(instance)),
160+
JsonObject.fromJson(objectMapper.writeValueAsString(instance)),
161161
InsertOptions.insertOptions().durability(PERSIST_TO_MAJORITY)
162162
)
163163
.awaitSingle()
@@ -184,7 +184,7 @@ class CouchbaseSystem internal constructor(
184184

185185
private fun createCluster(exposedConfiguration: CouchbaseExposedConfiguration): ReactiveCluster =
186186
ClusterEnvironment.builder()
187-
.jsonSerializer(jsonSerializer())
187+
.jsonSerializer(JacksonJsonSerializer.create(objectMapper))
188188
.build()
189189
.let {
190190
Cluster.connect(
@@ -194,13 +194,4 @@ class CouchbaseSystem internal constructor(
194194
.environment(it)
195195
).reactive()
196196
}
197-
198-
private fun jsonSerializer(): JsonSerializer = object : JsonSerializer {
199-
override fun serialize(input: Any): ByteArray = objectMapper.serializeAsBytes(input)
200-
201-
override fun <T : Any> deserialize(
202-
target: Class<T>,
203-
input: ByteArray,
204-
): T = objectMapper.deserialize(input, Reflection.getOrCreateKotlinClass(target)) as T
205-
}
206197
}

lib/stove-testing-e2e-elasticsearch/src/main/kotlin/com/trendyol/stove/testing/e2e/elasticsearch/ElasticsearchSystem.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ import co.elastic.clients.elasticsearch.core.DeleteRequest
1212
import co.elastic.clients.elasticsearch.core.SearchRequest
1313
import co.elastic.clients.json.jackson.JacksonJsonpMapper
1414
import co.elastic.clients.transport.rest_client.RestClientTransport
15+
import com.fasterxml.jackson.databind.ObjectMapper
1516
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
1617
import com.trendyol.stove.testing.e2e.containers.withProvidedRegistry
1718
import com.trendyol.stove.testing.e2e.database.DocumentDatabaseSystem
18-
import com.trendyol.stove.testing.e2e.serialization.StoveJacksonJsonSerializer
19-
import com.trendyol.stove.testing.e2e.serialization.StoveJsonSerializer
19+
import com.trendyol.stove.testing.e2e.serialization.StoveObjectMapper
2020
import com.trendyol.stove.testing.e2e.system.TestSystem
2121
import com.trendyol.stove.testing.e2e.system.abstractions.*
2222
import org.apache.http.HttpHost
@@ -34,7 +34,7 @@ data class ElasticsearchSystemOptions(
3434
val defaultIndex: DefaultIndex,
3535
val containerOptions: ContainerOptions = ContainerOptions(),
3636
override val configureExposedConfiguration: (ElasticSearchExposedConfiguration) -> List<String> = { _ -> listOf() },
37-
val jsonSerializer: StoveJsonSerializer = StoveJacksonJsonSerializer(),
37+
val objectMapper: ObjectMapper = StoveObjectMapper.Default,
3838
) : SystemOptions, ConfiguresExposedConfiguration<ElasticSearchExposedConfiguration> {
3939

4040
internal val migrationCollection: MigrationCollection = MigrationCollection()

lib/stove-testing-e2e-http/src/main/kotlin/com/trendyol/stove/testing/e2e/http/DefaultHttpSystem.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ package com.trendyol.stove.testing.e2e.http
44

55
import arrow.core.Option
66
import arrow.core.getOrElse
7-
import com.trendyol.stove.testing.e2e.serialization.StoveJacksonJsonSerializer
8-
import com.trendyol.stove.testing.e2e.serialization.StoveJsonSerializer
9-
import com.trendyol.stove.testing.e2e.serialization.deserialize
7+
import com.fasterxml.jackson.databind.ObjectMapper
8+
import com.fasterxml.jackson.module.kotlin.readValue
9+
import com.trendyol.stove.testing.e2e.serialization.StoveObjectMapper
1010
import com.trendyol.stove.testing.e2e.system.TestSystem
1111
import com.trendyol.stove.testing.e2e.system.abstractions.SystemNotRegisteredException
1212
import com.trendyol.stove.testing.e2e.system.abstractions.SystemOptions
@@ -22,19 +22,19 @@ import java.time.Duration
2222
import kotlinx.coroutines.future.await
2323
import kotlin.reflect.KClass
2424

25-
data class HttpClientSystemOptions(val jsonSerializer: StoveJsonSerializer = StoveJacksonJsonSerializer()) : SystemOptions
25+
data class HttpClientSystemOptions(val objectMapper: ObjectMapper = StoveObjectMapper.Default) : SystemOptions
2626

2727
@Deprecated(
2828
"This method is deprecated, going to be removed",
2929
replaceWith = ReplaceWith("withHttpClient()", "com.trendyol.stove.testing.e2e.http.TestSystem")
3030
)
31-
fun TestSystem.withDefaultHttp(jsonSerializer: StoveJsonSerializer = StoveJacksonJsonSerializer()): TestSystem {
31+
fun TestSystem.withDefaultHttp(jsonSerializer: ObjectMapper = StoveObjectMapper.Default): TestSystem {
3232
this.getOrRegister(DefaultHttpSystem(this, jsonSerializer))
3333
return this
3434
}
3535

3636
fun TestSystem.withHttpClient(options: HttpClientSystemOptions = HttpClientSystemOptions()): TestSystem {
37-
this.getOrRegister(DefaultHttpSystem(this, options.jsonSerializer))
37+
this.getOrRegister(DefaultHttpSystem(this, options.objectMapper))
3838
return this
3939
}
4040

@@ -54,7 +54,7 @@ fun TestSystem.http(): DefaultHttpSystem =
5454

5555
class DefaultHttpSystem(
5656
override val testSystem: TestSystem,
57-
private val json: StoveJsonSerializer,
57+
private val objectMapper: ObjectMapper,
5858
) : HttpSystem {
5959
private val httpClient: HttpClient = httpClient()
6060

@@ -72,7 +72,7 @@ class DefaultHttpSystem(
7272
token.map { request.setHeader(Headers.Authentication, Headers.bearer(it)) }
7373
body.fold(
7474
ifEmpty = { request.POST(BodyPublishers.noBody()) },
75-
ifSome = { request.POST(BodyPublishers.ofString(json.serialize(it))) }
75+
ifSome = { request.POST(BodyPublishers.ofString(objectMapper.writeValueAsString(it))) }
7676
)
7777
}.let { expect(deserialize(it, clazz)); this }
7878

@@ -85,7 +85,7 @@ class DefaultHttpSystem(
8585
token.map { request.setHeader(Headers.Authentication, Headers.bearer(it)) }
8686
body.fold(
8787
ifEmpty = { request.POST(BodyPublishers.noBody()) },
88-
ifSome = { request.POST(BodyPublishers.ofString(json.serialize(it))) }
88+
ifSome = { request.POST(BodyPublishers.ofString(objectMapper.writeValueAsString(it))) }
8989
)
9090
}.let { expect(StoveHttpResponse(it.statusCode(), it.headers().map())); this }
9191

@@ -107,7 +107,7 @@ class DefaultHttpSystem(
107107
): DefaultHttpSystem = httpClient.send(uri) { request ->
108108
token.map { request.setHeader(Headers.Authentication, Headers.bearer(it)) }
109109
request.GET()
110-
}.let { expect(json.deserialize(it.body())); this }
110+
}.let { expect(objectMapper.readValue(it.body())); this }
111111

112112
override suspend fun getResponse(
113113
uri: String,
@@ -145,7 +145,7 @@ class DefaultHttpSystem(
145145
clazz: KClass<TExpected>,
146146
): TExpected = when {
147147
clazz.java.isAssignableFrom(String::class.java) -> String(it.body()) as TExpected
148-
else -> json.deserialize(it.body(), clazz)
148+
else -> objectMapper.readValue(it.body(), clazz.java)
149149
}
150150

151151
override fun close() {}

lib/stove-testing-e2e-kafka/src/main/kotlin/com/trendyol/stove/testing/e2e/kafka/KafkaSystem.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ package com.trendyol.stove.testing.e2e.kafka
44

55
import arrow.core.Option
66
import arrow.core.getOrElse
7+
import com.fasterxml.jackson.databind.ObjectMapper
8+
import com.fasterxml.jackson.module.kotlin.readValue
79
import com.trendyol.stove.testing.e2e.containers.DEFAULT_REGISTRY
810
import com.trendyol.stove.testing.e2e.containers.withProvidedRegistry
911
import com.trendyol.stove.testing.e2e.kafka.intercepting.InterceptionOptions
1012
import com.trendyol.stove.testing.e2e.kafka.intercepting.TestSystemKafkaInterceptor
1113
import com.trendyol.stove.testing.e2e.messaging.MessagingSystem
12-
import com.trendyol.stove.testing.e2e.serialization.StoveJacksonJsonSerializer
13-
import com.trendyol.stove.testing.e2e.serialization.StoveJsonSerializer
14-
import com.trendyol.stove.testing.e2e.serialization.deserialize
14+
import com.trendyol.stove.testing.e2e.serialization.StoveObjectMapper
1515
import com.trendyol.stove.testing.e2e.system.TestSystem
1616
import com.trendyol.stove.testing.e2e.system.abstractions.*
1717
import io.github.nomisRev.kafka.Admin
@@ -40,7 +40,7 @@ data class KafkaSystemOptions(
4040
val registry: String = DEFAULT_REGISTRY,
4141
val ports: List<Int> = listOf(9092, 9093),
4242
val errorTopicSuffixes: List<String> = listOf("error", "errorTopic", "retry", "retryTopic"),
43-
val jsonSerializer: StoveJsonSerializer = StoveJacksonJsonSerializer(),
43+
val objectMapper: ObjectMapper = StoveObjectMapper.Default,
4444
override val configureExposedConfiguration: (KafkaExposedConfiguration) -> List<String> = { _ -> listOf() },
4545
) : SystemOptions, ConfiguresExposedConfiguration<KafkaExposedConfiguration>
4646

@@ -115,7 +115,7 @@ class KafkaSystem(
115115
override suspend fun afterRun() {
116116
interceptor = TestSystemKafkaInterceptor(
117117
adminClient,
118-
StoveJacksonJsonSerializer(),
118+
context.options.objectMapper,
119119
InterceptionOptions(errorTopicSuffixes = context.options.errorTopicSuffixes)
120120
)
121121
subscribeToAllConsumer = SubscribeToAll(
@@ -178,19 +178,19 @@ class KafkaSystem(
178178
}
179179

180180
class StoveKafkaValueDeserializer<T : Any> : Deserializer<T> {
181-
private val jsonSerializer = StoveJacksonJsonSerializer()
181+
private val objectMapper = StoveObjectMapper.Default
182182

183183
@Suppress("UNCHECKED_CAST")
184184
override fun deserialize(
185185
topic: String,
186186
data: ByteArray,
187-
): T = jsonSerializer.deserialize<Any>(data) as T
187+
): T = objectMapper.readValue<Any>(data) as T
188188
}
189189

190190
class StoveKafkaValueSerializer<T : Any> : Serializer<T> {
191-
private val jsonSerializer = StoveJacksonJsonSerializer()
191+
private val objectMapper = StoveObjectMapper.Default
192192
override fun serialize(
193193
topic: String,
194194
data: T,
195-
): ByteArray = jsonSerializer.serializeAsBytes(data)
195+
): ByteArray = objectMapper.writeValueAsBytes(data)
196196
}

lib/stove-testing-e2e-kafka/src/main/kotlin/com/trendyol/stove/testing/e2e/kafka/intercepting/CommonOps.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import arrow.core.Option
44
import arrow.core.align
55
import arrow.core.handleErrorWith
66
import arrow.core.toOption
7+
import com.fasterxml.jackson.databind.ObjectMapper
78
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
89
import com.trendyol.stove.testing.e2e.kafka.KafkaSystem
9-
import com.trendyol.stove.testing.e2e.serialization.StoveJsonSerializer
1010
import java.util.UUID
1111
import java.util.concurrent.ConcurrentMap
1212
import kotlinx.coroutines.TimeoutCancellationException
@@ -27,7 +27,7 @@ data class KafkaAssertion<T : Any>(
2727

2828
internal interface CommonOps : RecordsAssertions {
2929
val exceptions: ConcurrentMap<UUID, Failure>
30-
val serde: StoveJsonSerializer
30+
val serde: ObjectMapper
3131
val adminClient: Admin
3232

3333
suspend fun <T> (() -> Collection<T>).waitUntilConditionMet(
@@ -60,7 +60,7 @@ internal interface CommonOps : RecordsAssertions {
6060
clazz: KClass<T>,
6161
): Result<T> = runCatching {
6262
when (json) {
63-
is String -> serde.deserialize(json, clazz)
63+
is String -> serde.readValue(json, clazz.java)
6464
else -> jacksonObjectMapper().convertValue(json, clazz.java)
6565
}
6666
}

lib/stove-testing-e2e-kafka/src/main/kotlin/com/trendyol/stove/testing/e2e/kafka/intercepting/TestSystemInterceptor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.trendyol.stove.testing.e2e.kafka.intercepting
22

3-
import com.trendyol.stove.testing.e2e.serialization.StoveJsonSerializer
3+
import com.fasterxml.jackson.databind.ObjectMapper
44
import java.util.UUID
55
import java.util.concurrent.ConcurrentHashMap
66
import java.util.concurrent.ConcurrentMap
@@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory
1212

1313
class TestSystemKafkaInterceptor(
1414
override val adminClient: Admin,
15-
override val serde: StoveJsonSerializer,
15+
override val serde: ObjectMapper,
1616
private val options: InterceptionOptions,
1717
) : ConsumingOps, CommonOps, AutoCloseable {
1818

0 commit comments

Comments
 (0)