From 9140cf013414b4c8054da0ad1d2b6f272ead5fc6 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Thu, 9 Oct 2008 01:22:23 +0000 Subject: [PATCH] Fixed day offset bug: in java.util.Calendar, DAY_OF_WEEK values start with 1, but in the cron expression they start with 0. Also, replaced an occurrence of Calendar.HOUR (based on 12-hour clock) with the Calendar.HOUR_OF_DAY value (based on 24-hour clock) to prevent false overflow. --- .../integration/scheduling/CronSequenceGenerator.java | 9 ++++++--- .../integration/scheduling/CronTrigger.java | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronSequenceGenerator.java b/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronSequenceGenerator.java index 1f53243cec..b173cfb807 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronSequenceGenerator.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronSequenceGenerator.java @@ -93,14 +93,17 @@ public class CronSequenceGenerator { int second = calendar.get(Calendar.SECOND); int minute = calendar.get(Calendar.MINUTE); int hour = calendar.get(Calendar.HOUR_OF_DAY); - int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); + + // the DAY_OF_WEEK values in java.util.Calendar start with 1 (Sunday), + // but in the cron pattern, they start with 0, so we subtract 1 here + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); int month = calendar.get(Calendar.MONTH); month = findNext(months, month, 12, calendar, Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND); dayOfMonth = findNextDay(calendar, daysOfMonth, dayOfMonth, daysOfWeek, dayOfWeek, 366); - hour = findNext(hours, hour, 24, calendar, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND); + hour = findNext(hours, hour, 24, calendar, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND); minute = findNext(minutes, minute, 60, calendar, Calendar.MINUTE, Calendar.SECOND); second = findNext(seconds, second, 60, calendar, Calendar.SECOND); @@ -175,7 +178,7 @@ public class CronSequenceGenerator { String[] fields = StringUtils.delimitedListToStringArray(expression, " "); if (fields.length != 6) { throw new IllegalArgumentException(String.format("Expression must consist of 6 fields (found %d in %s)", - fields.length, fields)); + fields.length, expression)); } setNumberHits(seconds, fields[0], 60); setNumberHits(minutes, fields[1], 60); diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronTrigger.java b/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronTrigger.java index 58dea9eb01..3ad1e66cc3 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronTrigger.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/CronTrigger.java @@ -31,6 +31,7 @@ public class CronTrigger implements Trigger { /** * Create a trigger for the given cron expression. + * See {@link CronSequenceGenerator}. */ public CronTrigger(String expression) throws IllegalArgumentException { this.cronSequenceGenerator = new CronSequenceGenerator(expression);