Skip to content

Instantly share code, notes, and snippets.

@popstr
Last active December 15, 2015 11:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save popstr/5254001 to your computer and use it in GitHub Desktop.
Save popstr/5254001 to your computer and use it in GitHub Desktop.
import static junit.framework.Assert.assertEquals;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URISyntaxException;
import java.text.ParseException;
import net.fortuna.ical4j.data.CalendarBuilder;
import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.data.CalendarParserImpl;
import net.fortuna.ical4j.data.ParserException;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.model.Property;
import net.fortuna.ical4j.model.PropertyList;
import net.fortuna.ical4j.model.Recur;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.DtEnd;
import net.fortuna.ical4j.model.property.DtStart;
import net.fortuna.ical4j.model.property.ExDate;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.RRule;
import net.fortuna.ical4j.model.property.Version;
import org.junit.Test;
import cloudfinder.core.lang.Sneak;
public class RecurringTest {
@Test
public void test() throws URISyntaxException, IOException, ParserException, ParseException {
// Prepare calendar with recurring event
Calendar calendar = new Calendar();
calendar.getProperties().add(new ProdId("test"));
calendar.getProperties().add(Version.VERSION_2_0);
VEvent event = new VEvent();
boolean useUtc = true;
DtStart startDate = new DtStart(new Date("20130304"), useUtc);
event.getProperties().add(startDate);
DtEnd endDate = new DtEnd(new Date("20130305"), useUtc);
event.getProperties().add(endDate);
// Repeat every monday
Recur recur = new Recur("FREQ=WEEKLY;BYDAY=MO");
RRule rule = new RRule(recur);
event.getProperties().add(rule);
// Except for 11 March 2013
ExDate exDate = new ExDate();
exDate.setUtc(useUtc);
exDate.getDates().add(new Date("20130311", "yyyyMMdd"));
exDate.getParameters().add(net.fortuna.ical4j.model.parameter.Value.DATE);
event.getProperties().add(exDate);
calendar.getComponents().add(event);
// Write to file
File calendarFile = writeCalendarToFile(calendar);
System.out.println("Created file: " + calendarFile.getAbsolutePath());
/*
File will look like this:
---
BEGIN:VCALENDAR
PRODID:test
VERSION:2.0
BEGIN:VEVENT
DTSTAMP:20130327T124246Z
DTSTART;VALUE=DATE:20130304
DTEND;VALUE=DATE:20130305
RRULE:FREQ=WEEKLY;BYDAY=MO
EXDATE;VALUE=DATE:20130311T010000 <-- NOTE: time value added!
END:VEVENT
END:VCALENDAR
---
*/
// Read from file
FileInputStream input = new FileInputStream(calendarFile);
// Create calendar object from file
Calendar calendarFromFile = new CalendarBuilder(new CalendarParserImpl()).build(input);
// Verify
VEvent e = (VEvent) calendarFromFile.getComponents().get(0);
PropertyList exDates = e.getProperties(Property.EXDATE);
ExDate ex = (ExDate) exDates.get(0);
assertEquals("EXDATE", ex.getName());
assertEquals("20130311", ex.getValue());
}
public File writeCalendarToFile(Calendar calendar) {
File file;
try {
file = File.createTempFile("cal", ".ics");
FileWriter fw = new FileWriter(file);
new CalendarOutputter().output(calendar, fw);
fw.close();
} catch (Exception e) {
throw Sneak.unwrappedException(e);
}
return file;
}
}
@popstr
Copy link
Author

popstr commented Mar 28, 2013

I found a workaround. Replacing lines 55-60 with this makes the test pass:

// Except for 11 March 2013
DateList dateList = new DateList(Value.DATE);
dateList.add(new Date("20130311", "yyyyMMdd"));
ExDate exDate = new ExDate(dateList);
event.getProperties().add(exDate);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment