--- OSA_system2/OSAS_browser.py 2005/02/10 20:23:24 1.9 +++ OSA_system2/OSAS_browser.py 2005/02/11 16:27:01 1.10 @@ -15,7 +15,7 @@ import stat import xml.dom.minidom from types import * import xmlrpclib - +from OSAS_helpers import * class OSAS_storeOnline(SimpleItem): @@ -27,8 +27,210 @@ class OSAS_storeOnline(SimpleItem): security=ClassSecurityInfo() _v_fileSystem={} #chache fuer filesystem + _v_metaFiles={} #chache fuer indexMeta + def getMetaFile(self,path): + """get index.meta and translate it to HTML""" + """Lies Metafile ein + @param path: Pfad des index.met + @return: index.meta file + """ + html=[] + server=xmlrpclib.Server(self.serverUrl) + + + f=server.getFile(path+"/index.meta") + + if not f: + + return self.getMetaInfoFromIndexMeta(path) + #return "NO_METADATA" + else: + + dom = xml.dom.minidom.parseString(f) + + try: + name=getText(dom.getElementsByTagName("name")[0].childNodes) + except: + name="NOT_DEFINED!!!" + try: + creator=getText(dom.getElementsByTagName("creator")[0].childNodes) + except: + creator="NOT_DEFINED!!!" + + try: + creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes) + except: + creation_date="NOT_DEFINED!!!" + + try: + description=getText(dom.getElementsByTagName("description")[0].childNodes) + except: + description="NOT_DEFINED!!!" + + try: + type=getText(dom.getElementsByTagName("content-type")[0].childNodes) + except: + type="" + if type=="scanned document": + html="

Document: "+name+"

" + elif type=="folder": + html="

Folder: "+name+"

" + else: + html="

Document: "+name+"

" + + html=html+"

created by: "+creator+" at: "+creation_date+"

" + html=html+"

Description

"+description+"

" + try: + bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0] + if bib.attributes.has_key('type'): + html=html+"

Info ("+bib.attributes['type'].value+")

" + else: + html=html+"

Info

" + html=html+getBib(bib.childNodes) + + except: + """none""" + # html=html.encode('utf-8','replace')+getBib(bib.childNodes).encode('utf-8','replace') + + return html + + + def getMetaInfoFromIndexMeta(self,path): + """metadaten zu path als html aus dem index.meta file zu path (meta tag im file bzw. dir container) + @param path: Pfad auf das Object relativ zum rootFolderName + @return: metadata als html + """ + xmlInfos=self.findEntryInIndexMeta(path) + if xmlInfos: + return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos) + else: + return "" + def findEntryInIndexMeta(self,path): + """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad. + @param path: Pfad auf das Object relativ zum rootFolderName + @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error. + """ + + server=xmlrpclib.Server(self.serverUrl) + indexMeta=server.findIndexMeta(path) # suche index.meta + + if not indexMeta: + return None + + realPath=os.path.split(indexMeta)[0] + path=os.path.normpath(path) + + try: + + dom=xml.dom.minidom.parseString(server.getFile(indexMeta)) + except: + zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta) + #ist path ein directory? + dirs=dom.getElementsByTagName('dir') + for dir in dirs: + pathes=dir.getElementsByTagName('path') + if pathes: + pathX=OSAS_helpers.getText(pathes[0].childNodes) + else: + pathX="" + names=dir.getElementsByTagName('name') + if names: + name=OSAS_helpers.getText(names[0].childNodes) + else: + name="" + + checkpath=os.path.normpath(os.path.join(realPath,pathX,name)) + if checkpath==path: + + return dir.toxml() + + #ist path ein file? + files=dom.getElementsByTagName('file') + for dir in dirs: + pathes=dir.getElementsByTagName('path') + if pathes: + pathX=OSAS_helpers.getText(pathes[0].childNodes) + else: + pathX="" + names=dir.getElementsByTagName('name') + if names: + name=OSAS_helpers.getText(names[0].childNodes) + else: + name="" + + checkpath=os.path.normpath(os.path.join(realPath,pathX,name)) + if checkpath==path: + + return dir.toxml() + + + return None + + + def getSubDirsFromIndexMeta(self,path): + + """Gebe alle path untergeordenten Objekte aus + @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName + @return: Directory [pfad auf das Objekt]->(fileType,''), fileType ist hierbei OSAS_dir_archive falls Object ein directory und OSAS_file_archive falls das Object ein File ist,der zweite Eintrag des Tupels ist zur Zeit immer '', spaeter wird hier die Beschreibung gemaess Metadaten stehen, wie bei readObjectsFromPath. + @todo: Rueckgabe einer Beschreibung gemaess Metadaten + """ + ret={} + server=xmlrpclib.Server(self.serverUrl) + indexMeta,stats=server.findIndexMetaWithStats(path)#findex index.meta zu path. + + if not indexMeta: + return ret + + realPath=os.path.split(indexMeta)[0] + path=path.replace(realPath,"") + if path and (path[0]==os.sep): #falls am Anfang os.sep steht lösche dieses. + path=path[1:] + + + + #teste ob schon im cache + + if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]): + return self._v_metaFiles[path][1] + + try: + dom=xml.dom.minidom.parseString(server.getFile(indexMeta)) + except: + zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta) + return ret + + dirs=[] + dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file') + + for dir in dirs: + pathes=dir.getElementsByTagName('path') + if pathes: + pathX=OSAS_helpers.getText(pathes[0].childNodes) + else: + pathX="" + names=dir.getElementsByTagName('name') + if names: + name=OSAS_helpers.getText(names[0].childNodes) + else: + name="" + + #print "PP",pathX,path + if pathX==path: + if dir.tagName=="dir": + fileType="OSAS_dir_archive" + else: + fileType="OSAS_file_archive" + + object=os.path.join(realPath,pathX,name) + ret[object.encode('utf-8')]=(fileType,'') + + self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache + + return ret + + def __init__(self,id,serverUrl): """initialize a new instance @@ -153,8 +355,8 @@ class OSAS_storeOnline(SimpleItem): if not objects: objects={} - server=xmlrpclib.Server(self.serverUrl) - im=server.getSubDirsFromIndexMeta(path) + + im=self.getSubDirsFromIndexMeta(path) for key in im.keys(): #virtuelle pfade hinzufuegen @@ -219,16 +421,6 @@ class OSAS_storeOnline(SimpleItem): i=i-1 return string - def getMetaFile(self,path): - """Lies Metafile ein - @param path: Pfad des index.met - @return: index.meta file - """ - server=xmlrpclib.Server(self.serverUrl) - tmp=server.getMetaFile(path) - #zLOG.LOG("EE",zLOG.INFO,type(tmp)) - - return tmp InitializeClass(OSAS_storeOnline)