You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2013/06/11 15:12:18 UTC

svn commit: r1491785 - in /qpid/proton/trunk: proton-c/bindings/python/ proton-c/include/proton/ proton-c/src/engine/ proton-j/proton-api/src/main/resources/ tests/python/proton_tests/

Author: rhs
Date: Tue Jun 11 13:12:17 2013
New Revision: 1491785

URL: http://svn.apache.org/r1491785
Log:
PROTON-61: added access to connection properties

Modified:
    qpid/proton/trunk/proton-c/bindings/python/proton.py
    qpid/proton/trunk/proton-c/include/proton/engine.h
    qpid/proton/trunk/proton-c/src/engine/engine-internal.h
    qpid/proton/trunk/proton-c/src/engine/engine.c
    qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py
    qpid/proton/trunk/tests/python/proton_tests/engine.py

Modified: qpid/proton/trunk/proton-c/bindings/python/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/proton.py?rev=1491785&r1=1491784&r2=1491785&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/proton.py (original)
+++ qpid/proton/trunk/proton-c/bindings/python/proton.py Tue Jun 11 13:12:17 2013
@@ -1865,6 +1865,7 @@ class Connection(Endpoint):
       pn_connection_set_context(self._conn, self)
     self.offered_capabilities = None
     self.desired_capabilities = None
+    self.properties = None
 
   def __del__(self):
     if hasattr(self, "_conn"):
@@ -1906,7 +1907,7 @@ class Connection(Endpoint):
   def remote_hostname(self):
     return pn_connection_remote_hostname(self._conn)
 
-  def _dat2cap(self, dimpl):
+  def _dat2obj(self, dimpl):
     d = Data(dimpl)
     d.rewind()
     d.next()
@@ -1916,22 +1917,27 @@ class Connection(Endpoint):
 
   @property
   def remote_offered_capabilities(self):
-    return self._dat2cap(pn_connection_remote_offered_capabilities(self._conn))
+    return self._dat2obj(pn_connection_remote_offered_capabilities(self._conn))
 
   @property
   def remote_desired_capabilities(self):
-    return self._dat2cap(pn_connection_remote_desired_capabilities(self._conn))
+    return self._dat2obj(pn_connection_remote_desired_capabilities(self._conn))
 
-  def _cap2data(self, obj, dimpl):
+  @property
+  def remote_properties(self):
+    return self._dat2obj(pn_connection_remote_properties(self._conn))
+
+  def _obj2dat(self, obj, dimpl):
     if obj is not None:
       d = Data(dimpl)
       d.put_object(obj)
 
   def open(self):
-    self._cap2data(self.offered_capabilities,
-                   pn_connection_offered_capabilities(self._conn))
-    self._cap2data(self.desired_capabilities,
-                   pn_connection_desired_capabilities(self._conn))
+    self._obj2dat(self.offered_capabilities,
+                  pn_connection_offered_capabilities(self._conn))
+    self._obj2dat(self.desired_capabilities,
+                  pn_connection_desired_capabilities(self._conn))
+    self._obj2dat(self.properties, pn_connection_properties(self._conn))
     pn_connection_open(self._conn)
 
   def close(self):

Modified: qpid/proton/trunk/proton-c/include/proton/engine.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/engine.h?rev=1491785&r1=1491784&r2=1491785&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/engine.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/engine.h Tue Jun 11 13:12:17 2013
@@ -139,8 +139,10 @@ PN_EXTERN const char *pn_connection_remo
 PN_EXTERN const char *pn_connection_remote_hostname(pn_connection_t *connection);
 PN_EXTERN pn_data_t *pn_connection_offered_capabilities(pn_connection_t *connection);
 PN_EXTERN pn_data_t *pn_connection_desired_capabilities(pn_connection_t *connection);
+PN_EXTERN pn_data_t *pn_connection_properties(pn_connection_t *connection);
 PN_EXTERN pn_data_t *pn_connection_remote_offered_capabilities(pn_connection_t *connection);
 PN_EXTERN pn_data_t *pn_connection_remote_desired_capabilities(pn_connection_t *connection);
