File:  [Repository] / ECHO_content / ECHO_xslt.py
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Sun Sep 10 22:57:38 2006 UTC (17 years, 9 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
tagging parts are now cached as far as lexical analysis is concerned

    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 ECHO_language
   11: import sys
   12: import urllib
   13: import urlparse
   14: from Ft.Xml.Domlette import Print, PrettyPrint
   15: from StringIO import StringIO
   16: from types import *
   17: from Globals import package_home
   18: import transaction
   19: 
   20: import os.path
   21: 
   22: import urllib
   23: 
   24: try:
   25:     from Ft.Xml.Xslt.Processor import Processor
   26:     from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse
   27: except:
   28:     print "4suite has to be installed"
   29: 
   30: 
   31: class getXML(Implicit):
   32:     """get XML thread"""
   33: 
   34:     def set(self,qs,xsl,result):
   35:         """set"""
   36:    
   37:         self._v_qs=qs
   38:         self.xsl=xsl
   39:         self.result=None        
   40: 
   41: #    def acquireLock(self):
   42: #    
   43: #         lock=getattr(self, "_v_lock", None)
   44: #         if not lock:
   45: #             self._v_lock=threading.Lock()
   46: #             lock=self._v_lock
   47: #         lock.acquire()
   48: #
   49: #    def releaseLock(self):
   50: #         # acquire() should have been called
   51: #         # about one second before. This means the volatile lock
   52: #         # should still be there
   53: #    
   54: #         self._v_lock.release()
   55: #        
   56:   
   57:     def __call__(self):
   58:         """wait"""
   59:         return True
   60:     
   61:     def run(self):
   62:         """call it"""
   63:         xml=""
   64: 
   65:         try:
   66:   
   67:             urlH=urllib.urlopen(self._v_qs)
   68:             xml=urlH.read()
   69:             urlH.close()
   70:             xsltproc=Processor()
   71:             document = InputSource.DefaultFactory.fromString(xml)
   72:             
   73:             stylesheet = InputSource.DefaultFactory.fromUri(self.xsl)
   74:             
   75:             xsltproc.appendStylesheet(stylesheet)
   76:             
   77:         
   78:             #print self.xsl
   79:             #print xsltproc.run(document)
   80:             tmp=xsltproc.run(document)
   81:             
   82:             self.result=tmp[0:]
   83:             
   84:         
   85:        	except:
   86:                
   87:                self.result="<html>error: %s %s<br>"%sys.exc_info()[0:2]
   88:                self.result+=xml
   89:                self.result+="</html>"
   90:         
   91:         
   92:     
   93:     def getResult(self):
   94: 
   95:         return self.result
   96: 
   97: from ZODB import DB
   98: from ZODB.FileStorage import FileStorage
   99: class ECHO_cache:
  100:     def __init__(self):
  101:         """init the storage"""
  102:         self.storage=FileStorage("/var/tmp/echo_cache.fs")
  103:         self.db=DB(self.storage)    
  104:         self.connection=self.db.open()
  105:         self.root=self.connection.root()
  106:     
  107:     def deleteObject(self,name,pn=None):
  108:         """delete an object from cache"""
  109:         fileStore=self.root.get(name,None)
  110:         if fileStore:
  111:             if not pn:
  112:                 del(self.root[name])
  113:             else:
  114:                 if self.root[name].get(pn,None):
  115:                     del(self.root[name][pn])
  116:                     
  117:         
  118:     def storeObject(self,name,pn,object):
  119:         """store an object"""
  120:         
  121:         if not self.root.get(name,None):
  122:             self.root[name]={}
  123:             
  124: 
  125:         #following is necessary to make clear that object has really changed for ZODB
  126:         tmp=self.root[name]
  127:         tmp[pn]=object
  128:         self.root[name]=tmp
  129:         transaction.get().commit()
  130:         return True
  131:    
  132:     def retrieveObject(self,name,pn):
  133:         """retrieve it"""
  134:         
  135:         fileStore=self.root.get(name,None)
  136:         if not fileStore:
  137:             return None
  138:         else:
  139:             return self.root[name].get(pn,None)
  140:         
  141: 
  142: class ECHO_xslt(ECHO_pageTemplate,ECHO_language.ECHO_language):
  143:     """ECHO_xslt classe"""
  144: 
  145:     meta_type="ECHO_xslt"
  146:     
  147:     cache=ECHO_cache()
  148:     
  149:     results={}
  150:     manage_options=ECHO_pageTemplate.manage_options+(
  151:      {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)
  152:      
  153:     def refreshTxt(self):
  154:         """txt fuer refresh"""
  155:         return """ 2;url=%s?repeat=%s """%(self.absolute_url(),self.threadName)
  156: 
  157:     def xslt(self):
  158:         """xslt"""
  159: 
  160:         return self.document_src()
  161: 
  162:     def change_ECHO_xsltForm(self):
  163:         """change form"""
  164:         pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')
  165:         return pt()
  166: 
  167:     def addChanges(self,cgiUrl,RESPONSE=None):
  168:         """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate"""
  169:         if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute
  170:             self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)
  171:         else:
  172:             self.cgiUrl=cgiUrl
  173:             
  174:         if RESPONSE:
  175:             RESPONSE.redirect("manage_main")
  176:         
  177:     def index_html(self,repeat=None):
  178:         """standard ausgabe"""
  179: 
  180:         threadName=repeat
  181:         
  182:         if not threadName or threadName=="":
  183:             
  184:             #abwaertskompatibilitŠt mit altem nivht konfigurierbaren prototypen
  185:             
  186:             if getattr(self,'cgiUrl','')=='':
  187:                 self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1"
  188:                 
  189:             qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
  190:             xsl=self.absolute_url()+"/xslt"
  191:             self._v_xmltrans=getXML().__of__(self)
  192:             #self._xmltrans.start()
  193:             thread=Thread(target=self._v_xmltrans)
  194:             thread.start()
  195:             self._v_xmltrans.set(qs,xsl,None)
  196:             self._v_xmltrans.run()
  197:             
  198:             
  199:             self.threadName=thread.getName()[0:]
  200:             wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
  201:             if wait_template:
  202:                 return wait_template[0][1]()
  203:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
  204:             return pt()
  205:             #_v_xmltrans.run()
  206:         
  207:         else:
  208:             
  209:             if (self._v_xmltrans.getResult()==None):
  210: 
  211:                 wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
  212:                 if wait_template:
  213:                         return wait_template[0][1]()
  214:                 
  215:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
  216:                 return pt()
  217:             else:
  218:                 return self._v_xmltrans.getResult()
  219: 
  220:     
  221: 
  222:     def deleteCache(self):
  223:         """deletefrom cache"""
  224:         fn=self.REQUEST['fn']
  225:         self.cache.deleteObject(fn)
  226:         
  227:     def getPageLex(self,_pn="1",_caching="yes"):
  228:         """getpage mit lexikalischer analyse und xslt transform
  229:         if _caching=yes dann wird die lwxikalisch analysierte seite in einem cache abgespeichert
  230:         """
  231:        
  232:         fn=self.REQUEST['fn']
  233: 
  234:         
  235:         fromCache=self.cache.retrieveObject(fn,_pn)
  236: 
  237:         if fromCache and _caching=="yes":
  238:             print "retrieve",fn,_pn 
  239:             txt = fromCache
  240:         else:
  241:             txt=self.tagLex(nr=_pn)   
  242:             print "store",fn,_pn 
  243:             self.cache.storeObject(fn,_pn,txt[0:])
  244:         
  245:         xsl=self.xslt()
  246:         
  247:         xsltproc=Processor()
  248:         if type(txt)==UnicodeType:
  249:             document = InputSource.DefaultFactory.fromString(txt.encode('utf-8'))
  250:         else:
  251:             document = InputSource.DefaultFactory.fromString(txt)
  252:         stylesheet = InputSource.DefaultFactory.fromString(xsl)
  253:         xsltproc.appendStylesheet(stylesheet)
  254:         tmp=xsltproc.run(document)
  255:         
  256:         return tmp[0:]
  257:             
  258: 
  259:     def getPage(self,_pn,REQUEST=None):
  260:         """get a page from an xml"""
  261:         pn=int(_pn)-1
  262:         if pn<0:
  263:             if REQUEST:
  264:                 return "Sorry, pagenumbers have to be greater than 0"
  265:             else:
  266:                 return None
  267:         impl=xml.dom.getDOMImplementation()
  268:         newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None
  269:                                    )
  270:         root=newDoc.createElement('page')
  271:         newDoc.appendChild(root)
  272:         
  273:         
  274:         qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
  275:         
  276:         
  277:      
  278:         xmlt=urllib.urlopen(qs).read()
  279:         dom=Parse(xmlt)
  280:        
  281:         pbs=dom.xpath("//pb")
  282:         if pn > len(pbs):
  283:             if REQUEST:
  284:                 return "Sorry, pagenumber %s does not exit"%pn+1
  285:             else:
  286:                 return None
  287:             
  288:         beginNode=pbs[pn] #take the n'th pb
  289: 
  290:         if not (pn==len(pbs)-1): # nicht die letzte Seite
  291:             endNode=pbs[pn+1]
  292:         else:
  293:             endNode=None
  294:         
  295:            
  296: #        follower=beginNode.xpath('following::node()')
  297: #        #root.appendChild(beginNode)
  298: #        found=[]
  299: #       
  300: #        for node in endNode.xpath('preceding::node()'):
  301: #            if node in follower:
  302: #                found.append(node)
  303: #    
  304:         
  305:    
  306:         #rempove all children of parents which are also in the list
  307: #        for x in found:
  308: #            for child in x.xpath(".//*"):
  309: #                try:
  310: #                  
  311: #                    nr=found.index(child)
  312: #               
  313: #                    del(found[nr])
  314: #                except:
  315: #                    pass
  316: #
  317: #        found.append(endNode)
  318: #       
  319:         deleteNodes=beginNode.xpath('preceding::node()')
  320:         if endNode:
  321:             deleteNodes+=endNode.xpath('following::node()')
  322:         for node in deleteNodes:
  323:             try:
  324:                 parent=node.xpath("..")
  325:            
  326:                 if parent:
  327:                     parent[0].removeChild(node)
  328:             except:
  329:                 zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
  330:         strio = StringIO()
  331:         PrettyPrint(dom,strio) 
  332:         xmlstr = strio.getvalue()
  333: 
  334:         return xmlstr
  335: 
  336: 
  337:         
  338: def manage_addECHO_xsltForm(self):
  339:     """Form for adding"""
  340:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
  341:     return pt()
  342: 
  343: from urllib import quote
  344: 
  345: 
  346: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
  347:                            REQUEST=None, submit=None):
  348:     "Add a Page Template with optional file content."
  349: 
  350:     
  351:     id = str(id)
  352:     if REQUEST is None:
  353:         self._setObject(id, ECHO_xslt(id, text))
  354:         ob = getattr(self, id)
  355:         setattr(ob,'weight',weight)
  356:         setattr(ob,'label',label)
  357:         setattr(ob,'contentType',contentType)
  358:         if title:
  359:             ob.pt_setTitle(title)
  360:         return ob
  361:         setattr(ob,'cgiUrl',cgiUrl)
  362:     else:
  363:         file = REQUEST.form.get('file')
  364:         headers = getattr(file, 'headers', None)
  365:         if headers is None or not file.filename:
  366:             zpt = ECHO_xslt(id)
  367:         else:
  368:             zpt = ECHO_xslt(id, file, headers.get('contentType'))
  369: 
  370:         self._setObject(id, zpt)
  371:         ob = getattr(self, id)
  372:         setattr(ob,'weight',weight)
  373:         setattr(ob,'label',label)
  374:         setattr(ob,'cgiUrl',cgiUrl)
  375:         if title:
  376:             ob.pt_setTitle(title)
  377:         
  378:         try:
  379:             u = self.DestinationURL()
  380:         except AttributeError:
  381:             u = REQUEST['URL1']
  382: 
  383:         if submit == " Add and Edit ":
  384:             u = "%s/%s" % (u, quote(id))
  385:         REQUEST.RESPONSE.redirect(u+'/manage_main')
  386:     return ''
  387: 

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