Author: gsim
Date: Tue Nov 17 10:52:33 2009
New Revision: 881236

URL: http://svn.apache.org/viewvc?rev=881236&view=rev
Log:
QPID-664: Added getReceiver()/getSender() methods to session in new api.

Modified:
    qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h
    qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h
    qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/Session.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/SessionImpl.h
    qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Receiver.h Tue Nov 17 10:52:33 
2009
@@ -110,6 +110,12 @@
      * Cancels this receiver.
      */
     QPID_CLIENT_EXTERN void cancel();
+
+    /**
+     * Returns the name of this receiver.
+     */
+    QPID_CLIENT_EXTERN const std::string& getName() const;
+
   private:
   friend class qpid::client::PrivateImplRef<Receiver>;
 };

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Sender.h Tue Nov 17 10:52:33 2009
@@ -24,6 +24,7 @@
 #include "qpid/client/ClientImportExport.h"
 #include "qpid/client/Handle.h"
 #include "qpid/sys/IntegerTypes.h"
+#include <string>
 
 namespace qpid {
 namespace client {
@@ -68,6 +69,10 @@
      */
     QPID_CLIENT_EXTERN uint32_t pending();
 
+    /**
+     * Returns the name of this sender.
+     */
+    QPID_CLIENT_EXTERN const std::string& getName() const;
   private:
   friend class qpid::client::PrivateImplRef<Sender>;
 };

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Session.h Tue Nov 17 10:52:33 
2009
@@ -21,6 +21,7 @@
  * under the License.
  *
  */
+#include "qpid/Exception.h"
 #include "qpid/client/ClientImportExport.h"
 #include "qpid/client/Handle.h"
 #include "qpid/sys/Time.h"
@@ -43,6 +44,11 @@
 class SessionImpl;
 class Subscription;
 
+struct KeyError : qpid::Exception
+{
+    QPID_CLIENT_EXTERN KeyError(const std::string&);
+};
+
 /**
  * A session represents a distinct 'conversation' which can involve
  * sending and receiving messages to and from different addresses.
@@ -103,11 +109,30 @@
      */
     QPID_CLIENT_EXTERN Receiver nextReceiver(qpid::sys::Duration 
timeout=qpid::sys::TIME_INFINITE);
     
-
+    /**
+     * Create a new sender through which messages can be sent to the
+     * specified address.
+     */
     QPID_CLIENT_EXTERN Sender createSender(const Address& address);
     QPID_CLIENT_EXTERN Sender createSender(const std::string& address);
+
+    /**
+     * Create a new receiver through which messages can be received
+     * from the specified address.
+     */
     QPID_CLIENT_EXTERN Receiver createReceiver(const Address& address);
     QPID_CLIENT_EXTERN Receiver createReceiver(const std::string& address);
+
+    /**
+     * Returns the sender with the specified name or throws KeyError
+     * if there is none for that name.
+     */
+    QPID_CLIENT_EXTERN Sender getSender(const std::string& name) const;
+    /**
+     * Returns the receiver with the specified name or throws KeyError
+     * if there is none for that name.
+     */
+    QPID_CLIENT_EXTERN Receiver getReceiver(const std::string& name) const;
   private:
   friend class qpid::client::PrivateImplRef<Session>;
 };

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.cpp Tue Nov 17 
10:52:33 2009
@@ -129,4 +129,9 @@
     parent.senderCancelled(name);
 }
 
+const std::string& SenderImpl::getName() const
+{
+    return name;
+}
+
 }}} // namespace qpid::client::amqp0_10

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SenderImpl.h Tue Nov 17 
10:52:33 2009
@@ -54,6 +54,7 @@
     uint32_t getCapacity();
     uint32_t pending();
     void init(qpid::client::AsyncSession, AddressResolution&);
+    const std::string& getName() const;
 
   private:
     SessionImpl& parent;

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp Tue Nov 17 
10:52:33 2009
@@ -39,6 +39,7 @@
 #include <boost/intrusive_ptr.hpp>
 
 using qpid::messaging::Filter;
+using qpid::messaging::KeyError;
 using qpid::messaging::MessageImplAccess;
 using qpid::messaging::Sender;
 using qpid::messaging::Receiver;
@@ -176,6 +177,28 @@
     return sender;
 }
 
