1

I'm trying to fetch events from a CalDAV server using Sardine (and biweekly). Fetching an entire calendar is working for me:

Sardine sardine = SardineFactory.begin(); InputStream is = sardine.get(CALDAV_URL_STRING); ICalendar iCalendar = Biweekly.parse(is).first(); 

Now I would like to fetch events for specific time range. Based on this "Building a CalDAV client" article, I assume you should use Sardines report method to do so, right?

If so, how should you use that method? It's not documented in the wiki, and the Javadoc is also not very clear.

Should I write my own SardineReport? I looks like I should end up with something like:

Sardine sardine = SardineFactory.begin(); SardineReport<List<VEvent>> report = new MyRangeReport(FROM_DATE, END_DATE); List<VEvent> result = sardine.report(CALDAV_URL_STRING, 1, report); 

Am I on the right track? Does anyone have any pointers to how to write your own Sardine report?

2 Answers 2

1

You are correct, to run a time range query you need to issue an HTTP REPORT request containing a calendar-query. You can find a sample in RFC 4719 Section 7.8.1. I don't know Sardine, but yes, report sounds right ;-)

Simplified even further:

 REPORT /bernard/work/ HTTP/1.1 Host: cal.example.com Depth: 1 Content-Type: application/xml; charset="utf-8" Content-Length: xxxx <?xml version="1.0" encoding="utf-8" ?> <calendar-query xmlns:D="DAV:" xmlns="urn:ietf:params:xml:ns:caldav"> <D:prop> <D:getetag/> <calendar-data /> </D:prop> <filter> <comp-filter name="VCALENDAR"> <comp-filter name="VEVENT"> <time-range start="20060104T000000Z" end="20060105T000000Z"/> </comp-filter> </comp-filter> </filter> </calendar-query> 

Should I write my own SardineReport?

Looks like, scanning over the GitHub of Sardine it doesn't seem to include CalDAV queries. You can probably base yours on their SyncCollectionReport.java.

Note that the response to the calendar-query REPORT is just a regular WebDAV 207 multi-status response. Nothing extra required. (the Result object would be the same like in their SyncCollectionReport but w/o the extra syncToken).

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks! I already wrote my own report class which returns results. I'm starting to wonder if Radicale (server we're using) supports the time-range filter.
I don't know, but this answer suggests it doesn't. Check the comment: "The problem lies with Radicale. Switched to SabreDAV, now it works"
Thanks. I think we need to check out sabre/dav. For documentation sake I've added my report class.
0

I've implemented a report class which works, however, the result returned by Radicale seem to be incorrect. It looks like Radicale does not support the time-range filter.

For what it's worth, here are the relevant bits of the report:

public class VEventsTimeRangeSardineReport extends SardineReport<List<VEvent>> { ... @Override public String toXml() throws IOException { // Hardcode for now String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" + "<c:calendar-query xmlns:d=\"DAV:\" xmlns:c=\"urn:ietf:params:xml:ns:caldav\">\n" + " <d:prop>\n" + " <c:calendar-data/>\n" + " <d:getetag/>\n" + " </d:prop>\n" + " <c:filter>\n" + " <c:comp-filter name=\"VCALENDAR\">\n" + " <c:comp-filter name=\"VEVENT\">\n" + " <c:time-range start=\"%s\" end=\"%s\"/>\n" + " </c:comp-filter>\n" + " </c:comp-filter>\n" + " </c:filter>\n" + "</c:calendar-query>"; return String.format(xml, SDF.format(fromDate), SDF.format(toDate)); } @Override public List<VEvent> fromMultistatus(Multistatus multistatus) { List<VEvent> events = new ArrayList<>(multistatus.getResponse().size()); for (Response response : multistatus.getResponse()) { // Here response.getPropstat().get(0).getProp().getAny().get(0).getFirstChild().getTextContent() is parsed events.addAll(ICalendarSardineReport.getICalendar(response).getEvents()); } return events; } @Override public Object toJaxb() { return null; } } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.