[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