[Bedework-commit] caldav r505 - in
trunk/server/src/org/bedework/caldav/server: . exsynchws
svnadmin at bedework.org
svnadmin at bedework.org
Tue Mar 1 00:51:25 EST 2011
Author: douglm
Date: 2011-03-01 00:51:22 -0500 (Tue, 01 Mar 2011)
New Revision: 505
Modified:
trunk/server/src/org/bedework/caldav/server/CaldavBWIntf.java
trunk/server/src/org/bedework/caldav/server/CaldavBwNode.java
trunk/server/src/org/bedework/caldav/server/CaldavCalNode.java
trunk/server/src/org/bedework/caldav/server/exsynchws/ExsynchwsHandler.java
Log:
Fixes to icalendar schema
Fix the exsynch schema
Small fixes to reduce number of compiler warnings
Modified: trunk/server/src/org/bedework/caldav/server/CaldavBWIntf.java
===================================================================
--- trunk/server/src/org/bedework/caldav/server/CaldavBWIntf.java 2011-03-01 05:51:13 UTC (rev 504)
+++ trunk/server/src/org/bedework/caldav/server/CaldavBWIntf.java 2011-03-01 05:51:22 UTC (rev 505)
@@ -78,6 +78,9 @@
import edu.rpi.sss.util.xml.tagdefs.XrdTags;
import edu.rpi.sss.util.xml.tagdefs.XsiTags;
+import org.oasis_open.docs.ns.xri.xrd_1.AnyURI;
+import org.oasis_open.docs.ns.xri.xrd_1.Link;
+import org.oasis_open.docs.ns.xri.xrd_1.XRD;
import org.w3c.dom.Element;
import ietf.params.xml.ns.icalendar_2.Icalendar;
@@ -99,6 +102,8 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
/** This class implements a namespace interface for the webdav abstract
@@ -1101,17 +1106,17 @@
resp.setContentType("application/xrd+xml; charset=UTF-8");
try {
- xml.addNs(new NameSpace(XrdTags.namespace, "xrd"), true);
+ XRD xrd = new XRD();
- xml.startEmit(resp.getWriter());
+ AnyURI uri = new AnyURI();
- xml.openTag(XrdTags.xrd);
+ uri.setValue(node.getUrlValue());
+ xrd.setSubject(uri);
- xml.property(XrdTags.subject, node.getUrlValue());
-
for (PropertyTagXrdEntry pxe: node.getXrdNames()) {
if (pxe.inPropAll) {
- node.generateXrdValue(pxe.xrdName, this, true);
+ node.generateXrdProperties(xrd.getAliasAndPropertiesAndLinks(),
+ pxe.xrdName, this, true);
}
}
@@ -1121,27 +1126,24 @@
for (WebdavNsNode child: getChildren(node)) {
CaldavBwNode cn = (CaldavBwNode)child;
- xml.startTagIndent(XrdTags.link);
- xml.attribute("rel", CalWSXrdDefs.childCollection);
- xml.newline();
- xml.value(" "); // Just to indent
- xml.attribute("href", cn.getUrlValue());
- xml.endOpeningTag();
- xml.newline();
+ Link l = new Link();
+ l.setRel(CalWSXrdDefs.childCollection);
+ l.setHref(cn.getUrlValue());
for (PropertyTagXrdEntry pxe: node.getXrdNames()) {
if (pxe.inLink) {
- cn.generateXrdValue(pxe.xrdName, this, true);
+ cn.generateXrdProperties(l.getTitlesAndPropertiesAndAnies(),
+ pxe.xrdName, this, true);
}
}
-
- xml.closeTag(XrdTags.link);
}
}
- xml.closeTag(XrdTags.xrd);
+ JAXBContext jc = JAXBContext.newInstance(XrdTags.namespace);
- xml.flush();
+ Marshaller m = jc.createMarshaller();
+ m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+ m.marshal(xrd, resp.getOutputStream());
Content c = new Content();
Modified: trunk/server/src/org/bedework/caldav/server/CaldavBwNode.java
===================================================================
--- trunk/server/src/org/bedework/caldav/server/CaldavBwNode.java 2011-03-01 05:51:13 UTC (rev 504)
+++ trunk/server/src/org/bedework/caldav/server/CaldavBwNode.java 2011-03-01 05:51:22 UTC (rev 505)
@@ -32,17 +32,18 @@
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 edu.rpi.sss.util.xml.XmlEmit;
import edu.rpi.sss.util.xml.tagdefs.CalWSXrdDefs;
import edu.rpi.sss.util.xml.tagdefs.CaldavTags;
import edu.rpi.sss.util.xml.tagdefs.XrdTags;
-import edu.rpi.sss.util.xml.tagdefs.XsiTags;
-import java.io.IOException;
+import org.oasis_open.docs.ns.xri.xrd_1.PropertyType;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
/** Class to represent a caldav node.
@@ -237,17 +238,17 @@
}
/**
+ * @param props
* @param name
* @param intf
* @param allProp
- * @return true if proeprty emiited
+ * @return true if proeprty emitted
* @throws WebdavException
*/
- public boolean generateXrdValue(final String name,
- final WebdavNsIntf intf,
- final boolean allProp) throws WebdavException {
- XmlEmit xml = intf.getXmlEmit();
-
+ public boolean generateXrdProperties(final List<Object> props,
+ final String name,
+ final WebdavNsIntf intf,
+ final boolean allProp) throws WebdavException {
try {
if (name.equals(CalWSXrdDefs.created)) {
String val = getCreDate();
@@ -255,7 +256,7 @@
return true;
}
- xrdProperty(xml, name, val);
+ props.add(xrdProperty(name, val));
return true;
}
@@ -265,7 +266,7 @@
return true;
}
- xrdProperty(xml, name, val);
+ props.add(xrdProperty(name, val));
return true;
}
@@ -275,7 +276,7 @@
return true;
}
- xrdProperty(xml, name, val);
+ props.add(xrdProperty(name, val));
return true;
}
@@ -284,7 +285,7 @@
if (!href.endsWith("/")) {
href += "/";
}
- xrdProperty(xml, name, href);
+ props.add(xrdProperty(name, href));
return true;
}
@@ -310,28 +311,22 @@
return xrdNames.values();
}
- protected void xrdProperty(final XmlEmit xml, final String name,
- final String val) throws WebdavException {
- try {
- xml.openTagNoNewline(XrdTags.property, "type", name);
- xml.value(val);
- xml.closeTagNoblanks(XrdTags.property);
- } catch (IOException ioe) {
- throw new WebdavException(ioe);
- }
+ @SuppressWarnings("unchecked")
+ protected JAXBElement<PropertyType> xrdProperty(final String name,
+ final String val) throws WebdavException {
+ PropertyType p = new PropertyType();
+ p.setType(name);
+ p.setValue(val);
+
+ return new JAXBElement(XrdTags.property, PropertyType.class, p);
}
- protected void xrdEmptyProperty(final XmlEmit xml,
- final String name) throws WebdavException {
- try {
- xml.startTag(XrdTags.property);
- xml.attribute("type", name);
- xml.attribute(XsiTags.nil, "true");
- xml.endEmptyTag();
- xml.newline();
- } catch (IOException ioe) {
- throw new WebdavException(ioe);
- }
+ @SuppressWarnings("unchecked")
+ protected JAXBElement<PropertyType> xrdEmptyProperty(final String name) throws WebdavException {
+ PropertyType p = new PropertyType();
+ p.setType(name);
+
+ return new JAXBElement(XrdTags.property, PropertyType.class, p);
}
/**
Modified: trunk/server/src/org/bedework/caldav/server/CaldavCalNode.java
===================================================================
--- trunk/server/src/org/bedework/caldav/server/CaldavCalNode.java 2011-03-01 05:51:13 UTC (rev 504)
+++ trunk/server/src/org/bedework/caldav/server/CaldavCalNode.java 2011-03-01 05:51:22 UTC (rev 505)
@@ -53,6 +53,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.xml.namespace.QName;
@@ -855,11 +856,10 @@
}
@Override
- public boolean generateXrdValue(final String name,
- final WebdavNsIntf intf,
- final boolean allProp) throws WebdavException {
- XmlEmit xml = intf.getXmlEmit();
-
+ public boolean generateXrdProperties(final List<Object> props,
+ final String name,
+ final WebdavNsIntf intf,
+ final boolean allProp) throws WebdavException {
try {
int calType;
CalDAVCollection c = (CalDAVCollection)getCollection(true); // deref this
@@ -871,16 +871,16 @@
}
if (name.equals(CalWSXrdDefs.collection)) {
- xrdEmptyProperty(xml, name);
+ props.add(xrdEmptyProperty(name));
//boolean isCollection = cal.getCalendarCollection();
if (calType == CalDAVCollection.calTypeInbox) {
- xrdEmptyProperty(xml, CalWSXrdDefs.inbox);
+ props.add(xrdEmptyProperty(CalWSXrdDefs.inbox));
} else if (calType == CalDAVCollection.calTypeOutbox) {
- xrdEmptyProperty(xml, CalWSXrdDefs.outbox);
+ props.add(xrdEmptyProperty(CalWSXrdDefs.outbox));
} else if (calType == CalDAVCollection.calTypeCalendarCollection) {
- xrdEmptyProperty(xml, CalWSXrdDefs.calendarCollection);
+ props.add(xrdEmptyProperty(CalWSXrdDefs.calendarCollection));
}
return true;
@@ -893,7 +893,7 @@
return true;
}
- xrdProperty(xml, name, s);
+ props.add(xrdProperty(name, s));
return true;
}
@@ -909,7 +909,8 @@
return true;
}
- xrdProperty(xml, name, getUrlValue(cinfo.userHomePath, true));
+ props.add(xrdProperty(name,
+ getUrlValue(cinfo.userHomePath, true)));
return true;
}
@@ -925,7 +926,8 @@
return true;
}
- xrdProperty(xml, name, String.valueOf(val));
+ props.add(xrdProperty(name,
+ String.valueOf(val)));
return true;
}
@@ -941,7 +943,8 @@
return false;
}
- xrdProperty(xml, name, String.valueOf(val));
+ props.add(xrdProperty(name,
+ String.valueOf(val)));
return true;
}
@@ -957,7 +960,8 @@
return false;
}
- xrdProperty(xml, name, String.valueOf(val));
+ props.add(xrdProperty(name,
+ String.valueOf(val)));
return true;
}
@@ -973,7 +977,8 @@
return false;
}
- xrdProperty(xml, name, String.valueOf(val));
+ props.add(xrdProperty(name,
+ String.valueOf(val)));
return true;
}
@@ -989,7 +994,7 @@
return false;
}
- xrdProperty(xml, name, val);
+ props.add(xrdProperty(name, val));
return true;
}
@@ -1001,13 +1006,13 @@
return false;
}
- xrdProperty(xml, name, tzid);
+ props.add(xrdProperty(name, tzid));
return true;
}
// Not known - try higher
- return super.generateXrdValue(name, intf, allProp);
+ return super.generateXrdProperties(props, name, intf, allProp);
} catch (WebdavException wde) {
throw wde;
} catch (Throwable t) {
Modified: trunk/server/src/org/bedework/caldav/server/exsynchws/ExsynchwsHandler.java
===================================================================
--- trunk/server/src/org/bedework/caldav/server/exsynchws/ExsynchwsHandler.java 2011-03-01 05:51:13 UTC (rev 504)
+++ trunk/server/src/org/bedework/caldav/server/exsynchws/ExsynchwsHandler.java 2011-03-01 05:51:22 UTC (rev 505)
@@ -25,19 +25,26 @@
*/
package org.bedework.caldav.server.exsynchws;
+import org.bedework.caldav.server.CalDAVCollection;
import org.bedework.caldav.server.CalDAVEvent;
import org.bedework.caldav.server.CaldavBWIntf;
import org.bedework.caldav.server.CaldavComponentNode;
+import org.bedework.caldav.server.SysiIcalendar;
import org.bedework.caldav.server.PostMethod.RequestPars;
import org.bedework.caldav.server.sysinterface.SysIntf;
+import org.bedework.caldav.server.sysinterface.SysIntf.IcalResultType;
import org.bedework.exsynch.wsmessages.AddItem;
import org.bedework.exsynch.wsmessages.AddItemResponse;
+import org.bedework.exsynch.wsmessages.AddType;
import org.bedework.exsynch.wsmessages.ArrayOfUpdates;
+import org.bedework.exsynch.wsmessages.BaseUpdateType;
import org.bedework.exsynch.wsmessages.FetchItem;
import org.bedework.exsynch.wsmessages.FetchItemResponse;
import org.bedework.exsynch.wsmessages.GetSycnchInfo;
import org.bedework.exsynch.wsmessages.NamespaceType;
+import org.bedework.exsynch.wsmessages.NewValueType;
import org.bedework.exsynch.wsmessages.ObjectFactory;
+import org.bedework.exsynch.wsmessages.RemoveType;
import org.bedework.exsynch.wsmessages.StartServiceNotification;
import org.bedework.exsynch.wsmessages.StartServiceResponse;
import org.bedework.exsynch.wsmessages.StatusType;
@@ -52,12 +59,14 @@
import edu.rpi.cct.webdav.servlet.shared.WebdavNsIntf;
import edu.rpi.cct.webdav.servlet.shared.WebdavNsNode;
import edu.rpi.sss.util.xml.NsContext;
+import edu.rpi.sss.util.xml.XmlUtil;
import edu.rpi.sss.util.xml.tagdefs.XcalTags;
import org.w3c.dom.Document;
+import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import ietf.params.xml.ns.pidf_diff.BaseUpdateType;
+import ietf.params.xml.ns.icalendar_2.Icalendar;
import java.io.OutputStream;
import java.util.List;
@@ -69,6 +78,7 @@
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
@@ -472,7 +482,8 @@
return;
}
- CalDAVEvent ev = ((CaldavComponentNode)elNode).getEvent();
+ CaldavComponentNode compNode = (CaldavComponentNode)elNode;
+ CalDAVEvent ev = compNode.getEvent();
if (debug) {
trace("event: " + ev);
@@ -495,6 +506,8 @@
xpath.setNamespaceContext(ctx);
+ uir.setStatus(StatusType.OK);
+
try {
for (JAXBElement<? extends BaseUpdateType> jel: aupd.getBaseUpdates()) {
BaseUpdateType but = jel.getValue();
@@ -503,13 +516,58 @@
NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
+ int nlen = nodes.getLength();
if (debug) {
- trace("expr: " + but.getSel() + " found " + nodes.getLength());
+ trace("expr: " + but.getSel() + " found " + nlen);
}
+
+ if (nlen != 1) {
+ // We only allow updates to a single node.
+ uir.setStatus(StatusType.ERROR);
+ getIntf().getSysi().rollback();
+ break;
+ }
+
+ Node nd = nodes.item(0);
+
+ if (but instanceof RemoveType) {
+ removeNode(nd);
+ continue;
+ }
+
+ NewValueType nv = (NewValueType)but;
+
+ /* Replacement or new value must be of same type
+ */
+ if (!processNewValue(nv, nd, doc)) {
+ uir.setStatus(StatusType.ERROR);
+ getIntf().getSysi().rollback();
+ break;
+ }
}
- uir.setStatus(StatusType.OK);
+ if (uir.getStatus() == StatusType.OK) {
+ Unmarshaller u = jc.createUnmarshaller();
+ Icalendar ical = (Icalendar)u.unmarshal(doc);
+
+ // WebdavNsNode calNode = getNsIntf().getNode(ui.getCalendarHref(),
+ // WebdavNsIntf.existanceMust,
+ // WebdavNsIntf.nodeTypeCollection);
+ CalDAVCollection col = (CalDAVCollection)compNode.getCollection(true); // deref
+
+ SysiIcalendar cal = getIntf().getSysi().fromIcal(col,
+ ical,
+ IcalResultType.OneComponent);
+
+ CalDAVEvent newEv = (CalDAVEvent)cal.iterator().next();
+
+ ev.setParentPath(col.getPath());
+ newEv.setName(ev.getName());
+
+ getIntf().getSysi().updateEvent(newEv);
+ }
+
marshal(uir, resp.getOutputStream());
} catch (XPathExpressionException xpe) {
throw new WebdavException(xpe);
@@ -519,4 +577,84 @@
throw new WebdavException(t);
}
}
+
+ private void removeNode(final Node nd) throws WebdavException {
+ Node parent = nd.getParentNode();
+
+ parent.removeChild(nd);
+ }
+
+ private boolean processNewValue(final NewValueType nv,
+ final Node nd,
+ final Document evDoc) throws WebdavException {
+ Node parent = nd.getParentNode();
+ Node matchNode;
+
+ boolean add = nv instanceof AddType;
+ QName valName;
+
+ if (add) {
+ matchNode = nd;
+ valName = new QName("urn:ietf:params:xml:ns:pidf-diff", "add");
+ } else {
+ matchNode = parent;
+ valName = new QName("urn:ietf:params:xml:ns:pidf-diff", "replace");
+ }
+
+ validate: {
+ if (nv.getBaseComponent() != null) {
+ // parent must be a components element
+ if (!XmlUtil.nodeMatches(matchNode, XcalTags.components)) {
+ return false;
+ }
+
+ break validate;
+ }
+
+ if (nv.getBaseProperty() != null) {
+ // parent must be a properties element
+ if (!XmlUtil.nodeMatches(matchNode, XcalTags.properties)) {
+ return false;
+ }
+ break validate;
+ }
+
+ if (nv.getBaseParameter() != null) {
+ // parent must be a parameters element
+ if (!XmlUtil.nodeMatches(matchNode, XcalTags.parameters)) {
+ return false;
+ }
+ break validate;
+ }
+
+ return false;
+ } // validate
+
+ try {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document doc = db.newDocument();
+
+ Marshaller m = jc.createMarshaller();
+
+ m.marshal(new JAXBElement(valName,
+ nv.getClass(), nv),
+ doc);
+
+ Node newNode = doc.getFirstChild().getFirstChild();
+
+ if (add) {
+ matchNode.appendChild(evDoc.importNode(newNode, true));
+
+ return true;
+ }
+
+ parent.replaceChild(evDoc.importNode(newNode, true), nd);
+
+ return true;
+ } catch (Throwable t) {
+ throw new WebdavException(t);
+ }
+ }
}
More information about the Bedework-commit
mailing list