Annotation of XMLRpcTools/XmlRpcProxy.py, revision 1.6

1.1       casties     1: 
                      2: from OFS.SimpleItem import SimpleItem
                      3: from OFS.Folder import Folder
                      4: from Globals import InitializeClass
                      5: import xmlrpclib
                      6: import httplib
                      7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
                      8: import os.path
                      9: from Globals import package_home
                     10: import re
                     11: import logging
                     12: 
                     13: class XmlRpcProxyFolder(Folder):
                     14:     """XML-RPC server proxy folder containing XmlRpcProxyMethods"""
                     15:     
                     16:     meta_type = 'XmlRpcProxyFolder'
                     17:     
                     18:     # base URL to the server
                     19:     serverUrl = None
                     20:     
                     21:     # server proxy object
                     22:     _v_proxy = None
                     23:     
                     24:     manage_options= Folder.manage_options + (
                     25:         {'label':'Main Config','action':'mainConfigForm'},
                     26:         )
                     27: 
                     28:     def __init__(self,id,serverUrl):
                     29:         """init server proxy"""
                     30:         self.id=id
                     31:         self.serverUrl=serverUrl
                     32:         
                     33:         
                     34:     def getProxy(self):
                     35:         """get the proxy"""
                     36:         if not self.serverUrl:
                     37:             return None
                     38:       
                     39:         # TODO cache proxy and add alive test
                     40:         self._v_proxy = xmlrpclib.ServerProxy(self.serverUrl)
                     41:        
                     42:         return self._v_proxy
                     43:         
                     44:     mainConfigForm = PageTemplateFile('zpt/manageXmlRpcProxyFolder',globals())
                     45:     
                     46:     def mainConfig(self,serverUrl,RESPONSE=None):
                     47:         """main config"""
                     48:         
                     49:         self.serverUrl=serverUrl
                     50:         
                     51:         if RESPONSE:
                     52:             RESPONSE.redirect("manage_main")
                     53:             
                     54: 
                     55: def manage_addXmlRpcProxyFolderForm(self):
                     56:     """add the XmlRpcProxyFolder"""
                     57:     pt=PageTemplateFile('zpt/addXmlRpcProxyFolder',globals()).__of__(self)
                     58:     return pt()
                     59: 
                     60: def manage_addXmlRpcProxyFolder(self,id,serverUrl,RESPONSE=None):
                     61:     """add the basket"""
                     62:     ob=XmlRpcProxyFolder(id,serverUrl)
                     63:     self._setObject(id, ob)
                     64:     
                     65:     if RESPONSE is not None:
                     66:         RESPONSE.redirect('manage_main')
                     67: 
                     68: 
                     69: 
                     70: class XmlRpcProxyMethod(SimpleItem):
                     71:     """XML-RPC server proxy method. the id is also the remote method name"""
                     72:     
                     73:     meta_type="XmlRpcProxyMethod"
                     74:     
                     75:     rpc_arg_expr='[^A-z0-9]'
                     76:     
1.5       casties    77:     num_retries=0
                     78:     
1.1       casties    79:     manage_options= (
                     80:         {'label':'Main Config','action':'mainConfigForm'},
                     81:         )+ SimpleItem.manage_options
                     82: 
                     83:     
1.5       casties    84:     def __init__(self,id,rpc_arg_expr=None,num_retries=0):
1.1       casties    85:         """init server proxy"""
                     86:         self.id=id
1.5       casties    87:         self.num_retries = num_retries
1.1       casties    88:         if rpc_arg_expr:
                     89:             self.rpc_arg_expr = rpc_arg_expr
                     90: 
                     91:     def eval(self,*argv):
                     92:         """do proxy request"""
                     93:         server=self.aq_parent.getProxy()
                     94: 
1.3       casties    95:         if self.rpc_arg_expr:
                     96:             # clean arguments
                     97:             args = [ re.sub(self.rpc_arg_expr,'',a) for a in argv]
1.4       casties    98:         else:
                     99:             args = argv
1.1       casties   100:             
1.5       casties   101:         i = 0
                    102:         while True:
                    103:             try:
                    104:                 # call the method self.id on the server with the args
1.6     ! casties   105:                 logging.debug("XmlRpcProxyMethod: server=%s method=%s args=%s"%(server, self.id, repr(args)))
1.5       casties   106:                 return getattr(server, self.id)(*args)
                    107:         
                    108:             except:
                    109:                 # should we catch only specific exceptions?
1.6     ! casties   110:                 logging.error("XmlRpcProxyMethod: error!")
1.5       casties   111:                 if i >= self.num_retries:
                    112:                     # pass on exception
                    113:                     raise
                    114:             i += 1
                    115: 
1.1       casties   116:         
                    117:     __call__ = eval
                    118:     
                    119: 
                    120:     mainConfigForm = PageTemplateFile('zpt/manageXmlRpcProxyMethod',globals())
                    121:         
1.5       casties   122:     def mainConfig(self,rpc_arg_expr=None,num_retries=0,RESPONSE=None):
1.1       casties   123:         """main config"""
1.5       casties   124:         
                    125:         self.num_retries = num_retries
1.1       casties   126:         if rpc_arg_expr is not None:
                    127:             self.rpc_arg_expr = rpc_arg_expr
                    128:         
                    129:         if RESPONSE:
1.2       casties   130:             RESPONSE.redirect("manage_main")
1.1       casties   131:             
                    132: 
                    133: def manage_addXmlRpcProxyMethodForm(self):
                    134:     """add the XmlRpcProxyFolder"""
                    135:     pt=PageTemplateFile('zpt/addXmlRpcProxyMethod',globals()).__of__(self)
                    136:     return pt()
                    137: 
1.5       casties   138: def manage_addXmlRpcProxyMethod(self,id,rpc_arg_expr,num_retries,RESPONSE=None):
1.1       casties   139:     """add the basket"""
1.5       casties   140:     ob=XmlRpcProxyMethod(id,rpc_arg_expr,num_retries)
1.1       casties   141:     self._setObject(id, ob)
                    142:     
                    143:     if RESPONSE is not None:
                    144:         RESPONSE.redirect('manage_main')
                    145: 
                    146: 
                    147: 
                    148: # init classes
                    149: InitializeClass(XmlRpcProxyFolder)
                    150: InitializeClass(XmlRpcProxyMethod)

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