Last active
December 15, 2015 11:38
-
-
Save popstr/5254001 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I found a workaround. Replacing lines 55-60 with this makes the test pass: