[Bedework-commit] caldav r523 - in trunk: server/src/org/bedework/caldav/server server/src/org/bedework/caldav/server/soap server/src/org/bedework/caldav/server/soap/calws util/src/org/bedework/caldav/util/filter/parse

svnadmin at bedework.org svnadmin at bedework.org
Thu Mar 24 17:16:28 EDT 2011


Author: douglm
Date: 2011-03-24 17:16:27 -0400 (Thu, 24 Mar 2011)
New Revision: 523

Modified:
   trunk/server/src/org/bedework/caldav/server/CaldavReportMethod.java
   trunk/server/src/org/bedework/caldav/server/soap/ReportBase.java
   trunk/server/src/org/bedework/caldav/server/soap/calws/CalwsHandler.java
   trunk/util/src/org/bedework/caldav/util/filter/parse/Filters.java
Log:
CalWS SOAP query now works.

Modified: trunk/server/src/org/bedework/caldav/server/CaldavReportMethod.java
===================================================================
--- trunk/server/src/org/bedework/caldav/server/CaldavReportMethod.java	2011-03-24 04:35:05 UTC (rev 522)
+++ trunk/server/src/org/bedework/caldav/server/CaldavReportMethod.java	2011-03-24 21:16:27 UTC (rev 523)
@@ -59,11 +59,9 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.xml.namespace.QName;
 
-/** Class called to handle OPTIONS. We should determine what the current
- * url refers to and send a response which shows the allowable methods on that
- * resource.
+/** Class called to handle CalDAV REPORT.
  *
- *   @author Mike Douglass   douglm at rpi.edu
+ *   @author Mike Douglass   douglm rpi.edu
  */
 public class CaldavReportMethod extends ReportMethod {
   /* The parsed results go here. We see:
@@ -73,7 +71,16 @@
    */
 
   private FreeBusyQuery freeBusy;
-  private Filter filter;
+
+  protected static class CalendarQueryPars {
+    public Filter filter;
+    public String tzid;
+    public int depth;
+
+    public CalendarQueryPars() {}
+  }
+
+  protected CalendarQueryPars cqpars;
   private ArrayList<String> hrefs;
 
   // ENUM
@@ -202,14 +209,19 @@
       if (reportType == reportTypeQuery) {
         // Filter required next
 
+        cqpars = new CalendarQueryPars();
+
         if (!XmlUtil.nodeMatches(curnode, CaldavTags.filter)) {
           throw new WebdavBadRequest("Expected filter");
         }
 
-        // Delay parsing until we see if we have a timezone
-        Element filterNode = curnode;
-        String tzid = null;
+        cqpars.filter = Filters.parse(curnode);
 
+        if (debug) {
+          trace("REPORT: query");
+          DumpUtil.dumpFilter(cqpars.filter, getLogger());
+        }
+
         if (chiter.hasNext()) {
           // Only timezone allowed
           curnode = chiter.next();
@@ -225,16 +237,9 @@
                                                    null,
                                                    IcalResultType.TimeZone);
           Collection<TimeZone> tzs = ical.getTimeZones();
-          tzid = tzs.iterator().next().getID();
+          cqpars.tzid = tzs.iterator().next().getID();
         }
 
-        filter = Filters.parse(filterNode);
-
-        if (debug) {
-          trace("REPORT: query");
-          DumpUtil.dumpFilter(filter, getLogger());
-        }
-
         return;
       }
 
@@ -320,11 +325,13 @@
 
     String resourceUri = getResourceUri(req);
 
-    process(resourceUri, depth);
+    cqpars.depth = depth;
+
+    process(cqpars, resourceUri);
   }
 
