--- ECHO_content/ECHO_xslt.py 2005/04/10 11:37:03 1.2 +++ ECHO_content/ECHO_xslt.py 2006/09/09 10:52:35 1.7 @@ -1,52 +1,97 @@ ### XSLT Class ### ### setzt 4 suite vorraus ### - +from Acquisition import Implicit from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Globals import DTMLFile from ECHO_Nav import ECHO_pageTemplate from threading import Thread,Timer +import threading +from ECHO_helpers import * +import sys +import urllib +import urlparse +from Ft.Xml.Domlette import Print, PrettyPrint +from StringIO import StringIO from Globals import package_home + import os.path import urllib try: from Ft.Xml.Xslt.Processor import Processor - from Ft.Xml import InputSource - + from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse except: print "4suite has to be installed" -class getXML: +class getXML(Implicit): """get XML thread""" - def __init__(self,qs,xsl): - - self.qs=qs + def set(self,qs,xsl,result): + """set""" + + self._v_qs=qs self.xsl=xsl - self.result=None + self.result=None +# def acquireLock(self): +# +# lock=getattr(self, "_v_lock", None) +# if not lock: +# self._v_lock=threading.Lock() +# lock=self._v_lock +# lock.acquire() +# +# def releaseLock(self): +# # acquire() should have been called +# # about one second before. This means the volatile lock +# # should still be there +# +# self._v_lock.release() +# + def __call__(self): - - urlH=urllib.urlopen(self.qs) - xml=urlH.read() - urlH.close() + """wait""" + return True + + def run(self): + """call it""" + xml="" + print "X",self._v_qs + try: + + urlH=urllib.urlopen(self._v_qs) + xml=urlH.read() + urlH.close() + xsltproc=Processor() + document = InputSource.DefaultFactory.fromString(xml) + + stylesheet = InputSource.DefaultFactory.fromUri(self.xsl) + + xsltproc.appendStylesheet(stylesheet) + - - xsltproc=Processor() - document = InputSource.DefaultFactory.fromString(xml) - stylesheet = InputSource.DefaultFactory.fromUri(self.xsl) - xsltproc.appendStylesheet(stylesheet) + #print self.xsl + #print xsltproc.run(document) + tmp=xsltproc.run(document) + + self.result=tmp[0:] + - self.result=xsltproc.run(document) - + except: + + self.result="error: %s %s
"%sys.exc_info()[0:2] + self.result+=xml + self.result+="" + + def getResult(self): - return self.result + return self.result @@ -54,31 +99,56 @@ class ECHO_xslt(ECHO_pageTemplate): """ECHO_xslt classe""" meta_type="ECHO_xslt" + + results={} + manage_options=ECHO_pageTemplate.manage_options+( + {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},) + def refreshTxt(self): """txt fuer refresh""" return """ 2;url=%s?repeat=%s """%(self.absolute_url(),self.threadName) def xslt(self): """xslt""" - return self.pt_render() - + return self.document_src() + def change_ECHO_xsltForm(self): + """change form""" + pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt') + return pt() + + def addChanges(self,cgiUrl,RESPONSE=None): + """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate""" + if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute + self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl) + else: + self.cgiUrl=cgiUrl + + if RESPONSE: + RESPONSE.redirect("manage_main") def index_html(self,repeat=None): """standard ausgabe""" + threadName=repeat - if not threadName or threadName=="": - self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1" - - qs="%s?%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING']) - xsl=self.absolute_url()+"/xslt" - self.xmltrans=getXML(qs,xsl) - thread=Thread(target=self.xmltrans) + #abwaertskompatibilitŠt mit altem nivht konfigurierbaren prototypen + + if getattr(self,'cgiUrl','')=='': + self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1" + + qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING']) + xsl=self.absolute_url()+"/xslt" + self._v_xmltrans=getXML().__of__(self) + #self._xmltrans.start() + thread=Thread(target=self._v_xmltrans) thread.start() + self._v_xmltrans.set(qs,xsl,None) + self._v_xmltrans.run() + self.threadName=thread.getName()[0:] wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) @@ -86,23 +156,96 @@ class ECHO_xslt(ECHO_pageTemplate): return wait_template[0][1]() pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self) return pt() - #xmltrans.run() + #_v_xmltrans.run() else: - if (self.xmltrans.getResult()==None): - killThread(self.xmltrans) + if (self._v_xmltrans.getResult()==None): + + wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) + if wait_template: + return wait_template[0][1]() pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self) return pt() else: - return self.xmltrans.getResult() + return self._v_xmltrans.getResult() - -def killThread(thread): - print "killing" - del thread + def getPage(self,_pn,REQUEST=None): + """get a page from an xml""" + pn=int(_pn)-1 + if pn<0: + if REQUEST: + return "Sorry, pagenumbers have to be greater than 0" + else: + return None + impl=xml.dom.getDOMImplementation() + newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None + ) + 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) + + pbs=dom.xpath("//pb") + if pn > len(pbs): + if REQUEST: + return "Sorry, pagenumber %s does not exit"%pn+1 + else: + return None + + beginNode=pbs[pn] #take the n'th pb + + if not (pn==len(pbs)-1): # nicht die letzte Seite + endNode=pbs[pn+1] + else: + endNode=None + + +# follower=beginNode.xpath('following::node()') +# #root.appendChild(beginNode) +# found=[] +# +# for node in endNode.xpath('preceding::node()'): +# if node in follower: +# found.append(node) +# + + + #rempove all children of parents which are also in the list +# for x in found: +# for child in x.xpath(".//*"): +# try: +# +# nr=found.index(child) +# +# del(found[nr]) +# except: +# pass +# +# found.append(endNode) +# + deleteNodes=beginNode.xpath('preceding::node()') + if endNode: + deleteNodes+=endNode.xpath('following::node()') + for node in deleteNodes: + try: + parent=node.xpath("..") + + if parent: + parent[0].removeChild(node) + except: + zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) + strio = StringIO() + PrettyPrint(dom,strio) + xmlstr = strio.getvalue() + return xmlstr + + + def manage_addECHO_xsltForm(self): """Form for adding""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self) @@ -111,7 +254,7 @@ def manage_addECHO_xsltForm(self): from urllib import quote -def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, +def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None, REQUEST=None, submit=None): "Add a Page Template with optional file content." @@ -126,6 +269,7 @@ def manage_addECHO_xslt(self, id, label, if title: ob.pt_setTitle(title) return ob + setattr(ob,'cgiUrl',cgiUrl) else: file = REQUEST.form.get('file') headers = getattr(file, 'headers', None) @@ -138,6 +282,7 @@ def manage_addECHO_xslt(self, id, label, ob = getattr(self, id) setattr(ob,'weight',weight) setattr(ob,'label',label) + setattr(ob,'cgiUrl',cgiUrl) if title: ob.pt_setTitle(title)