commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r8005 - in trunk/gnue-common/src/rpc: . drivers/xmlrpc


From: johannes
Subject: [gnue] r8005 - in trunk/gnue-common/src/rpc: . drivers/xmlrpc
Date: Wed, 28 Sep 2005 12:35:48 -0500 (CDT)

Author: johannes
Date: 2005-09-27 05:12:29 -0500 (Tue, 27 Sep 2005)
New Revision: 8005

Modified:
   trunk/gnue-common/src/rpc/client.py
   trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py
   trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py
   trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py
Log:
Improved/Fixed object transports in xmlrpc


Modified: trunk/gnue-common/src/rpc/client.py
===================================================================
--- trunk/gnue-common/src/rpc/client.py 2005-09-27 09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/client.py 2005-09-27 10:12:29 UTC (rev 8005)
@@ -195,12 +195,24 @@
   res = subobj.argcheck (other)
   print "subobj.argcheck (other)", res
 
+  print "<enter>"
+  raw_input ()
+
   res = subobj.dictcheck (other, {'buddy': other})
   print "Result-Object (buddy)=", res.printIt ()
 
-  subobj._destroy ()
-  other._destroy ()
+  print "removing result", res
+  del res
+  raw_input ()
 
+  print "removing subobj", subobj
+  del subobj
+  raw_input ()
+
+  print "removing other:", other
+  del other
+  raw_input ()
+
   print 'shutting down server ...'
   try:
     # This will raise an exception because the server will not even answer any
@@ -208,3 +220,5 @@
     obj.shutdown ()
   except:
     pass
+
+  del obj

Modified: trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py   2005-09-27 
09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/drivers/xmlrpc/ClientAdapter.py   2005-09-27 
10:12:29 UTC (rev 8005)
@@ -23,6 +23,7 @@
 
 import xmlrpclib
 import socket
+import weakref
 
 from gnue.common.apps import errors
 from gnue.common.rpc import client
@@ -149,6 +150,7 @@
     self._transport = PersistentTransport ()
     self._verbose   = params.get ('loglevel', 0)
     self.__remote   = "%s:%s" % (self._host, self._port)
+    self.__objectProxies = weakref.WeakValueDictionary ()
 
 
   # ---------------------------------------------------------------------------
@@ -177,6 +179,10 @@
 
     checktype (method, basestring)
 
+    if not self._transport:
+      assert gLeave (9)
+      return
+     
     __args = tuple ([typeconv.python_to_rpc (arg, self.__unwrapProxy) \
         for arg in args])
     try:
@@ -217,7 +223,12 @@
 
   def __wrapProxy (self, item):
 
-    return ObjectProxy (self, item)
+    if item ['__id__'] in self.__objectProxies:
+      return self.__objectProxies [item ['__id__']]
+    else:
+      result = ObjectProxy (self, item)
+      self.__objectProxies [item ['__id__']] = result
+      return result
 
 
   # ---------------------------------------------------------------------------
@@ -239,6 +250,7 @@
     """
 
     self._transport.close ()
+    self._transport = None
 
 
 # =============================================================================
@@ -264,7 +276,7 @@
   # Remove the object from the server's object store
   # ---------------------------------------------------------------------------
 
-  def _destroy (self):
+  def __del__ (self):
     """
     Remove the object from the server's object store. Further access to this
     object will lead to an exception

Modified: trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py   2005-09-27 
09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/drivers/xmlrpc/ServerAdapter.py   2005-09-27 
10:12:29 UTC (rev 8005)
@@ -86,7 +86,8 @@
         logRequests = parameters.get ('loglevel', 0), adapter = self)
 
     # Store with all valid objects created by the server
-    self._objectStore = {}
+    self._clientPerObject = {}
+    self._objectPerClient = {}
 
     # Register the python object to be served as well as the introspection
     # functions (system.list_methods,system.list_help, system.list_signatures)
@@ -102,7 +103,7 @@
   # Dispatch a method with the given parameters
   # ---------------------------------------------------------------------------
 
