diff --git a/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java b/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java index 28488ddc45..404b12dda4 100644 --- a/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java +++ b/source/java/org/alfresco/repo/calendar/CalendarHelpersTest.java @@ -28,6 +28,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -118,7 +119,6 @@ public class CalendarHelpersTest @Test public void dailyRecurrenceDates() { List dates = new ArrayList(); - Calendar currentDate = Calendar.getInstance(); @@ -210,6 +210,173 @@ public class CalendarHelpersTest assertEquals("2011-07-20", dateFmt.format(dates.get(0))); } + @Test public void weeklyRecurrenceDates() + { + List dates = new ArrayList(); + Calendar currentDate = Calendar.getInstance(); + + Map params = new HashMap(); + params.put("BYDAY", "MO,TH"); + + + // Dates in the past, get nothing + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,10), date(2011,7,15), + true, 1 + ); + assertEquals(0, dates.size()); + + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,10), date(2011,7,15), + false, 1 + ); + assertEquals(0, dates.size()); + + + // Just before today + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,17), date(2011,7,26), + true, 1 + ); + assertEquals(1, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); // Thursday + + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,19), date(2011,7,26), + false, 1 + ); + assertEquals(2, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); // Thu + assertEquals("2011-07-25", dateFmt.format(dates.get(1))); // Mon + + + // From today + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,19), date(2011,7,26), + true, 1 + ); + assertEquals(1, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); // Thursday + + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,19), date(2011,7,26), + false, 1 + ); + assertEquals(2, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); // Thu + assertEquals("2011-07-25", dateFmt.format(dates.get(1))); // Mon + + + // Dates in the future, goes from then + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,20), date(2011,7,30), + true, 1 + ); + assertEquals(1, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); // Thu + + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,20), date(2011,7,30), + false, 1 + ); + assertEquals(3, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); + assertEquals("2011-07-25", dateFmt.format(dates.get(1))); + assertEquals("2011-07-28", dateFmt.format(dates.get(2))); + + + // Multi-week skip + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,20), date(2011,8,30), + true, 3 + ); + assertEquals(1, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); // Thu + + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,20), date(2011,8,30), + false, 3 + ); + assertEquals(4, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); + // Not the 25th or 28th + // Not the 1st or the 4th + assertEquals("2011-08-08", dateFmt.format(dates.get(1))); + assertEquals("2011-08-11", dateFmt.format(dates.get(2))); + // Not the 15th or 18th + // Not the 22nd or 25th + assertEquals("2011-08-29", dateFmt.format(dates.get(3))); + + + // With no end date but only first, check it behaves + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,19), null, + true, 1 + ); + assertEquals(1, dates.size()); + assertEquals("2011-07-21", dateFmt.format(dates.get(0))); // Thu + + dates.clear(); + currentDate.set(2011,7-1,19,10,30); + RecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, + date(2011,7,22), null, + true, 1 + ); + assertEquals(1, dates.size()); + assertEquals("2011-07-25", dateFmt.format(dates.get(0))); + } + + private static class RecurrenceHelper extends CalendarRecurrenceHelper + { + protected static void buildDailyRecurrences(Calendar currentDate, List dates, + Map params, Date onOrAfter, Date until, boolean firstOnly, int interval) + { + CalendarRecurrenceHelper.buildDailyRecurrences( + currentDate, dates, params, onOrAfter, until, firstOnly, interval); + } + + protected static void buildWeeklyRecurrences(Calendar currentDate, List dates, + Map params, Date onOrAfter, Date until, boolean firstOnly, int interval) + { + CalendarRecurrenceHelper.buildWeeklyRecurrences( + currentDate, dates, params, onOrAfter, until, firstOnly, interval); + } + } + private static Date date(int year, int month, int day) { return date(year, month, day, 0, 0); @@ -221,14 +388,4 @@ public class CalendarHelpersTest c.set(Calendar.MILLISECOND, 0); return c.getTime(); } - - private static class RecurrenceHelper extends CalendarRecurrenceHelper - { - protected static void buildDailyRecurrences(Calendar currentDate, List dates, - Map params, Date onOrAfter, Date until, boolean firstOnly, int interval) - { - CalendarRecurrenceHelper.buildDailyRecurrences( - currentDate, dates, params, onOrAfter, until, firstOnly, interval); - } - } } diff --git a/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java b/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java index 8caf9d7949..cf47518b60 100644 --- a/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java +++ b/source/java/org/alfresco/service/cmr/calendar/CalendarRecurrenceHelper.java @@ -52,7 +52,7 @@ public class CalendarRecurrenceHelper d2cd.put("MO", Calendar.MONDAY); d2cd.put("TU", Calendar.TUESDAY); d2cd.put("WE", Calendar.WEDNESDAY); - d2cd.put("Th", Calendar.THURSDAY); + d2cd.put("TH", Calendar.THURSDAY); d2cd.put("FR", Calendar.FRIDAY); d2cd.put("SA", Calendar.SATURDAY); } @@ -275,8 +275,10 @@ public class CalendarRecurrenceHelper Collections.sort(daysOfWeek); // Wind forward + boolean going = true; boolean valid = false; - while(true) + Date origDate = currentDate.getTime(); + while(going) { // Check each day for(int day : daysOfWeek) @@ -284,10 +286,14 @@ public class CalendarRecurrenceHelper currentDate.set(Calendar.DAY_OF_WEEK, day); if(!valid) { - if(currentDate.before(onOrAfter)) + if(currentDate.getTime().before(onOrAfter)) { // To early } + else if(currentDate.getTime().before(origDate)) + { + // Too early + } else { // Now in the right range @@ -298,15 +304,17 @@ public class CalendarRecurrenceHelper { if(until != null) { - if(currentDate.after(until)) + if(currentDate.getTime().after(until)) { // Too late + going = false; break; } } dates.add(currentDate.getTime()); if(firstOnly) { + going = false; break; } }