2016-06-27 8 views
1

Sardine (및 biweekly)을 사용하여 CalDAV 서버에서 이벤트를 가져 오려고합니다. 전체 캘린더를 가져 오는 것은 나를 위해 일하고 있습니다.Sardines 보고서 메서드를 사용하여 CalDAV 서버에서 이벤트 쿼리

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

이제 특정 시간대의 일정을 가져오고 싶습니다. 이 "Building a CalDAV client"기사를 바탕으로, 나는 그렇게하기 위해 정어리 report 방법을 사용해야한다고 생각하니, 맞습니까?

그렇다면 어떻게 사용해야합니까? 그것은 위키에 문서화되어 있지 않으며 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); 

올바른 트랙에 있습니까? 누군가가 당신의 Sardine 보고서를 작성하는 방법에 대한 지침을 가지고 있습니까?

답변

1

정확합니다. 시간 범위 쿼리를 실행하려면 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> 

내가 내 자신의 SardineReport를 작성해야 하는가?

Sardine의 GitHub를 검색하면 CalDAV 쿼리가 포함되지 않는 것처럼 보입니다. SyncCollectionReport.java을 기반으로 할 수 있습니다.

calendar-queryREPORT에 대한 응답은 일반적인 WebDAV 207multi-status 응답임을 유의하십시오. 추가 비용이 들지 않습니다. (Result 객체는 SyncCollectionReport과 같지만 추가 syncToken이 없어도됩니다).

+0

감사합니다 : 그것은 가치가 무엇인지에 대한

, 여기에 보고서의 관련 비트입니다! 이미 결과를 반환하는 자체 보고서 클래스를 작성했습니다. Radicale (우리가 사용하는 서버)가'time-range' 필터를 지원하는지 궁금해지기 시작했습니다. –

+1

모르겠지만 [이 답변] (http://stackoverflow.com/questions/37711699/expanding-recurring-events-in-caldav)에 나와 있지 않습니다. 의견을 확인하십시오 : "문제는 Radicale에 있습니다. SabreDAV로 전환되었습니다. 이제 작동합니다" – hnh

+0

고마워. 나는 saber/dav를 조사해야한다고 생각해. 문서 용으로 저는 보고서 클래스를 추가했습니다. –

0

작동하는 보고서 클래스를 구현했지만 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; 
    } 

}