File:  [Repository] / cdli / DownloadBasket.py
Revision 1.4: download - view: text, annotated - select for diffs - revision graph
Mon Oct 6 12:26:57 2008 UTC (15 years, 7 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
*** empty log message ***

from threading import Thread
from ZPublisher.HTTPResponse import HTTPResponse
from ZPublisher.HTTPRequest import HTTPRequest
from ZPublisher.BaseRequest import RequestContainer
import logging
import os
import transaction
class DownloadBasketFinallyThread(Thread):

    def __init__(self):
        """init for uploadATFfinallyThread"""
        self.continueVar=True
        self.returnValue=None
        self.end=False
        self.counter=0 # zaehlt wieviele Files schon gefunden wurden
    
        self.number=0 # Anzahl der Files im Basket
        Thread.__init__(self)

    def set(self,lock,procedure,user,current,basketID,versionNumber,serverport="28080"):
        self.procedure=procedure
        self.lock=lock
        self.user=user
        self.basketID = basketID
        self.versionNumber = versionNumber
        self.serverport=serverport
        self.current=current
        logging.debug("download thread:set")
        logging.debug("download thread:user"+repr(self.user))
       
    def __call__(self):
        """call of the thread (equals run)"""
        logging.debug("download thread:call")
        self.run()
        return True
    
    def run(self):
        """call of the thread (equals run)"""
        logging.error("---------download thread:run")
        
        from Zope2 import DB
        self.conn = DB.open()
        root = self.conn.root()
        app  = root['Application']
        self.ctx = self.getContext(app,serverport=self.serverport).cdliRoot.basketContainer
        logging.error("---------download thread:run2")
        baskets=self.ctx.ZopeFind(self.ctx,obj_metatypes=['CDLIBasket'],obj_ids=[self.basketID])
        logging.error("---------download thread:run3")
        if len(baskets)!=1:
            logging.error("ERROR: downloadBasket: cannot find basket:"+self.basketID)
            self.end=True
            return
        
        basket=baskets[0]
        logging.error("donwloadBasket: found basket:"+repr(basket))
        
        basketVersion=getattr(basket[1],self.versionNumber)
        
        self.downloadObjectsAsOneFileFinally(self.lock,self.procedure,self.user,self.current,basketVersion)
        self.end=True
        
    def getResult(self):
        """method for accessing result"""
        
        return self.result
    
    def getCounter(self):
        """gibt den Counter zurueck, wieviele Objekte schon gefunden wurden"""
        logging.error("counter:"+repr(self.counter))
        return self.counter
    

    
    def getNumberOfFiles(self):
        """gibt anzahl zurueck"""
        return self.number;
    def getContext(self, app,serverport="8080"):
        """get the context within the ZODB"""
        
        resp = HTTPResponse(stdout=None)
        env = {
            'SERVER_NAME':'localhost',
            'SERVER_PORT':serverport,
            'REQUEST_METHOD':'GET'
            }
        req = HTTPRequest(None, env, resp)
        return app.__of__(RequestContainer(REQUEST = req))
          
    def downloadObjectsAsOneFileFinally(self,lock=None,procedure=None,user=None,current="no",basketVersion=None):
        """print do the download"""
        logging.debug("download thread")
  
        logging.debug("donwloadBasketasonefile: found basket:"+repr(basketVersion))
        ret=""

        self.counter=0
        #fh=file("/var/tmp/test","w")
        files=[]
        lockedFiles=[]
        objects=basketVersion.getContent()
        self.number=len(objects)
        logging.error("objects:"+repr(self.number))
        for object in objects:
       
                self.counter+=1
#                logging.error("ret:"+repr(object[0]))
#                logging.error("    -"+repr(procedure))
                try:
	                lockedBy=object[1].lockedBy
                except:
                    logging.error("no object:"+repr(self.counter))
                    logging.error("no object:"+repr(object))
                    continue
			
#                lockedBy=""
#                logging.error("    -"+repr(lockedBy))
#                
                if (procedure=="downloadAll") or (lockedBy=='') or (lockedBy==user):
                    logging.error("ret1")
                    if current=="no": #version as they are in the basket
                        logging.error("ret2")
                        #object[0].addToFile2("/var/tmp/test2")
                        #ret+=str(object[0].getData())+"\n"
                        files.append(object[0].getFileName())
                    elif current=="yes":
                        logging.error("ret3")
                        #search current object
                        #founds=self.CDLICatalog.search({'title':object[1].getId().split(".")[0]})
                        obj=self.ctx.getFileObjectLastVersion(object[1].getId())
                        if obj:
                            files.append(obj.getFileName())
                        else:
                            logging.error("donwloadBasketasonefile: don't know: "+repr(object[0].getId()))
                        #if len(founds)>0:      
                          #  ret+=str(founds[0].getObject().getLastVersion().getData())+"\n"
                      
                else:
                    logging.error("ret4")
                    lockedFiles.append(object[0].getId())
      
                #if lock and lockedBy=='':
                    #obj=self.ctx.getFileObject(object[1].getId())
                   # founds=self.ctx.CDLICatalog.search({'title':object[1].getId().split(".")[0]})
                   #if len(founds)>0:      
                          #founds[0].getObject().lockedBy=user
                      
                #    object[1].lockedBy=user
                #    transaction.get().commit()
                    #obj.lockedBy=user
#        logging.error("---------download thread:run5")
#        pin,pout =os.popen2("xargs cat")
#        logging.error("---------download thread:run6")
#        pin.write(" ".join(files))
#        logging.error("---------download thread:run7")
#        pin.close()
#        logging.error("---------download thread:run8")
#    
#      
#        
#        fw = file("/var/tmp/test","w")
#        fw.write(pout.read())
#        fw.close()
        
        if not hasattr(self.ctx,'resultHash'):
            self.ctx.resultHash={}
        self.ctx.resultHash[self.getName()]=files
        
        if not hasattr(self.ctx,'resultLockedHash'):
            self.ctx.resultLockedHash={}
        self.ctx.resultLockedHash[self.getName()]=lockedFiles
        
        transaction.get().commit()
        self.conn.close()
        logging.error("---------download thread:run9")
        return True
        

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>