mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
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:
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user