-  protected void process(final String resourceUri,
-                         final int depth) throws WebdavException {
+  protected void process(final CalendarQueryPars cqp,
+                         final String resourceUri) throws WebdavException {
     CaldavBWIntf intf = (CaldavBWIntf)getNsIntf();
     WebdavNsNode node = intf.getNode(resourceUri,
                                      WebdavNsIntf.existanceMust,
@@ -338,7 +345,7 @@
     Collection<String> badHrefs = new ArrayList<String>();
 
     if (reportType == reportTypeQuery) {
-      nodes = doNodeAndChildren(node, 0, defaultDepth(depth, 0));
+      nodes = doNodeAndChildren(cqp, node);
     } else if (reportType == reportTypeMultiGet) {
       nodes = new ArrayList<WebdavNsNode>();
 
@@ -397,11 +404,60 @@
     flush();
   }
 
+  protected Collection<WebdavNsNode> doNodeAndChildren(final CalendarQueryPars cqp,
+                                    final WebdavNsNode node) throws WebdavException {
+    return doNodeAndChildren(cqp, node, 0, defaultDepth(cqp.depth, 0));
+  }
+
   /* ====================================================================
    *                   Private methods
    * ==================================================================== */
 
-  private Collection<WebdavNsNode> getNodes(final WebdavNsNode node)
+  private Collection<WebdavNsNode> doNodeAndChildren(final CalendarQueryPars cqp,
+                                                     final WebdavNsNode node,
+                                       int curDepth,
+                                       final int maxDepth) throws WebdavException {
+    if (debug) {
+      trace("doNodeAndChildren: curDepth=" + curDepth +
+            " maxDepth=" + maxDepth + " uri=" + node.getUri());
+    }
+
+    Collection<WebdavNsNode> nodes = new ArrayList<WebdavNsNode>();
+
+    if (node instanceof CaldavComponentNode) {
+      // Targetted directly at component
+      nodes.add(node);
+      return nodes;
+    }
+
+    if (!(node instanceof CaldavCalNode)) {
+      throw new WebdavBadRequest();
+    }
+
+    CaldavCalNode calnode = (CaldavCalNode)node;
+
+    /* TODO - should we return info about the collection?
+     * Probably if the filter allows it.
+     */
+    curDepth++;
+
+    if (curDepth > maxDepth) {
+      return nodes;
+    }
+
+    if (calnode.isCalendarCollection()) {
+      return getNodes(cqp, node);
+    }
+
+    for (WebdavNsNode child: getNsIntf().getChildren(node)) {
+      nodes.addAll(doNodeAndChildren(cqp, child, curDepth, maxDepth));
+    }
+
+    return nodes;
+  }
+
+  private Collection<WebdavNsNode> getNodes(final CalendarQueryPars cqp,
+                                            final WebdavNsNode node)
           throws WebdavException {
     if (debug) {
       trace("getNodes: " + node.getUri());
@@ -495,7 +551,7 @@
       retrieveList = null;
     }
 
-    return intf.query(node, retrieveList, rm, filter);
+    return intf.query(node, retrieveList, rm, cqp.filter);
   }
 
   private boolean addPropname(final QName tag,
@@ -508,48 +564,6 @@
     return false;
   }
 
-  private Collection<WebdavNsNode> doNodeAndChildren(final WebdavNsNode node,
-                                       int curDepth,
-                                       final int maxDepth) throws WebdavException {
-    if (debug) {
-      trace("doNodeAndChildren: curDepth=" + curDepth +
-            " maxDepth=" + maxDepth + " uri=" + node.getUri());
-    }
-
-    Collection<WebdavNsNode> nodes = new ArrayList<WebdavNsNode>();
-
-    if (node instanceof CaldavComponentNode) {
-      // Targetted directly at component
-      nodes.add(node);
-      return nodes;
-    }
-
-    if (!(node instanceof CaldavCalNode)) {
-      throw new WebdavBadRequest();
-    }
-
-    CaldavCalNode calnode = (CaldavCalNode)node;
-
-    /* TODO - should we return info about the collection?
-     * Probably if the filter allows it.
-     */
-    curDepth++;
-
-    if (curDepth > maxDepth) {
-      return nodes;
-    }
-
-    if (calnode.isCalendarCollection()) {
-      return getNodes(node);
-    }
-
-    for (WebdavNsNode child: getNsIntf().getChildren(node)) {
-      nodes.addAll(doNodeAndChildren(child, curDepth, maxDepth));
-    }
-
-    return nodes;
-  }
-
   /** Handle free/busy response
    *
    * @param req

Modified: trunk/server/src/org/bedework/caldav/server/soap/ReportBase.java
===================================================================
--- trunk/server/src/org/bedework/caldav/server/soap/ReportBase.java	2011-03-24 04:35:05 UTC (rev 522)
+++ trunk/server/src/org/bedework/caldav/server/soap/ReportBase.java	2011-03-24 21:16:27 UTC (rev 523)
@@ -23,13 +23,16 @@
 import edu.rpi.cct.webdav.servlet.common.PropFindMethod;
 import edu.rpi.cct.webdav.servlet.shared.WebdavException;
 import edu.rpi.cct.webdav.servlet.shared.WebdavNsIntf;
+import edu.rpi.cct.webdav.servlet.shared.WebdavNsNode;
 
+import org.oasis_open.docs.ns.wscal.calws_soap.CalendarQuery;
 import org.w3c.dom.Document;
 
 import ietf.params.xml.ns.icalendar_2.Icalendar;
 
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.Collection;
 
 /**
  * @author douglm
@@ -65,9 +68,9 @@
       // Set up XmlEmit so we can process the output.
       StringWriter sw = new StringWriter();
       xml.startEmit(sw);
+      cqpars.depth = 1;
 
-      process(resourceUri,
-              1);  // depth
+      process(cqpars, resourceUri);
 
       String s = sw.toString();
       return parseContent(s.length(),
@@ -79,6 +82,26 @@
     }
   }
 
+  /**
+   * @param resourceUri
+   * @param cq
+   * @return collection of nodes
+   * @throws WebdavException
+   */
+  public Collection<WebdavNsNode> query(final String resourceUri,
+                                        final CalendarQuery cq) throws WebdavException {
+    WebdavNsNode node = getNsIntf().getNode(resourceUri,
+                                            WebdavNsIntf.existanceMust,
+                                            WebdavNsIntf.nodeTypeUnknown);
+
+    CalendarQueryPars cqp = new CalendarQueryPars();
+
+    cqp.filter = cq.getFilter();
+    cqp.depth = 1;
+
+    return doNodeAndChildren(cqp, node);
+  }
+
   Icalendar fetch(final String resourceUri,
                   final String uid) throws WebdavException {
     // Build a report query and execute it.
@@ -113,8 +136,9 @@
 
     processDoc(doc);
 
-    process(resourceUri,
-            1);  // depth
+    /* ugly - cqpars is result of processDoc. Need to restructure */
+    cqpars.depth = 1;
+    process(cqpars, resourceUri);
 
     return null;
   }

Modified: trunk/server/src/org/bedework/caldav/server/soap/calws/CalwsHandler.java
===================================================================
--- trunk/server/src/org/bedework/caldav/server/soap/calws/CalwsHandler.java	2011-03-24 04:35:05 UTC (rev 522)
+++ trunk/server/src/org/bedework/caldav/server/soap/calws/CalwsHandler.java	2011-03-24 21:16:27 UTC (rev 523)
@@ -47,14 +47,20 @@
 import org.oasis_open.docs.ns.wscal.calws_soap.AddType;
 import org.oasis_open.docs.ns.wscal.calws_soap.ArrayOfUpdates;
 import org.oasis_open.docs.ns.wscal.calws_soap.BaseUpdateType;
+import org.oasis_open.docs.ns.wscal.calws_soap.CalendarDataResponseType;
+import org.oasis_open.docs.ns.wscal.calws_soap.CalendarQuery;
+import org.oasis_open.docs.ns.wscal.calws_soap.CalendarQueryResponse;
 import org.oasis_open.docs.ns.wscal.calws_soap.FetchItem;
 import org.oasis_open.docs.ns.wscal.calws_soap.FetchItemResponse;
 import org.oasis_open.docs.ns.wscal.calws_soap.FreebusyReport;
 import org.oasis_open.docs.ns.wscal.calws_soap.FreebusyReportResponse;
 import org.oasis_open.docs.ns.wscal.calws_soap.GetProperties;
 import org.oasis_open.docs.ns.wscal.calws_soap.GetPropertiesResponse;
+import org.oasis_open.docs.ns.wscal.calws_soap.MultistatResponseElementType;
+import org.oasis_open.docs.ns.wscal.calws_soap.MultistatusPropElementType;
 import org.oasis_open.docs.ns.wscal.calws_soap.NamespaceType;
 import org.oasis_open.docs.ns.wscal.calws_soap.NewValueType;
+import org.oasis_open.docs.ns.wscal.calws_soap.Propstat;
 import org.oasis_open.docs.ns.wscal.calws_soap.RemoveType;
 import org.oasis_open.docs.ns.wscal.calws_soap.StatusType;
 import org.oasis_open.docs.ns.wscal.calws_soap.UTCTimeRangeType;
@@ -153,6 +159,11 @@
         return;
       }
 
+      if (o instanceof CalendarQuery) {
+        doCalendarQuery((CalendarQuery)o, resp);
+        return;
+      }
+
       if (o instanceof AddItem) {
         doAddItem((AddItem)o, req, resp);
         return;
@@ -357,59 +368,83 @@
     }
   }
 
-  /*
-   *
-  +
-
-  private void doFreebusyReport(final FreebusyReport fr,
-                                final HttpServletResponse resp) throws WebdavException {
+  private void doCalendarQuery(final CalendarQuery cq,
+                               final HttpServletResponse resp) throws WebdavException {
     if (debug) {
-      trace("FreebusyReport: ");
+      trace("CalendarQuery: ");
     }
 
+    CalendarQueryResponse cqr = new CalendarQueryResponse();
+
     try {
-      String url = fr.getHref();
-      FreebusyReportResponse frr = new FreebusyReportResponse();
+      String url = cq.getHref();
 
       buildResponse: {
         if (url == null) {
-          frr.setStatus(StatusType.ERROR);
-          frr.setMessage("No href supplied");
+          cqr.setStatus(StatusType.ERROR);
+          cqr.setMessage("No href supplied");
           break buildResponse;
         }
 
-        String cua = getSysi().principalToCaladdr(getSysi().getPrincipal(url));
+        Report rpt = new Report(getNsIntf());
 
-        SysiIcalendar cal = getSysi().fromIcal(null,
-                                               fr.getIcalendar(),
-                                               IcalResultType.OneComponent);
+        Collection<WebdavNsNode> nodes = rpt.query(url, cq);
 
-        CalDAVEvent ev = (CalDAVEvent)cal.iterator().next();
+        if (nodes != null) {
+          for (WebdavNsNode curnode: nodes) {
+            MultistatResponseElementType mre = new MultistatResponseElementType();
 
-        Collection<SchedRecipientResult> srrs = getSysi().requestFreeBusy(ev);
-        if (srrs.size() != 1) {
-          frr.setStatus(StatusType.ERROR);
-          frr.setMessage("No data returned");
-          break buildResponse;
+            mre.setHref(curnode.getPrefixedUri());
+            mre.setEtag(curnode.getEtagValue(true));
+
+            cqr.getResponses().add(mre);
+
+            Propstat ps = new Propstat();
+
+            mre.getPropstats().add(ps);
+
+            ps.setStatus(getStatus(curnode.getStatus(), null));
+
+            if (!curnode.getExists()) {
+              continue;
+            }
+
+            if (!(curnode instanceof CaldavComponentNode)) {
+              continue;
+            }
+
+            /* For the moment always return the full calendar data. Need to
+             * implement the properties thing
+             */
+
+            MultistatusPropElementType mpe = new MultistatusPropElementType();
+
+            ps.getProps().add(mpe);
+
+            CalendarDataResponseType cdr = new CalendarDataResponseType();
+
+            mpe.setCalendarData(cdr);
+
+            CalDAVEvent ev = ((CaldavComponentNode)curnode).getEvent();
+
+            cdr.setIcalendar(getIntf().getSysi().toIcalendar(ev, false));
+            cdr.setContentType("application/xml+calendar");
+            cdr.setVersion("2.0");
+          }
         }
 
