[core] Fix for handling inverted cron ranges (#1519)

* Fix for handling inverted cron ranges

This fix adds support for inverted cron ranged. For example SUN-WEN.
It also works all ranges and also with additional increments.

Closes #1516

Signed-off-by: Hilbrand Bouwkamp <hilbrand@h72.nl>
This commit is contained in:
Hilbrand Bouwkamp 2020-06-09 12:32:26 +02:00 committed by GitHub
parent e37c28cfc9
commit e84d01bafe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 20 deletions

View File

@ -290,18 +290,33 @@ class CronAdjuster implements SchedulerTemporalAdjuster {
if (range[0] == range[1]) { if (range[0] == range[1]) {
range[1] = max; range[1] = max;
} }
return temporal -> { if (range[0] > range[1]) {
final int n = temporal.get(chronoField); return temporal -> {
return n >= range[0] && n <= range[1] && ((n - range[0]) % increment) == 0; final int n = temporal.get(chronoField);
}; return (n >= range[0] || n <= range[1]) && ((n - range[0]) % increment) == 0;
};
} else {
return temporal -> {
final int n = temporal.get(chronoField);
return n >= range[0] && n <= range[1] && ((n - range[0]) % increment) == 0;
};
}
} }
// simple range/value check // simple range/value check
return temporal -> { if (range[0] > range[1]) {
final int n = temporal.get(chronoField); return temporal -> {
final int n = temporal.get(chronoField);
return n >= range[0] && n <= range[1]; return n >= range[0] || n <= range[1];
}; };
} else {
return temporal -> {
final int n = temporal.get(chronoField);
return n >= range[0] && n <= range[1];
};
}
} }
/** /**
@ -428,14 +443,7 @@ class CronAdjuster implements SchedulerTemporalAdjuster {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"Value too high in range in cron expression '%s' in field '%s': value %s, minimum: %s", "Value too high in range in cron expression '%s' in field '%s': value %s, minimum: %s",
cronExpression, chronoField, r[1], max)); cronExpression, chronoField, r[1], max));
} }
if (r[0] > r[1]) {
throw new IllegalArgumentException(String.format(
"Minimum higher than maximum range in cron expression '%s' in field '%s': min: %s, max: %s",
cronExpression, chronoField, r[0], r[1]));
}
return r; return r;
} }

View File

@ -67,11 +67,6 @@ public class CronAdjusterMiscTest {
new CronAdjuster("* * * X/10 * *"); new CronAdjuster("* * * X/10 * *");
} }
@Test(expected = IllegalArgumentException.class)
public void testRangeWeekDay() {
new CronAdjuster("* * * * * FRI-1");
}
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void testRangeLeftSideError() { public void testRangeLeftSideError() {
new CronAdjuster("X-3 * * * * *"); new CronAdjuster("X-3 * * * * *");

View File

@ -148,6 +148,11 @@ public class CronAdjusterTest {
"2015-01-02T14:00" } }, "2015-01-02T14:00" } },
{ JAN_1ST_2015, "0 0 0 ? * SAT", new String[] { "2015-01-03T00:00" } }, { JAN_1ST_2015, "0 0 0 ? * SAT", new String[] { "2015-01-03T00:00" } },
{ JAN_1ST_2015, "0 0 0 ? * SUN", new String[] { "2015-01-04T00:00" } }, { JAN_1ST_2015, "0 0 0 ? * SUN", new String[] { "2015-01-04T00:00" } },
{ JAN_1ST_2015, "0 0 0 ? * SUN-MON",
new String[] { "2015-01-04T00:00", "2015-01-05T00:00", "2015-01-11T00:00" } },
{ JAN_1ST_2000, "14-02/2 * * * * *",
new String[] { "2000-01-01T00:00:02", "2000-01-01T00:00:14", "2000-01-01T00:00:16",
"2000-01-01T00:00:18" } },
{ JAN_1ST_2000, "10-14/2 * * * * *", { JAN_1ST_2000, "10-14/2 * * * * *",
new String[] { "2000-01-01T00:00:10", "2000-01-01T00:00:12", "2000-01-01T00:00:14", new String[] { "2000-01-01T00:00:10", "2000-01-01T00:00:12", "2000-01-01T00:00:14",
"2000-01-01T00:01:10" } }, "2000-01-01T00:01:10" } },