[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/common/src GComm.py commdrivers/xmlrpc/Ser...
From: |
Jan Ischebeck |
Subject: |
gnue/common/src GComm.py commdrivers/xmlrpc/Ser... |
Date: |
Mon, 27 May 2002 14:06:45 -0400 |
CVSROOT: /cvsroot/gnue
Module name: gnue
Changes by: Jan Ischebeck <address@hidden> 02/05/27 14:06:45
Modified files:
common/src : GComm.py
common/src/commdrivers/xmlrpc: ServerAdapter.py ClientAdapter.py
Log message:
fix missing error handling in xmlrpc client
and the creating dynamic objects without releasing them bug
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/common/src/GComm.py.diff?tr1=1.17&tr2=1.18&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/common/src/commdrivers/xmlrpc/ServerAdapter.py.diff?tr1=1.14&tr2=1.15&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/common/src/commdrivers/xmlrpc/ClientAdapter.py.diff?tr1=1.8&tr2=1.9&r1=text&r2=text
Patches:
Index: gnue/common/src/GComm.py
diff -c gnue/common/src/GComm.py:1.17 gnue/common/src/GComm.py:1.18
*** gnue/common/src/GComm.py:1.17 Fri May 3 11:18:52 2002
--- gnue/common/src/GComm.py Mon May 27 14:06:45 2002
***************
*** 207,212 ****
--- 207,221 ----
class CommunicationsError(Error):
pass
+
+ #
+ # An error which has occured on the server and which is
+ # raised again on the server
+ #
+ class DistantError(Error):
+ pass
+
+
#
# Hmm... I had something in mind when I put this down...
#
Index: gnue/common/src/commdrivers/xmlrpc/ClientAdapter.py
diff -c gnue/common/src/commdrivers/xmlrpc/ClientAdapter.py:1.8
gnue/common/src/commdrivers/xmlrpc/ClientAdapter.py:1.9
*** gnue/common/src/commdrivers/xmlrpc/ClientAdapter.py:1.8 Sun May 26
15:57:33 2002
--- gnue/common/src/commdrivers/xmlrpc/ClientAdapter.py Mon May 27 14:06:45 2002
***************
*** 74,80 ****
raise GComm.AdapterInitializationError, \
_("\nUnable to load xmlrpc. To use the XML-RPC interface, \n") \
+ _("please install xmlrpc from:\n") \
! + " http://py-xmlrpc.sourceforge.net/" \
+ _("the appropriate DEBIAN package is python-xmlrpc.deb")
--- 74,80 ----
raise GComm.AdapterInitializationError, \
_("\nUnable to load xmlrpc. To use the XML-RPC interface, \n") \
+ _("please install xmlrpc from:\n") \
! + " http://sourceforge.net/projects/py-xmlrpc " \
+ _("the appropriate DEBIAN package is python-xmlrpc.deb")
***************
*** 150,170 ****
! url = "%s://%s:%s%s" % \
! ( transport, params['host'], port,path )
# setLoglevel
if hasattr(params,'loglevel'):
xmlrpc.setLogLevel(params['loglevel'])
else:
! xmlrpc.setLogLevel(1)
# care for non-integer port settings
if type(port)!=type(12):
port=string.atoi(port)
# create the real xmlrpc client
! self._client = xmlrpc.client(host,port,path)
except KeyError:
raise GComm.AdapterConfigurationError, \
--- 150,176 ----
! self._url = "%s://%s:%s%s" % \
! ( transport, params['host'], port,path )
# setLoglevel
if hasattr(params,'loglevel'):
xmlrpc.setLogLevel(params['loglevel'])
else:
! xmlrpc.setLogLevel(0)
# care for non-integer port settings
if type(port)!=type(12):
port=string.atoi(port)
+ # add an list to store references to proxys for dyn. objects
+ self._objectProxys=[]
+
# create the real xmlrpc client
! self._client = xmlrpc.client(host,port,path)
!
! # add an error handler ( is disabled because of wrong c implementation)
! # self._client.setOnErr(self.errorHandler)
except KeyError:
raise GComm.AdapterConfigurationError, \
***************
*** 180,190 ****
return self._baseproxy
def close(self):
# do a cleanup of the proxy objects and the object stubs
# on the XMLRPC server side
! self._client=None
! pass
# just in case the user forgot to delete some objects
def __del__(self):
--- 186,221 ----
return self._baseproxy
+ def errorHandler(self,src, exc):
+ # doesn't work correct, so is being disabled
+ if exc[1]==(111, 'Connection refused'):
+ # cannot raise a new error, so I try to change it
+ exc=(GComm.AdapterInitializationError,
+ _("Unable to initialize the XML-RPC interface at %s: ")\
+ % src.getDesc() + _("Connection refused"), None )
+ print "Connection to ",src.getDesc()," failed."
+ print exc
+ # sys.exit(0)
+ #import traceback
+ #sys.stderr.write()
+ #traceback.print_exception(exc[0], exc[1], exc[2])
+ #return xmlrpc.ONERR_KEEP_WORK
+ return xmlrpc.ONERR_KEEP_DEF
+
def close(self):
# do a cleanup of the proxy objects and the object stubs
# on the XMLRPC server side
!
! # 1. close the proxy objects for services (static, client only)
! self._baseproxy=None
!
! # 2. close the proxy objects for objects (dynamic, client+server)
! for i in self._objectProxys:
! i._close()
! self._objectProxys=[]
!
! # close the client it self
! self._client=None
# just in case the user forgot to delete some objects
def __del__(self):
***************
*** 202,221 ****
def runMethod(self, method, *args, **params):
# print "Calling method: %s with attr %s " % method,string.join(args,",")
! # send authentication info?
! if hasattr(self,'_auth_name'):
! result = self._client.execute(method, args, self._timeout, \
! self._auth_name, self._auth_passw)
! else:
! result = self._client.execute(method, args,self._timeout)
# print "the result is",result,"of type",type(result)
# check, if an object handle is send
# TODO: make a better check
if type(result)==type("String") and len(result)==40 :
! # create an proxy for this handle
result = _ProxyObject(self, "[%s]" % result)
return result
--- 233,285 ----
def runMethod(self, method, *args, **params):
# print "Calling method: %s with attr %s " % method,string.join(args,",")
! try:
! # send authentication info?
! if hasattr(self,'_auth_name'):
! result = self._client.execute(method, args, self._timeout, \
! self._auth_name, self._auth_passw)
! else:
! result = self._client.execute(method, args,self._timeout)
!
! except:
! if str(sys.exc_type)=="xmlrpc.error":
! if sys.exc_value==(111, 'Connection refused'):
! msg= _("Unable to connect to XML-RPC server ") + \
! _("at '%s' \n(connection refused)\n") % self._url + \
! _("please check if the server is running")
! #raise GComm.CommunicationsError, msg
! else:
! msg="Error: %s" % sys.exc_value
!
! print
! print "********************************************\n"
! print msg,"\n\n"
! print "********************************************"
! sys.exit(0)
!
! elif str(sys.exc_type)=="xmlrpc.fault":
! msg =_("Error '%s' occured on server connected"+ \
! " by XMLRPC") % sys.exc_value.faultString
! raise GComm.DistantError,msg,sys.exc_traceback
!
! else:
! raise GComm.Error, _("Unknown XMLRPC Error: '%s' of type '%s'") % \
! (sys.exc_value, sys.exc_type), \
! sys.exc_traceback
!
+
# print "the result is",result,"of type",type(result)
# check, if an object handle is send
# TODO: make a better check
if type(result)==type("String") and len(result)==40 :
!
! # create an proxy for this handle
result = _ProxyObject(self, "[%s]" % result)
+
+ # store proxy in list
+ self._objectProxys.append(result)
return result
***************
*** 242,245 ****
# TODO:
raise StandardError, data.message
!
--- 306,312 ----
# TODO:
raise StandardError, data.message
! def _close(self):
! # if it is a dynamic object then close it
! if self._attrPath==[self._attr]:
! self._adapter.runMethod(self._attr+'._close')
Index: gnue/common/src/commdrivers/xmlrpc/ServerAdapter.py
diff -c gnue/common/src/commdrivers/xmlrpc/ServerAdapter.py:1.14
gnue/common/src/commdrivers/xmlrpc/ServerAdapter.py:1.15
*** gnue/common/src/commdrivers/xmlrpc/ServerAdapter.py:1.14 Mon May 6
18:56:03 2002
--- gnue/common/src/commdrivers/xmlrpc/ServerAdapter.py Mon May 27 14:06:45 2002
***************
*** 59,65 ****
raise GComm.AdapterInitializationError, \
_("\nUnable to load xmlrpc. To use the XML-RPC interface, \n") \
+ _("please install xmlrpc from:\n") \
! + " http://py-xmlrpc.sourceforge.net/" \
+ _("the appropriate DEBIAN package is python-xmlrpc")
--- 59,65 ----
raise GComm.AdapterInitializationError, \
_("\nUnable to load xmlrpc. To use the XML-RPC interface, \n") \
+ _("please install xmlrpc from:\n") \
! + " http://sourceforge.net/projects/py-xmlrpc" \
+ _("the appropriate DEBIAN package is python-xmlrpc")
***************
*** 99,119 ****
bindings, params)
if hasattr(params,'loglevel'):
! xmlrpc.setLogLevel(params['loglevel'])
else:
! xmlrpc.setLogLevel(1)
!
self.server.setParent(self)
self.server.bindAndListen(self._port)
self.server.setOnErr(self.OnErr)
-
- #
- # Return an exception
- #
- def raiseException(self, exception, message, event=None):
- print xmlrpc.buildFault(34543, '%s: %s' % (exception, message),{})
-
def serve(self):
while 1:
try:
--- 99,114 ----
bindings, params)
if hasattr(params,'loglevel'):
! self._loglevel = params['loglevel']
else:
! self._loglevel = 1
!
! xmlrpc.setLogLevel(self._loglevel)
!
self.server.setParent(self)
self.server.bindAndListen(self._port)
self.server.setOnErr(self.OnErr)
def serve(self):
while 1:
try:
***************
*** 125,135 ****
raise e[0], e[1], e[2]
traceback.print_exc()
- ##############################################################################
- ##############################################################################
- ##############################################################################
- ##############################################################################
-
def addRpMethod(self,object,parent,binding):
DirectoryServer.DirectoryServer.addRpMethod(self,object, \
--- 120,125 ----
***************
*** 156,162 ****
def OnErr(server,source):
! print _("Error occured with s: %s on source %s.") % (server,source)
return xmlrpc.ONERR_KEEP_WORK
--- 146,153 ----
def OnErr(server,source):
! print _("Internal server error occured:\n"+
! " server %s \n on source %s.") % (server,source)
return xmlrpc.ONERR_KEEP_WORK
***************
*** 164,170 ****
# Call the requested method
#
def call(self, method, params):
! print _("Dispatching: "), method, params
## Check if the Method is part of a service or a pointer to a
## single object
--- 155,163 ----
# Call the requested method
#
def call(self, method, params):
! if self._loglevel>0:
! print _("Dispatching: "), method, params
!
## Check if the Method is part of a service or a pointer to a
## single object
***************
*** 196,211 ****
try:
server_attribute=getattr(o,method[4:])
except AttributeError:
! msg=_("Internal XMLRPC server error: method %s can be ")% \
! method +\
! _("found in the directory (build out of a .grpc file),")+\
! _(" but the object doesn't contain this method/attribut.")+\
! _(" Please check you .grpc file for wrong return types.")
!
! raise AttributeError, msg
! direntry = self.getMethodDirEntry(o._type+"."+method)
! signature=direntry['signature']
else:
# call to a service method or a helper call (get/set) for
--- 189,210 ----
try:
server_attribute=getattr(o,method[4:])
except AttributeError:
!
! if method!="_close":
! msg=_("Internal XMLRPC server error: method %s can be ")% \
! method +\
! _("found in the directory (build out of a .grpc file),")+\
! _(" but the object doesn't contain this method/attribut.")+\
! _(" Please check you .grpc file for wrong return types.")
!
! raise AttributeError, msg
! if method!="_close":
! direntry = self.getMethodDirEntry(o._type+"."+method)
! signature=direntry['signature']
! else:
! signature= ('string',)
!
else:
# call to a service method or a helper call (get/set) for
***************
*** 263,268 ****
--- 262,272 ----
# call method with params
result=server_method(*params)
+
+ # check if it's the close object method
+ elif (method=="_close"):
+
+ result=self.releaseDynamicObject(o)
else:
***************
*** 298,304 ****
result._type=rtype
result=ObjectLibrarian.getObjectReference(result)
! self.addRegisterDynamicObject(result,rtype)
# check for empty results (not allowed for XMLRPC)
if result==None:
--- 302,308 ----
result._type=rtype
result=ObjectLibrarian.getObjectReference(result)
! self.registerDynamicObject(result,rtype)
# check for empty results (not allowed for XMLRPC)
if result==None:
***************
*** 307,344 ****
return result
! def addRegisterDynamicObject(self,result,type):
#
# add new methods to the xmlrpc server
#
tl=len(type)
for i in self.directory.keys():
if i[0:tl]==type:
! method="["+result+"]"+i[tl:]
GDebug.printMesg(1,'Method %s registered to py-xmlrpc ' \
% method +\
' internal directory.')
self.server.addMethods({method:None})
! ## check if any methods were added, if no methods were added
! ## kill this useless object
! def deRegisterDynamicObject(self,object):
#
# remove the new methods from the xmlrpc server
#
type=object._type
tl=len(type)
for i in self.directory.keys():
if i[0:tl]==type:
! method="["+result+"]"+i[tl:]
! GDebug.printMesg(1,'Method %s registered to py-xmlrpc ' \
% method +\
' internal directory.')
! self.server.deleteMethods({method:None})
! ## check if any methods were added, if no methods were added
! ## kill this useless object
class XMLRPC_Server(xmlrpc.server):
def setParent(self, parent):
--- 311,356 ----
return result
! def registerDynamicObject(self,objhandle,type):
#
# add new methods to the xmlrpc server
#
tl=len(type)
for i in self.directory.keys():
if i[0:tl]==type:
! method="["+objhandle+"]"+i[tl:]
GDebug.printMesg(1,'Method %s registered to py-xmlrpc ' \
% method +\
' internal directory.')
self.server.addMethods({method:None})
!
! # add a method to close this object
! self.server.addMethods({"["+objhandle+"]._close":None})
! def deregisterDynamicObject(self,object):
#
# remove the new methods from the xmlrpc server
#
+ objhandle=ObjectLibrarian.getObjectReference(object)
type=object._type
tl=len(type)
for i in self.directory.keys():
if i[0:tl]==type:
! method="["+objhandle+"]"+i[tl:]
! GDebug.printMesg(1,'Method %s is deleted from py-xmlrpc ' \
% method +\
' internal directory.')
! self.server.removeMethods({method:None})
+ # remove the method to close this object
+ self.server.removeMethods({"["+objhandle+"]._close":None})
+ def releaseDynamicObject(self,object):
+ # delete bindings for this object in the xmlrpc method directory
+ self.deregisterDynamicObject(object)
+ # release object for Object Librarian
+ ObjectLibrarian.deferenceObject(object)
+
class XMLRPC_Server(xmlrpc.server):
def setParent(self, parent):
***************
*** 347,354 ****
def dispatch(self, servp, srcp, uri, method, params):
return self._parent.call(method,params)
! def deleteMethods(self, dic):
! pass
##############################################################################
#
--- 359,372 ----
def dispatch(self, servp, srcp, uri, method, params):
return self._parent.call(method,params)
! def removeMethods(self, dict):
! d = {}
! for (name, func) in dict.items():
! del self.comtab[name]
! # TODO: remove method from internal comtab too
! # del self._o.comtab[name]
! # or
! # self._o.removeMethods(d)
##############################################################################
#
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/common/src GComm.py commdrivers/xmlrpc/Ser...,
Jan Ischebeck <=