File:  [Repository] / OSA_system2 / OSAS_server.py
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Thu Feb 10 20:23:24 2005 UTC (19 years, 4 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
further improvement for server client

    1: import os
    2: import os.path
    3: import stat
    4: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    5: from Globals import InitializeClass,package_home
    6: from OFS.SimpleItem import SimpleItem
    7: import xml.dom.minidom
    8: import OSAS_helpers
    9: from OSAS_helpers import *
   10: 
   11: class OSAS_storeOnlineServer(SimpleItem):
   12:     """Server for store Online system"""
   13:     
   14:     _v_metaFiles={} #chache fuer indexMeta
   15:     meta_type="OSAS_server"
   16:     def getSubDirsFromIndexMeta(self,path):
   17:         
   18:         """Gebe alle path untergeordenten Objekte aus
   19:         @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
   20:         @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.
   21:         @todo: Rueckgabe einer Beschreibung gemaess Metadaten
   22:         """
   23:         ret={}
   24:         #server=xmlrpclib.Server(self.serverUrl)
   25:         indexMeta,stats=self.findIndexMetaWithStats(path)#findex index.meta zu path.
   26: 
   27:         if not indexMeta:
   28:             return ret
   29: 
   30:         realPath=os.path.split(indexMeta)[0]
   31:         path=path.replace(realPath,"")
   32:         if path and (path[0]==os.sep): #falls am Anfang os.sep steht lösche dieses.
   33:             path=path[1:]
   34: 
   35: 
   36: 
   37:         #teste ob schon im cache
   38:         
   39:         if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):
   40:             return self._v_metaFiles[path][1]
   41: 
   42:         try:
   43:             dom=xml.dom.minidom.parse(indexMeta)
   44:         except:
   45:             zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
   46:             return ret
   47: 
   48:         dirs=[]
   49:         dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
   50:     
   51:         for dir in dirs:
   52:             pathes=dir.getElementsByTagName('path')
   53:             if pathes:
   54:                 pathX=OSAS_helpers.getText(pathes[0].childNodes)
   55:             else:
   56:                 pathX=""
   57:             names=dir.getElementsByTagName('name')
   58:             if names:
   59:                 name=OSAS_helpers.getText(names[0].childNodes)
   60:             else:
   61:                 name=""
   62: 
   63:             #print "PP",pathX,path
   64:             if pathX==path:
   65:                 if dir.tagName=="dir":
   66:                     fileType="OSAS_dir_archive"
   67:                 else:
   68:                     fileType="OSAS_file_archive"
   69: 
   70:                 object=os.path.join(realPath,pathX,name)
   71:                 ret[object.encode('utf-8')]=(fileType,'')
   72: 
   73:         self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache
   74:       
   75:         return ret
   76: 
   77:         
   78:   
   79:     def findIndexMeta(self,realPath=""):
   80:         """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
   81:         @keyword path: default ist "", Pfad auf das Object
   82:         @return: None falls kein index.meta existiert sonst Pfad auf das index.meta
   83:         """
   84:         
   85:         #suche index.meta
   86:         while (not os.path.exists(os.path.join(realPath,'index.meta'))) and (not ((realPath=="") or (realPath=="/"))):
   87:             realPath=os.path.split(realPath)[0]
   88:             
   89:         if realPath=='' or realPath=='/':
   90:             if os.path.exists(os.path.join(realPath,'index.meta')):
   91:                 return (os.path.join(realPath,'index.meta'))
   92:             else:
   93:                 return None
   94:         else:
   95:             return os.path.join(realPath,'index.meta')
   96: 
   97:     def findIndexMetaWithStats(self,path=""):
   98:         """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
   99:         @keyword path: default ist "", Pfad auf das Object
  100:         @return: None falls kein index.meta existiert sonst Tupel (Pfad auf das index.meta,stats(indexMeta)
  101:         """
  102: 
  103:         indexMeta=self.findIndexMeta(path)
  104:         if indexMeta:
  105:             return (indexMeta,self.getStat(indexMeta))
  106:         else:
  107:             return (None,[])
  108: 
  109: 
  110:     def getStat(self,path=""):
  111:         """Gibt stat von path aus
  112:         @keyword path: default ist "", Pfad
  113:         @return: stat[path]"""
  114: 
  115:         if not os.path.exists(path):
  116:             #return None,"(ERROR) path %s does not exist."%path
  117:             return None
  118:         else:
  119:             return [x for x in os.stat(path)]
  120:             
  121:             
  122:             
  123: 
  124:     def listdir(self,path=""):
  125:         """list dir"""
  126:         return os.listdir(path)
  127: 
  128: 
  129:     def getMetaFile(self,path):
  130:         """get index.meta and translate it to HTML"""
  131:         html=[]
  132:         
  133:         if not os.path.exists(path+"/index.meta"):
  134:               
  135:               return self.getMetaInfoFromIndexMeta(path)
  136:               #return "NO_METADATA"
  137:         else:
  138:            
  139:            f = os.popen("cat "+path+"/index.meta","r")
  140:            lines = f.read()
  141:            
  142:            dom = xml.dom.minidom.parseString(lines)
  143:            try:
  144:                name=getText(dom.getElementsByTagName("name")[0].childNodes)
  145:            except:
  146:                name="NOT_DEFINED!!!"
  147:            try:
  148:                creator=getText(dom.getElementsByTagName("creator")[0].childNodes)
  149:            except:
  150:                creator="NOT_DEFINED!!!"
  151: 
  152:            try:
  153:                creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes)
  154:            except:
  155:                creation_date="NOT_DEFINED!!!"
  156: 
  157:            try:
  158:                description=getText(dom.getElementsByTagName("description")[0].childNodes)
  159:            except:
  160:                description="NOT_DEFINED!!!"
  161: 
  162:            try:
  163:             type=getText(dom.getElementsByTagName("content-type")[0].childNodes) 
  164:            except:
  165:             type=""
  166:            if type=="scanned document":
  167:                     html="<h3>Document: "+name+"</h3>"
  168:            elif type=="folder":
  169:                     html="<h3>Folder: "+name+"</h3>"
  170:            else:
  171:                     html="<h3>Document: "+name+"</h3>"
  172: 
  173:            html=html+"<p><i>created by: "+creator+" at: "+creation_date+"</i></p>" 
  174:            html=html+"<h4>Description</h4><p>"+description+"</p>"
  175:            try:
  176:             bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
  177:             if bib.attributes.has_key('type'):
  178:               html=html+"<h4>Info ("+bib.attributes['type'].value+")</h4>"
  179:             else:
  180:               html=html+"<h4>Info</h4>"
  181:             html=html+getBib(bib.childNodes)
  182: 
  183:            except:
  184:             """none"""
  185: 
  186:     #        html=html.encode('utf-8','replace')+getBib(bib.childNodes).encode('utf-8','replace')
  187: 
  188:            return html
  189: 
  190: 
  191:     def getMetaInfoFromIndexMeta(self,path):
  192:         """metadaten zu path als html aus dem index.meta file zu path (meta tag im file bzw. dir container)
  193:         @param path: Pfad auf das Object relativ zum rootFolderName
  194:         @return: metadata als html
  195:         """
  196:         xmlInfos=self.findEntryInIndexMeta(path)
  197:         if xmlInfos:
  198:             return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)
  199:         else:
  200:             return ""
  201:    
  202:     def findEntryInIndexMeta(self,path):
  203:         """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad.
  204:         @param path: Pfad auf das Object relativ zum rootFolderName
  205:         @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.
  206:         """
  207: 
  208:         indexMeta=self.findIndexMeta(path) # suche index.meta
  209:         
  210:         if not indexMeta:
  211:             return None
  212: 
  213:         realPath=os.path.split(indexMeta)[0]
  214:         path=os.path.normpath(path)
  215: 
  216:         try:
  217:             dom=xml.dom.minidom.parse(indexMeta)
  218:         except:
  219:             zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
  220:         #ist path ein directory? 
  221:         dirs=dom.getElementsByTagName('dir')
  222:         for dir in dirs:
  223:             pathes=dir.getElementsByTagName('path')
  224:             if pathes:
  225:                 pathX=OSAS_helpers.getText(pathes[0].childNodes)
  226:             else:
  227:                 pathX=""
  228:             names=dir.getElementsByTagName('name')
  229:             if names:
  230:                 name=OSAS_helpers.getText(names[0].childNodes)
  231:             else:
  232:                 name=""
  233: 
  234:             checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
  235:             if checkpath==path:
  236:                 
  237:                 return dir.toxml()
  238: 
  239:         #ist path ein file?
  240:         files=dom.getElementsByTagName('file')
  241:         for dir in dirs:
  242:             pathes=dir.getElementsByTagName('path')
  243:             if pathes:
  244:                 pathX=OSAS_helpers.getText(pathes[0].childNodes)
  245:             else:
  246:                 pathX=""
  247:             names=dir.getElementsByTagName('name')
  248:             if names:
  249:                 name=OSAS_helpers.getText(names[0].childNodes)
  250:             else:
  251:                 name=""
  252: 
  253:             checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
  254:             if checkpath==path:
  255:                 
  256:                 return dir.toxml()
  257: 
  258:         
  259:         return None
  260: 
  261: 
  262: def manage_addOSAS_storeOnlineServerForm(self):
  263:     """interface for adding the OSAS_storeOnline"""
  264:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addStoreOnlineServer.zpt')).__of__(self)
  265:     return pt()
  266: 
  267: def manage_addOSAS_storeOnlineServer(self,id,RESPONSE=None):
  268:     """add the OSAS_storeOnline
  269:     @param id: id
  270:     """
  271:     newObj=OSAS_storeOnlineServer(id)
  272:     self._setObject(id,newObj)
  273:     if RESPONSE is not None:
  274:         RESPONSE.redirect('manage_main')
  275: 

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