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));
}