--- ECHO_content/ECHO_xslt.py 2006/09/10 11:03:07 1.8 +++ ECHO_content/ECHO_xslt.py 2006/09/10 22:57:38 1.9 @@ -13,9 +13,9 @@ import urllib import urlparse from Ft.Xml.Domlette import Print, PrettyPrint from StringIO import StringIO - +from types import * from Globals import package_home - +import transaction import os.path @@ -61,7 +61,7 @@ class getXML(Implicit): def run(self): """call it""" xml="" - print "X",self._v_qs + try: urlH=urllib.urlopen(self._v_qs) @@ -94,13 +94,58 @@ class getXML(Implicit): return self.result - +from ZODB import DB +from ZODB.FileStorage import FileStorage +class ECHO_cache: + def __init__(self): + """init the storage""" + self.storage=FileStorage("/var/tmp/echo_cache.fs") + self.db=DB(self.storage) + self.connection=self.db.open() + self.root=self.connection.root() + def deleteObject(self,name,pn=None): + """delete an object from cache""" + fileStore=self.root.get(name,None) + if fileStore: + if not pn: + del(self.root[name]) + else: + if self.root[name].get(pn,None): + del(self.root[name][pn]) + + + def storeObject(self,name,pn,object): + """store an object""" + + if not self.root.get(name,None): + self.root[name]={} + + + #following is necessary to make clear that object has really changed for ZODB + tmp=self.root[name] + tmp[pn]=object + self.root[name]=tmp + transaction.get().commit() + return True + + def retrieveObject(self,name,pn): + """retrieve it""" + + fileStore=self.root.get(name,None) + if not fileStore: + return None + else: + return self.root[name].get(pn,None) + + class ECHO_xslt(ECHO_pageTemplate,ECHO_language.ECHO_language): """ECHO_xslt classe""" meta_type="ECHO_xslt" + cache=ECHO_cache() + results={} manage_options=ECHO_pageTemplate.manage_options+( {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},) @@ -173,10 +218,44 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l return self._v_xmltrans.getResult() - def getPageLex(self,_pn="1"): - """getpage with linkss to lexicon""" - return self.tagLex(nr=_pn) - + + def deleteCache(self): + """deletefrom cache""" + fn=self.REQUEST['fn'] + self.cache.deleteObject(fn) + + def getPageLex(self,_pn="1",_caching="yes"): + """getpage mit lexikalischer analyse und xslt transform + if _caching=yes dann wird die lwxikalisch analysierte seite in einem cache abgespeichert + """ + + fn=self.REQUEST['fn'] + + + fromCache=self.cache.retrieveObject(fn,_pn) + + if fromCache and _caching=="yes": + print "retrieve",fn,_pn + txt = fromCache + else: + txt=self.tagLex(nr=_pn) + print "store",fn,_pn + self.cache.storeObject(fn,_pn,txt[0:]) + + xsl=self.xslt() + + xsltproc=Processor() + if type(txt)==UnicodeType: + document = InputSource.DefaultFactory.fromString(txt.encode('utf-8')) + else: + document = InputSource.DefaultFactory.fromString(txt) + stylesheet = InputSource.DefaultFactory.fromString(xsl) + xsltproc.appendStylesheet(stylesheet) + tmp=xsltproc.run(document) + + return tmp[0:] + + def getPage(self,_pn,REQUEST=None): """get a page from an xml""" pn=int(_pn)-1 @@ -190,8 +269,12 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l ) root=newDoc.createElement('page') newDoc.appendChild(root) + + qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING']) - print qs + + + xmlt=urllib.urlopen(qs).read() dom=Parse(xmlt) @@ -247,6 +330,7 @@ class ECHO_xslt(ECHO_pageTemplate,ECHO_l strio = StringIO() PrettyPrint(dom,strio) xmlstr = strio.getvalue() + return xmlstr