-  def call (self, method, parameters):
+  def call (self, client, method, parameters):
     """
     Dispatch a method with a given set of parameters
 
@@ -119,10 +120,10 @@
     checktype (parameters, tuple)
     
     params = typeconv.rpc_to_python (parameters, self._fetchFromStore,
-        server.InvalidParameter)
+        server.InvalidParameter, client)
     result = self._tcpServer._dispatch (method, params)
 
-    result = typeconv.python_to_rpc (result, self._updateStore)
+    result = typeconv.python_to_rpc (result, self._updateStore, client)
     assert gLeave (9, result)
     return result
 
@@ -147,9 +148,16 @@
 
     assert gEnter (9)
 
-    if id (item) in self._objectStore:
-      del self._objectStore [id (item)]
+    itemId = id (item)
+    client = self._clientPerObject.get (itemId)
 
+    if itemId in self._clientPerObject:
+      del self._clientPerObject [itemId]
+
+    if client in self._objectPerClient:
+      if itemId in self._objectPerClient [client]:
+        del self._objectPerClient [client][itemId]
+
     assert gLeave (9)
 
 
@@ -157,12 +165,14 @@
   # Add an object to the store or update it's reference
   # ---------------------------------------------------------------------------
 
-  def _updateStore (self, item):
+  def _updateStore (self, item, client):
 
     gEnter (9)
 
-    result = {'__id__': id (item), '__rpc_datatype__': 'object'}
-    self._objectStore [id (item)] = item
+    itemId = id (item)
+    result = {'__id__': itemId, '__rpc_datatype__': 'object'}
+    self._objectPerClient.setdefault (client, {}) [itemId] = item
+    self._clientPerObject [itemId] = client
 
     assert gLeave (9, result)
     return result
@@ -172,16 +182,34 @@
   # Fetch a real object from the store, identified by it's id-dictionary
   # ---------------------------------------------------------------------------
 
-  def _fetchFromStore (self, item):
+  def _fetchFromStore (self, item, client):
 
     try:
-      return self._objectStore [item ['__id__']]
+      itemId = item ['__id__']
+      return self._objectPerClient [client][itemId]
 
     except KeyError:
       raise ObjectNotFoundError, item
 
 
   # ---------------------------------------------------------------------------
+  # Clear all object of a given client
+  # ---------------------------------------------------------------------------
+
+  def _clearClientObjects (self, client):
+
+    assert gEnter (9)
+
+    for itemId in self._objectPerClient.get (client, {}).keys ():
+      if itemId in self._clientPerObject:
+        del self._clientPerObject [itemId]
+
+      del self._objectPerClient [client] [itemId]
+
+    assert gLeave (9)
+
+
+  # ---------------------------------------------------------------------------
   # Nice string representation
   # ---------------------------------------------------------------------------
 
@@ -246,7 +274,8 @@
 
       params, method = xmlrpclib.loads (data)
 
-      response = self.server.serverAdapter.call (method, params)
+      response = self.server.serverAdapter.call (self.client_address, method,
+          params)
       response = (response,)
 
       response = xmlrpclib.dumps (response, methodresponse = 1, allow_none = 1)
@@ -321,19 +350,34 @@
       to the socket.
     """
 
+    assert gEnter (9)
+
     allowed = self.serverAdapter and self.serverAdapter.allowed_hosts
     for host in allowed:
       if client_address [0][:len (host)] == host:
+        assert gLeave (9, True)
         return True
 
     request.send ('HTTP/1.1 403 Forbidden\r\n\r\n')
     self.close_request (request)
 
+    assert gLeave (9, False)
     return False
 
 
+  # ---------------------------------------------------------------------------
+  # A connection to a given socket has been closed
+  # ---------------------------------------------------------------------------
 
+  def close_request (self, request):
 
+    if self.serverAdapter:
+      self.serverAdapter._clearClientObjects (request.getpeername ())
+
+    SimpleXMLRPCServer.close_request (self, request)
+
+
+
 # =============================================================================
 # A forking XML-RPC server
 # =============================================================================

Modified: trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py
===================================================================
--- trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py        2005-09-27 
09:46:10 UTC (rev 8004)
+++ trunk/gnue-common/src/rpc/drivers/xmlrpc/typeconv.py        2005-09-27 
10:12:29 UTC (rev 8005)
@@ -54,7 +54,7 @@
 # Convert native Python type to xmlrpc's type
 # -----------------------------------------------------------------------------
 
-def python_to_rpc (value, wrapObject):
+def python_to_rpc (value, wrapObject, *wrapArgs):
   """
   Convert a value from native python type into a type acceptable to xmlrpc. 
 
@@ -109,11 +109,12 @@
 
   # List
   elif isinstance (value, list):
-    return [python_to_rpc (element, wrapObject) for element in value]
+    return [python_to_rpc (element, wrapObject, *wrapArgs) for element in 
value]
 
   # Tuple
   elif isinstance (value, tuple):
-    return tuple ([python_to_rpc (element, wrapObject) for element in value])
+    return tuple ([python_to_rpc (element, wrapObject, *wrapArgs) \
+        for element in value])
 
   # Dictionary
   elif isinstance (value, dict):
@@ -130,14 +131,14 @@
         key = ''
 
       elif not isinstance (key, str):
-        key = python_to_rpc (key, wrapObject)
+        key = python_to_rpc (key, wrapObject, *wrapArgs)
 
-      result [key] = python_to_rpc (val, wrapObject)
+      result [key] = python_to_rpc (val, wrapObject, *wrapArgs)
 
     return result
 
   elif wrapObject is not None:
-    return wrapObject (value)
+    return wrapObject (value, *wrapArgs)
 
   else:
     raise exception, repr (value)
@@ -147,7 +148,7 @@
 # Convert xmlrpc's type to native Python type
 # -----------------------------------------------------------------------------
 
-def rpc_to_python (value, wrapObject, exception):
+def rpc_to_python (value, wrapObject, exception, *wrapArgs):
   """
   Convert a value from xmlrpc types into native python types.
 
@@ -195,21 +196,23 @@
 
   # List
   elif isinstance (value, list):
-    return [rpc_to_python (element, wrapObject, exception) for element in 
value]
+    return [rpc_to_python (element, wrapObject, exception, *wrapArgs) \
+        for element in value]
 
   # Tuple
   elif isinstance (value, tuple):
-    return tuple ([rpc_to_python (e, wrapObject, exception) for e in value])
+    return tuple ([rpc_to_python (e, wrapObject, exception, *wrapArgs) \
+        for e in value])
 
   # Dictionary
   elif is_rpc_object (value):
-    return wrapObject (value)
+    return wrapObject (value, *wrapArgs)
 
   elif isinstance (value, dict):
     result = {}
     for (key, val) in value.items ():
-      result [rpc_to_python (key, wrapObject, exception)] = \
-          rpc_to_python (val, wrapObject, exception)
+      result [rpc_to_python (key, wrapObject, exception, *wrapArgs)] = \
+          rpc_to_python (val, wrapObject, exception, *wrapArgs)
     return result
 
   else:





reply via email to

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