[Commits] (pavlov) cleanup of webdav code... you can put itemcollections now...

commits at osafoundation.org commits at osafoundation.org
Mon Jul 12 12:13:01 PDT 2004


Commit by: pavlov
Modified files:
chandler/parcels/osaf/framework/webdav/DAVItem.py None 1.1
chandler/parcels/osaf/framework/webdav/parcel.xml None 1.1
chandler/parcels/osaf/framework/webdav/Dav.py 1.1 1.2
chandler/parcels/osaf/framework/webdav/Export.py 1.1 1.2
chandler/parcels/osaf/framework/webdav/Import.py 1.1 1.2

Log message:
cleanup of webdav code... you can put itemcollections now...


ViewCVS links:
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/webdav/DAVItem.py?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/webdav/parcel.xml?rev=1.1&content-type=text/vnd.viewcvs-markup
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/webdav/Dav.py.diff?r1=text&tr1=1.1&r2=text&tr2=1.2
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/webdav/Export.py.diff?r1=text&tr1=1.1&r2=text&tr2=1.2
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/webdav/Import.py.diff?r1=text&tr1=1.1&r2=text&tr2=1.2

Index: chandler/parcels/osaf/framework/webdav/Dav.py
diff -u chandler/parcels/osaf/framework/webdav/Dav.py:1.1 chandler/parcels/osaf/framework/webdav/Dav.py:1.2
--- chandler/parcels/osaf/framework/webdav/Dav.py:1.1	Mon Jun 28 13:03:20 2004
+++ chandler/parcels/osaf/framework/webdav/Dav.py	Mon Jul 12 12:13:00 2004
@@ -1,21 +1,23 @@
 import davlib
-import httplib
-import xml.sax.saxutils
-import libxml2
 
 from repository.item.Item import Item
+from repository.util.URL import URL
 
 import Import, Export
 
-# WebDAVServer APIs
-
 class DAV(object):
     def __init__(self, resourceURL):
         super(DAV, self).__init__()
+        if isinstance(resourceURL, basestring):
+            resourceURL = URL(resourceURL)
+
+        if not isinstance(resourceURL, URL):
+            raise TypeError
+
         self.url = resourceURL
 
     def newConnection(self):
-        return DavConnection(self.url)
+        return DAVConnection(self.url)
 
     # importing
     def get(self):
@@ -26,7 +28,7 @@
         """ gives back a new ItemCollection """
         # figure out properties of the collection itself.. I should share code
         # with Import.py here..
-        # get a listing of all items in the collection... propfind?
+        # get a listing of all items in the collection... propfind depth 1
 
         # make a new ItemCollection based on the properties of the dav
         # collection
@@ -37,7 +39,7 @@
 
     # exporting
     def put(self, item):
