[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