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 {
return cursor.getBlob(cursor.getColumnIndex(Schema.Repository.ROW_DATA))
.jsonParse {
Repository.deserialize(
cursor.getLong(cursor.getColumnIndex(Schema.Repository.ROW_ID)),
it
)
Repository.deserialize(it).apply {
this.id = cursor.getLong(cursor.getColumnIndex(Schema.Repository.ROW_ID))
}
}
}
}
@ -567,27 +566,37 @@ object Database {
private fun transform(cursor: Cursor): Product {
return cursor.getBlob(cursor.getColumnIndex(Schema.Product.ROW_DATA))
.jsonParse {
Product.deserialize(
cursor.getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID)),
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_DESCRIPTION)), it
)
Product.deserialize(it).apply {
this.repositoryId = cursor
.getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID))
this.description = cursor
.getString(cursor.getColumnIndex(Schema.Product.ROW_DESCRIPTION))
}
}
}
fun transformItem(cursor: Cursor): ProductItem {
return cursor.getBlob(cursor.getColumnIndex(Schema.Product.ROW_DATA_ITEM))
.jsonParse {
ProductItem.deserialize(
cursor.getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID)),
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_PACKAGE_NAME)),
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_NAME)),
cursor.getString(cursor.getColumnIndex(Schema.Product.ROW_SUMMARY)),
cursor.getString(cursor.getColumnIndex(Schema.Installed.ROW_VERSION))
.orEmpty(),
cursor.getInt(cursor.getColumnIndex(Schema.Product.ROW_COMPATIBLE)) != 0,
cursor.getInt(cursor.getColumnIndex(Schema.Synthetic.ROW_CAN_UPDATE)) != 0,
cursor.getInt(cursor.getColumnIndex(Schema.Synthetic.ROW_MATCH_RANK)), it
)
ProductItem.deserialize(it).apply {
this.repositoryId = cursor
.getLong(cursor.getColumnIndex(Schema.Product.ROW_REPOSITORY_ID))
this.packageName = cursor
.getString(cursor.getColumnIndex(Schema.Product.ROW_PACKAGE_NAME))
this.name = cursor
.getString(cursor.getColumnIndex(Schema.Product.ROW_NAME))
this.summary = cursor
.getString(cursor.getColumnIndex(Schema.Product.ROW_SUMMARY))
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
data class Product(
val repositoryId: Long,
var repositoryId: Long,
val packageName: String,
val name: String,
val summary: String,
val description: String,
var description: String,
val whatsNew: String,
val icon: String,
val metadataIcon: String,
@ -93,10 +93,12 @@ data class Product(
}
fun serialize(generator: JsonGenerator) {
generator.writeNumberField("repositoryId",repositoryId)
generator.writeNumberField("serialVersion", 1)
generator.writeStringField("packageName", packageName)
generator.writeStringField("name", name)
generator.writeStringField("summary", summary)
generator.writeStringField("description", description)
generator.writeStringField("whatsNew", whatsNew)
generator.writeStringField("icon", icon)
generator.writeStringField("metadataIcon", metadataIcon)
@ -169,10 +171,12 @@ data class Product(
}, { extract(it).versionCode }))
}
fun deserialize(repositoryId: Long, description: String, parser: JsonParser): Product {
fun deserialize(parser: JsonParser): Product {
var repositoryId = 0L
var packageName = ""
var name = ""
var summary = ""
var description = ""
var whatsNew = ""
var icon = ""
var metadataIcon = ""
@ -194,9 +198,11 @@ data class Product(
var releases = emptyList<Release>()
parser.forEachKey { it ->
when {
it.string("repositoryId") -> repositoryId = valueAsLong
it.string("packageName") -> packageName = valueAsString
it.string("name") -> name = valueAsString
it.string("summary") -> summary = valueAsString
it.string("description") -> description = valueAsString
it.string("whatsNew") -> whatsNew = valueAsString
it.string("icon") -> icon = 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
data class ProductItem(
val repositoryId: Long, val packageName: String, val name: String, val summary: String,
val icon: String, val metadataIcon: String, val version: String, val installedVersion: String,
val compatible: Boolean, val canUpdate: Boolean, val matchRank: Int
var repositoryId: Long, var packageName: String, var name: String, var summary: String,
val icon: String, val metadataIcon: String, val version: String, var installedVersion: String,
var compatible: Boolean, var canUpdate: Boolean, var matchRank: Int
) {
sealed class Section : KParcelable {
object All : Section() {
@ -60,25 +60,45 @@ data class ProductItem(
fun serialize(generator: JsonGenerator) {
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("metadataIcon", metadataIcon)
generator.writeStringField("version", version)
generator.writeStringField("installedVersion", installedVersion)
generator.writeBooleanField("compatible", compatible)
generator.writeBooleanField("canUpdate", canUpdate)
generator.writeNumberField("matchRank", matchRank)
}
companion object {
fun deserialize(
repositoryId: Long, packageName: String, name: String, summary: String,
installedVersion: String, compatible: Boolean, canUpdate: Boolean, matchRank: Int,
parser: JsonParser
): ProductItem {
fun deserialize(parser: JsonParser): ProductItem {
var repositoryId = 0L
var packageName = ""
var name = ""
var summary = ""
var icon = ""
var metadataIcon = ""
var version = ""
var installedVersion = ""
var compatible = false
var canUpdate = false
var matchRank = 0
parser.forEachKey {
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("metadataIcon") -> metadataIcon = 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()
}
}

View File

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

View File

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