Update: Simplify serialize and deserialize for data objects (Repository, Product & ProductItem)

This commit is contained in:
machiav3lli 2021-10-14 16:02:17 +02:00
parent 39ebb6fdf6
commit 268d5be601
5 changed files with 74 additions and 33 deletions

View File

@ -453,10 +453,9 @@ object Database {
fun transform(cursor: Cursor): Repository { fun transform(cursor: Cursor): Repository {
return cursor.getBlob(cursor.getColumnIndex(Schema.Repository.ROW_DATA)) return cursor.getBlob(cursor.getColumnIndex(Schema.Repository.ROW_DATA))
.jsonParse { .jsonParse {
Repository.deserialize( Repository.deserialize(it).apply {
cursor.getLong(cursor.getColumnIndex(Schema.Repository.ROW_ID)), this.id = cursor.getLong(cursor.getColumnIndex(Schema.Repository.ROW_ID))
it }
)
} }
} }
} }
@ -567,27 +566,37 @@ object Database {
private fun transform(cursor: Cursor): Product { private fun transform(cursor: Cursor): Product {
return cursor.getBlob(cursor.getColumnIndex(Schema.Product.ROW_DATA)) return cursor.getBlob(cursor.getColumnIndex(Schema.Product.ROW_DATA))
.jsonParse { .jsonParse {
Product.deserialize( Product.deserialize(it).apply {
cursor.getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID)), this.repositoryId = cursor
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_DESCRIPTION)), it .getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID))
) this.description = cursor
.getString(cursor.getColumnIndex(Schema.Product.ROW_DESCRIPTION))
}
} }
} }
fun transformItem(cursor: Cursor): ProductItem { fun transformItem(cursor: Cursor): ProductItem {
return cursor.getBlob(cursor.getColumnIndex(Schema.Product.ROW_DATA_ITEM)) return cursor.getBlob(cursor.getColumnIndex(Schema.Product.ROW_DATA_ITEM))
.jsonParse { .jsonParse {
ProductItem.deserialize( ProductItem.deserialize(it).apply {
cursor.getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID)), this.repositoryId = cursor
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_PACKAGE_NAME)), .getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID))
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_NAME)), this.packageName = cursor
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_SUMMARY)), .getString(cursor.getColumnIndex(Schema.Product.ROW_PACKAGE_NAME))
cursor.getString(cursor.getColumnIndex(Schema.Installed.ROW_VERSION)) this.name = cursor
.orEmpty(), .getString(cursor.getColumnIndex(Schema.Product.ROW_NAME))
cursor.getInt(cursor.getColumnIndex(Schema.Product.ROW_COMPATIBLE)) != 0, this.summary = cursor
cursor.getInt(cursor.getColumnIndex(Schema.Synthetic.ROW_CAN_UPDATE)) != 0, .getString(cursor.getColumnIndex(Schema.Product.ROW_SUMMARY))
cursor.getInt(cursor.getColumnIndex(Schema.Synthetic.ROW_MATCH_RANK)), it this.installedVersion = cursor
) .getString(cursor.getColumnIndex(Schema.Installed.ROW_VERSION))
.orEmpty()
this.compatible = cursor
.getInt(cursor.getColumnIndex(Schema.Product.ROW_COMPATIBLE)) != 0
this.canUpdate = cursor
.getInt(cursor.getColumnIndex(Schema.Synthetic.ROW_CAN_UPDATE)) != 0
this.matchRank = cursor
.getInt(cursor.getColumnIndex(Schema.Synthetic.ROW_MATCH_RANK))
}
} }
} }
} }

View File

