From c3c7cd00b6fd2110bc8ca6c36b4a561d9d3d0f2d Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Wed, 27 Mar 2024 12:40:07 -0600 Subject: [wallet] Deserialize observability event to JSON object bug 0008509 --- .../net/taler/wallet/events/ObservabilityDialog.kt | 4 +- .../net/taler/wallet/events/ObservabilityEvent.kt | 221 ++++++--------------- wallet/src/main/res/values/strings.xml | 4 +- 3 files changed, 68 insertions(+), 161 deletions(-) (limited to 'wallet') diff --git a/wallet/src/main/java/net/taler/wallet/events/ObservabilityDialog.kt b/wallet/src/main/java/net/taler/wallet/events/ObservabilityDialog.kt index 600f143..9164e77 100644 --- a/wallet/src/main/java/net/taler/wallet/events/ObservabilityDialog.kt +++ b/wallet/src/main/java/net/taler/wallet/events/ObservabilityDialog.kt @@ -106,9 +106,9 @@ fun ObservabilityComposable( @Composable fun ObservabilityItem(event: ObservabilityEvent) { - val title = stringResource(event.titleRes) - val body = BackendManager.json.encodeToString(event) val context = LocalContext.current + val title = event.getTitle(context) + val body = BackendManager.json.encodeToString(event.body) ListItem( modifier = Modifier.fillMaxWidth(), diff --git a/wallet/src/main/java/net/taler/wallet/events/ObservabilityEvent.kt b/wallet/src/main/java/net/taler/wallet/events/ObservabilityEvent.kt index 51e4f7a..cb710f7 100644 --- a/wallet/src/main/java/net/taler/wallet/events/ObservabilityEvent.kt +++ b/wallet/src/main/java/net/taler/wallet/events/ObservabilityEvent.kt @@ -16,166 +16,73 @@ package net.taler.wallet.events -import androidx.annotation.StringRes -import kotlinx.serialization.SerialName +import android.content.Context +import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonDecoder import kotlinx.serialization.json.JsonElement -import net.taler.common.Timestamp +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import net.taler.wallet.R -import net.taler.wallet.backend.TalerErrorInfo -@Serializable -sealed class ObservabilityEvent { - @get:StringRes - abstract val titleRes: Int - @Serializable - @SerialName("http-fetch-start") - data class HttpFetchStart( - val id: String, - @SerialName("when") - val timestamp: Timestamp, - val url: String, - - override val titleRes: Int = R.string.event_http_fetch_start, - ): ObservabilityEvent() - - @Serializable - @SerialName("http-fetch-finish-success") - data class HttpFetchFinishSuccess( - val id: String, - @SerialName("when") - val timestamp: Timestamp, - val url: String, - val status: Int, - - override val titleRes: Int = R.string.event_http_fetch_finish_success, - ): ObservabilityEvent() - - @Serializable - @SerialName("http-fetch-finish-error") - data class HttpFetchFinishError( - val id: String, - @SerialName("when") - val timestamp: Timestamp, - val url: String, - val error: TalerErrorInfo, - - override val titleRes: Int = R.string.event_http_fetch_finish_error, - ): ObservabilityEvent() - - @Serializable - @SerialName("db-query-start") - data class DbQueryStart( - val name: String, - val location: String, - - override val titleRes: Int = R.string.event_db_query_start, - ): ObservabilityEvent() - - @Serializable - @SerialName("db-query-finish-success") - data class DbQueryFinishSuccess( - val name: String, - val location: String, - - override val titleRes: Int = R.string.event_db_query_finish_success, - ): ObservabilityEvent() - - @Serializable - @SerialName("db-query-finish-error") - data class DbQueryFinishError( - val name: String, - val location: String, - - override val titleRes: Int = R.string.event_db_query_finish_error, - ): ObservabilityEvent() - - @Serializable - @SerialName("request-start") - data class RequestStart( - override val titleRes: Int = R.string.event_request_start, - ): ObservabilityEvent() - - @Serializable - @SerialName("request-finish-success") - data class RequestFinishSuccess( - override val titleRes: Int = R.string.event_request_finish_success, - ): ObservabilityEvent() - - @Serializable - @SerialName("request-finish-error") - data class RequestFinishError( - override val titleRes: Int = R.string.event_request_finish_error, - ): ObservabilityEvent() - - @Serializable - @SerialName("task-start") - data class TaskStart( - val taskId: String, - - override val titleRes: Int = R.string.event_task_start, - ): ObservabilityEvent() - - @Serializable - @SerialName("task-stop") - data class TaskStop( - val taskId: String, - - override val titleRes: Int = R.string.event_task_stop, - ): ObservabilityEvent() - - @Serializable - @SerialName("task-reset") - data class TaskReset( - val taskId: String, - - override val titleRes: Int = R.string.event_task_reset, - ): ObservabilityEvent() - - @Serializable - @SerialName("declare-task-dependency") - data class DeclareTaskDependency( - val taskId: String, - - override val titleRes: Int = R.string.event_declare_task_dependency, - ): ObservabilityEvent() - - @Serializable - @SerialName("crypto-start") - data class CryptoStart( - val operation: String, - - override val titleRes: Int = R.string.event_crypto_start, - ): ObservabilityEvent() - - @Serializable - @SerialName("crypto-finish-success") - data class CryptoFinishSuccess( - val operation: String, - - override val titleRes: Int = R.string.event_crypto_finished_success, - ): ObservabilityEvent() - - @Serializable - @SerialName("crypto-finish-error") - data class CryptoFinishError( - val operation: String, - - override val titleRes: Int = R.string.event_crypto_finished_error, - ): ObservabilityEvent() - - @Serializable - @SerialName("sheperd-task-result") - data class ShepherdTaskResult( - val resultType: String, - - override val titleRes: Int = R.string.event_shepherd_task_result, - ): ObservabilityEvent() - - @Serializable - @SerialName("unknown") - data class Unknown( - override val titleRes: Int = R.string.event_unknown, - ): ObservabilityEvent() +@Serializable(with = ObservabilityEventSerializer::class) +class ObservabilityEvent( + val body: JsonObject, + val type: String, +) { + + fun getTitle(c: Context) = when (type) { + "http-fetch-start" -> c.getString(R.string.event_http_fetch_start) + "http-fetch-finish-error" -> c.getString(R.string.event_http_fetch_finish_error) + "http-fetch-finish-success" -> c.getString(R.string.event_http_fetch_finish_success) + "db-query-start" -> c.getString(R.string.event_db_query_start) + "db-query-finish-success" -> c.getString(R.string.event_db_query_finish_success) + "db-query-finish-error" -> c.getString(R.string.event_db_query_finish_error) + "request-start" -> c.getString(R.string.event_request_start) + "request-finish-success" -> c.getString(R.string.event_request_finish_success) + "request-finish-error" -> c.getString(R.string.event_request_finish_error) + "task-start" -> c.getString(R.string.event_task_start) + "task-stop" -> c.getString(R.string.event_task_stop) + "task-reset" -> c.getString(R.string.event_task_reset) + "sheperd-task-result" -> c.getString(R.string.event_shepherd_task_result) + "declare-task-dependency" -> c.getString(R.string.event_declare_task_dependency) + "crypto-start" -> c.getString(R.string.event_crypto_start) + "crypto-finish-success" -> c.getString(R.string.event_crypto_finish_success) + "crypto-finish-error" -> c.getString(R.string.event_crypto_finish_error) + "unknown" -> c.getString(R.string.event_unknown) + else -> type + } +} + +class ObservabilityEventSerializer: KSerializer { + private val jsonElementSerializer = JsonElement.serializer() + + override val descriptor: SerialDescriptor + get() = jsonElementSerializer.descriptor + + override fun deserialize(decoder: Decoder): ObservabilityEvent { + require(decoder is JsonDecoder) + val jsonObject = decoder + .decodeJsonElement() + .jsonObject + + val type = jsonObject["type"] + ?.jsonPrimitive + ?.content + ?: "unknown" + + return ObservabilityEvent( + body = jsonObject, + type = type, + ) + } + + override fun serialize(encoder: Encoder, value: ObservabilityEvent) { + encoder.encodeSerializableValue(JsonObject.serializer(), value.body) + } } \ No newline at end of file diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml index db2630f..31d007d 100644 --- a/wallet/src/main/res/values/strings.xml +++ b/wallet/src/main/res/values/strings.xml @@ -287,8 +287,8 @@ GNU Taler is immune against many types of fraud, such as phishing of credit card Task reset Task dependency declared Crypto operation started - Crypto operation succeeded - Crypto operation finished + Crypto operation succeeded + Crypto operation finished Shepherd task result Unknown event -- cgit v1.2.3