+PN_EXTERN pn_data_t *pn_connection_remote_properties(pn_connection_t *connection);
 
 
 /** Extracts the first delivery on the connection that has pending

Modified: qpid/proton/trunk/proton-c/src/engine/engine-internal.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine-internal.h?rev=1491785&r1=1491784&r2=1491785&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine-internal.h (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine-internal.h Tue Jun 11 13:12:17 2013
@@ -126,6 +126,7 @@ struct pn_transport_t {
   char *remote_hostname;
   pn_data_t *remote_offered_capabilities;
   pn_data_t *remote_desired_capabilities;
+  pn_data_t *remote_properties;
   //#define PN_DEFAULT_MAX_FRAME_SIZE (16*1024)
 #define PN_DEFAULT_MAX_FRAME_SIZE (0)  /* for now, allow unlimited size */
   uint32_t   local_max_frame;
@@ -186,6 +187,7 @@ struct pn_connection_t {
   pn_string_t *hostname;
   pn_data_t *offered_capabilities;
   pn_data_t *desired_capabilities;
+  pn_data_t *properties;
   void *context;
 };
 

Modified: qpid/proton/trunk/proton-c/src/engine/engine.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine.c?rev=1491785&r1=1491784&r2=1491785&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine.c Tue Jun 11 13:12:17 2013
@@ -185,8 +185,9 @@ void pn_transport_free(pn_transport_t *t
   pn_dispatcher_free(transport->disp);
   free(transport->remote_container);
   free(transport->remote_hostname);
-  pn_data_free(transport->remote_offered_capabilities);
-  pn_data_free(transport->remote_desired_capabilities);
+  pn_free(transport->remote_offered_capabilities);
+  pn_free(transport->remote_desired_capabilities);
+  pn_free(transport->remote_properties);
   pn_error_free(transport->error);
   pn_condition_tini(&transport->remote_condition);
   pn_free(transport->local_channels);
@@ -320,6 +321,7 @@ static void pn_connection_finalize(void 
   pn_free(conn->hostname);
   pn_free(conn->offered_capabilities);
   pn_free(conn->desired_capabilities);
+  pn_free(conn->properties);
   pn_endpoint_tini(&conn->endpoint);
 }
 
@@ -345,6 +347,7 @@ pn_connection_t *pn_connection()
   conn->hostname = pn_string(NULL);
   conn->offered_capabilities = pn_data(16);
   conn->desired_capabilities = pn_data(16);
+  conn->properties = pn_data(16);
 
   return conn;
 }
