ALF-9156 Calendar weekly repeating

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29188 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Nick Burch
2011-07-19 14:21:14 +00:00
parent 7c6eb61fdc
commit 7794d91f4e
2 changed files with 180 additions and 15 deletions

View File

@@ -28,6 +28,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -118,7 +119,6 @@ public class CalendarHelpersTest
@Test public void dailyRecurrenceDates() @Test public void dailyRecurrenceDates()
{ {
List<Date> dates = new ArrayList<Date>(); List<Date> dates = new ArrayList<Date>();
Calendar currentDate = Calendar.getInstance(); Calendar currentDate = Calendar.getInstance();
@@ -210,6 +210,173 @@ public class CalendarHelpersTest
assertEquals("2011-07-20", dateFmt.format(dates.get(0))); assertEquals("2011-07-20", dateFmt.format(dates.get(0)));
} }
@Test public void weeklyRecurrenceDates()
{
List<Date> dates = new ArrayList<Date>();
Calendar currentDate = Calendar.getInstance();
Map<String,String> params = new HashMap<String, String>();
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<Date> dates,
Map<String,String> 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<Date> dates,
Map<String,String> 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) private static Date date(int year, int month, int day)
{ {
return date(year, month, day, 0, 0); return date(year, month, day, 0, 0);
@@ -221,14 +388,4 @@ public class CalendarHelpersTest
c.set(Calendar.MILLISECOND, 0); c.set(Calendar.MILLISECOND, 0);
return c.getTime(); return c.getTime();
} }
private static class RecurrenceHelper extends CalendarRecurrenceHelper
{
protected static void buildDailyRecurrences(Calendar currentDate, List<Date> dates,
Map<String,String> params, Date onOrAfter, Date until, boolean firstOnly, int interval)
{
CalendarRecurrenceHelper.buildDailyRecurrences(
currentDate, dates, params, onOrAfter, until, firstOnly, interval);
}
}
} }

View File

@@ -52,7 +52,7 @@ public class CalendarRecurrenceHelper
d2cd.put("MO", Calendar.MONDAY); d2cd.put("MO", Calendar.MONDAY);
d2cd.put("TU", Calendar.TUESDAY); d2cd.put("TU", Calendar.TUESDAY);
d2cd.put("WE", Calendar.WEDNESDAY); d2cd.put("WE", Calendar.WEDNESDAY);
d2cd.put("Th", Calendar.THURSDAY); d2cd.put("TH", Calendar.THURSDAY);
d2cd.put("FR", Calendar.FRIDAY); d2cd.put("FR", Calendar.FRIDAY);
d2cd.put("SA", Calendar.SATURDAY); d2cd.put("SA", Calendar.SATURDAY);
} }
@@ -275,8 +275,10 @@ public class CalendarRecurrenceHelper
Collections.sort(daysOfWeek); Collections.sort(daysOfWeek);
// Wind forward // Wind forward
boolean going = true;
boolean valid = false; boolean valid = false;
while(true) Date origDate = currentDate.getTime();
while(going)
{ {
// Check each day // Check each day
for(int day : daysOfWeek) for(int day : daysOfWeek)
@@ -284,10 +286,14 @@ public class CalendarRecurrenceHelper
currentDate.set(Calendar.DAY_OF_WEEK, day); currentDate.set(Calendar.DAY_OF_WEEK, day);
if(!valid) if(!valid)
{ {
if(currentDate.before(onOrAfter)) if(currentDate.getTime().before(onOrAfter))
{ {
// To early // To early
} }
else if(currentDate.getTime().before(origDate))
{
// Too early
}
else else
{ {
// Now in the right range // Now in the right range
@@ -298,15 +304,17 @@ public class CalendarRecurrenceHelper
{ {
if(until != null) if(until != null)
{ {
if(currentDate.after(until)) if(currentDate.getTime().after(until))
{ {
// Too late // Too late
going = false;
break; break;
} }
} }
dates.add(currentDate.getTime()); dates.add(currentDate.getTime());
if(firstOnly) if(firstOnly)
{ {
going = false;
break; break;
} }
} }