Annotation of ECHO_content/ECHO_xslt.py, revision 1.10

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

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