@@ -385,47 +388,61 @@ void pn_connection_set_hostname(pn_conne
 
 pn_data_t *pn_connection_offered_capabilities(pn_connection_t *connection)
 {
+  assert(connection);
   return connection->offered_capabilities;
 }
 
 pn_data_t *pn_connection_desired_capabilities(pn_connection_t *connection)
 {
+  assert(connection);
   return connection->desired_capabilities;
 }
 
+pn_data_t *pn_connection_properties(pn_connection_t *connection)
+{
+  assert(connection);
+  return connection->properties;
+}
+
 pn_data_t *pn_connection_remote_offered_capabilities(pn_connection_t *connection)
 {
-  if (!connection) return NULL;
+  assert(connection);
   return connection->transport ? connection->transport->remote_offered_capabilities : NULL;
 }
 
 pn_data_t *pn_connection_remote_desired_capabilities(pn_connection_t *connection)
 {
-  if (!connection) return NULL;
+  assert(connection);
   return connection->transport ? connection->transport->remote_desired_capabilities : NULL;
 }
 
+pn_data_t *pn_connection_remote_properties(pn_connection_t *connection)
+{
+  assert(connection);
+  return connection->transport ? connection->transport->remote_properties : NULL;
+}
+
 const char *pn_connection_remote_container(pn_connection_t *connection)
 {
-  if (!connection) return NULL;
+  assert(connection);
   return connection->transport ? connection->transport->remote_container : NULL;
 }
 
 const char *pn_connection_remote_hostname(pn_connection_t *connection)
 {
-  if (!connection) return NULL;
+  assert(connection);
   return connection->transport ? connection->transport->remote_hostname : NULL;
 }
 
 pn_delivery_t *pn_work_head(pn_connection_t *connection)
 {
-  if (!connection) return NULL;
+  assert(connection);
   return connection->work_head;
 }
 
 pn_delivery_t *pn_work_next(pn_delivery_t *delivery)
 {
-  if (!delivery) return NULL;
+  assert(delivery);
 
   if (delivery->work)
     return delivery->work_next;
@@ -769,6 +786,7 @@ void pn_transport_init(pn_transport_t *t
   transport->last_bytes_output = 0;
   transport->remote_offered_capabilities = pn_data(16);
   transport->remote_desired_capabilities = pn_data(16);
+  transport->remote_properties = pn_data(16);
   transport->error = pn_error();
   pn_condition_init(&transport->remote_condition);
 
@@ -1408,12 +1426,14 @@ int pn_do_open(pn_dispatcher_t *disp)
   pn_bytes_t remote_container, remote_hostname;
   pn_data_clear(transport->remote_offered_capabilities);
   pn_data_clear(transport->remote_desired_capabilities);
-  int err = pn_scan_args(disp, "D.[?S?SI.I..CC]", &container_q,
+  pn_data_clear(transport->remote_properties);
+  int err = pn_scan_args(disp, "D.[?S?SI.I..CCC]", &container_q,
                          &remote_container, &hostname_q, &remote_hostname,
                          &transport->remote_max_frame,
                          &transport->remote_idle_timeout,
                          transport->remote_offered_capabilities,
-                         transport->remote_desired_capabilities);
+                         transport->remote_desired_capabilities,
+                         transport->remote_properties);
   if (err) return err;
   if (transport->remote_max_frame > 0) {
     if (transport->remote_max_frame < AMQP_MIN_MAX_FRAME_SIZE) {
@@ -2007,14 +2027,15 @@ int pn_process_conn_setup(pn_transport_t
     if (!(endpoint->state & PN_LOCAL_UNINIT) && !transport->open_sent)
     {
       pn_connection_t *connection = (pn_connection_t *) endpoint;
-      int err = pn_post_frame(transport->disp, 0, "DL[SS?In?InnCC]", OPEN,
+      int err = pn_post_frame(transport->disp, 0, "DL[SS?In?InnCCC]", OPEN,
                               pn_string_get(connection->container),
                               pn_string_get(connection->hostname),
                               // if not zero, advertise our max frame size and idle timeout
                               (bool)transport->local_max_frame, transport->local_max_frame,
                               (bool)transport->local_idle_timeout, transport->local_idle_timeout,
                               connection->offered_capabilities,
-                              connection->desired_capabilities);
+                              connection->desired_capabilities,
+                              connection->properties);
       if (err) return err;
       transport->open_sent = true;
     }

Modified: qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py?rev=1491785&r1=1491784&r2=1491785&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py (original)
+++ qpid/proton/trunk/proton-j/proton-api/src/main/resources/proton.py Tue Jun 11 13:12:17 2013
@@ -38,7 +38,7 @@ from org.apache.qpid.proton.amqp.messagi
 from org.apache.qpid.proton.amqp import UnsignedInteger, UnsignedLong, UnsignedByte, UnsignedShort, Symbol, \
     Decimal32, Decimal64, Decimal128
 from jarray import zeros, array
-from java.util import EnumSet, UUID as JUUID, Date as JDate
+from java.util import EnumSet, UUID as JUUID, Date as JDate, HashMap
 from java.util.concurrent import TimeoutException as Timeout
 from java.nio import ByteBuffer
 from java.lang import Character as JCharacter, String as JString, Integer as JInteger
@@ -180,28 +180,6 @@ class Condition:
         self.description == o.description and \
         self.info == o.info)
 
-def convertToPyArray(t,a,f):
-    if a == None or len(a) == 0:
-        return None
-
-    return Array(UNDESCRIBED, t, *map(f,a))
-
-
-arrayElementMappings = {
-    JData.DataType.SYMBOL: lambda s: Symbol.valueOf(s)
-    }
-
-
-arrayTypeMappings = {
-    JData.DataType.SYMBOL: Symbol
-    }
-
-def convertFromPyArray(a):
-    if a == None:
-        return None
-
-    return array(map(arrayElementMappings[a.type],a.elements), arrayTypeMappings[a.type])
-
 def wrap_connection(impl):
   if impl: return Connection(_impl = impl)
 
@@ -210,8 +188,9 @@ class Connection(Endpoint):
   def __init__(self, _impl=None):
     Endpoint.__init__(self)
     self.impl = _impl or engineFactory.createConnection()
-    self._desired_capabilities = None
-    self._offered_capabilities = None
+    self.desired_capabilities = None
+    self.offered_capabilities = None
+    self.properties = None
 
   @property
   def writable(self):
@@ -256,35 +235,23 @@ class Connection(Endpoint):
       self.impl.setRemoteHostname(hostname)
   remote_hostname = property(_get_remote_hostname, _set_remote_hostname)
 
-  def _get_remote_offered_capabilities(self):
+  @property
+  def remote_offered_capabilities(self):
       return convertToPyArray(Data.SYMBOL, self.impl.getRemoteOfferedCapabilities(),symbol)
-  def _set_remote_offered_capabilities(self, capabilities):
-      self.impl.setRemoteOfferedCapabilities(convertFromPyArray(capabilities))
-  remote_offered_capabilities = property(_get_remote_offered_capabilities, _set_remote_offered_capabilities)
-  
-  def _get_remote_desired_capabilities(self):
+
+  @property
+  def remote_desired_capabilities(self):
       return convertToPyArray(Data.SYMBOL, self.impl.getRemoteDesiredCapabilities(),symbol)
-  def _set_remote_desired_capabilities(self, capabilities):
-      self.impl.setRemoteDesiredCapabilities(convertFromPyArray(capabilities))
-  remote_desired_capabilities = property(_get_remote_desired_capabilities, _set_remote_desired_capabilities)
-  
-  
-  def _get_offered_capabilities(self):
-      return self._offered_capabilities
-  def _set_offered_capabilities(self, capabilities):
-      self._offered_capabilities = capabilities
-      self.impl.setOfferedCapabilities(convertFromPyArray(capabilities))
-  offered_capabilities = property(_get_offered_capabilities, _set_offered_capabilities)
-  
-  def _get_desired_capabilities(self):
-      return self._desired_capabilities
-  def _set_desired_capabilities(self, capabilities):
-      self._desired_capabilities = capabilities
-      self.impl.setDesiredCapabilities(convertFromPyArray(capabilities))
-  desired_capabilities = property(_get_desired_capabilities, _set_desired_capabilities)
-  
-  
 
+  @property
+  def remote_properties(self):
+    return J2PY(self.impl.getRemoteProperties());
+
+  def open(self):
+    self.impl.setOfferedCapabilities(PY2J(self.offered_capabilities))
+    self.impl.setDesiredCapabilities(PY2J(self.desired_capabilities))
+    self.impl.setProperties(PY2J(self.properties))
+    Endpoint.open(self)
 
 def wrap_session(impl):
   # XXX
@@ -1455,6 +1422,46 @@ class Listener(object):
   def __init__(self, *args, **kwargs):
     raise ProtonUnsupportedOperationException()
 
+def convertToPyArray(t,a,f):
+    if a == None or len(a) == 0:
+        return None
+
+    return Array(UNDESCRIBED, t, *map(f,a))
+
+
+arrayElementMappings = {
+    JData.DataType.SYMBOL: lambda s: Symbol.valueOf(s)
+    }
+
+arrayTypeMappings = {
+    JData.DataType.SYMBOL: Symbol
+    }
+
+conversions_J2PY = {
+  dict: lambda d: dict([(J2PY(k), J2PY(v)) for k, v in d.items()]),
+  HashMap: lambda m: dict([(J2PY(e.getKey()), J2PY(e.getValue())) for e in m.entrySet()]),
+  list: lambda l: [J2PY(x) for x in l],
+  Symbol: lambda s: symbol(s.toString())
+  }
+
+conversions_PY2J = {
+  dict: lambda d: dict([(PY2J(k), PY2J(v)) for k, v in d.items()]),
+  list: lambda l: [PY2J(x) for x in l],
+  symbol: lambda s: Symbol.valueOf(s),
+  Array: lambda a: array(map(arrayElementMappings[a.type], a.elements),
+                         arrayTypeMappings[a.type])
+  }
+
+def identity(x): return x
+
+def J2PY(obj):
+  result = conversions_J2PY.get(type(obj), identity)(obj)
+  return result
+
+def PY2J(obj):
+  result = conversions_PY2J.get(type(obj), identity)(obj)
+  return result
+
 __all__ = [
            "ACCEPTED",
            "Array",

Modified: qpid/proton/trunk/tests/python/proton_tests/engine.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/engine.py?rev=1491785&r1=1491784&r2=1491785&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/engine.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/engine.py Tue Jun 11 13:12:17 2013
@@ -186,6 +186,16 @@ class ConnectionTest(Test):
     rcond = self.c2.remote_condition
     assert rcond == cond, (rcond, cond)
 
+  def test_properties(self, p1={symbol("key"): symbol("value")}, p2=None):
+    self.c1.properties = p1
+    self.c2.properties = p2
+    self.c1.open()
+    self.c2.open()
+    self.pump()
+
+    assert self.c2.remote_properties == p1, (self.c2.remote_properties, p1)
+    assert self.c1.remote_properties == p2, (self.c2.remote_properties, p2)
+
 class SessionTest(Test):
 
   def setup(self):



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org