### 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, EMPTY_NAMESPACE,Parse
except:
print "4suite has to be installed"
class getXML(Implicit):
"""get XML thread"""
def set(self,qs,xsl,result):
"""set"""
self._v_qs=qs
self.xsl=xsl
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):
"""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)
#print self.xsl
#print xsltproc.run(document)
tmp=xsltproc.run(document)
self.result=tmp[0:]
except:
self.result="<html>error: %s %s<br>"%sys.exc_info()[0:2]
self.result+=xml
self.result+="</html>"
def getResult(self):
return self.result
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.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=="":
#abwaertskompatibilitt 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'])
if wait_template:
return wait_template[0][1]()
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
return pt()
#_v_xmltrans.run()
else:
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._v_xmltrans.getResult()
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)
return pt()
from urllib import quote
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."
id = str(id)
if REQUEST is None:
self._setObject(id, ECHO_xslt(id, text))
ob = getattr(self, id)
setattr(ob,'weight',weight)
setattr(ob,'label',label)
setattr(ob,'contentType',contentType)
if title:
ob.pt_setTitle(title)
return ob
setattr(ob,'cgiUrl',cgiUrl)
else:
file = REQUEST.form.get('file')
headers = getattr(file, 'headers', None)
if headers is None or not file.filename:
zpt = ECHO_xslt(id)
else:
zpt = ECHO_xslt(id, file, headers.get('contentType'))
self._setObject(id, zpt)
ob = getattr(self, id)
setattr(ob,'weight',weight)
setattr(ob,'label',label)
setattr(ob,'cgiUrl',cgiUrl)
if title:
ob.pt_setTitle(title)
try:
u = self.DestinationURL()
except AttributeError:
u = REQUEST['URL1']
if submit == " Add and Edit ":
u = "%s/%s" % (u, quote(id))
REQUEST.RESPONSE.redirect(u+'/manage_main')
return ''
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>