--- 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)