Skip to content

Commit 6a93b89

Browse files
author
Adrian Tosca
committed
add kotlin serialization support for Id and RawId
1 parent fa028ea commit 6a93b89

File tree

16 files changed

+123
-26
lines changed

16 files changed

+123
-26
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# typeid-kotlin
22
![Build Status](https://github.com/aleris/typeid-kotlin/actions/workflows/build-on-push.yml/badge.svg)
3-
![Current Version](https://img.shields.io/badge/Version-0.0.9-blue)
3+
![Current Version](https://img.shields.io/badge/Version--blue)
44

55

66
## A Kotlin implementation of [TypeID](https://github.com/jetpack-io/typeid).
@@ -25,14 +25,14 @@ To use with Maven:
2525
<dependency>
2626
<groupId>earth.adi</groupId>
2727
<artifactId>typeid-kotlin</artifactId>
28-
<version>0.0.9</version>
28+
<version></version>
2929
</dependency>
3030
```
3131

3232
To use via Gradle:
3333

3434
```kotlin
35-
implementation("earth.adi:typeid-kotlin:0.0.9")
35+
implementation("earth.adi:typeid-kotlin:")
3636
```
3737

3838

build.gradle.kts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent.*
44
plugins {
55
`java-library`
66
alias(libs.plugins.kotlinJvm)
7+
alias(libs.plugins.kotlinSerialization)
78
alias(libs.plugins.spotless)
89
jacoco
910
alias(libs.plugins.jmh)
@@ -14,17 +15,19 @@ plugins {
1415

1516
group = "earth.adi"
1617

17-
version = "0.0.9"
18+
version = "0.0.10"
1819

1920
repositories { mavenCentral() }
2021

2122
dependencies {
2223
implementation(libs.javaUuidGenerator)
2324
implementation(platform(libs.jacksonBom))
2425
implementation(libs.bundles.jackson)
26+
implementation(libs.kotlinxSerializationCore)
2527

2628
testImplementation(platform(libs.junitBom))
2729
testImplementation(libs.bundles.test)
30+
testImplementation(libs.kotlinxSerializationCbor)
2831
}
2932

3033
kotlin { jvmToolchain(17) }
@@ -83,15 +86,43 @@ tasks.test {
8386
}
8487

8588
tasks.withType<JacocoReport> {
89+
afterEvaluate {
90+
classDirectories.setFrom(
91+
files(
92+
classDirectories.files.map {
93+
fileTree(it).apply {
94+
exclude("**/**/*serializer*.*") // kotlinx.serialization
95+
}
96+
}))
97+
}
98+
8699
doLast { println("JaCoCo report: file://" + reports.html.entryPoint) }
87100
}
88101

89102
tasks.jacocoTestReport { dependsOn(tasks.test) }
90103

91-
tasks.jacocoTestCoverageVerification {
104+
tasks.withType<JacocoCoverageVerification> {
92105
dependsOn(tasks.jacocoTestReport)
93106

94-
violationRules { rule { limit { minimum = "1.00".toBigDecimal() } } }
107+
violationRules {
108+
rule { limit { minimum = "1.00".toBigDecimal() } }
109+
rule {
110+
limit {
111+
counter = "BRANCH"
112+
minimum = "1.00".toBigDecimal()
113+
}
114+
}
115+
}
116+
117+
afterEvaluate {
118+
classDirectories.setFrom(
119+
files(
120+
classDirectories.files.map {
121+
fileTree(it).apply {
122+
exclude("**/**/*serializer*.*") // kotlinx.serialization
123+
}
124+
}))
125+
}
95126
}
96127

97128
jmh {

gradle/libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ jmh = "0.7.2"
99
jqwik = "1.8.4"
1010
jreleaser = "1.12.0"
1111
dokka = "1.9.20"
12+
kotlinxSerialization = "1.6.3"
1213

1314
[plugins]
1415
jmh = { id = "me.champeau.jmh", version.ref = "jmh" }
1516
kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
17+
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
1618
spotless = { id = "com.diffplug.spotless", version.ref = "spotless" }
1719
jreleaser = { id = "org.jreleaser", version.ref = "jreleaser" }
1820
dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
@@ -22,6 +24,8 @@ javaUuidGenerator = { module = "com.fasterxml.uuid:java-uuid-generator", version
2224
jacksonBom = { module = "com.fasterxml.jackson:jackson-bom", version.ref = "jackson" }
2325
jacksonDatabind = { module = "com.fasterxml.jackson.core:jackson-databind" }
2426
jacksonModuleKotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin" }
27+
kotlinxSerializationCore = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinxSerialization" }
28+
kotlinxSerializationCbor = { module = "org.jetbrains.kotlinx:kotlinx-serialization-cbor", version.ref = "kotlinxSerialization" }
2529

2630
junitBom = { module = "org.junit:junit-bom", version.ref = "junit" }
2731
junitJupiterEngine = { module = "org.junit.jupiter:junit-jupiter-engine" }

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
requires com.fasterxml.uuid;
66
requires com.fasterxml.jackson.databind;
77
requires kotlin.stdlib;
8+
requires kotlinx.serialization.core;
89

910
exports earth.adi.typeid;
1011
}

src/main/kotlin/earth/adi/typeid/Id.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package earth.adi.typeid
22

33
import earth.adi.typeid.codec.Codec
4+
import earth.adi.typeid.serialization.UUIDKSerializer
45
import java.io.Serializable
56
import java.util.*
67

@@ -37,7 +38,11 @@ import java.util.*
3738
* @property typedPrefix the typed prefix of the identifier
3839
* @property uuid the uuid of the identifier
3940
*/
40-
data class Id<TEntity>(val typedPrefix: TypedPrefix<out TEntity>, val uuid: UUID) : Serializable {
41+
@kotlinx.serialization.Serializable
42+
data class Id<TEntity>(
43+
val typedPrefix: TypedPrefix<out TEntity>,
44+
@kotlinx.serialization.Serializable(with = UUIDKSerializer::class) val uuid: UUID,
45+
) : Serializable {
4146
init {
4247
Codec.requireValidPrefix(typedPrefix.prefix)
4348
}

src/main/kotlin/earth/adi/typeid/RawId.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package earth.adi.typeid
22

33
import earth.adi.typeid.codec.Codec
4+
import earth.adi.typeid.serialization.UUIDKSerializer
45
import java.io.Serializable
56
import java.util.UUID
67

@@ -11,7 +12,11 @@ import java.util.UUID
1112
* @property prefix the prefix of the identifier
1213
* @property uuid the uuid of the identifier
1314
*/
14-
data class RawId(val prefix: String, val uuid: UUID) : Serializable {
15+
@kotlinx.serialization.Serializable
16+
data class RawId(
17+
val prefix: String,
18+
@kotlinx.serialization.Serializable(with = UUIDKSerializer::class) val uuid: UUID,
19+
) : Serializable {
1520
init {
1621
Codec.requireValidPrefix(prefix)
1722
}

src/main/kotlin/earth/adi/typeid/TypedPrefix.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ package earth.adi.typeid
33
import java.io.Serializable
44

55
/** Typed prefix for a type id. */
6+
@kotlinx.serialization.Serializable
67
data class TypedPrefix<TEntity>(val prefix: String) : Serializable

src/main/kotlin/earth/adi/typeid/jackson/IdJsonSerializer.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ class IdJsonSerializer @JvmOverloads constructor(t: Class<Id<*>?>? = null) :
1616
StdSerializer<Id<*>?>(t) {
1717
@Throws(IOException::class, JsonProcessingException::class)
1818
override fun serialize(value: Id<*>?, jgen: JsonGenerator, provider: SerializerProvider?) {
19-
jgen.writeString(value?.toString() ?: "")
19+
if (value == null) {
20+
jgen.writeNull()
21+
return
22+
}
23+
jgen.writeString(value.toString())
2024
}
2125
}

src/main/kotlin/earth/adi/typeid/jackson/RawIdJsonSerializer.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ class RawIdJsonSerializer @JvmOverloads constructor(t: Class<RawId?>? = null) :
1616
StdSerializer<RawId?>(t) {
1717
@Throws(IOException::class, JsonProcessingException::class)
1818
override fun serialize(value: RawId?, jgen: JsonGenerator, provider: SerializerProvider?) {
19-
jgen.writeString(value?.toString() ?: "")
19+
if (value == null) {
20+
jgen.writeNull()
21+
return
22+
}
23+
jgen.writeString(value.toString())
2024
}
2125
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package earth.adi.typeid.serialization
2+
3+
import java.util.*
4+
import kotlinx.serialization.KSerializer
5+
import kotlinx.serialization.descriptors.PrimitiveKind
6+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
7+
import kotlinx.serialization.encoding.Decoder
8+
import kotlinx.serialization.encoding.Encoder
9+
10+
object UUIDKSerializer : KSerializer<UUID> {
11+
override val descriptor = PrimitiveSerialDescriptor("UUID", PrimitiveKind.STRING)
12+
13+
override fun deserialize(decoder: Decoder): UUID {
14+
return UUID.fromString(decoder.decodeString())
15+
}
16+
17+
override fun serialize(encoder: Encoder, value: UUID) {
18+
encoder.encodeString(value.toString())
19+
}
20+
}

src/test/kotlin/earth/adi/typeid/IdTest.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ package earth.adi.typeid
33
import java.io.ByteArrayOutputStream
44
import java.io.ObjectInputStream
55
import java.io.ObjectOutputStream
6-
import java.util.*
6+
import java.util.UUID
7+
import kotlinx.serialization.ExperimentalSerializationApi
8+
import kotlinx.serialization.cbor.Cbor
9+
import kotlinx.serialization.decodeFromByteArray
10+
import kotlinx.serialization.encodeToByteArray
711
import org.assertj.core.api.Assertions.assertThat
812
import org.assertj.core.api.Assertions.assertThatThrownBy
913
import org.junit.jupiter.api.Test
@@ -35,7 +39,7 @@ class IdTest {
3539
}
3640

3741
@Test
38-
fun `test serialization deserialization`() {
42+
fun `test java serialization deserialization`() {
3943
val uuid = UUID.fromString("00000000-0000-0000-0000-000000000000")
4044
val id = Id<String>(TypedPrefix("user"), uuid)
4145
ByteArrayOutputStream().use { outputStream ->
@@ -46,4 +50,14 @@ class IdTest {
4650
}
4751
}
4852
}
53+
54+
@OptIn(ExperimentalSerializationApi::class)
55+
@Test
56+
fun `test kotlin serialization deserialization`() {
57+
val uuid = UUID.fromString("00000000-0000-0000-0000-000000000000")
58+
val id = Id<String>(TypedPrefix("user"), uuid)
59+
val bytes = Cbor.encodeToByteArray<Id<String>>(id)
60+
val deserialized = Cbor.decodeFromByteArray<Id<String>>(bytes)
61+
assertThat(deserialized).isEqualTo(id)
62+
}
4963
}

src/test/kotlin/earth/adi/typeid/RawIdTest.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ import java.io.ByteArrayOutputStream
44
import java.io.ObjectInputStream
55
import java.io.ObjectOutputStream
66
import java.util.*
7+
import kotlinx.serialization.ExperimentalSerializationApi
8+
import kotlinx.serialization.cbor.Cbor
9+
import kotlinx.serialization.decodeFromByteArray
10+
import kotlinx.serialization.encodeToByteArray
711
import org.assertj.core.api.Assertions.assertThat
8-
import org.junit.jupiter.api.Assertions.*
912
import org.junit.jupiter.api.Test
1013

1114
class RawIdTest {
@@ -33,4 +36,14 @@ class RawIdTest {
3336
}
3437
}
3538
}
39+
40+
@OptIn(ExperimentalSerializationApi::class)
41+
@Test
42+
fun `test kotlin serialization deserialization`() {
43+
val uuid = UUID.fromString("00000000-0000-0000-0000-000000000000")
44+
val id = RawId("user", uuid)
45+
val bytes = Cbor.encodeToByteArray<RawId>(id)
46+
val deserialized = Cbor.decodeFromByteArray<RawId>(bytes)
47+
assertThat(deserialized).isEqualTo(id)
48+
}
3649
}

src/test/kotlin/earth/adi/typeid/CodecPropertyTest.kt renamed to src/test/kotlin/earth/adi/typeid/codec/CodecPropertyTest.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
package earth.adi.typeid
1+
package earth.adi.typeid.codec
22

3-
import earth.adi.typeid.codec.Codec
4-
import earth.adi.typeid.codec.Decoded
53
import java.util.*
64
import net.jqwik.api.*
75
import net.jqwik.api.constraints.LowerChars

src/test/kotlin/earth/adi/typeid/CodecSpecTest.kt renamed to src/test/kotlin/earth/adi/typeid/codec/CodecSpecTest.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
package earth.adi.typeid
1+
package earth.adi.typeid.codec
22

33
import com.fasterxml.jackson.annotation.JsonAutoDetect
44
import com.fasterxml.jackson.databind.ObjectMapper
55
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
6-
import earth.adi.typeid.codec.Codec
7-
import earth.adi.typeid.codec.Decoded
86
import java.util.*
97
import java.util.stream.Stream
108
import org.assertj.core.api.Assertions.assertThat

src/test/kotlin/earth/adi/typeid/CodecValidationsTest.kt renamed to src/test/kotlin/earth/adi/typeid/codec/CodecValidationsTest.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package earth.adi.typeid
1+
package earth.adi.typeid.codec
22

3-
import earth.adi.typeid.codec.Codec
4-
import earth.adi.typeid.codec.Decoded
3+
import earth.adi.typeid.TypeId
4+
import earth.adi.typeid.Validated
55
import java.util.*
66
import java.util.stream.Stream
77
import org.assertj.core.api.Assertions.*
@@ -71,6 +71,7 @@ class CodecValidationsTest {
7171
"sömeprefix_01h455vb4pex5vsknk084sn02q", // prefix with 'ö'
7272
"someprefix_01h455öb4pex5vsknk084sn02q", // suffix with 'ö'
7373
"someprefix_Ă01h455b4pex5vsknk084sn02q", // suffix with 'Ă' (> ascii 255) as first
74+
"someprefix_/01h455b4pex5vsknk084sn02q", // suffix with '/' (< ascii '0') as first
7475
// char
7576
"sOmeprefix_01h455vb4pex5vsknk084sn02q", // prefix with 'O'
7677
"someprefix_01h455Vb4pex5vsknk084sn02q", // suffix with 'V'

src/test/kotlin/earth/adi/typeid/JacksonJsonTest.kt renamed to src/test/kotlin/earth/adi/typeid/jackson/JacksonJsonTest.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
package earth.adi.typeid
1+
package earth.adi.typeid.jackson
22

33
import com.fasterxml.jackson.annotation.JsonProperty
44
import com.fasterxml.jackson.databind.BeanProperty
55
import com.fasterxml.jackson.databind.PropertyName
66
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
77
import com.fasterxml.jackson.module.kotlin.readValue
8-
import earth.adi.typeid.jackson.IdJsonDeserializer
9-
import earth.adi.typeid.jackson.IdJsonSerializer
10-
import earth.adi.typeid.jackson.RawIdJsonSerializer
8+
import earth.adi.typeid.*
119
import java.io.ByteArrayOutputStream
1210
import org.assertj.core.api.Assertions.assertThat
1311
import org.junit.jupiter.api.Test

0 commit comments

Comments
 (0)