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() # clean arguments args = [ re.sub(self.rpc_arg_expr,'',a) for a in 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)