From 366d8edab3cff1f315ff8889d6efca509c31c560 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Fri, 31 May 2019 15:14:36 +0200 Subject: [PATCH] Add Serializer --- .../kotlin/fr/postgresjson/entity/Entity.kt | 16 +++++ .../fr/postgresjson/serializer/Serializer.kt | 23 ++++++++ .../postgresjson/serializer/SerializerTest.kt | 59 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 src/main/kotlin/fr/postgresjson/entity/Entity.kt create mode 100644 src/main/kotlin/fr/postgresjson/serializer/Serializer.kt create mode 100644 src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt diff --git a/src/main/kotlin/fr/postgresjson/entity/Entity.kt b/src/main/kotlin/fr/postgresjson/entity/Entity.kt new file mode 100644 index 0000000..bc0cea7 --- /dev/null +++ b/src/main/kotlin/fr/postgresjson/entity/Entity.kt @@ -0,0 +1,16 @@ +package fr.postgresjson.entity + +import java.util.* + +interface EntityI { + var id: T +} +abstract class Entity(override var id: T) : EntityI +abstract class UuidEntity(override var id: UUID = UUID.randomUUID()) : Entity(id) {} +abstract class IdEntity(override var id: Int) : Entity(id) + +interface EntityVersioning { + var version: T +} + +interface EntityVersioningIncrement : EntityVersioning diff --git a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt new file mode 100644 index 0000000..ad9ddab --- /dev/null +++ b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt @@ -0,0 +1,23 @@ +package fr.postgresjson.serializer + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import fr.postgresjson.entity.Entity + +class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) { + fun serialize(source: Any): String { + return mapper.writeValueAsString(source) + } + + inline fun deserialize(json: String): T { + return mapper.readValue(json) + } + + inline fun deserialize(json: String, target: T): T { + return mapper.readerForUpdating(target).readValue(json) + } +} + +fun Entity.serialize() = Serializer().serialize(this) +inline fun T.deserialize(json: String) = Serializer().deserialize(json, this) \ No newline at end of file diff --git a/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt b/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt new file mode 100644 index 0000000..710de6a --- /dev/null +++ b/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt @@ -0,0 +1,59 @@ +package fr.postgresjson.serializer + +import fr.postgresjson.entity.UuidEntity +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +internal class SerializerTest { + class ObjTest(var val1: String, var val2: Int) : UuidEntity() + + private val serializer = Serializer() + + private val objSerialized = """{"val1":"plop","val2":123,"id":"1362a162-df75-4995-ab46-4ad55fa07de2"}""" + private val objSerializedUpdate = """{"val1":"update","val2":123}""" + private lateinit var obj: ObjTest + + @BeforeEach + fun before() { + obj = ObjTest("plop", 123) + } + + @Test + fun serialize() { + val json = serializer.serialize(obj) + assertTrue(json.contains("\"val1\":\"plop\",\"val2\":123")) + } + + @Test + fun serialize2() { + val json = obj.serialize() + assertTrue(json.contains("\"val1\":\"plop\",\"val2\":123")) + } + + @Test + fun deserialize() { + val objDeserialized: ObjTest = serializer.deserialize(objSerialized) + assertEquals(obj.val1, objDeserialized.val1) + assertEquals(obj.val2, objDeserialized.val2) + } + + @Test + fun deserializeUpdate() { + val objDeserialized: ObjTest = serializer.deserialize(objSerializedUpdate, obj) + assertTrue(obj === objDeserialized) + assertEquals("update", objDeserialized.val1) + assertEquals(123, objDeserialized.val2) + } + + @Test + fun deserializeUpdate2() { + val objDeserialized: ObjTest = obj.deserialize(objSerializedUpdate) + assertTrue(obj === objDeserialized) + assertEquals("update", objDeserialized.val1) + assertEquals(123, objDeserialized.val2) + } +} \ No newline at end of file