This is an automated email from the ASF dual-hosted git repository.

exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-api.git


The following commit(s) were added to refs/heads/main by this push:
     new 012cbf5  NIFI-15601 Improved the Duration Regular Expression Pattern 
(#66)
012cbf5 is described below

commit 012cbf552a926800b66c02df750d53a7fc02b1d0
Author: dan-s1 <[email protected]>
AuthorDate: Thu Mar 5 13:22:48 2026 -0500

    NIFI-15601 Improved the Duration Regular Expression Pattern (#66)
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../java/org/apache/nifi/time/DurationFormat.java    |  2 +-
 .../org/apache/nifi/time/TestDurationFormat.java     | 20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/nifi/time/DurationFormat.java 
b/src/main/java/org/apache/nifi/time/DurationFormat.java
index 0527cc4..3f671ea 100644
--- a/src/main/java/org/apache/nifi/time/DurationFormat.java
+++ b/src/main/java/org/apache/nifi/time/DurationFormat.java
@@ -37,7 +37,7 @@ public class DurationFormat {
     private static final String WEEKS = String.join(UNION, "w", "wk", "wks", 
"week", "weeks");
 
     private static final String VALID_TIME_UNITS = String.join(UNION, NANOS, 
MILLIS, SECS, MINS, HOURS, DAYS, WEEKS);
-    public static final String TIME_DURATION_REGEX = "([\\d.]+)\\s*(" + 
VALID_TIME_UNITS + ")";
+    public static final String TIME_DURATION_REGEX = "(\\d*\\.?\\d+)\\s*(" + 
VALID_TIME_UNITS + ")";
     public static final Pattern TIME_DURATION_PATTERN = 
Pattern.compile(TIME_DURATION_REGEX);
     private static final List<Long> TIME_UNIT_MULTIPLIERS = 
Arrays.asList(1000L, 1000L, 1000L, 60L, 60L, 24L);
 
diff --git a/src/test/java/org/apache/nifi/time/TestDurationFormat.java 
b/src/test/java/org/apache/nifi/time/TestDurationFormat.java
index 3259de7..b3987ab 100644
--- a/src/test/java/org/apache/nifi/time/TestDurationFormat.java
+++ b/src/test/java/org/apache/nifi/time/TestDurationFormat.java
@@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Stream;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -95,6 +96,23 @@ public class TestDurationFormat {
         assertEquals(10L, DurationFormat.getTimeDuration(decimal, 
TimeUnit.MILLISECONDS));
     }
 
+    @ParameterizedTest
+    @MethodSource("getInvalidDurationValues")
+    void testGetPreciseTimeDurationShouldHandleIllegalCharacters(String 
invalidDurationValue) {
+        final IllegalArgumentException iae = 
assertThrows(IllegalArgumentException.class, () -> 
DurationFormat.getPreciseTimeDuration(invalidDurationValue, TimeUnit.SECONDS));
+        assertFalse(iae instanceof NumberFormatException);
+    }
+
+    private static Stream<Arguments> getInvalidDurationValues() {
+        return Stream.of(
+                Arguments.argumentSet("Duration with too many periods", 
"10.10.10 seconds"),
+                Arguments.argumentSet("Duration with letter suffix", "100L 
seconds"),
+                Arguments.argumentSet("Duration with letter prefix", "E10 
seconds"),
+                Arguments.argumentSet("Duration with a comma", "1,000 
seconds"),
+                Arguments.argumentSet("Duration with spaces", "1 000 000 
seconds")
+        );
+    }
+
     @ParameterizedTest
     @MethodSource("getOneWeekInOtherUnits")
     public void testGetPreciseTimeDurationShouldHandleWeeks(TimeUnit timeUnit, 
long expected) {
@@ -135,7 +153,7 @@ public class TestDurationFormat {
     }
 
     @ParameterizedTest
-    @ValueSource(strings = {"0.010 s", "0.010 seconds"})
+    @ValueSource(strings = {"0.010 s", ".010 s", "0.010 seconds"})
     public void testGetPreciseTimeDurationWithDecimalNumbers(String decimal) {
         assertEquals(10.0, DurationFormat.getPreciseTimeDuration(decimal, 
TimeUnit.MILLISECONDS));
     }

Reply via email to