使用 Sardines 报告方法从 CalDAV 服务器查询事件
Using Sardines report method to query events from CalDAV server
我正在尝试使用 Sardine (and biweekly) 从 CalDAV 服务器获取事件。获取整个日历对我有用:
Sardine sardine = SardineFactory.begin();
InputStream is = sardine.get(CALDAV_URL_STRING);
ICalendar iCalendar = Biweekly.parse(is).first();
现在我想获取特定时间范围内的事件。基于这个“Building a CalDAV client" article, I assume you should use Sardines report
方法来做,对吧?
如果是这样,您应该如何使用该方法? wiki上没有记载,Javadoc也不是很清楚。
我应该自己写 SardineReport
吗?我看起来应该以这样的方式结束:
Sardine sardine = SardineFactory.begin();
SardineReport<List<VEvent>> report = new MyRangeReport(FROM_DATE, END_DATE);
List<VEvent> result = sardine.report(CALDAV_URL_STRING, 1, report);
我走在正确的轨道上吗?有人知道如何编写自己的沙丁鱼报告吗?
您是正确的,要 运行 时间范围查询,您需要发出包含 calendar-query
的 HTTP REPORT
请求。您可以在 RFC 4719 Section 7.8.1 中找到示例。我不认识沙丁鱼,但是是的,report
听起来不错 ;-)
进一步简化:
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?
看起来,扫描沙丁鱼的 GitHub 它似乎不包括 CalDAV 查询。你可能可以根据他们的
SyncCollectionReport.java.
请注意,对 calendar-query
REPORT
的响应只是常规的 WebDAV 207
multi-status
响应。不需要额外的东西。 (Result
对象与他们的 SyncCollectionReport
对象相同,但 w/o 额外的 syncToken)。
我已经实施了一个有效的报告 class,但是,Radicale 返回的结果似乎不正确。 Radicale 似乎不支持 time-range
过滤器。
关于它的价值,以下是报告的相关部分:
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;
}
}
我正在尝试使用 Sardine (and biweekly) 从 CalDAV 服务器获取事件。获取整个日历对我有用:
Sardine sardine = SardineFactory.begin();
InputStream is = sardine.get(CALDAV_URL_STRING);
ICalendar iCalendar = Biweekly.parse(is).first();
现在我想获取特定时间范围内的事件。基于这个“Building a CalDAV client" article, I assume you should use Sardines report
方法来做,对吧?
如果是这样,您应该如何使用该方法? wiki上没有记载,Javadoc也不是很清楚。
我应该自己写 SardineReport
吗?我看起来应该以这样的方式结束:
Sardine sardine = SardineFactory.begin();
SardineReport<List<VEvent>> report = new MyRangeReport(FROM_DATE, END_DATE);
List<VEvent> result = sardine.report(CALDAV_URL_STRING, 1, report);
我走在正确的轨道上吗?有人知道如何编写自己的沙丁鱼报告吗?
您是正确的,要 运行 时间范围查询,您需要发出包含 calendar-query
的 HTTP REPORT
请求。您可以在 RFC 4719 Section 7.8.1 中找到示例。我不认识沙丁鱼,但是是的,report
听起来不错 ;-)
进一步简化:
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?
看起来,扫描沙丁鱼的 GitHub 它似乎不包括 CalDAV 查询。你可能可以根据他们的 SyncCollectionReport.java.
请注意,对 calendar-query
REPORT
的响应只是常规的 WebDAV 207
multi-status
响应。不需要额外的东西。 (Result
对象与他们的 SyncCollectionReport
对象相同,但 w/o 额外的 syncToken)。
我已经实施了一个有效的报告 class,但是,Radicale 返回的结果似乎不正确。 Radicale 似乎不支持 time-range
过滤器。
关于它的价值,以下是报告的相关部分:
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;
}
}