-        SchedRecipientResult srr = srrs.iterator().next();
-
-        frr.setIcalendar(getSysi().toIcalendar(srr.freeBusy, false));
-        frr.setStatus(StatusType.OK);
+        cqr.setStatus(StatusType.OK);
       } // buildResponse
 
-      marshal(frr, resp.getOutputStream());
+      marshal(cqr, resp.getOutputStream());
     } catch (WebdavException we) {
+      cqr.setStatus(StatusType.ERROR);
       throw we;
     } catch(Throwable t) {
       throw new WebdavException(t);
     }
   }
 
-  +
-   */
-
   private void doAddItem(final AddItem ai,
                          final HttpServletRequest req,
                          final HttpServletResponse resp) throws WebdavException {

Modified: trunk/util/src/org/bedework/caldav/util/filter/parse/Filters.java
===================================================================
--- trunk/util/src/org/bedework/caldav/util/filter/parse/Filters.java	2011-03-24 04:35:05 UTC (rev 522)
+++ trunk/util/src/org/bedework/caldav/util/filter/parse/Filters.java	2011-03-24 21:16:27 UTC (rev 523)
@@ -153,7 +153,7 @@
     int entityType = IcalDefs.entityTypeEvent;
 
     boolean isNotDefined = cf.getIsNotDefined() != null;
-    String name = cf.getName();
+    String name = cf.getName().toUpperCase();
 
     if (exprDepth == 0) {
       if (!"VCALENDAR".equals(name)) {



More information about the Bedework-commit mailing list