File:  [Repository] / ECHO_content / ECHO_xslt.py
Revision 1.6: download - view: text, annotated - select for diffs - revision graph
Sat Sep 9 00:10:01 2006 UTC (17 years, 9 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
get page

    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: 
   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:             #abwaertskompatibilitŠt 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):
  176:         """get a page from an xml"""
  177:         pn=int(pn)
  178:         impl=xml.dom.getDOMImplementation()
  179:         newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None
  180:                                    )
  181:         root=newDoc.createElement('page')
  182:         newDoc.appendChild(root)
  183:    
  184:         xmlt=urllib.urlopen("%s"%self.cgiUrl).read()
  185:         dom=Parse(xmlt)
  186:        
  187:         pbs=dom.xpath("//pb")
  188:         beginNode=pbs[pn] #take the n'th pb
  189:         endNode=pbs[pn+1]
  190:         follower=beginNode.xpath('following::node()')
  191:         #root.appendChild(beginNode)
  192:         found=[]
  193:        
  194:         for node in endNode.xpath('preceding::node()'):
  195:             if node in follower:
  196:                 found.append(node)
  197:     
  198:         #rempove all children of parents which are also in the list
  199:         for x in found:
  200:             for child in x.xpath(".//*"):
  201:                 try:
  202:                   
  203:                     nr=found.index(child)
  204:                
  205:                     del(found[nr])
  206:                 except:
  207:                     pass
  208: 
  209:         found.append(endNode)
  210:        
  211:         for x in found:
  212:             PrettyPrint(x)
  213: 
  214: 
  215:         
  216: def manage_addECHO_xsltForm(self):
  217:     """Form for adding"""
  218:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
  219:     return pt()
  220: 
  221: from urllib import quote
  222: 
  223: 
  224: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
  225:                            REQUEST=None, submit=None):
  226:     "Add a Page Template with optional file content."
  227: 
  228:     
  229:     id = str(id)
  230:     if REQUEST is None:
  231:         self._setObject(id, ECHO_xslt(id, text))
  232:         ob = getattr(self, id)
  233:         setattr(ob,'weight',weight)
  234:         setattr(ob,'label',label)
  235:         setattr(ob,'contentType',contentType)
  236:         if title:
  237:             ob.pt_setTitle(title)
  238:         return ob
  239:         setattr(ob,'cgiUrl',cgiUrl)
  240:     else:
  241:         file = REQUEST.form.get('file')
  242:         headers = getattr(file, 'headers', None)
  243:         if headers is None or not file.filename:
  244:             zpt = ECHO_xslt(id)
  245:         else:
  246:             zpt = ECHO_xslt(id, file, headers.get('contentType'))
  247: 
  248:         self._setObject(id, zpt)
  249:         ob = getattr(self, id)
  250:         setattr(ob,'weight',weight)
  251:         setattr(ob,'label',label)
  252:         setattr(ob,'cgiUrl',cgiUrl)
  253:         if title:
  254:             ob.pt_setTitle(title)
  255:         
  256:         try:
  257:             u = self.DestinationURL()
  258:         except AttributeError:
  259:             u = REQUEST['URL1']
  260: 
  261:         if submit == " Add and Edit ":
  262:             u = "%s/%s" % (u, quote(id))
  263:         REQUEST.RESPONSE.redirect(u+'/manage_main')
  264:     return ''
  265: 

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