upload of resources from loops.agent via HTTP PUT basically working

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1955 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-08-23 16:27:03 +00:00
parent a689fb09bb
commit 57a5f126b5
4 changed files with 43 additions and 24 deletions

View file

@ -35,8 +35,8 @@ We are now ready to schedule the job and let the reactor execute it.
>>> startTime = scheduler.schedule(crawlJob) >>> startTime = scheduler.schedule(crawlJob)
>>> tester.iterate() >>> tester.iterate()
Metadata: {'path': '...data...file1.txt'}
Transferring: Data from file1.txt
Metadata: {'path': '...data...subdir...file2.txt'} Metadata: {'path': '...data...subdir...file2.txt'}
Transferring: Data from file2.txt Transferring: Data from file2.txt
Metadata: {'path': '...data...file1.txt'}
Transferring: Data from file1.txt

View file

@ -24,7 +24,7 @@ $Id$
from base64 import b64encode from base64 import b64encode
from twisted.internet import reactor from twisted.internet import reactor
from twisted.internet.defer import Deferred, DeferredList, fail from twisted.internet.defer import Deferred, fail
from twisted.web.client import getPage from twisted.web.client import getPage
from zope.interface import implements from zope.interface import implements
@ -39,26 +39,36 @@ class TransportJob(Job):
def __init__(self, transporter): def __init__(self, transporter):
super(TransportJob, self).__init__() super(TransportJob, self).__init__()
self.transporter = transporter self.transporter = transporter
self.resources = []
self.deferred = None
def execute(self): def execute(self):
result = self.params.get('result') result = self.params.get('result')
if result is None: if result is None:
return fail('No data available.') return fail('No data available.')
transfers = [] self.resources = result
for resource in result: self.deferred = Deferred()
d = self.transporter.transfer(resource) d = self.transporter.transfer(self.resources.pop())
transfers.append(d) d.addCallback(self.transferDone).addErrback(self.logError)
d.addCallback(self.logTransfer) return self.deferred
d.addErrback(self.logError)
return DeferredList(transfers) def transferDone(self, result):
self.logTransfer(result)
if self.resources:
d = self.transporter.transfer(self.resources.pop())
d.addCallback(self.transferDone).addErrback(self.logError)
else:
self.deferred.callback('OK')
def logTransfer(self, result, err=None): def logTransfer(self, result, err=None):
#print 'transfer successful; remaining:', len(self.resources)
# TODO: logging # TODO: logging
# self.transporter.agent.logger.log(...) # self.transporter.agent.logger.log(...)
pass pass
def logError(self, error): def logError(self, error):
print '*** error on transfer', self.transporter.serverURL, error print '*** error on transfer', self.transporter.serverURL, error
self.deferred.errback(error)
class Transporter(object): class Transporter(object):
@ -77,6 +87,7 @@ class Transporter(object):
self.agent = agent self.agent = agent
for k, v in params.items(): for k, v in params.items():
setattr(self, k ,v) setattr(self, k ,v)
self.deferred = None
def createJob(self): def createJob(self):
return self.jobFactory(self) return self.jobFactory(self)
@ -88,22 +99,27 @@ class Transporter(object):
data.close() data.close()
else: else:
text = data text = data
# TODO: encode text (?)
# TODO: set headers: Content-Type, Authorization, User-Agent
path = resource.path path = resource.path
app = resource.application app = resource.application
deferreds = []
metadata = resource.metadata metadata = resource.metadata
auth = b64encode(':'.join((self.userName, self.password))) auth = b64encode(self.userName + ':' + self.password)
headers = {'Authorization': 'Basic ' + auth} headers = {'Authorization': 'Basic ' + auth}
if metadata is not None:
url = self.makePath('.meta', app, path, 'xml')
deferreds.append(getPage(url, method=self.method, headers=headers,
postdata=metadata.asXML()))
url = self.makePath('.data', app, path) url = self.makePath('.data', app, path)
deferreds.append(getPage(url, method=self.method, headers=headers, d = getPage(url, method=self.method, headers=headers, postdata=text)
postdata=text)) if metadata is None:
return DeferredList(deferreds, fireOnOneErrback=True) d.addCallback(self.finished)
else:
d.addCallback(self.transferMeta, app, path, headers, metadata.asXML())
self.deferred = Deferred()
return self.deferred
def transferMeta(self, result, app, path, headers, text):
url = self.makePath('.meta', app, path)
d = getPage(url, method=self.method, headers=headers, postdata=text)
d.addCallback(self.finished)
def finished(self, result):
self.deferred.callback(result)
def makePath(self, infoType, app, path, extension=None): def makePath(self, infoType, app, path, extension=None):
if path.startswith('/'): if path.startswith('/'):

View file

@ -99,9 +99,9 @@ class ResourceManagerTraverser(ItemTraverser):
obj.contentType = contentType obj.contentType = contentType
obj.title = title obj.title = title
#obj.data = data #obj.data = data
notify(ObjectModifiedEvent(resource))
# TODO: provide basic concept assignments (collections) # TODO: provide basic concept assignments (collections)
IExternalSourceInfo(resource).externalIdentifier == identifier IExternalSourceInfo(resource).externalIdentifier = identifier
notify(ObjectCreatedEvent(resource))
return resource return resource
def generateName(self, name): def generateName(self, name):

View file

@ -48,6 +48,9 @@ class ExternalSourceInfo(object):
def getExternalIdentifier(self): def getExternalIdentifier(self):
return self.getSourceInfo().get('externalIdentifier') return self.getSourceInfo().get('externalIdentifier')
def setExternalIdentifier(self, value): def setExternalIdentifier(self, value):
self.getSourceInfo()['externalIdentifier'] = value info = self.getSourceInfo()
if not info:
setattr(self.context, sourceInfoAttrName, info)
info['externalIdentifier'] = value
externalIdentifier = property(getExternalIdentifier, setExternalIdentifier) externalIdentifier = property(getExternalIdentifier, setExternalIdentifier)