File:  [Repository] / XMLRpcTools / XmlRpcProxy.py
Revision 1.4: download - view: text, annotated - select for diffs - revision graph
Mon Nov 26 20:32:58 2007 UTC (16 years, 7 months ago) by casties
Branches: MAIN
CVS tags: HEAD
fixed bug in last checkin


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]'
    
    manage_options= (
        {'label':'Main Config','action':'mainConfigForm'},
        )+ SimpleItem.manage_options

    
    def __init__(self,id,rpc_arg_expr=None):
        """init server proxy"""
        self.id=id
        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
            
        # call the method self.id on the server with the args
        return getattr(server, self.id)(*args)
        
    __call__ = eval
    

    mainConfigForm = PageTemplateFile('zpt/manageXmlRpcProxyMethod',globals())
        
    def mainConfig(self,rpc_arg_expr=None,RESPONSE=None):
        """main config"""
                
        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,RESPONSE=None):
    """add the basket"""
    ob=XmlRpcProxyMethod(id,rpc_arg_expr)
    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>