diff --git a/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java b/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java index 50365b4ed5..059830d6d6 100644 --- a/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java +++ b/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java @@ -206,11 +206,25 @@ public class CalendarHelpersTest currentDate.set(2011,11-1,24,10,30); RecurrenceHelper.buildDailyRecurrences( currentDate, dates, null, - date(2011,11,22,12,30), date(2011,11,25,12,30), + date(2011,11,22,12,30), date(2011,11,27,12,30), false, 1); - assertEquals(2, dates.size()); + assertEquals(4, dates.size()); assertEquals("2011-11-24", dateFmt.format(dates.get(0))); // Thu assertEquals("2011-11-25", dateFmt.format(dates.get(1))); // Fri + assertEquals("2011-11-26", dateFmt.format(dates.get(2))); // Sat + assertEquals("2011-11-27", dateFmt.format(dates.get(3))); // Sun + + // From before today, with an interval + // Repeats are 24th, 27th, (30th - too far) + dates.clear(); + currentDate.set(2011,11-1,24,10,30); + RecurrenceHelper.buildDailyRecurrences( + currentDate, dates, null, + date(2011,11,22,12,30), date(2011,11,27,12,30), + false, 3); + assertEquals(2, dates.size()); + assertEquals("2011-11-24", dateFmt.format(dates.get(0))); // Thu + assertEquals("2011-11-27", dateFmt.format(dates.get(1))); // Sun // With no end date but only first, check it behaves @@ -473,6 +487,17 @@ public class CalendarHelpersTest assertEquals("2011-09-02", dateFmt.format(dates.get(1))); + // Now with a recurrence interval of only every 2 months + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildMonthlyRecurrences( + currentDate, dates, params, + date(2011,7,20), date(2011,9,20), + false, 2); + assertEquals(1, dates.size()); + assertEquals("2011-09-02", dateFmt.format(dates.get(0))); + + // With no end date but only first, check it behaves dates.clear(); currentDate.set(2011,7-1,2,10,30); diff --git a/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java b/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java index 20abffb03d..f97d684c11 100644 --- a/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java +++ b/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java @@ -254,7 +254,7 @@ public class CalendarRecurrenceHelper // Nice and easy while (currentDate.getTime().before(onOrAfter)) { - currentDate.add(Calendar.DATE, 1); + currentDate.add(Calendar.DATE, interval); } if (firstOnly) @@ -278,7 +278,7 @@ public class CalendarRecurrenceHelper while (! currentDate.getTime().after(until)) { dates.add(currentDate.getTime()); - currentDate.add(Calendar.DATE, 1); + currentDate.add(Calendar.DATE, interval); } } } @@ -355,7 +355,7 @@ public class CalendarRecurrenceHelper } protected static void buildMonthlyRecurrences(Calendar currentDate, List dates, - Map params, Date onOrAfter, Date until, boolean firstOnly, int interval) + Map params, Date onOrAfter, Date until, boolean firstOnly, int monthInterval) { if (params.get("BYMONTHDAY") != null) { @@ -364,7 +364,7 @@ public class CalendarRecurrenceHelper if (currentDate.get(Calendar.DAY_OF_MONTH) > dayOfMonth) { // Move forward to start of the next month - addMonthToDayOfMonth(currentDate, dayOfMonth); + addMonthToDayOfMonth(currentDate, dayOfMonth, monthInterval); } else { @@ -375,7 +375,7 @@ public class CalendarRecurrenceHelper // Go until in the ok range while (currentDate.getTime().before(onOrAfter)) { - addMonthToDayOfMonth(currentDate, dayOfMonth); + addMonthToDayOfMonth(currentDate, dayOfMonth, monthInterval); } while (true) { @@ -393,7 +393,7 @@ public class CalendarRecurrenceHelper break; } - addMonthToDayOfMonth(currentDate, dayOfMonth); + addMonthToDayOfMonth(currentDate, dayOfMonth, monthInterval); } } else if (params.get("BYSETPOS") != null) @@ -403,7 +403,7 @@ public class CalendarRecurrenceHelper if (currentDate.get(Calendar.DAY_OF_MONTH) > 8) { // Move to start, in next month - addMonthToFirstDayOfWeek(currentDate, dayOfWeek); + addMonthToFirstDayOfWeek(currentDate, dayOfWeek, monthInterval); } else if (currentDate.get(Calendar.DAY_OF_WEEK) != dayOfWeek) { @@ -418,7 +418,7 @@ public class CalendarRecurrenceHelper while (currentDate.getTime().before(onOrAfter)) { - addMonthToFirstDayOfWeek(currentDate, dayOfWeek); + addMonthToFirstDayOfWeek(currentDate, dayOfWeek, monthInterval); } while (true) { @@ -436,7 +436,7 @@ public class CalendarRecurrenceHelper break; } - addMonthToFirstDayOfWeek(currentDate, dayOfWeek); + addMonthToFirstDayOfWeek(currentDate, dayOfWeek, monthInterval); } } } @@ -457,14 +457,14 @@ public class CalendarRecurrenceHelper } else { - currentDate.set(Calendar.YEAR, currentDate.get(Calendar.YEAR) + 1); + currentDate.set(Calendar.YEAR, currentDate.get(Calendar.YEAR) + interval); currentDate.set(Calendar.MONTH, month); currentDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); } while (currentDate.getTime().before(onOrAfter)) { - currentDate.set(Calendar.YEAR, currentDate.get(Calendar.YEAR) + 1); + currentDate.set(Calendar.YEAR, currentDate.get(Calendar.YEAR) + interval); currentDate.set(Calendar.MONTH, month); currentDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); } @@ -484,7 +484,7 @@ public class CalendarRecurrenceHelper break; } - currentDate.set(Calendar.YEAR, currentDate.get(Calendar.YEAR) + 1); + currentDate.set(Calendar.YEAR, currentDate.get(Calendar.YEAR) + interval); currentDate.set(Calendar.MONTH, month); currentDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); } @@ -497,20 +497,23 @@ public class CalendarRecurrenceHelper } } - private static void addMonthToDayOfMonth(Calendar c, int dayOfMonth) + private static void addMonthToDayOfMonth(Calendar c, int dayOfMonth, int monthInterval) { - // Set it to the 1st - c.set(Calendar.DAY_OF_MONTH, 1); - // Add 33 days, will be on the 2nd-6th - c.add(Calendar.DATE, 33); - // Set to the requred day in the month - c.set(Calendar.DAY_OF_MONTH, dayOfMonth); + for (int i=0; i