#@author: Thomas.Darimont
class IService(Interface):
def businessOperation(self,arguments):
"""some business operation"""
def someAction(self,arguments):
class ServiceImpl(IService,IBubu):
def businessOperation(self,arguments):
return str(arguments).upper()
def someAction(self,arguments):
print "xxx"+str(arguments)
class IInvocationHandler(Interface):
def invoke(self,proxy,target,methodName,args):
class LoggingInvocationHandler(IInvocationHandler):
def invoke(self,proxy,target,methodName,args):
print "before %s" % methodName
result = getattr(target,methodName)(args)
print "after %s" % methodName
def __init__(self,proxy,invocationTarget,methodName):
self.methodName = methodName
self.invocationTarget = invocationTarget
#print "self=%s, args=%s" % (self,args)
#return getattr(self.invocationTarget,self.methodName)(args)
return self.proxy.invocationHandler.invoke(self.proxy,self.invocationTarget,self.methodName,args)
def createProxy(invocationTarget,interfaces,invocationHandler):
#print "interfaces: %s" % interfaces
proxy.invocationTarget = invocationTarget
proxy.invocationHandler = invocationHandler
proxy.interfaces = interfaces
proxy.interfaceMethodMap = {}
for interface in interfaces:
#print "interfaces to implement %s->%s" % (interface,dir(interface))
for key in dir(interface):
#print "checking: %s" % key
if inspect.ismethod(getattr(interface,key)):
#print "adding: %s" % key
if not key in proxy.interfaceMethodMap:
proxy.interfaceMethodMap[interface] = {key:getattr(interface,key)}
proxy.interfaceMethodMap[interface][key]=getattr(interface,key)
def __getattr__(self, name):
for interface in self.interfaces:
if name in self.interfaceMethodMap[interface]:
#print "candidate: %s " % candidate.__name__
return InvokableMethod(self,self.invocationTarget,self.interfaceMethodMap[interface][name].__name__)
print ServiceImpl().businessOperation("bubu")
serviceProxy = Proxy.createProxy(ServiceImpl(), [IService(),IBubu()],LoggingInvocationHandler())
print serviceProxy.interfaces
print serviceProxy.businessOperation("test")
print "xxxxxxxxxxxxxxxxxxxxx"
print serviceProxy.someAction("test")