From b9d7d6edb7cc12e5238168c4446a28c0ae98c729 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 22 Jul 2020 16:47:05 -0300 Subject: [common] also support multi-platform serialization/deserialization --- build.gradle | 1 + merchant-lib/build.gradle | 14 +++++++------ taler-kotlin-common/build.gradle | 10 +++++++--- .../src/main/java/net/taler/common/Amount.kt | 17 ++++++++++++++++ .../main/java/net/taler/common/ContractTerms.kt | 23 ++++++++++++++++------ 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index 3067d22..dc530bf 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } } diff --git a/merchant-lib/build.gradle b/merchant-lib/build.gradle index 08da35d..93e2d4d 100644 --- a/merchant-lib/build.gradle +++ b/merchant-lib/build.gradle @@ -15,13 +15,12 @@ */ plugins { - id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version" + id 'com.android.library' + id 'kotlin-android' + id 'kotlin-android-extensions' + id 'kotlinx-serialization' } -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' - android { compileSdkVersion 29 //noinspection GradleDependency @@ -46,6 +45,8 @@ android { } dependencies { + implementation project(":taler-kotlin-common") + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" def ktor_version = "1.3.2" @@ -54,5 +55,6 @@ dependencies { implementation "io.ktor:ktor-client-serialization-jvm:$ktor_version" testImplementation 'junit:junit:4.13' - testApi "io.ktor:ktor-client-mock-jvm:$ktor_version" + testImplementation "io.ktor:ktor-client-mock-jvm:$ktor_version" + testImplementation "io.ktor:ktor-client-logging-jvm:$ktor_version" } diff --git a/taler-kotlin-common/build.gradle b/taler-kotlin-common/build.gradle index 573a329..df4b65f 100644 --- a/taler-kotlin-common/build.gradle +++ b/taler-kotlin-common/build.gradle @@ -14,9 +14,12 @@ * GNU Taler; see the file COPYING. If not, see */ -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'kotlin-android-extensions' + id 'kotlinx-serialization' +} android { compileSdkVersion 29 @@ -59,6 +62,7 @@ dependencies { implementation 'com.google.zxing:core:3.4.0' // needs minSdkVersion 24+ // JSON parsing and serialization + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0" implementation "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.2" lintChecks 'com.github.thirdegg:lint-rules:0.0.4-alpha' diff --git a/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt index 76cd294..992f93b 100644 --- a/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt +++ b/taler-kotlin-common/src/main/java/net/taler/common/Amount.kt @@ -26,6 +26,11 @@ 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 +import kotlinx.serialization.Decoder +import kotlinx.serialization.Encoder +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.Serializer import org.json.JSONObject import java.lang.Math.floorDiv import kotlin.math.pow @@ -34,6 +39,7 @@ import kotlin.math.roundToInt class AmountParserException(msg: String? = null, cause: Throwable? = null) : Exception(msg, cause) class AmountOverflowException(msg: String? = null, cause: Throwable? = null) : Exception(msg, cause) +@Serializable(with = KotlinXAmountSerializer::class) @JsonSerialize(using = AmountSerializer::class) @JsonDeserialize(using = AmountDeserializer::class) data class Amount( @@ -211,6 +217,17 @@ data class Amount( } +@Serializer(forClass = Amount::class) +object KotlinXAmountSerializer: KSerializer { + override fun serialize(encoder: Encoder, value: Amount) { + encoder.encodeString(value.toJSONString()) + } + + override fun deserialize(decoder: Decoder): Amount { + return Amount.fromJSONString(decoder.decodeString()) + } +} + class AmountSerializer : StdSerializer(Amount::class.java) { override fun serialize(value: Amount, gen: JsonGenerator, provider: SerializerProvider) { gen.writeString(value.toJSONString()) diff --git a/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt b/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt index 8b8e02d..c07127a 100644 --- a/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt +++ b/taler-kotlin-common/src/main/java/net/taler/common/ContractTerms.kt @@ -23,13 +23,20 @@ import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY 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 +@Serializable @JsonIgnoreProperties(ignoreUnknown = true) data class ContractTerms( val summary: String, - val products: List, - val amount: Amount + @SerialName("summary_i18n") + val summaryI18n: Map? = null, + val amount: Amount, + @SerialName("fulfillment_url") + val fulfillmentUrl: String, + val products: List ) @JsonInclude(NON_NULL) @@ -52,13 +59,17 @@ abstract class Product { get() = getLocalizedString(descriptionI18n, description) } +@Serializable data class ContractProduct( - override val productId: String?, + @SerialName("product_id") + override val productId: String? = null, override val description: String, - override val descriptionI18n: Map?, + @SerialName("description_i18n") + override val descriptionI18n: Map? = null, override val price: Amount, - override val location: String?, - override val image: String?, + @SerialName("delivery_location") + override val location: String? = null, + override val image: String? = null, val quantity: Int ) : Product() { @get:JsonIgnore -- cgit v1.2.3