From 82d00ac6d6119503c6a96ba28026bc0b356e8057 Mon Sep 17 00:00:00 2001 From: machiav3lli Date: Fri, 1 Apr 2022 01:54:23 +0200 Subject: [PATCH] Update: Migrate Subentities and Converters to k-serialization --- .../looker/droidify/database/Converters.kt | 83 ++++++---------- .../com/looker/droidify/entity/SubEntities.kt | 96 +++++-------------- 2 files changed, 50 insertions(+), 129 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/database/Converters.kt b/src/main/kotlin/com/looker/droidify/database/Converters.kt index 2feb4fd8..0da17cc4 100644 --- a/src/main/kotlin/com/looker/droidify/database/Converters.kt +++ b/src/main/kotlin/com/looker/droidify/database/Converters.kt @@ -2,14 +2,9 @@ package com.looker.droidify.database import androidx.room.TypeConverter import com.looker.droidify.database.entity.Release -import com.looker.droidify.database.entity.Release.Companion.deserializeIncompatibilities import com.looker.droidify.entity.Donate +import com.looker.droidify.entity.Product import com.looker.droidify.entity.Screenshot -import com.looker.droidify.utility.extension.json.collectList -import com.looker.droidify.utility.extension.json.writeDictionary -import com.looker.droidify.utility.extension.json.writeList -import com.looker.droidify.utility.jsonGenerate -import com.looker.droidify.utility.jsonParse object Converters { @TypeConverter @@ -27,84 +22,62 @@ object Converters { @TypeConverter @JvmStatic - fun toProduct(byteArray: ByteArray) = - byteArray.jsonParse { com.looker.droidify.entity.Product.deserialize(it) } + fun toProduct(byteArray: ByteArray) = Product.fromJson(String(byteArray)) @TypeConverter @JvmStatic - fun toByteArray(product: com.looker.droidify.entity.Product) = jsonGenerate(product::serialize) + fun toByteArray(product: Product) = product.toJSON().toByteArray() @TypeConverter @JvmStatic - fun toReleases(byteArray: ByteArray): List = byteArray.jsonParse { - it.collectList("releases") { Release.deserialize(it) } - } + fun toReleases(byteArray: ByteArray): List = + if (String(byteArray) == "") emptyList() + else String(byteArray).split(";").map { Release.fromJson(it) } @JvmName("releasesToByteArray") @TypeConverter @JvmStatic - fun toByteArray(releases: List) = jsonGenerate { generator -> - generator.writeList("releases", releases) { serialize(generator) } - } + fun toByteArray(releases: List) = + if (releases.isNotEmpty()) releases.joinToString(";") { it.toJSON() }.toByteArray() + else "".toByteArray() @TypeConverter @JvmStatic - fun toIncompatibilities(byteArray: ByteArray) = - byteArray.jsonParse { it.deserializeIncompatibilities() } + fun toIncompatibilities(byteArray: ByteArray): List = + if (String(byteArray) == "") emptyList() + else String(byteArray).split(";").map { Release.Incompatibility.fromJson(it) } @JvmName("incompatibilitiesToByteArray") @TypeConverter @JvmStatic - fun toByteArray(list: List) = - jsonGenerate { generator -> - list.forEach { - generator.writeDictionary { - when (it) { - is Release.Incompatibility.MinSdk -> { - writeStringField("type", "minSdk") - } - is Release.Incompatibility.MaxSdk -> { - writeStringField("type", "maxSdk") - } - is Release.Incompatibility.Platform -> { - writeStringField("type", "platform") - } - is Release.Incompatibility.Feature -> { - writeStringField("type", "feature") - writeStringField("feature", it.feature) - } - }::class - } - } - } + fun toByteArray(incompatibilities: List) = + if (incompatibilities.isNotEmpty()) + incompatibilities.joinToString(";") { it.toJSON() }.toByteArray() + else "".toByteArray() @TypeConverter @JvmStatic - fun toScreenshots(byteArray: ByteArray): List { - val string = byteArray.toString() - return if (string == "") emptyList() - else string.split(",").mapNotNull { byteArray.jsonParse { Screenshot.deserialize(it) } } - } + fun toScreenshots(byteArray: ByteArray): List = + if (String(byteArray) == "") emptyList() + else String(byteArray).split(";").map { Screenshot.fromJson(it) } @JvmName("screenshotsToByteArray") @TypeConverter @JvmStatic - fun toByteArray(screenshots: List) = jsonGenerate { - screenshots.forEach { item -> item.serialize(it) }.toString().toByteArray() - } + fun toByteArray(screenshots: List) = + if (screenshots.isNotEmpty()) screenshots.joinToString(";") { it.toJSON() }.toByteArray() + else "".toByteArray() @TypeConverter @JvmStatic - fun toDonates(byteArray: ByteArray): List { - val string = byteArray.toString() - return if (string == "") emptyList() - else string.split(",").mapNotNull { byteArray.jsonParse { Donate.deserialize(it) } } - } + fun toDonates(byteArray: ByteArray): List = + if (String(byteArray) == "") emptyList() + else String(byteArray).split(";").map { Donate.fromJson(it) } @JvmName("donatesToByteArray") @TypeConverter @JvmStatic - fun toByteArray(donates: List) = jsonGenerate { - donates.forEach { item -> item.serialize(it) }.toString().toByteArray() - } + fun toByteArray(donates: List) = + if (donates.isNotEmpty()) donates.joinToString(";") { it.toJSON() }.toByteArray() + else "".toByteArray() } \ No newline at end of file diff --git a/src/main/kotlin/com/looker/droidify/entity/SubEntities.kt b/src/main/kotlin/com/looker/droidify/entity/SubEntities.kt index ddd88012..70173524 100644 --- a/src/main/kotlin/com/looker/droidify/entity/SubEntities.kt +++ b/src/main/kotlin/com/looker/droidify/entity/SubEntities.kt @@ -1,76 +1,41 @@ package com.looker.droidify.entity -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.JsonParser -import com.looker.droidify.utility.extension.json.forEachKey +import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +@Serializable data class Author(val name: String, val email: String, val web: String) +@Serializable sealed class Donate { + @Serializable data class Regular(val url: String) : Donate() + + @Serializable data class Bitcoin(val address: String) : Donate() + + @Serializable data class Litecoin(val address: String) : Donate() + + @Serializable data class Flattr(val id: String) : Donate() + + @Serializable data class Liberapay(val id: String) : Donate() + + @Serializable data class OpenCollective(val id: String) : Donate() - fun serialize(generator: JsonGenerator) { - when (this) { - is Regular -> { - generator.writeStringField("type", "") - generator.writeStringField("url", url) - } - is Bitcoin -> { - generator.writeStringField("type", "bitcoin") - generator.writeStringField("address", address) - } - is Litecoin -> { - generator.writeStringField("type", "litecoin") - generator.writeStringField("address", address) - } - is Flattr -> { - generator.writeStringField("type", "flattr") - generator.writeStringField("id", id) - } - is Liberapay -> { - generator.writeStringField("type", "liberapay") - generator.writeStringField("id", id) - } - is OpenCollective -> { - generator.writeStringField("type", "openCollective") - generator.writeStringField("id", id) - } - }::class - } + fun toJSON() = Json.encodeToString(this) companion object { - fun deserialize(parser: JsonParser): Donate? { - var type = "" - var url = "" - var address = "" - var id = "" - parser.forEachKey { - when { - it.string("type") -> type = valueAsString - it.string("url") -> url = valueAsString - it.string("address") -> address = valueAsString - it.string("id") -> id = valueAsString - else -> skipChildren() - } - } - return when (type) { - "" -> Regular(url) - "bitcoin" -> Bitcoin(address) - "litecoin" -> Litecoin(address) - "flattr" -> Flattr(id) - "liberapay" -> Liberapay(id) - "openCollective" -> OpenCollective(id) - else -> null - } - } + fun fromJson(json: String) = Json.decodeFromString(json) } } +@Serializable class Screenshot(val locale: String, val type: Type, val path: String) { enum class Type(val jsonName: String) { PHONE("phone"), @@ -81,26 +46,9 @@ class Screenshot(val locale: String, val type: Type, val path: String) { val identifier: String get() = "$locale.${type.name}.$path" - fun serialize(generator: JsonGenerator) { - generator.writeStringField("locale", locale) - generator.writeStringField("type", type.jsonName) - generator.writeStringField("path", path) - } + fun toJSON() = Json.encodeToString(this) companion object { - fun deserialize(parser: JsonParser): Screenshot? { - var locale = "" - var type = "" - var path = "" - parser.forEachKey { - when { - it.string("locale") -> locale = valueAsString - it.string("type") -> type = valueAsString - it.string("path") -> path = valueAsString - else -> skipChildren() - } - } - return Type.values().find { it.jsonName == type }?.let { Screenshot(locale, it, path) } - } + fun fromJson(json: String) = Json.decodeFromString(json) } } \ No newline at end of file