+Sender SessionImpl::getSender(const std::string& name) const
+{
+    qpid::sys::Mutex::ScopedLock l(lock);
+    Senders::const_iterator i = senders.find(name);
+    if (i == senders.end()) {
+        throw KeyError(name);
+    } else {
+        return i->second;
+    }    
+}
+
+Receiver SessionImpl::getReceiver(const std::string& name) const
+{
+    qpid::sys::Mutex::ScopedLock l(lock);
+    Receivers::const_iterator i = receivers.find(name);
+    if (i == receivers.end()) {
+        throw KeyError(name);
+    } else {
+        return i->second;
+    }
+}
+
 SessionImpl& SessionImpl::convert(qpid::messaging::Session& s)
 {
     boost::intrusive_ptr<SessionImpl> impl = 
getImplPtr<qpid::messaging::Session, SessionImpl>(s);

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.h Tue Nov 17 
10:52:33 2009
@@ -65,6 +65,9 @@
     qpid::messaging::Sender createSender(const qpid::messaging::Address& 
address);
     qpid::messaging::Receiver createReceiver(const qpid::messaging::Address& 
address);
 
+    qpid::messaging::Sender getSender(const std::string& name) const;
+    qpid::messaging::Receiver getReceiver(const std::string& name) const;
+
     bool nextReceiver(qpid::messaging::Receiver& receiver, qpid::sys::Duration 
timeout);
     qpid::messaging::Receiver nextReceiver(qpid::sys::Duration timeout);
 
@@ -99,7 +102,7 @@
     typedef std::map<std::string, qpid::messaging::Receiver> Receivers;
     typedef std::map<std::string, qpid::messaging::Sender> Senders;
 
-    qpid::sys::Mutex lock;
+    mutable qpid::sys::Mutex lock;
     ConnectionImpl& connection;
     qpid::client::Session session;
     AddressResolution resolver;

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Receiver.cpp Tue Nov 17 10:52:33 2009
@@ -47,5 +47,5 @@
 uint32_t Receiver::available() { return impl->available(); }
 uint32_t Receiver::pendingAck() { return impl->pendingAck(); }
 void Receiver::cancel() { impl->cancel(); }
-
+const std::string& Receiver::getName() const { return impl->getName(); }
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/ReceiverImpl.h Tue Nov 17 10:52:33 
2009
@@ -46,6 +46,7 @@
     virtual uint32_t available() = 0;
     virtual uint32_t pendingAck() = 0;
     virtual void cancel() = 0;
+    virtual const std::string& getName() const = 0;
 };
 }} // namespace qpid::messaging
 

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Sender.cpp Tue Nov 17 10:52:33 2009
@@ -43,5 +43,6 @@
 void Sender::setCapacity(uint32_t c) { impl->setCapacity(c); }
 uint32_t Sender::getCapacity() { return impl->getCapacity(); }
 uint32_t Sender::pending() { return impl->pending(); }
+const std::string& Sender::getName() const { return impl->getName(); }
 
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/SenderImpl.h Tue Nov 17 10:52:33 2009
@@ -40,6 +40,7 @@
     virtual void setCapacity(uint32_t) = 0;
     virtual uint32_t getCapacity() = 0;
     virtual uint32_t pending() = 0;
+    virtual const std::string& getName() const = 0;
   private:
 };
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Session.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Session.cpp?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Session.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Session.cpp Tue Nov 17 10:52:33 2009
@@ -89,4 +89,15 @@
 uint32_t Session::available() { return impl->available(); }
 uint32_t Session::pendingAck() { return impl->pendingAck(); }
 
+Sender Session::getSender(const std::string& name) const
+{ 
+    return impl->getSender(name); 
+}
+Receiver Session::getReceiver(const std::string& name) const
+{ 
+    return impl->getReceiver(name); 
+}
+
+KeyError::KeyError(const std::string& msg) : Exception(msg) {}
+
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/SessionImpl.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/SessionImpl.h?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/SessionImpl.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/SessionImpl.h Tue Nov 17 10:52:33 
2009
@@ -54,6 +54,8 @@
     virtual Receiver nextReceiver(qpid::sys::Duration timeout) = 0;
     virtual uint32_t available() = 0;
     virtual uint32_t pendingAck() = 0;
+    virtual Sender getSender(const std::string& name) const = 0;
+    virtual Receiver getReceiver(const std::string& name) const = 0;
   private:
 };
 }} // namespace qpid::messaging

Modified: qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp?rev=881236&r1=881235&r2=881236&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp Tue Nov 17 10:52:33 
2009
@@ -694,6 +694,35 @@
     fix.admin.deleteQueue("q");
 }
 
+QPID_AUTO_TEST_CASE(testGetSender)
+{
+    QueueFixture fix;
+    std::string name = fix.session.createSender(fix.queue).getName();
+    Sender sender = fix.session.getSender(name);
+    BOOST_CHECK_EQUAL(name, sender.getName());
+    Message out(Uuid(true).str());
+    sender.send(out);
+    Message in;
+    BOOST_CHECK(fix.session.createReceiver(fix.queue).fetch(in));
+    BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
+    BOOST_CHECK_THROW(fix.session.getSender("UnknownSender"), 
qpid::messaging::KeyError);
+}
+
+
+QPID_AUTO_TEST_CASE(testGetReceiver)
+{
+    QueueFixture fix;
+    std::string name = fix.session.createReceiver(fix.queue).getName();
+    Receiver receiver = fix.session.getReceiver(name);
+    BOOST_CHECK_EQUAL(name, receiver.getName());
+    Message out(Uuid(true).str());
+    fix.session.createSender(fix.queue).send(out);
+    Message in;
+    BOOST_CHECK(receiver.fetch(in));
+    BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
+    BOOST_CHECK_THROW(fix.session.getReceiver("UnknownReceiver"), 
qpid::messaging::KeyError);
+}
+
 QPID_AUTO_TEST_SUITE_END()
 
 }} // namespace qpid::tests



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to