commit-gnue
[Top][All Lists]
Advanced

[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)
  
  ##############################################################################
  #



reply via email to

[Prev in Thread] Current Thread [Next in Thread]