From 65fb032ad990d05e07fd9ed13aaf045ae66c702b Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Mon, 3 Jun 2019 11:49:30 +0200 Subject: [PATCH] Add EntityCollection --- .idea/vcs.xml | 5 +++ .../kotlin/fr/postgresjson/entity/Entity.kt | 2 +- .../postgresjson/entity/EntityCollection.kt | 13 +++++++ .../fr/postgresjson/repository/Repository.kt | 37 +++++++++++++++++++ .../fr/postgresjson/serializer/Serializer.kt | 19 ++++++---- .../postgresjson/serializer/SerializerTest.kt | 4 +- 6 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 src/main/kotlin/fr/postgresjson/entity/EntityCollection.kt create mode 100644 src/main/kotlin/fr/postgresjson/repository/Repository.kt diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..5fc0921 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,5 +1,10 @@ + + + diff --git a/src/main/kotlin/fr/postgresjson/entity/Entity.kt b/src/main/kotlin/fr/postgresjson/entity/Entity.kt index bc0cea7..f81664f 100644 --- a/src/main/kotlin/fr/postgresjson/entity/Entity.kt +++ b/src/main/kotlin/fr/postgresjson/entity/Entity.kt @@ -6,7 +6,7 @@ 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 UuidEntity(override var id: UUID = UUID.randomUUID()) : Entity(id) abstract class IdEntity(override var id: Int) : Entity(id) interface EntityVersioning { diff --git a/src/main/kotlin/fr/postgresjson/entity/EntityCollection.kt b/src/main/kotlin/fr/postgresjson/entity/EntityCollection.kt new file mode 100644 index 0000000..7a5e726 --- /dev/null +++ b/src/main/kotlin/fr/postgresjson/entity/EntityCollection.kt @@ -0,0 +1,13 @@ +package fr.postgresjson.entity + +class EntityCollection> { + var collection: MutableMap = mutableMapOf() + + fun get(id: T): E? { + return collection[id] + } + + fun set(entity: E) { + collection.set(entity.id, entity) + } +} diff --git a/src/main/kotlin/fr/postgresjson/repository/Repository.kt b/src/main/kotlin/fr/postgresjson/repository/Repository.kt new file mode 100644 index 0000000..c14c646 --- /dev/null +++ b/src/main/kotlin/fr/postgresjson/repository/Repository.kt @@ -0,0 +1,37 @@ +package fr.postgresjson.repository + +import fr.postgresjson.entity.EntityCollection +import fr.postgresjson.entity.EntityI +import fr.postgresjson.serializer.Serializer +import kotlin.reflect.KClass + +interface RepositoryI> + +abstract class Repository> : RepositoryI { + private val collections: MutableMap, EntityCollection>> = mutableMapOf() + + private inline fun > get(id: I): R? { + val collection = collections[R::class] + val entity = collection?.get(id!!) + return entity as R? + } + + private inline fun > set(entity: R) { + if (collections[R::class] == null) { + collections[R::class] = EntityCollection() + } + + collections[R::class]!!.set(entity as EntityI) + } + + fun findById(id: T): EntityI? { + return when (val e = get(id)) { + null -> { + // TODO create Request + Serializer().deserialize>("""{"plop", "plip"}""") + } + else -> e + + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt index ad9ddab..54f45ef 100644 --- a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt +++ b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt @@ -3,21 +3,24 @@ 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 +import fr.postgresjson.entity.EntityCollection +import fr.postgresjson.entity.EntityI class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) { - fun serialize(source: Any): String { + fun serialize(source: EntityI): String { return mapper.writeValueAsString(source) } - inline fun deserialize(json: String): T { - return mapper.readValue(json) + inline fun > deserialize(json: String): E { + val unserialized = mapper.readValue(json) + return EntityCollection().get(unserialized.id) ?: unserialized } - inline fun deserialize(json: String, target: T): T { - return mapper.readerForUpdating(target).readValue(json) + fun > deserialize(json: String, target: E): E { + val unserialized = mapper.readerForUpdating(target).readValue(json) + return EntityCollection().get(unserialized.id) ?: unserialized } } -fun Entity.serialize() = Serializer().serialize(this) -inline fun T.deserialize(json: String) = Serializer().deserialize(json, this) \ No newline at end of file +fun EntityI.serialize() = Serializer().serialize(this) +fun > E.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 index 710de6a..34742e8 100644 --- a/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt +++ b/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt @@ -13,7 +13,7 @@ internal class SerializerTest { private val serializer = Serializer() - private val objSerialized = """{"val1":"plop","val2":123,"id":"1362a162-df75-4995-ab46-4ad55fa07de2"}""" + private val objSerialized: String = """{"val1":"plop","val2":123,"id":"1362a162-df75-4995-ab46-4ad55fa07de2"}""" private val objSerializedUpdate = """{"val1":"update","val2":123}""" private lateinit var obj: ObjTest @@ -51,7 +51,7 @@ internal class SerializerTest { @Test fun deserializeUpdate2() { - val objDeserialized: ObjTest = obj.deserialize(objSerializedUpdate) + val objDeserialized = obj.deserialize(objSerializedUpdate) assertTrue(obj === objDeserialized) assertEquals("update", objDeserialized.val1) assertEquals(123, objDeserialized.val2)