[Cosmo-dev] Caldav4j: patch to search for newly changed events:
CalDAVCalendarCollection.java
Roberto Polli
rpolli at babel.it
Wed Oct 3 07:44:03 PDT 2007
hey!
the following patch enables to search for newly changed events. Requires the
previous patch to
src/main/java/org/osaf/caldav4j/model/request/CalDAVProp.java
Plenty of comments follows! Let me know,
R.
[bash$] svn diff
Index: src/main/java/org/osaf/caldav4j/CalDAVCalendarCollection.java
===================================================================
--- src/main/java/org/osaf/caldav4j/CalDAVCalendarCollection.java
(revision 5569)
+++ src/main/java/org/osaf/caldav4j/CalDAVCalendarCollection.java
(working copy)
@@ -55,9 +55,12 @@
import org.osaf.caldav4j.methods.MkCalendarMethod;
import org.osaf.caldav4j.methods.MkTicketMethod;
import org.osaf.caldav4j.methods.PutMethod;
+import org.osaf.caldav4j.model.request.CalDAVProp;
import org.osaf.caldav4j.model.request.CalendarData;
import org.osaf.caldav4j.model.request.CalendarQuery;
+import org.osaf.caldav4j.model.request.Comp;
import org.osaf.caldav4j.model.request.CompFilter;
+import org.osaf.caldav4j.model.request.Prop;
import org.osaf.caldav4j.model.request.PropFilter;
import org.osaf.caldav4j.model.request.PropProperty;
import org.osaf.caldav4j.model.request.TextMatch;
@@ -129,7 +132,7 @@
public void setMethodFactory(CalDAV4JMethodFactory methodFactory) {
this.methodFactory = methodFactory; }
- public String getCalendarCollectionRoot() {
+ protected String getCalendarCollectionRoot() {
return calendarCollectionRoot;
}
@@ -302,6 +305,7 @@
* @param timezone The VTimeZone of the VEvent if it references one,
* otherwise null
* @throws CalDAV4JException
+ * @todo specify somewhere the kind of caldav error...
*/
public void addEvent(HttpClient httpClient, VEvent vevent, VTimeZone
timezone)
throws CalDAV4JException {
@@ -326,7 +330,8 @@
PutMethod putMethod = createPutMethodForNewResource(resourceName,
calendar);
try {
- httpClient.executeMethod(getHostConfiguration(), putMethod);
+ httpClient.executeMethod(getHostConfiguration(), putMethod);
+// String etag = ( putMethod.getResponseHeader("ETag") !=
null) ? putMethod.getResponseHeader("ETag").getValue() : null; // rpolli
String etag = putMethod.getResponseHeader("ETag").getValue();
CalDAVResource calDAVResource = new CalDAVResource(calendar,
etag, getHref((putMethod.getPath())));
@@ -599,7 +604,7 @@
PropFilter propFilter = new PropFilter("C");
propFilter.setName(Property.UID);
- propFilter.setTextMatch(new TextMatch("C", false, uid));
+ propFilter.setTextMatch(new TextMatch("C", null, uid)); // rpolli
s/false/null/
vEventCompFilter.addPropFilter(propFilter);
vCalendarCompFilter.addCompFilter(vEventCompFilter);
@@ -822,4 +827,165 @@
+ path;
return href;
}
-}
+ /**
+ * Returns all Calendars (VCALENDAR/VEVENTS) which contain events with
DTSTAMP between beginDate - endDate
+ * TODO Note that recurring events are NOT expanded.
+ * TODO we can parametrize too the Component.VEVENT field to get a more
flexible method
+ * TODO This method doesn't use cache
+ * the search is the following...
+<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data>
+ <C:comp name="VCALENDAR">
+ <C:comp name="VEVENT">
+ <C:prop name="UID"/>
+ </C:comp>
+ </C:comp>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:prop-filter name="DTSTAMP">
+ <C:time-range end="20071210T000000Z"
start="20070607T000000Z"/>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ * @param httpClient the httpClient which will make the request
+ * @param propertyName the iCalendar property name ex. Property.UID @see
Property
+ * @param beginDate the beginning of the date range. Must be a UTC date
+ * @param endDate the end of the date range. Must be a UTC date.
+ * @return a List of Property values (eg. a List of VEVENT UIDs
+ * @throws CalDAV4JException if there was a problem
+ */
+ public List<String> getEventPropertyByTimestamp(HttpClient httpClient,
String propertyName,
+ Date beginDate, Date endDate)
+ throws CalDAV4JException {
+ // first create the calendar query
+ CalendarQuery query = new CalendarQuery("C", "D");
+
+ query.addProperty(PROP_ETAG);
+
+ // create the query fields
+ CalendarData calendarData = new CalendarData("C");
+
+ Comp vCalendarComp = new Comp("C");
+ vCalendarComp.setName(Calendar.VCALENDAR);
+
+ Comp vEventComp = new Comp("C");
+ vEventComp.setName(Component.VEVENT);
+ vEventComp.addProp(new CalDAVProp("C", "name", propertyName, false,
false)); // @see modification to CalDAVProp
+
+ List <Comp> comps = new ArrayList<Comp> ();
+ comps.add(vEventComp);
+ vCalendarComp.setComps(comps);
+ calendarData.setComp(vCalendarComp);
+ query.setCalendarDataProp(calendarData);
+
+ // search for events matching...
+ CompFilter vCalendarCompFilter = new CompFilter("C");
+ vCalendarCompFilter.setName(Calendar.VCALENDAR);
+
+ CompFilter vEventCompFilter = new CompFilter("C");
+ vEventCompFilter.setName(Component.VEVENT);
+
+ // TODO check the support from the caldav server. bedework is ok
+ PropFilter pFilter = new PropFilter("C");
+ pFilter.setName("DTSTAMP");
+ pFilter.setTimeRange(beginDate, endDate);
+
+ vEventCompFilter.addPropFilter(pFilter);
+ vCalendarCompFilter.addCompFilter(vEventCompFilter);
+ query.setCompFilter(vCalendarCompFilter);
+
+ CalDAVReportMethod reportMethod =
methodFactory.createCalDAVReportMethod();
+ reportMethod.setPath(getCalendarCollectionRoot());
+ reportMethod.setReportRequest(query);
+ try {
+ httpClient.executeMethod(getHostConfiguration(), reportMethod);
+ } catch (Exception he) {
+ throw new CalDAV4JException("Problem executing method", he);
+ }
+
+ List<String> propertyList = new ArrayList<String>();
+ Enumeration<CalDAVResponse> e = reportMethod.getResponses();
+ while (e.hasMoreElements()){
+ CalDAVResponse response = e.nextElement();
+ Calendar cal = response.getCalendar();
+ if (cal.getComponent(Component.VEVENT) != null) {
+ propertyList.add( cal.getComponent(Component.VEVENT)
+ .getProperty(propertyName).getValue() );
+ }
+// former code with cache
+// String etag = response.getETag();
+// CalDAVResource resource = getCalDAVResource(httpClient,
+// stripHost(response.getHref()), etag);
+// list.add(resource.getCalendar());
+ }
+
+ return propertyList;
+ }
+} // end of class ;)
--
Roberto Polli
Babel S.r.l. - http://www.babel.it
Tel. +39.06.91801075 - fax +39.06.91612446
P.zza S.Benedetto da Norcia, 33 - 00040 Pomezia (Roma)
"Il seguente messaggio contiene informazioni riservate. Qualora questo
messaggio fosse da Voi ricevuto per errore, Vogliate cortesemente darcene
notizia a mezzo e-mail. Vi sollecitiamo altresì a distruggere il messaggio
erroneamente ricevuto. Quanto precede Vi viene chiesto ai fini del rispetto
della legge in materia di protezione dei dati personali."
"Il seguente messaggio contiene informazioni riservate. Qualora questo messaggio fosse da Voi ricevuto per errore, Vogliate cortesemente darcene notizia mezzo e-mail. Vi sollecitiamo altresi' a distruggere il messaggo erroneamente ricevuto. Quanto precede Vi viene chiesto ai fini del rispetto della legge in materia di protezione dei dati personali."
More information about the cosmo-dev
mailing list