File:  [Repository] / XMLRpcTools / XmlRpcProxy.py
Revision 1.6: download - view: text, annotated - select for diffs - revision graph
Thu Mar 3 17:51:06 2011 UTC (13 years, 2 months ago) by casties
Branches: MAIN
CVS tags: HEAD
add logging


from OFS.SimpleItem import SimpleItem
from OFS.Folder import Folder
from Globals import InitializeClass
import xmlrpclib
import httplib
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
import os.path
from Globals import package_home
import re
import logging

class XmlRpcProxyFolder(Folder):
    """XML-RPC server proxy folder containing XmlRpcProxyMethods"""
    
    meta_type = 'XmlRpcProxyFolder'
    
    # base URL to the server
    serverUrl = None
    
    # server proxy object
    _v_proxy = None
    
    manage_options= Folder.manage_options + (
        {'label':'Main Config','action':'mainConfigForm'},
        )

    def __init__(self,id,serverUrl):
        """init server proxy"""
        self.id=id
        self.serverUrl=serverUrl
        
        
    def getProxy(self):
        """get the proxy"""
        if not self.serverUrl:
            return None
      
        # TODO cache proxy and add alive test
        self._v_proxy = xmlrpclib.ServerProxy(self.serverUrl)
       
        return self._v_proxy
        
    mainConfigForm = PageTemplateFile('zpt/manageXmlRpcProxyFolder',globals())
    
    def mainConfig(self,serverUrl,RESPONSE=None):
        """main config"""
        
        self.serverUrl=serverUrl
        
        if RESPONSE:
            RESPONSE.redirect("manage_main")
            

def manage_addXmlRpcProxyFolderForm(self):
    """add the XmlRpcProxyFolder"""
    pt=PageTemplateFile('zpt/addXmlRpcProxyFolder',globals()).__of__(self)
    return pt()

def manage_addXmlRpcProxyFolder(self,id,serverUrl,RESPONSE=None):
    """add the basket"""
    ob=XmlRpcProxyFolder(id,serverUrl)
    self._setObject(id, ob)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')



class XmlRpcProxyMethod(SimpleItem):
    """XML-RPC server proxy method. the id is also the remote method name"""
    
    meta_type="XmlRpcProxyMethod"
    
    rpc_arg_expr='[^A-z0-9]'
    
    num_retries=0
    
    manage_options= (
        {'label':'Main Config','action':'mainConfigForm'},
        )+ SimpleItem.manage_options

    
    def __init__(self,id,rpc_arg_expr=None,num_retries=0):
        """init server proxy"""
        self.id=id
        self.num_retries = num_retries
        if rpc_arg_expr:
            self.rpc_arg_expr = rpc_arg_expr

    def eval(self,*argv):
        """do proxy request"""
        server=self.aq_parent.getProxy()

        if self.rpc_arg_expr:
            # clean arguments
            args = [ re.sub(self.rpc_arg_expr,'',a) for a in argv]
        else:
            args = argv
            
        i = 0
        while True:
            try:
                # call the method self.id on the server with the args
                logging.debug("XmlRpcProxyMethod: server=%s method=%s args=%s"%(server, self.id, repr(args)))
                return getattr(server, self.id)(*args)
        
            except:
                # should we catch only specific exceptions?
                logging.error("XmlRpcProxyMethod: error!")
                if i >= self.num_retries:
                    # pass on exception
                    raise
            i += 1

        
    __call__ = eval
    

    mainConfigForm = PageTemplateFile('zpt/manageXmlRpcProxyMethod',globals())
        
    def mainConfig(self,rpc_arg_expr=None,num_retries=0,RESPONSE=None):
        """main config"""
        
        self.num_retries = num_retries
        if rpc_arg_expr is not None:
            self.rpc_arg_expr = rpc_arg_expr
        
        if RESPONSE:
            RESPONSE.redirect("manage_main")
            

def manage_addXmlRpcProxyMethodForm(self):
    """add the XmlRpcProxyFolder"""
    pt=PageTemplateFile('zpt/addXmlRpcProxyMethod',globals()).__of__(self)
    return pt()

def manage_addXmlRpcProxyMethod(self,id,rpc_arg_expr,num_retries,RESPONSE=None):
    """add the basket"""
    ob=XmlRpcProxyMethod(id,rpc_arg_expr,num_retries)
    self._setObject(id, ob)
    
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')



# init classes
InitializeClass(XmlRpcProxyFolder)
InitializeClass(XmlRpcProxyMethod)

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