clean entities

This commit is contained in:
2019-08-07 22:45:40 +02:00
parent 19e98250b7
commit e42f3b07cb
7 changed files with 77 additions and 27 deletions

View File

@@ -5,13 +5,13 @@ import kotlin.reflect.KClass
class EntitiesCollections {
private val collections: MutableMap<KClass<*>, EntityCollection<Any, EntityI<Any?>>> = mutableMapOf()
fun <I, R: EntityI<I?>> get(id: I, className: KClass<R>): R? {
fun <I, R: EntityI<I>> get(id: I, className: KClass<R>): R? {
val collection = collections[className]
val entity = collection?.get(id!!)
return entity as R?
}
inline fun <I, reified R: EntityI<I?>> get(id: I): R? {
inline fun <I, reified R: EntityI<I>> get(id: I): R? {
return get(id, R::class)
}

View File

@@ -8,13 +8,13 @@ import kotlin.reflect.KClass
/* ID */
interface EntityI<T> {
var id: T?
val className: KClass<EntityI<T?>>
@JsonIgnore() get() = this::class as KClass<EntityI<T?>>
val className: KClass<EntityI<T>>
@JsonIgnore() get() = this::class as KClass<EntityI<T>>
}
abstract class Entity<T>(override var id: T? = null): EntityI<T?>
abstract class UuidEntity(override var id: UUID? = UUID.randomUUID()): Entity<UUID?>(id)
abstract class IdEntity(override var id: Int? = null): Entity<Int?>(id)
abstract class Entity<T>(override var id: T? = null): EntityI<T>
abstract class UuidEntity(override var id: UUID? = UUID.randomUUID()): Entity<UUID>(id)
abstract class IdEntity(override var id: Int? = null): Entity<Int>(id)
/* Version */
interface EntityVersioning<ID, NUMBER> {
@@ -53,13 +53,13 @@ interface UpdatedBy<T: EntityI<*>> {
var updatedBy: T?
}
class EntityCreatedByImp<UserT: EntityI<*>>: CreatedBy<UserT> {
override var createdBy: UserT? = null
}
class EntityCreatedByImp<UserT: EntityI<*>>(
override var createdBy: UserT?
): CreatedBy<UserT>
class EntityUpdatedByImp<UserT: EntityI<*>>: UpdatedBy<UserT> {
override var updatedBy: UserT? = null
}
class EntityUpdatedByImp<UserT: EntityI<*>>(
override var updatedBy: UserT?
): UpdatedBy<UserT>
/* Published */
interface Published<UserT: EntityI<*>> {
@@ -67,19 +67,25 @@ interface Published<UserT: EntityI<*>> {
var publishedBy: UserT?
}
class EntityPublishedImp<UserT: EntityI<*>>: Published<UserT> {
class EntityPublishedImp<UserT: EntityI<*>>(
override var publishedBy: UserT?
): Published<UserT> {
override var publishedAt: DateTime? = null
override var publishedBy: UserT? = null
}
/* Implementation */
abstract class EntityImp<T, UserT: EntityI<*>>: Entity<T>(),
abstract class EntityImp<T, UserT: EntityI<*>>(
updatedBy: UserT?
): Entity<T>(),
EntityCreatedAt by EntityCreatedAtImp(),
EntityUpdatedAt by EntityUpdatedAtImp(),
CreatedBy<UserT> by EntityCreatedByImp(),
UpdatedBy<UserT> by EntityUpdatedByImp()
CreatedBy<UserT> by EntityCreatedByImp(updatedBy),
UpdatedBy<UserT> by EntityUpdatedByImp(updatedBy)
abstract class EntityExtended<T, UserT: EntityI<*>>:
EntityImp<T, UserT>(),
abstract class UuidEntityExtended<T, UserT: EntityI<*>>(
updatedBy: UserT?,
publishedBy: UserT?
):
EntityImp<T, UserT>(updatedBy),
EntityVersioning<UUID, Int> by UuidEntityVersioning(),
Published<UserT> by EntityPublishedImp()
Published<UserT> by EntityPublishedImp(publishedBy)

View File

@@ -58,7 +58,7 @@ class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) {
}
}
fun <T> EntityI<T?>.serialize(pretty: Boolean = false) = Serializer().serialize(this, pretty)
fun <T> EntityI<T>.serialize(pretty: Boolean = false) = Serializer().serialize(this, pretty)
inline fun <reified E: EntityI<*>> E.deserialize(json: String) = Serializer().deserialize(json, this)
inline fun <reified E: EntityI<*>> String.deserialize() = Serializer().deserialize<E>(this)
@@ -92,9 +92,9 @@ class EntityIdDeserializer<T: IdEntity> @JvmOverloads constructor(vc: Class<*>?
override fun deserialize(jp: JsonParser, ctxt: DeserializationContext): T {
val node = jp.codec.readTree<JsonNode>(jp)
val id = node.get("id").asInt()
val entity = collection.get<Int?, IdEntity>(id)
val entity = collection.get<Int, IdEntity>(id)
val obj = (entity ?: ctxt.readValue(jp, UuidEntity::class.javaObjectType)) as EntityI<Int?>
val obj = (entity ?: ctxt.readValue(jp, UuidEntity::class.javaObjectType)) as EntityI<Int>
collection.set(obj)
return obj as T

View File

@@ -8,13 +8,13 @@ import org.junit.jupiter.api.TestInstance
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class EntityTest() {
private class User(override var id: Int?): EntityI<Int?>
private class ObjTest(var name: String): EntityExtended<Int?, User>()
private class ObjTest(var name: String): UuidEntityExtended<Int?, User>(User(1), User(2))
@Test
fun getObject() {
val obj: ObjTest? = ObjTest("plop")
assertTrue(obj is ObjTest)
assertTrue(obj is EntityExtended<Int?, User>)
assertTrue(obj is UuidEntityExtended<Int?, User>)
assertTrue(obj is EntityI<Int?>)
assertTrue(obj is Entity<Int?>)
assertTrue(obj is Published<User>)