From 82318dde535f7e09892f147f6fd9c4e504627150 Mon Sep 17 00:00:00 2001 From: Damien Coraboeuf Date: Sun, 30 Oct 2022 16:07:46 +0100 Subject: [PATCH] #1039 JSON serialization of the settings --- .../av/settings/AutoVersioningSettings.kt | 6 ++++- .../av/settings/AutoVersioningSettingsTest.kt | 24 ++++++++++++++++++ .../ontrack/json/SimpleDurationSerializer.kt | 25 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 ontrack-extension-auto-versioning/src/test/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettingsTest.kt create mode 100644 ontrack-json/src/main/java/net/nemerosa/ontrack/json/SimpleDurationSerializer.kt diff --git a/ontrack-extension-auto-versioning/src/main/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettings.kt b/ontrack-extension-auto-versioning/src/main/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettings.kt index 3c76f296f23..c5e3c865158 100644 --- a/ontrack-extension-auto-versioning/src/main/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettings.kt +++ b/ontrack-extension-auto-versioning/src/main/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettings.kt @@ -1,7 +1,9 @@ package net.nemerosa.ontrack.extension.av.settings import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.databind.annotation.JsonSerialize import net.nemerosa.ontrack.json.SimpleDurationDeserializer +import net.nemerosa.ontrack.json.SimpleDurationSerializer import net.nemerosa.ontrack.model.annotations.APIDescription import net.nemerosa.ontrack.model.annotations.APILabel import java.time.Duration @@ -12,9 +14,11 @@ data class AutoVersioningSettings( val enabled: Boolean, @APIDescription("Maximum number of days to keep audit entries for non-running auto versioning requests") @JsonDeserialize(using = SimpleDurationDeserializer::class) + @JsonSerialize(using = SimpleDurationSerializer::class) val auditRetentionDuration: Duration = DEFAULT_AUDIT_RETENTION_DURATION, @APIDescription("Maximum number of days to keep audit entries for all kinds of auto versioning requests (counted _after_ the audit retention)") @JsonDeserialize(using = SimpleDurationDeserializer::class) + @JsonSerialize(using = SimpleDurationSerializer::class) val auditCleanupDuration: Duration = DEFAULT_AUDIT_CLEANUP_DURATION, @APIDescription("Creation of the build link on auto version check") @APILabel("Build links on auto versioning check") @@ -39,6 +43,6 @@ data class AutoVersioningSettings( /** * Default value for [AutoVersioningSettings.buildLinks] */ - val DEFAULT_BUILD_LINKS: Boolean = true + const val DEFAULT_BUILD_LINKS: Boolean = true } } diff --git a/ontrack-extension-auto-versioning/src/test/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettingsTest.kt b/ontrack-extension-auto-versioning/src/test/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettingsTest.kt new file mode 100644 index 00000000000..6fe7643c04e --- /dev/null +++ b/ontrack-extension-auto-versioning/src/test/java/net/nemerosa/ontrack/extension/av/settings/AutoVersioningSettingsTest.kt @@ -0,0 +1,24 @@ +package net.nemerosa.ontrack.extension.av.settings + +import net.nemerosa.ontrack.json.asJson +import net.nemerosa.ontrack.json.parse +import org.junit.jupiter.api.Test +import java.time.Duration +import kotlin.test.assertEquals + +internal class AutoVersioningSettingsTest { + + @Test + fun `Json serialization and deserialization`() { + val settings = AutoVersioningSettings( + enabled = true, + auditRetentionDuration = Duration.ofDays(14L), + auditCleanupDuration = Duration.ofDays(90L), + buildLinks = true, + ) + val json = settings.asJson() + val loaded = json.parse() + assertEquals(settings, loaded) + } + +} \ No newline at end of file diff --git a/ontrack-json/src/main/java/net/nemerosa/ontrack/json/SimpleDurationSerializer.kt b/ontrack-json/src/main/java/net/nemerosa/ontrack/json/SimpleDurationSerializer.kt new file mode 100644 index 00000000000..bea8e9880ab --- /dev/null +++ b/ontrack-json/src/main/java/net/nemerosa/ontrack/json/SimpleDurationSerializer.kt @@ -0,0 +1,25 @@ +package net.nemerosa.ontrack.json + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.JsonSerializer +import com.fasterxml.jackson.databind.SerializerProvider +import java.time.Duration + +class SimpleDurationSerializer : JsonSerializer() { + + override fun serialize(value: Duration, gen: JsonGenerator, serializers: SerializerProvider) { + val hoursPart = value.toHoursPart() + if (hoursPart == 0) { + val days = value.toDays() + if (days % 7L == 0L) { + val weeks = days / 7L + gen.writeString("${weeks}w") + } else { + gen.writeString("${days}d") + } + } else { + gen.writeString("${value.toHours()}h") + } + } + +} \ No newline at end of file