[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