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, 3 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
further improvement for server client

import os
import os.path
import stat
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Globals import InitializeClass,package_home
from OFS.SimpleItem import SimpleItem
import xml.dom.minidom
import OSAS_helpers
from OSAS_helpers import *

class OSAS_storeOnlineServer(SimpleItem):
    """Server for store Online system"""
    
    _v_metaFiles={} #chache fuer indexMeta
    meta_type="OSAS_server"
    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=self.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.parse(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 findIndexMeta(self,realPath=""):
        """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
        @keyword path: default ist "", Pfad auf das Object
        @return: None falls kein index.meta existiert sonst Pfad auf das index.meta
        """
        
        #suche index.meta
        while (not os.path.exists(os.path.join(realPath,'index.meta'))) and (not ((realPath=="") or (realPath=="/"))):
            realPath=os.path.split(realPath)[0]
            
        if realPath=='' or realPath=='/':
            if os.path.exists(os.path.join(realPath,'index.meta')):
                return (os.path.join(realPath,'index.meta'))
            else:
                return None
        else:
            return os.path.join(realPath,'index.meta')

    def findIndexMetaWithStats(self,path=""):
        """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
        @keyword path: default ist "", Pfad auf das Object
        @return: None falls kein index.meta existiert sonst Tupel (Pfad auf das index.meta,stats(indexMeta)
        """

        indexMeta=self.findIndexMeta(path)
        if indexMeta:
            return (indexMeta,self.getStat(indexMeta))
        else:
            return (None,[])


    def getStat(self,path=""):
        """Gibt stat von path aus
        @keyword path: default ist "", Pfad
        @return: stat[path]"""

        if not os.path.exists(path):
            #return None,"(ERROR) path %s does not exist."%path
            return None
        else:
            return [x for x in os.stat(path)]
            
            
            

    def listdir(self,path=""):
        """list dir"""
        return os.listdir(path)


    def getMetaFile(self,path):
        """get index.meta and translate it to HTML"""
        html=[]
        
        if not os.path.exists(path+"/index.meta"):
              
              return self.getMetaInfoFromIndexMeta(path)
              #return "NO_METADATA"
        else:
           
           f = os.popen("cat "+path+"/index.meta","r")
           lines = f.read()
           
           dom = xml.dom.minidom.parseString(lines)
           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="<h3>Document: "+name+"</h3>"
           elif type=="folder":
                    html="<h3>Folder: "+name+"</h3>"
           else:
                    html="<h3>Document: "+name+"</h3>"

           html=html+"<p><i>created by: "+creator+" at: "+creation_date+"</i></p>" 
           html=html+"<h4>Description</h4><p>"+description+"</p>"
           try:
            bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
            if bib.attributes.has_key('type'):
              html=html+"<h4>Info ("+bib.attributes['type'].value+")</h4>"
            else:
              html=html+"<h4>Info</h4>"
            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.
        """

        indexMeta=self.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.parse(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 manage_addOSAS_storeOnlineServerForm(self):
    """interface for adding the OSAS_storeOnline"""
    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addStoreOnlineServer.zpt')).__of__(self)
    return pt()

def manage_addOSAS_storeOnlineServer(self,id,RESPONSE=None):
    """add the OSAS_storeOnline
    @param id: id
    """
    newObj=OSAS_storeOnlineServer(id)
    self._setObject(id,newObj)
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')


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