From 39dcd04750eef1581d0bdde394371ef9ca2808b9 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 24 Aug 2020 17:10:49 -0300 Subject: Get rid of Jackson and only use multi-platform serialization --- taler-kotlin-android/build.gradle | 2 - .../main/java/net/taler/common/ContractTerms.kt | 18 +------- .../java/net/taler/lib/android/Serialization.kt | 21 +++++++++ .../main/java/net/taler/lib/common/AmountMixin.kt | 51 ---------------------- .../java/net/taler/lib/common/TimestampMixin.kt | 39 ----------------- .../java/net/taler/common/ContractTermsTest.kt | 21 +++------ 6 files changed, 29 insertions(+), 123 deletions(-) create mode 100644 taler-kotlin-android/src/main/java/net/taler/lib/android/Serialization.kt delete mode 100644 taler-kotlin-android/src/main/java/net/taler/lib/common/AmountMixin.kt delete mode 100644 taler-kotlin-android/src/main/java/net/taler/lib/common/TimestampMixin.kt (limited to 'taler-kotlin-android') diff --git a/taler-kotlin-android/build.gradle b/taler-kotlin-android/build.gradle index 5cb0b0e..6d992a0 100644 --- a/taler-kotlin-android/build.gradle +++ b/taler-kotlin-android/build.gradle @@ -67,8 +67,6 @@ dependencies { // JSON parsing and serialization api "org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-RC" - implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.2" - implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" lintPublish 'com.github.thirdegg:lint-rules:0.0.4-alpha' diff --git a/taler-kotlin-android/src/main/java/net/taler/common/ContractTerms.kt b/taler-kotlin-android/src/main/java/net/taler/common/ContractTerms.kt index 8bf77e8..2c50fa9 100644 --- a/taler-kotlin-android/src/main/java/net/taler/common/ContractTerms.kt +++ b/taler-kotlin-android/src/main/java/net/taler/common/ContractTerms.kt @@ -17,10 +17,6 @@ package net.taler.common import androidx.annotation.RequiresApi -import com.fasterxml.jackson.annotation.JsonIgnore -import com.fasterxml.jackson.annotation.JsonInclude -import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL -import com.fasterxml.jackson.annotation.JsonProperty import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import net.taler.common.TalerUtils.getLocalizedString @@ -31,36 +27,24 @@ import net.taler.lib.common.Timestamp data class ContractTerms( val summary: String, @SerialName("summary_i18n") - @get:JsonProperty("summary_i18n") val summaryI18n: Map? = null, val amount: Amount, @SerialName("fulfillment_url") - @get:JsonProperty("fulfillment_url") val fulfillmentUrl: String, val products: List, @SerialName("wire_transfer_deadline") - @get:JsonProperty("wire_transfer_deadline") val wireTransferDeadline: Timestamp? = null, @SerialName("refund_deadline") - @get:JsonProperty("refund_deadline") val refundDeadline: Timestamp? = null ) -@JsonInclude(NON_NULL) abstract class Product { - @get:JsonProperty("product_id") abstract val productId: String? abstract val description: String - - @get:JsonProperty("description_i18n") abstract val descriptionI18n: Map? abstract val price: Amount - - @get:JsonProperty("delivery_location") abstract val location: String? abstract val image: String? - - @get:JsonIgnore val localizedDescription: String @RequiresApi(26) get() = getLocalizedString(descriptionI18n, description) @@ -79,12 +63,12 @@ data class ContractProduct( override val image: String? = null, val quantity: Int ) : Product() { - @get:JsonIgnore val totalPrice: Amount by lazy { price * quantity } } +@Serializable data class ContractMerchant( val name: String ) diff --git a/taler-kotlin-android/src/main/java/net/taler/lib/android/Serialization.kt b/taler-kotlin-android/src/main/java/net/taler/lib/android/Serialization.kt new file mode 100644 index 0000000..7eb4480 --- /dev/null +++ b/taler-kotlin-android/src/main/java/net/taler/lib/android/Serialization.kt @@ -0,0 +1,21 @@ +/* + * This file is part of GNU Taler + * (C) 2020 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see + */ + +package net.taler.lib.android + +interface CustomClassDiscriminator { + val discriminator: String +} diff --git a/taler-kotlin-android/src/main/java/net/taler/lib/common/AmountMixin.kt b/taler-kotlin-android/src/main/java/net/taler/lib/common/AmountMixin.kt deleted file mode 100644 index 59285b6..0000000 --- a/taler-kotlin-android/src/main/java/net/taler/lib/common/AmountMixin.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see - */ - -package net.taler.lib.common - -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JsonMappingException -import com.fasterxml.jackson.databind.SerializerProvider -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.deser.std.StdDeserializer -import com.fasterxml.jackson.databind.ser.std.StdSerializer - -/** - * Used to support Jackson serialization along with KotlinX. - */ -@JsonSerialize(using = AmountSerializer::class) -@JsonDeserialize(using = AmountDeserializer::class) -abstract class AmountMixin - -class AmountSerializer : StdSerializer(Amount::class.java) { - override fun serialize(value: Amount, gen: JsonGenerator, provider: SerializerProvider) { - gen.writeString(value.toJSONString()) - } -} - -class AmountDeserializer : StdDeserializer(Amount::class.java) { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Amount { - val node = p.codec.readValue(p, String::class.java) - try { - return Amount.fromJSONString(node) - } catch (e: AmountParserException) { - throw JsonMappingException(p, "Error parsing Amount", e) - } - } -} diff --git a/taler-kotlin-android/src/main/java/net/taler/lib/common/TimestampMixin.kt b/taler-kotlin-android/src/main/java/net/taler/lib/common/TimestampMixin.kt deleted file mode 100644 index 40c03f6..0000000 --- a/taler-kotlin-android/src/main/java/net/taler/lib/common/TimestampMixin.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of GNU Taler - * (C) 2020 Taler Systems S.A. - * - * GNU Taler is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 3, or (at your option) any later version. - * - * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * GNU Taler; see the file COPYING. If not, see - */ - -package net.taler.lib.common - -import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.annotation.JsonDeserialize -import com.fasterxml.jackson.databind.deser.std.StdDeserializer - -/** - * Used to support Jackson serialization along with KotlinX. - */ -abstract class TimestampMixin( - @get:JsonDeserialize(using = NeverDeserializer::class) - @get:JsonProperty("t_ms") - val ms: Long -) - -class NeverDeserializer : StdDeserializer(Long::class.java) { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Long { - return if (p.text == "never") -1 - else p.longValue - } -} diff --git a/taler-kotlin-android/src/test/java/net/taler/common/ContractTermsTest.kt b/taler-kotlin-android/src/test/java/net/taler/common/ContractTermsTest.kt index 0e410ca..3a2cdb4 100644 --- a/taler-kotlin-android/src/test/java/net/taler/common/ContractTermsTest.kt +++ b/taler-kotlin-android/src/test/java/net/taler/common/ContractTermsTest.kt @@ -16,28 +16,21 @@ package net.taler.common -import com.fasterxml.jackson.databind.DeserializationFeature -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.KotlinModule -import com.fasterxml.jackson.module.kotlin.readValue -import net.taler.lib.common.Amount -import net.taler.lib.common.AmountMixin +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json import net.taler.lib.common.Timestamp -import net.taler.lib.common.TimestampMixin import org.junit.Assert.assertEquals import org.junit.Test class ContractTermsTest { - private val mapper = ObjectMapper() - .registerModule(KotlinModule()) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .addMixIn(Amount::class.java, AmountMixin::class.java) - .addMixIn(Timestamp::class.java, TimestampMixin::class.java) + private val json = Json { + ignoreUnknownKeys = true + } @Test fun test() { - val json = """ + val jsonStr = """ { "amount":"TESTKUDOS:0.5", "extra":{ @@ -72,7 +65,7 @@ class ContractTermsTest { "nonce":"FK8ZKJRV6VX6YFAG4CDSC6W0DWD084Q09DP81ANF30GRFQYM2KPG" } """.trimIndent() - val contractTerms: ContractTerms = mapper.readValue(json) + val contractTerms: ContractTerms = json.decodeFromString(jsonStr) assertEquals("Essay: 1. The Free Software Definition", contractTerms.summary) assertEquals(Timestamp.never(), contractTerms.refundDeadline) } -- cgit v1.2.3