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>