-        Export.DAVExport(self, item)
+        Export.putItem(self, item)
 
     def putCollection(self, itemCollection):
         """
@@ -47,18 +49,24 @@
         # XXX the following code probably belongs in Export.py
 
         # make new dir for the collection, get its base url
-        collectionURL = self.url.join(itemCollection.itsUUID.str16())
+        collectionURL = self.url.join(itemCollection.itsUUID.str16() + '/')
 
         r = DAV(collectionURL).newConnection().mkcol(collectionURL.path)
-        # parse response..
+        print collectionURL, collectionURL.path
+        # XXX parse response..
         # set attributes on the collection
 
         for item in itemCollection:
-            itemURL = self.url.join(item.itsUUID.str16())
+            itemURL = collectionURL.join(item.itsUUID.str16())
             DAV(itemURL).put(item)
 
+        return collectionURL
+
+    def sync(self):
+        raise NotImplementedError
+
 
-class DavConnection(davlib.DAV):
+class DAVConnection(davlib.DAV):
     def __init__(self, url):
         host = url.host
         port = url.port or 80

Index: chandler/parcels/osaf/framework/webdav/Import.py
diff -u chandler/parcels/osaf/framework/webdav/Import.py:1.1 chandler/parcels/osaf/framework/webdav/Import.py:1.2
--- chandler/parcels/osaf/framework/webdav/Import.py:1.1	Mon Jun 28 13:03:20 2004
+++ chandler/parcels/osaf/framework/webdav/Import.py	Mon Jul 12 12:13:00 2004
@@ -1,78 +1,18 @@
 import application.Globals as Globals
 
 import davlib
-import httplib
 import libxml2
 
-itemMap = {}
-
-class BadItem(Exception):
-    pass
-
-class DAVItem(object):
-    """ utility class that represents an item from a webdav server """
-    def __init__(self, dav):
-        super(DAVItem, self).__init__()
-
-        self.dav = dav
-
-        self.doc = self._allprop(unicode(dav.url))
-
-    def _allprop(self, url, depth = 0):
-        """ Fetch all the properties of a resource """
-        body = davlib.XML_DOC_HEADER + \
-               '<D:propfind xmlns:D="DAV:">' + \
-               '<D:allprop/>' + \
-               '</D:propfind>'
-
-        r = self.dav.newConnection().propfind(url, body, depth)
-
-        xmlgoop = r.read()
-        print url
-        print xmlgoop
-
-        doc = libxml2.parseDoc(xmlgoop)
-
-        return doc
+import DAVItem as DAVItem
 
-    def getKind(self):
-        value = self._getAttribute('kind', '//core')
-        if not value:
-            raise BadItem, 'Unable to find a kind at %s' % (self.dav.url)
-
-        return Globals.repository.findPath(value)
-
-    def getUUID(self):
-        value = self._getAttribute('uuid', '//core')
-        if not value:
-            raise BadItem, 'Unable to find a uuid at %s' % (self.dav.url)
-
-        from repository.util.UUID import UUID
-        return UUID(value)
-
-    def getAttribute(self, attr):
-        """ takes an Attribute argument """
-        attrname = attr.itsName
-        
-        attrns = str(attr.itsPath[0:-1])
-        return self._getAttribute(attrname, attrns)
-
-    def _getAttribute(self, attr, attrns):
-        ctxt = self.doc.xpathNewContext()
-        ctxt.xpathRegisterNs('D', 'DAV:')
-        ctxt.xpathRegisterNs('O', attrns)
-
-        xp = '/D:multistatus/D:response/D:propstat/D:prop/O:' + attr
-        try:
-            node = ctxt.xpathEval(xp)[0]
-        except IndexError:
-            return None
-
-        # Do I need to free the context?
-        return node.content
+from repository.schema.Kind import Kind
 
+itemMap = {}
 
 def makeAndParse(xml):
+    # given a chunk of text that is a flat xml tree like:
+    # "<foo/><foo/><foo/>"
+    # parse it and return a list of the nodes
     xmlgoop = davlib.XML_DOC_HEADER + \
               '<doc>' + \
               xml + \
@@ -85,29 +25,25 @@
 
 def getItem(dav):
     from Dav import DAV
-    from repository.util.URL import URL
     global itemMap
     repository = Globals.repository
 
     # fetch the item
-    di = DAVItem(dav)
+    di = DAVItem.DAVItem(dav)
 
     # pretend here we don't care if the item has changed..
     try:
         # get the exported item's UUID and see if we have already fetched it
-        oldUUID = di.getUUID()
-        return repository.findUUID(itemMap[oldUUID])
+        origUUID = di.itsUUID
+        return repository.findUUID(itemMap[origUUID])
     except KeyError:
         pass
 
-    # ugh
-    kindType = type(repository.findPath('//Schema/Core/Kind'))
-
-    kind = di.getKind()
+    kind = di.itsKind
     newItem = kind.newItem(None, repository.findPath('//userdata/zaobaoitems'))
 
     # XXX hack...
-    itemMap[oldUUID] = newItem.itsUUID.str16()
+    itemMap[origUUID] = newItem.itsUUID
 
     for (name, attr) in kind.iterAttributes(True):
 
@@ -117,20 +53,18 @@
 
         print 'Getting:', name, '(' + attr.type.itsName + ')'
 
-        if type(attr.type) == kindType:
-            if len(value) < 5: # skip things that are shorter than <a/>
-                continue
-
+        #if type(attr.type) == kindType:
+        if isinstance(attr.type, Kind):
             # time for some xml parsing! yum!
             nodes = makeAndParse(value)
 
             if attr.cardinality == 'list':
                 for node in nodes:
-                    otherItem = DAV(URL(node.content)).get()
+                    otherItem = DAV(node.content).get()
                     newItem.addValue(name, otherItem)
             elif attr.cardinality == 'single':
                 node = nodes[0]
-                otherItem = findOtherItem(node.content)
+                otherItem = DAV(node.content).get()
                 newItem.setAttributeValue(name, otherItem)
             else:
                 raise Exception

Index: chandler/parcels/osaf/framework/webdav/Export.py
diff -u chandler/parcels/osaf/framework/webdav/Export.py:1.1 chandler/parcels/osaf/framework/webdav/Export.py:1.2
--- chandler/parcels/osaf/framework/webdav/Export.py:1.1	Mon Jun 28 13:03:20 2004
+++ chandler/parcels/osaf/framework/webdav/Export.py	Mon Jul 12 12:13:00 2004
@@ -5,93 +5,82 @@
 
 from repository.item.Item import Item
 
-class DAVExport(object):
-    def __init__(self, dav, item):
-        super(DAVExport, self).__init__()
-
-        self.dav = dav
-
-        if hasattr(item, 'davified'):
-            return
-
-        self.convert(item)
-
-    def parseResponse(self, response):
-        """ figure out what the HTTP status was in a multistatus response """
-        doc = libxml2.parseDoc(response)
-
-        ctxt = doc.xpathNewContext()
-        ctxt.xpathRegisterNs('D', 'DAV:')
-        xp = '/D:multistatus/D:response/D:propstat/D:status'
-        try:
-            node = ctxt.xpathEval(xp)[0]
-        except IndexError:
-            return None
-
-        return node.content
-
-    def convert(self, item):
-        from Dav import DAV
-
-        item.davified = True
-        
-        url = unicode(self.dav.url)
-
-        r = self.dav.newConnection().put(url, item.itsKind.itsName, 'text/plain')
-
-        kind = item.itsKind
-
-        kns = kind.itsPath[0:-1]
-        propstring = '<osaf:kind xmlns:osaf="//core">%s</osaf:kind><osaf:uuid xmlns:osaf="//core">%s</osaf:uuid>' % (kind.itsPath, item.itsUUID.str16())
-        r = self.dav.newConnection().setprops2(url, propstring)
-        print url, r.status, r.reason
-        print r.read()
-
-        for (name, value) in item.iterAttributeValues():
-            data = ''
-
-            itemType = type(item.getRepositoryView().findPath('//userdata'))
-
-            # the attribute's namespace is its path...
-            namespace = kind.getAttribute(name).itsPath[0:-1]
-
-            atype = item.getAttributeAspect(name, 'type')
-            acard = item.getAttributeAspect(name, 'cardinality')
-            if acard == 'list':
-                # mmm, recursion
-                data = '<osaf:%s xmlns:osaf="%s"><![CDATA[' % (name, namespace)
-                for i in value:
-                    if isinstance(i, itemType):
-                        durl = self.dav.url.join(i.itsUUID.str16())
-                        DAV(durl).put(i)
-
-                        data = data + '<itemref>' + unicode(durl) + '</itemref>'
-                    else:
-                        pass
-                data = data + ']]></osaf:%s>' % (name)
-            else:
-                if isinstance(value, itemType):
-                    durl = self.dav.url.join(i.itsUUID.str16())
+def parseResponse(response):
+    """ figure out what the HTTP status was in a multistatus response """
+    doc = libxml2.parseDoc(response)
+
+    ctxt = doc.xpathNewContext()
+    ctxt.xpathRegisterNs('D', 'DAV:')
+    xp = '/D:multistatus/D:response/D:propstat/D:status'
+    try:
+        node = ctxt.xpathEval(xp)[0]
+    except IndexError:
+        return None
+
+    return node.content
+
+def putItem(dav, item):
+    from Dav import DAV
+
+    # hack to avoid infinite recursion
+    if hasattr(item, 'davified'):
+        return
+    item.davified = True
+
+    url = unicode(dav.url)
+
+    r = dav.newConnection().put(url, item.itsKind.itsName, 'text/plain')
+
+    kind = item.itsKind
+
+    propstring = '<osaf:kind xmlns:osaf="//core">%s</osaf:kind><osaf:uuid xmlns:osaf="//core">%s</osaf:uuid>' % (kind.itsPath, item.itsUUID.str16())
+    r = dav.newConnection().setprops2(url, propstring)
+    print url, r.status, r.reason
+    print r.read()
+
+    for (name, value) in item.iterAttributeValues():
+        data = ''
+
+        # the attribute's namespace is its path...
+        namespace = kind.getAttribute(name).itsPath[0:-1]
+
+        atype = item.getAttributeAspect(name, 'type')
+        acard = item.getAttributeAspect(name, 'cardinality')
+        if acard == 'list':
+            # mmm, recursion
+            data = '<osaf:%s xmlns:osaf="%s"><![CDATA[' % (name, namespace)
+            for i in value:
+                if isinstance(i, Item):
+                    durl = dav.url.join(i.itsUUID.str16())
                     DAV(durl).put(i)
 
-                    data = '<osaf:%s xmlns:osaf="%s"><![CDATA[<itemref>%s</itemref>]]></osaf:%s>' % (name, namespace, unicode(durl), name)
+                    data = data + '<itemref>' + unicode(durl) + '</itemref>'
                 else:
-                    atypepath = "%s" % (atype.itsPath)
-                    value = atype.makeString(value)
-                    data = '<osaf:%s xmlns:osaf="%s"><![CDATA[%s]]></osaf:%s>' % (name, namespace, value, name)
-
-            propstring = propstring + data
-            #print name, r.status, r.reason
-            #r = dc().setprops2(url, str)
-            #xmlgoop = r.read()
-            #if self.parseResponse(xmlgoop) != 'HTTP/1.1 200 OK':
-            #    print url, r.status, r.reason
-            #    print str
-            #    print xmlgoop
-
-        r = self.dav.newConnection().setprops2(url, propstring)
-        print url, r.status, r.reason
-        print r.read()
+                    pass
+                data = data + ']]></osaf:%s>' % (name)
+        else:
+            if isinstance(value, Item):
+                durl = dav.url.join(i.itsUUID.str16())
+                DAV(durl).put(i)
+
+                data = '<osaf:%s xmlns:osaf="%s"><![CDATA[<itemref>%s</itemref>]]></osaf:%s>' % (name, namespace, unicode(durl), name)
+            else:
+                atypepath = "%s" % (atype.itsPath)
+                value = atype.makeString(value)
+                data = '<osaf:%s xmlns:osaf="%s"><![CDATA[%s]]></osaf:%s>' % (name, namespace, value, name)
+
+        propstring = propstring + data
+        #print name, r.status, r.reason
+        #r = dc().setprops2(url, str)
+        #xmlgoop = r.read()
+        #if self.parseResponse(xmlgoop) != 'HTTP/1.1 200 OK':
+        #    print url, r.status, r.reason
+        #    print str
+        #    print xmlgoop
+
+    r = dav.newConnection().setprops2(url, propstring)
+    print url, r.status, r.reason
+    print r.read()
 
-        return url
-        #print propstring
+    return url
+    #print propstring



More information about the Commits mailing list