1: ### XSLT Class ###
2: ### setzt 4 suite vorraus ###
3: from Acquisition import Implicit
4: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
5: from Globals import DTMLFile
6: from ECHO_Nav import ECHO_pageTemplate
7: from threading import Thread,Timer
8: import threading
9: from ECHO_helpers import *
10: import sys
11: import urllib
12: import urlparse
13: from Ft.Xml.Domlette import Print, PrettyPrint
14: from StringIO import StringIO
15:
16: from Globals import package_home
17:
18:
19: import os.path
20:
21: import urllib
22:
23: try:
24: from Ft.Xml.Xslt.Processor import Processor
25: from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse
26: except:
27: print "4suite has to be installed"
28:
29:
30: class getXML(Implicit):
31: """get XML thread"""
32:
33: def set(self,qs,xsl,result):
34: """set"""
35:
36: self._v_qs=qs
37: self.xsl=xsl
38: self.result=None
39:
40: # def acquireLock(self):
41: #
42: # lock=getattr(self, "_v_lock", None)
43: # if not lock:
44: # self._v_lock=threading.Lock()
45: # lock=self._v_lock
46: # lock.acquire()
47: #
48: # def releaseLock(self):
49: # # acquire() should have been called
50: # # about one second before. This means the volatile lock
51: # # should still be there
52: #
53: # self._v_lock.release()
54: #
55:
56: def __call__(self):
57: """wait"""
58: return True
59:
60: def run(self):
61: """call it"""
62: xml=""
63: print "X",self._v_qs
64: try:
65:
66: urlH=urllib.urlopen(self._v_qs)
67: xml=urlH.read()
68: urlH.close()
69: xsltproc=Processor()
70: document = InputSource.DefaultFactory.fromString(xml)
71:
72: stylesheet = InputSource.DefaultFactory.fromUri(self.xsl)
73:
74: xsltproc.appendStylesheet(stylesheet)
75:
76:
77: #print self.xsl
78: #print xsltproc.run(document)
79: tmp=xsltproc.run(document)
80:
81: self.result=tmp[0:]
82:
83:
84: except:
85:
86: self.result="<html>error: %s %s<br>"%sys.exc_info()[0:2]
87: self.result+=xml
88: self.result+="</html>"
89:
90:
91:
92: def getResult(self):
93:
94: return self.result
95:
96:
97:
98: class ECHO_xslt(ECHO_pageTemplate):
99: """ECHO_xslt classe"""
100:
101: meta_type="ECHO_xslt"
102:
103: results={}
104: manage_options=ECHO_pageTemplate.manage_options+(
105: {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)
106:
107: def refreshTxt(self):
108: """txt fuer refresh"""
109: return """ 2;url=%s?repeat=%s """%(self.absolute_url(),self.threadName)
110:
111: def xslt(self):
112: """xslt"""
113:
114: return self.document_src()
115:
116: def change_ECHO_xsltForm(self):
117: """change form"""
118: pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')
119: return pt()
120:
121: def addChanges(self,cgiUrl,RESPONSE=None):
122: """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate"""
123: if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute
124: self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)
125: else:
126: self.cgiUrl=cgiUrl
127:
128: if RESPONSE:
129: RESPONSE.redirect("manage_main")
130:
131: def index_html(self,repeat=None):
132: """standard ausgabe"""
133:
134: threadName=repeat
135:
136: if not threadName or threadName=="":
137:
138: #abwaertskompatibilitt mit altem nivht konfigurierbaren prototypen
139:
140: if getattr(self,'cgiUrl','')=='':
141: self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1"
142:
143: qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
144: xsl=self.absolute_url()+"/xslt"
145: self._v_xmltrans=getXML().__of__(self)
146: #self._xmltrans.start()
147: thread=Thread(target=self._v_xmltrans)
148: thread.start()
149: self._v_xmltrans.set(qs,xsl,None)
150: self._v_xmltrans.run()
151:
152:
153: self.threadName=thread.getName()[0:]
154: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
155: if wait_template:
156: return wait_template[0][1]()
157: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
158: return pt()
159: #_v_xmltrans.run()
160:
161: else:
162:
163: if (self._v_xmltrans.getResult()==None):
164:
165: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
166: if wait_template:
167: return wait_template[0][1]()
168:
169: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
170: return pt()
171: else:
172: return self._v_xmltrans.getResult()
173:
174:
175: def getPage(self,_pn,REQUEST=None):
176: """get a page from an xml"""
177: pn=int(_pn)-1
178: if pn<0:
179: if REQUEST:
180: return "Sorry, pagenumbers have to be greater than 0"
181: else:
182: return None
183: impl=xml.dom.getDOMImplementation()
184: newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None
185: )
186: root=newDoc.createElement('page')
187: newDoc.appendChild(root)
188: qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
189: print qs
190: xmlt=urllib.urlopen(qs).read()
191: dom=Parse(xmlt)
192:
193: pbs=dom.xpath("//pb")
194: if pn > len(pbs):
195: if REQUEST:
196: return "Sorry, pagenumber %s does not exit"%pn+1
197: else:
198: return None
199:
200: beginNode=pbs[pn] #take the n'th pb
201:
202: if not (pn==len(pbs)-1): # nicht die letzte Seite
203: endNode=pbs[pn+1]
204: else:
205: endNode=None
206:
207:
208: # follower=beginNode.xpath('following::node()')
209: # #root.appendChild(beginNode)
210: # found=[]
211: #
212: # for node in endNode.xpath('preceding::node()'):
213: # if node in follower:
214: # found.append(node)
215: #
216:
217:
218: #rempove all children of parents which are also in the list
219: # for x in found:
220: # for child in x.xpath(".//*"):
221: # try:
222: #
223: # nr=found.index(child)
224: #
225: # del(found[nr])
226: # except:
227: # pass
228: #
229: # found.append(endNode)
230: #
231: deleteNodes=beginNode.xpath('preceding::node()')
232: if endNode:
233: deleteNodes+=endNode.xpath('following::node()')
234: for node in deleteNodes:
235: try:
236: parent=node.xpath("..")
237:
238: if parent:
239: parent[0].removeChild(node)
240: except:
241: zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
242: strio = StringIO()
243: PrettyPrint(dom,strio)
244: xmlstr = strio.getvalue()
245: return xmlstr
246:
247:
248:
249: def manage_addECHO_xsltForm(self):
250: """Form for adding"""
251: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
252: return pt()
253:
254: from urllib import quote
255:
256:
257: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
258: REQUEST=None, submit=None):
259: "Add a Page Template with optional file content."
260:
261:
262: id = str(id)
263: if REQUEST is None:
264: self._setObject(id, ECHO_xslt(id, text))
265: ob = getattr(self, id)
266: setattr(ob,'weight',weight)
267: setattr(ob,'label',label)
268: setattr(ob,'contentType',contentType)
269: if title:
270: ob.pt_setTitle(title)
271: return ob
272: setattr(ob,'cgiUrl',cgiUrl)
273: else:
274: file = REQUEST.form.get('file')
275: headers = getattr(file, 'headers', None)
276: if headers is None or not file.filename:
277: zpt = ECHO_xslt(id)
278: else:
279: zpt = ECHO_xslt(id, file, headers.get('contentType'))
280:
281: self._setObject(id, zpt)
282: ob = getattr(self, id)
283: setattr(ob,'weight',weight)
284: setattr(ob,'label',label)
285: setattr(ob,'cgiUrl',cgiUrl)
286: if title:
287: ob.pt_setTitle(title)
288:
289: try:
290: u = self.DestinationURL()
291: except AttributeError:
292: u = REQUEST['URL1']
293:
294: if submit == " Add and Edit ":
295: u = "%s/%s" % (u, quote(id))
296: REQUEST.RESPONSE.redirect(u+'/manage_main')
297: return ''
298:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>