2017-05-31 3 views
0

Apple iCloud Calendarに照会するのにSardineを使用しようとしています。しかし、Sardineが適切に応答を解析していないように思えます。SardineがCalDavの応答を解析できない

これは私の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クライアント(不眠症)を使用して、このクエリを焼成した場合、私は何の問題もなく私の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>"[email protected]=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>"[email protected]=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>"[email protected]=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> 

しかし、私はイワシ報告書を通じて、まったく同じクエリを送信するとき、私はcalendat-data内容を読み取ることができないです:私は)それを短くするカレンダーデータの一部を削除しますのでご注意ください。

さらに詳しくは、以下のコードを実行すると、getAnyは空のリストを返します。私のGoogleの調査によると、これはpropの下にxmlノードを持つリストを含んでいるはずです(いくつかの事前定義されたもの以外のノードで、Propの下に別のオブジェクトの下に格納されています、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オブジェクト全体をデバッグしました。私のカレンダーデータの信号はありません。

+0

サディインとは何ですか? – hnh

+0

[Sardine](https://github.com/lookfirst/sardine)はJava WebDavクライアントライブラリです。 CalDavベースのサーバーにアクセスするためのJavaライブラリを探すときに見つけました。 caldav4jがもう古くて、もうメンテナンスされていないようだから、プロトコルの面で「一段階下がって」、WebDavライブラリを探すことに決めました。 [Apache's Jack Rabbit wiki](https://wiki.apache.org/jackrabbit/WebDAV)のSardineを使用するための推奨が見つかりました –

+0

他の投稿でも見つけました。 [投稿へのリンク](https://stackoverflow.com/questions/38057038/using-sardines-report-method-to-query-events-from-caldav-server) –

答えて

0

申し訳ありませんが、欠陥は私です。私は不眠症に私のテストでは、このURLを呼んでいた。

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

そして、私のイワシのテストでこれを呼び出す:

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

homeサブカレンダーを呼び出すと、その右の名前である場合には? )私はイベントがありません。

これは私のテストイベントを含むhomeサブカレンダーに問い合わせることができなかったような別の質問をもたらしますが、とにかく私がなぜSardineを使ってテストイベントを取得していないのかというこの特定の質問を解決します。

+0

残念ながら、CalDAVはネストされたカレンダーをサポートしていません。カレンダーのホームセットの単なる平らなカレンダーです。したがって、 'サブカレンダー'はなく、カレンダーだけです;-) – hnh