Не удается заставить Sardine анализировать ответ CalDav

Я пытаюсь использовать Sardine для запроса календаря Apple iCloud. Однако мне кажется, что Sardine неправильно анализирует ответ.

Это мой запрос временного диапазона CalDav:

<?xml version="1.0" encoding="utf-8" ?>
<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
  <d:prop>
        <d:getetag/>
    <c:calendar-data/>
  </d:prop>
  <c:filter>
    <c:comp-filter name="VCALENDAR">
      <c:comp-filter name="VEVENT">
        <c:time-range start="20170501T000000Z" end="20170630T000000Z"/>
      </c:comp-filter>
    </c:comp-filter>
  </c:filter>
</c:calendar-query>

При запуске этого запроса с использованием HTTP-клиента (Insomnia) я без проблем получаю ответ с моими 3 тестовыми событиями. Обратите внимание, что я удалил часть данных календаря, чтобы сделать его короче):

<?xml version='1.0' encoding='UTF-8'?>
<multistatus
    xmlns='DAV:'>
    <response>
        <href>/2003926771/calendars/home/DF4C980C-C189-4DAB-80CE-991A4636593D.ics</href>
        <propstat>
            <prop>
                <getetag>"C=62@U=974e7f83-44fb-4eb2-8386-46012509f5af"</getetag>
                <calendar-data
                    xmlns='urn:ietf:params:xml:ns:caldav'>
                    <![CDATA[BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:DF4C980C-C189-4DAB-80CE-991A4636593D
DTSTART;TZID=Europe/Zurich:20170522T150000
DTEND;TZID=Europe/Zurich:20170522T160000
SUMMARY:Test event
END:VEVENT
END:VCALENDAR
]]>
                </calendar-data>
            </prop>
            <status>HTTP/1.1 200 OK</status>
        </propstat>
    </response>
    <response>
        <href>/2003926771/calendars/home/4A9F9785-A8A4-4E61-A600-D5A5C041950E.ics</href>
        <propstat>
            <prop>
                <getetag>"C=115@U=974e7f83-44fb-4eb2-8386-46012509f5af"</getetag>
                <calendar-data
                    xmlns='urn:ietf:params:xml:ns:caldav'>
                    <![CDATA[BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:4A9F9785-A8A4-4E61-A600-D5A5C041950E
DTSTART;TZID=Europe/Zurich:20170601T120000
DTEND;TZID=Europe/Zurich:20170601T130000
SUMMARY:test event in June
END:VEVENT
END:VCALENDAR
]]>
                </calendar-data>
            </prop>
            <status>HTTP/1.1 200 OK</status>
        </propstat>
    </response>
    <response>
        <href>/2003926771/calendars/home/33D1A876-87E6-4165-8AE6-EDD2FA588964.ics</href>
        <propstat>
            <prop>
                <getetag>"C=114@U=974e7f83-44fb-4eb2-8386-46012509f5af"</getetag>
                <calendar-data
                    xmlns='urn:ietf:params:xml:ns:caldav'>
                    <![CDATA[BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
BEGIN:VEVENT
UID:33D1A876-87E6-4165-8AE6-EDD2FA588964
DTSTART;TZID=Europe/Zurich:20170530T120000
DTEND;TZID=Europe/Zurich:20170530T130000
LAST-MODIFIED:20170530T071831Z
SUMMARY:another test event
END:VEVENT
END:VCALENDAR
]]>
                </calendar-data>
            </prop>
            <status>HTTP/1.1 200 OK</status>
        </propstat>
    </response>
</multistatus>

Однако, когда я отправляю точно такой же запрос через Sardine Report, я не могу прочитать содержимое calendat-data.

Более подробно, при выполнении кода ниже getAny возвращает пустой список. Согласно моим исследованиям Google, он должен содержать список с узлами xml в реквизите (с узлами, отличными от нескольких предопределенных, которые хранятся в разных объектах в реквизите, например etag).

@Override
public List<VEvent> fromMultistatus(Multistatus multistatus) {
    List<VEvent> events = new ArrayList<>(multistatus.getResponse().size());
    for (Response response : multistatus.getResponse()) {
        for (Propstat propstat : response.getPropstat()) {
            System.out.println(propstat.getProp().getAny().get(0).getFirstChild().getTextContent());                
        }
    }
    return events;
}

Я даже отладил весь объект multistatus, содержащий ответ. Нет сигнала данных моего календаря.


person Robson Hermes    schedule 31.05.2017    source источник
comment
Что такое Сардина?   -  person hnh    schedule 31.05.2017
comment
Sardine — это клиентская библиотека Java WebDav. Я нашел его, когда искал библиотеки Java для доступа к серверам на основе CalDav. Поскольку caldav4j, кажется, немного устарел и больше не поддерживается, то решил спуститься на один уровень ниже с точки зрения протокола и поискать библиотеки WebDav. Нашел рекомендацию по использованию Sardine в вики Apache по Jack Rabbit.   -  person Robson Hermes    schedule 31.05.2017
comment
Забыл упомянуть, я также нашел это в другом посте, где вы помогли другому разработчику, который также использовал Sardine. ссылка на сообщение   -  person Robson Hermes    schedule 31.05.2017


Ответы (1)


Извините, вина была на мне. Я вызывал этот URL-адрес в своем тесте с Insomnia:

https://pxx-caldav.icloud.com:443/principal/calendars/

И вызывая это в моем тесте Sardine:

https://pxx-caldav.icloud.com:443/principal/calendars/home/

При вызове подкалендаря home (это правильное название?) я не получил никаких событий.

Хотя это вызывает еще один вопрос, например, я не мог запросить подкалендарь home, содержащий мои тестовые события, в любом случае это решает этот конкретный вопрос о том, почему я не извлекал свои тестовые события с помощью Sardine.

person Robson Hermes    schedule 31.05.2017
comment
CalDAV, к сожалению, не поддерживает вложенные календари, в наборе календарей есть только плоские календари. Следовательно, никаких «подкалендарей», только календари ;-) - person hnh; 02.06.2017