@ -7,11 +7,11 @@ import com.looker.droidify.utility.extension.json.*
import com.looker.droidify.utility.extension.text.nullIfEmpty import com.looker.droidify.utility.extension.text.nullIfEmpty
data class Product( data class Product(
val repositoryId: Long, var repositoryId: Long,
val packageName: String, val packageName: String,
val name: String, val name: String,
val summary: String, val summary: String,
val description: String, var description: String,
val whatsNew: String, val whatsNew: String,
val icon: String, val icon: String,
val metadataIcon: String, val metadataIcon: String,
@ -93,10 +93,12 @@ data class Product(
} }
fun serialize(generator: JsonGenerator) { fun serialize(generator: JsonGenerator) {
generator.writeNumberField("repositoryId",repositoryId)
generator.writeNumberField("serialVersion", 1) generator.writeNumberField("serialVersion", 1)
generator.writeStringField("packageName", packageName) generator.writeStringField("packageName", packageName)
generator.writeStringField("name", name) generator.writeStringField("name", name)
generator.writeStringField("summary", summary) generator.writeStringField("summary", summary)
generator.writeStringField("description", description)
generator.writeStringField("whatsNew", whatsNew) generator.writeStringField("whatsNew", whatsNew)
generator.writeStringField("icon", icon) generator.writeStringField("icon", icon)
generator.writeStringField("metadataIcon", metadataIcon) generator.writeStringField("metadataIcon", metadataIcon)
@ -169,10 +171,12 @@ data class Product(
}, { extract(it).versionCode })) }, { extract(it).versionCode }))
} }
fun deserialize(repositoryId: Long, description: String, parser: JsonParser): Product { fun deserialize(parser: JsonParser): Product {
var repositoryId = 0L
var packageName = "" var packageName = ""
var name = "" var name = ""
var summary = "" var summary = ""
var description = ""
var whatsNew = "" var whatsNew = ""
var icon = "" var icon = ""
var metadataIcon = "" var metadataIcon = ""
@ -194,9 +198,11 @@ data class Product(
var releases = emptyList<Release>() var releases = emptyList<Release>()
parser.forEachKey { it -> parser.forEachKey { it ->
when { when {
it.string("repositoryId") -> repositoryId = valueAsLong
it.string("packageName") -> packageName = valueAsString it.string("packageName") -> packageName = valueAsString
it.string("name") -> name = valueAsString it.string("name") -> name = valueAsString
it.string("summary") -> summary = valueAsString it.string("summary") -> summary = valueAsString
it.string("description") -> description = valueAsString
it.string("whatsNew") -> whatsNew = valueAsString it.string("whatsNew") -> whatsNew = valueAsString
it.string("icon") -> icon = valueAsString it.string("icon") -> icon = valueAsString
it.string("metadataIcon") -> metadataIcon = valueAsString it.string("metadataIcon") -> metadataIcon = valueAsString

View File

@ -8,9 +8,9 @@ import com.looker.droidify.utility.KParcelable
import com.looker.droidify.utility.extension.json.forEachKey import com.looker.droidify.utility.extension.json.forEachKey
data class ProductItem( data class ProductItem(
val repositoryId: Long, val packageName: String, val name: String, val summary: String, var repositoryId: Long, var packageName: String, var name: String, var summary: String,
val icon: String, val metadataIcon: String, val version: String, val installedVersion: String, val icon: String, val metadataIcon: String, val version: String, var installedVersion: String,
val compatible: Boolean, val canUpdate: Boolean, val matchRank: Int var compatible: Boolean, var canUpdate: Boolean, var matchRank: Int
) { ) {
sealed class Section : KParcelable { sealed class Section : KParcelable {
object All : Section() { object All : Section() {
@ -60,25 +60,45 @@ data class ProductItem(
fun serialize(generator: JsonGenerator) { fun serialize(generator: JsonGenerator) {
generator.writeNumberField("serialVersion", 1) generator.writeNumberField("serialVersion", 1)
generator.writeNumberField("repositoryId", repositoryId)
generator.writeStringField("packageName", packageName)
generator.writeStringField("name", name)
generator.writeStringField("summary", summary)
generator.writeStringField("icon", icon) generator.writeStringField("icon", icon)
generator.writeStringField("metadataIcon", metadataIcon) generator.writeStringField("metadataIcon", metadataIcon)
generator.writeStringField("version", version) generator.writeStringField("version", version)
generator.writeStringField("installedVersion", installedVersion)
generator.writeBooleanField("compatible", compatible)
generator.writeBooleanField("canUpdate", canUpdate)
generator.writeNumberField("matchRank", matchRank)
} }
companion object { companion object {
fun deserialize( fun deserialize(parser: JsonParser): ProductItem {
repositoryId: Long, packageName: String, name: String, summary: String, var repositoryId = 0L
installedVersion: String, compatible: Boolean, canUpdate: Boolean, matchRank: Int, var packageName = ""
parser: JsonParser var name = ""
): ProductItem { var summary = ""
var icon = "" var icon = ""
var metadataIcon = "" var metadataIcon = ""
var version = "" var version = ""
var installedVersion = ""
var compatible = false
var canUpdate = false
var matchRank = 0
parser.forEachKey { parser.forEachKey {
when { when {
it.number("repositoryId") -> repositoryId = valueAsLong
it.string("packageName") -> packageName = valueAsString
it.string("name") -> name = valueAsString
it.string("summary") -> summary = valueAsString
it.string("icon") -> icon = valueAsString it.string("icon") -> icon = valueAsString
it.string("metadataIcon") -> metadataIcon = valueAsString it.string("metadataIcon") -> metadataIcon = valueAsString
it.string("version") -> version = valueAsString it.string("version") -> version = valueAsString
it.string("installedVersion") -> installedVersion = valueAsString
it.boolean("compatible") -> compatible = valueAsBoolean
it.boolean("canUpdate") -> canUpdate = valueAsBoolean
it.number("matchRank") -> matchRank = valueAsInt
else -> skipChildren() else -> skipChildren()
} }
} }

View File

@ -8,7 +8,7 @@ import com.looker.droidify.utility.extension.json.writeArray
import java.net.URL import java.net.URL
data class Repository( data class Repository(
val id: Long, val address: String, val mirrors: List<String>, var id: Long, val address: String, val mirrors: List<String>,
val name: String, val description: String, val version: Int, val enabled: Boolean, val name: String, val description: String, val version: Int, val enabled: Boolean,
val fingerprint: String, val lastModified: String, val entityTag: String, val fingerprint: String, val lastModified: String, val entityTag: String,
val updated: Long, val timestamp: Long, val authentication: String val updated: Long, val timestamp: Long, val authentication: String
@ -43,6 +43,7 @@ data class Repository(
fun serialize(generator: JsonGenerator) { fun serialize(generator: JsonGenerator) {
generator.writeNumberField("serialVersion", 1) generator.writeNumberField("serialVersion", 1)
generator.writeNumberField("id", id)
generator.writeStringField("address", address) generator.writeStringField("address", address)
generator.writeArray("mirrors") { mirrors.forEach { writeString(it) } } generator.writeArray("mirrors") { mirrors.forEach { writeString(it) } }
generator.writeStringField("name", name) generator.writeStringField("name", name)
@ -58,7 +59,8 @@ data class Repository(
} }
companion object { companion object {
fun deserialize(id: Long, parser: JsonParser): Repository { fun deserialize(parser: JsonParser): Repository {
var id = 0L
var address = "" var address = ""
var mirrors = emptyList<String>() var mirrors = emptyList<String>()
var name = "" var name = ""
@ -73,6 +75,7 @@ data class Repository(
var authentication = "" var authentication = ""
parser.forEachKey { parser.forEachKey {
when { when {
it.string("id") -> id = valueAsLong
it.string("address") -> address = valueAsString it.string("address") -> address = valueAsString
it.array("mirrors") -> mirrors = collectNotNullStrings() it.array("mirrors") -> mirrors = collectNotNullStrings()
it.string("name") -> name = valueAsString it.string("name") -> name = valueAsString

View File

@ -74,7 +74,10 @@ class IndexMerger(file: File) : Closeable {
val description = it.getString(0) val description = it.getString(0)
val product = Json.factory.createParser(it.getBlob(1)).use { val product = Json.factory.createParser(it.getBlob(1)).use {
it.nextToken() it.nextToken()
Product.deserialize(repositoryId, description, it) Product.deserialize(it).apply {
this.repositoryId = repositoryId
this.description = description
}
} }
val releases = it.getBlob(2)?.let { val releases = it.getBlob(2)?.let {
Json.factory.createParser(it).use { Json.factory.createParser(it).use {