From 0f89296096f36bb915175faba712740586399f5c Mon Sep 17 00:00:00 2001 From: Alex Martel <13215031+manofthepeace@users.noreply.github.com> Date: Wed, 26 Apr 2023 15:22:20 -0400 Subject: [PATCH] Add possibility to parse days and milliseconds with config DurationConverter --- .../runtime/configuration/DurationConverter.java | 11 +++++++++-- .../configuration/DurationConverterTestCase.java | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/core/runtime/src/main/java/io/quarkus/runtime/configuration/DurationConverter.java b/core/runtime/src/main/java/io/quarkus/runtime/configuration/DurationConverter.java index 7104f303cd503..d154122ee4010 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/configuration/DurationConverter.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/configuration/DurationConverter.java @@ -17,9 +17,12 @@ @Priority(DEFAULT_QUARKUS_CONVERTER_PRIORITY) public class DurationConverter implements Converter, Serializable { private static final long serialVersionUID = 7499347081928776532L; + private static final String PERIOD = "P"; private static final String PERIOD_OF_TIME = "PT"; private static final Pattern DIGITS = Pattern.compile("^[-+]?\\d+$"); - private static final Pattern START_WITH_DIGITS = Pattern.compile("^[-+]?\\d+.*"); + private static final Pattern DIGITS_AND_UNIT = Pattern.compile("^[-+]?\\d+\\.?\\d+?(?i)[hms]$"); + private static final Pattern DAYS = Pattern.compile("^[-+]?\\d+(?i)d$"); + private static final Pattern MILLIS = Pattern.compile("^[-+]?\\d+(?i)ms$"); public DurationConverter() { } @@ -52,11 +55,15 @@ public static Duration parseDuration(String value) { } if (DIGITS.asPredicate().test(value)) { return Duration.ofSeconds(Long.parseLong(value)); + } else if (MILLIS.asPredicate().test(value)) { + return Duration.ofMillis(Long.parseLong(value.substring(0, value.length() - 2))); } try { - if (START_WITH_DIGITS.asPredicate().test(value)) { + if (DIGITS_AND_UNIT.asPredicate().test(value)) { return Duration.parse(PERIOD_OF_TIME + value); + } else if (DAYS.asPredicate().test(value)) { + return Duration.parse(PERIOD + value); } return Duration.parse(value); diff --git a/core/runtime/src/test/java/io/quarkus/runtime/configuration/DurationConverterTestCase.java b/core/runtime/src/test/java/io/quarkus/runtime/configuration/DurationConverterTestCase.java index 2e02d570a87f8..04b5de552079e 100644 --- a/core/runtime/src/test/java/io/quarkus/runtime/configuration/DurationConverterTestCase.java +++ b/core/runtime/src/test/java/io/quarkus/runtime/configuration/DurationConverterTestCase.java @@ -47,4 +47,18 @@ public void testValueInCorrectFormatProvided() { public void testValueNotInCorrectFormatProvided() { assertThrows(IllegalArgumentException.class, () -> durationConverter.convert("PT")); } + + @Test + public void testValueIsInDays() { + Duration expectedDuration = Duration.ofDays(3); + Duration actualDuration = durationConverter.convert("3d"); + assertEquals(expectedDuration, actualDuration); + } + + @Test + public void testValueIsInMillis() { + Duration expectedDuration = Duration.ofMillis(25); + Duration actualDuration = durationConverter.convert("25ms"); + assertEquals(expectedDuration, actualDuration); + } }