Author: gsim
Date: Mon Nov 16 15:57:43 2009
New Revision: 880819

URL: http://svn.apache.org/viewvc?rev=880819&view=rev
Log:
QPID-664: Introduce ';' as delimiter bewteen name (and optionally subject) and 
the options map in address syntax.

Modified:
    qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp
    qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h
    qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp
    qpid/trunk/qpid/cpp/src/tests/Address.cpp
    qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp

Modified: qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp?rev=880819&r1=880818&r2=880819&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp (original)
+++ qpid/trunk/qpid/cpp/examples/messaging/topic_receiver.cpp Mon Nov 16 
15:57:43 2009
@@ -37,7 +37,7 @@
     try {
         Connection connection = Connection::open(url);
         Session session = connection.newSession();
-        Receiver receiver = session.createReceiver("news_service 
{filter:[control, " + pattern + "]}");
+        Receiver receiver = session.createReceiver("news_service; 
{filter:[control, " + pattern + "]}");
         while (true) {
             Message message = receiver.fetch();
             std::cout << "Message: " << message.getContent() << std::endl;

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h?rev=880819&r1=880818&r2=880819&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Address.h Mon Nov 16 15:57:43 
2009
@@ -51,7 +51,7 @@
  * All parts of an address can be specified in a string of the
  * following form:
  * 
- * <address> [ / <subject> ] [ { <key> : <value> , ... } ]
+ * <address> [ / <subject> ] ; [ { <key> : <value> , ... } ]
  * 
  * Here the <address> is a simple name for the addressed entity and
  * <subject> is a subject or subject pattern for messages sent to or

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp?rev=880819&r1=880818&r2=880819&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Address.cpp Mon Nov 16 15:57:43 2009
@@ -28,6 +28,7 @@
 
 namespace {
 const std::string SUBJECT_DIVIDER = "/";
+const std::string OPTIONS_DIVIDER = ";";
 const std::string SPACE = " ";
 const std::string TYPE = "type";
 }
@@ -54,18 +55,22 @@
     static const std::string RESERVED;
 
     bool readChar(char c);
-    bool readQuotedString(Variant& value);
-    bool readString(Variant& value, char delimiter);
-    bool readWord(std::string& word);
+    bool readQuotedString(std::string& s);
+    bool readQuotedValue(Variant& value);
+    bool readString(std::string& value, char delimiter);
+    bool readWord(std::string& word, const std::string& delims = RESERVED);
     bool readSimpleValue(Variant& word);
     bool readKey(std::string& key);
     bool readValue(Variant& value);
     bool readKeyValuePair(Variant::Map& map);
     bool readMap(Variant& value);
     bool readList(Variant& value);
+    bool readName(std::string& name);
+    bool readSubject(std::string& subject);
     bool error(const std::string& message);
     bool eos();
     bool iswhitespace();
+    bool in(const std::string& delims);
     bool isreserved();
 };
 
@@ -90,7 +95,7 @@
     std::stringstream out;
     out << impl->name;
     if (!impl->subject.empty()) out << SUBJECT_DIVIDER << impl->subject;
-    if (!impl->options.empty()) out << " {" << impl->options << "}";
+    if (!impl->options.empty()) out << OPTIONS_DIVIDER << " {" << 
impl->options << "}";
     return out.str();
 }
 Address::operator bool() const { return !impl->name.empty(); }
@@ -145,22 +150,26 @@
 bool AddressParser::parse(Address& address)
 {
     std::string name;
-    if (readWord(name)) {
+    if (readName(name)) {
         if (name.find('#') == 0) name = qpid::framing::Uuid(true).str() + name;
         address.setName(name);
         if (readChar('/')) {
             std::string subject;
-            if (readWord(subject)) {
+            if (readSubject(subject)) {
                 address.setSubject(subject);
             } else {
                 return error("Expected subject after /");
             }
         }
-        Variant options = Variant::Map();
-        if (readMap(options)) {
-            address.setOptions(options.asMap());
+        if (readChar(';')) {
+            Variant options = Variant::Map();
+            if (readMap(options)) {
+                address.setOptions(options.asMap());
+            }
         }
-        return true;
+        //skip trailing whitespace
+        while (!eos() && iswhitespace()) ++current;
+        return eos() || error("Unexpected chars in address: " + 
input.substr(current));
     } else {
         return input.empty() || error("Expected name");
     }
@@ -215,11 +224,11 @@
 
 bool AddressParser::readValue(Variant& value)
 {
-    return readSimpleValue(value) || readQuotedString(value) || 
+    return readSimpleValue(value) || readQuotedValue(value) || 
         readMap(value)  || readList(value) || error("Expected value");
 }
 
-bool AddressParser::readString(Variant& value, char delimiter)
+bool AddressParser::readString(std::string& value, char delimiter)
 {
     if (readChar(delimiter)) {
         std::string::size_type start = current++;
@@ -242,9 +251,30 @@
     }
 }
 
-bool AddressParser::readQuotedString(Variant& value)
+bool AddressParser::readName(std::string& name)
+{
+    return readQuotedString(name) || readWord(name, "/;");
+}
+
+bool AddressParser::readSubject(std::string& subject)
+{
+    return readQuotedString(subject) || readWord(subject, ";");
+}
+
+bool AddressParser::readQuotedString(std::string& s)
+{
+    return readString(s, '"') || readString(s, '\'');
+}
+
+bool AddressParser::readQuotedValue(Variant& value)
 {
-    return readString(value, '"') || readString(value, '\'');
+    std::string s;
+    if (readQuotedString(s)) {
+        value = s;
+        return true;
+    } else {
+        return false;
+    }
 }
 
 bool AddressParser::readSimpleValue(Variant& value)
@@ -260,14 +290,14 @@
     }
 }
 
-bool AddressParser::readWord(std::string& value)
+bool AddressParser::readWord(std::string& value, const std::string& delims)
 {
     //skip leading whitespace
     while (!eos() && iswhitespace()) ++current;
 
     //read any number of non-whitespace, non-reserved chars into value
     std::string::size_type start = current;
-    while (!eos() && !iswhitespace() && !isreserved()) ++current;
+    while (!eos() && !iswhitespace() && !in(delims)) ++current;
     
     if (current > start) {
         value = input.substr(start, current - start);
@@ -299,7 +329,12 @@
 
 bool AddressParser::isreserved()
 {
-    return RESERVED.find(input.at(current)) != std::string::npos;
+    return in(RESERVED);
+}
+
+bool AddressParser::in(const std::string& chars)
+{
+    return chars.find(input.at(current)) != std::string::npos;
 }
 
 bool AddressParser::eos()

Modified: qpid/trunk/qpid/cpp/src/tests/Address.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/Address.cpp?rev=880819&r1=880818&r2=880819&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/Address.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/Address.cpp Mon Nov 16 15:57:43 2009
@@ -46,7 +46,7 @@
 
 QPID_AUTO_TEST_CASE(testParseOptions)
 {
-    Address address("my-topic {a:bc, x:101, y:'a string'}");
+    Address address("my-topic; {a:bc, x:101, y:'a string'}");
     BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
     BOOST_CHECK_EQUAL(std::string("bc"), address.getOption("a").asString());
     BOOST_CHECK_EQUAL((uint16_t) 101, address.getOption("x").asInt64());
@@ -55,7 +55,7 @@
 
 QPID_AUTO_TEST_CASE(testParseSubjectAndOptions)
 {
-    Address address("my-topic/my-subject {a:bc, x:101, y:'a string'}");
+    Address address("my-topic/my-subject; {a:bc, x:101, y:'a string'}");
     BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
     BOOST_CHECK_EQUAL(std::string("my-subject"), address.getSubject());
     BOOST_CHECK_EQUAL(std::string("bc"), address.getOption("a").asString());
@@ -65,7 +65,7 @@
 
 QPID_AUTO_TEST_CASE(testParseNestedOptions)
 {
-    Address address("my-topic {a:{p:202, q:'another string'}, x:101, y:'a 
string'}");
+    Address address("my-topic; {a:{p:202, q:'another string'}, x:101, y:'a 
string'}");
     BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
     BOOST_CHECK_EQUAL((uint16_t) 202, 
address.getOptions()["a"].asMap()["p"].asInt64());
     BOOST_CHECK_EQUAL(std::string("another string"), 
address.getOptions()["a"].asMap()["q"].asString());
@@ -75,7 +75,7 @@
 
 QPID_AUTO_TEST_CASE(testParseOptionsWithList)
 {
-    Address address("my-topic {a:[202, 'another string'], x:101}");
+    Address address("my-topic; {a:[202, 'another string'], x:101}");
     BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
     Variant::List& list = address.getOptions()["a"].asList();
     Variant::List::const_iterator i = list.begin();

Modified: qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp?rev=880819&r1=880818&r2=880819&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp Mon Nov 16 15:57:43 
2009
@@ -248,7 +248,7 @@
     MessagingFixture fix;
     ScopedSuppressLogging sl;
     BOOST_CHECK_THROW(fix.session.createSender("NonExistentAddress"), 
qpid::messaging::InvalidAddress);
-    BOOST_CHECK_THROW(fix.session.createSender("NonExistentAddress 
{create:receiver, type:queue}"),
+    BOOST_CHECK_THROW(fix.session.createSender("NonExistentAddress; 
{create:receiver, type:queue}"),
                       qpid::messaging::InvalidAddress);
 }
 
@@ -257,7 +257,7 @@
     MessagingFixture fix;
     ScopedSuppressLogging sl;
     BOOST_CHECK_THROW(fix.session.createReceiver("NonExistentAddress"), 
qpid::messaging::InvalidAddress);
-    BOOST_CHECK_THROW(fix.session.createReceiver("NonExistentAddress 
{create:sender, type:queue}"),
+    BOOST_CHECK_THROW(fix.session.createReceiver("NonExistentAddress; 
{create:sender, type:queue}"),
                       qpid::messaging::InvalidAddress);
 }
 
@@ -466,9 +466,9 @@
     QueueFixture fix;
     Sender sender = fix.session.createSender(fix.queue);
     send(sender, 10);
-    Receiver browser1 = fix.session.createReceiver(fix.queue + " 
{browse:true}");
+    Receiver browser1 = fix.session.createReceiver(fix.queue + "; 
{browse:true}");
     receive(browser1, 10);
-    Receiver browser2 = fix.session.createReceiver(fix.queue + " 
{browse:true}");
+    Receiver browser2 = fix.session.createReceiver(fix.queue + "; 
{browse:true}");
     receive(browser2, 10);
     Receiver consumer = fix.session.createReceiver(fix.queue);
     receive(consumer, 10);
@@ -495,13 +495,13 @@
 
 QPID_AUTO_TEST_CASE(testCreatePolicyQueueAlways)
 {
-    QueueCreatePolicyFixture fix("# {create:always, type:queue}");
+    QueueCreatePolicyFixture fix("#; {create:always, type:queue}");
     fix.test();
 }
 
 QPID_AUTO_TEST_CASE(testCreatePolicyQueueReceiver)
 {
-    QueueCreatePolicyFixture fix("# {create:receiver, type:queue}");
+    QueueCreatePolicyFixture fix("#; {create:receiver, type:queue}");
     Receiver r = fix.session.createReceiver(fix.address);
     fix.test();
     r.cancel();
@@ -509,7 +509,7 @@
 
 QPID_AUTO_TEST_CASE(testCreatePolicyQueueSender)
 {
-    QueueCreatePolicyFixture fix("# {create:sender, type:queue}");
+    QueueCreatePolicyFixture fix("#; {create:sender, type:queue}");
     Sender s = fix.session.createSender(fix.address);
     fix.test();
     s.cancel();
@@ -539,14 +539,14 @@
 
 QPID_AUTO_TEST_CASE(testCreatePolicyTopic)
 {
-    ExchangeCreatePolicyFixture fix("# {create:always, type:topic, 
node-properties:{x-amqp0-10-exchange-type:topic}}",
+    ExchangeCreatePolicyFixture fix("#; {create:always, type:topic, 
node-properties:{x-amqp0-10-exchange-type:topic}}",
                                   "topic");
     fix.test();
 }
 
 QPID_AUTO_TEST_CASE(testCreatePolicyTopicReceiverFanout)
 {
-    ExchangeCreatePolicyFixture fix("#/my-subject {create:receiver, 
type:topic, node-properties:{x-amqp0-10-exchange-type:fanout}}", "fanout");
+    ExchangeCreatePolicyFixture fix("#/my-subject; {create:receiver, 
type:topic, node-properties:{x-amqp0-10-exchange-type:fanout}}", "fanout");
     Receiver r = fix.session.createReceiver(fix.address);
     fix.test();
     r.cancel();
@@ -554,7 +554,7 @@
 
 QPID_AUTO_TEST_CASE(testCreatePolicyTopicSenderDirect)
 {
-    ExchangeCreatePolicyFixture fix("#/my-subject {create:sender, type:topic, 
node-properties:{x-amqp0-10-exchange-type:direct}}", "direct");
+    ExchangeCreatePolicyFixture fix("#/my-subject; {create:sender, type:topic, 
node-properties:{x-amqp0-10-exchange-type:direct}}", "direct");
     Sender s = fix.session.createSender(fix.address);
     fix.test();
     s.cancel();
@@ -594,7 +594,7 @@
 
     void test(Mode mode)
     {
-        qpid::messaging::Address address("# " + getPolicy(mode));
+        qpid::messaging::Address address("#; " + getPolicy(mode));
         create(address);
 
         Sender s = session.createSender(address);
@@ -681,18 +681,18 @@
 QPID_AUTO_TEST_CASE(testAssertPolicyQueue)
 {
     MessagingFixture fix;
-    std::string a1 = "q {create:always, assert:always, type:queue, 
node-properties:{durable:false, x-amqp0-10-arguments:{qpid.max-count:100}}}";
+    std::string a1 = "q; {create:always, assert:always, type:queue, 
node-properties:{durable:false, x-amqp0-10-arguments:{qpid.max-count:100}}}";
     Sender s1 = fix.session.createSender(a1);
     s1.cancel();
     Receiver r1 = fix.session.createReceiver(a1);
     r1.cancel();
     
-    std::string a2 = "q {assert:receiver, node-properties:{durable:true, 
x-amqp0-10-arguments:{qpid.max-count:100}}}";
+    std::string a2 = "q; {assert:receiver, node-properties:{durable:true, 
x-amqp0-10-arguments:{qpid.max-count:100}}}";
     Sender s2 = fix.session.createSender(a2);
     s2.cancel();
     BOOST_CHECK_THROW(fix.session.createReceiver(a2), 
qpid::messaging::InvalidAddress);
 
-    std::string a3 = "q {assert:sender, 
node-properties:{x-amqp0-10-arguments:{qpid.max-count:99}}}";
+    std::string a3 = "q; {assert:sender, 
node-properties:{x-amqp0-10-arguments:{qpid.max-count:99}}}";
     BOOST_CHECK_THROW(fix.session.createSender(a3), 
qpid::messaging::InvalidAddress);
     Receiver r3 = fix.session.createReceiver(a3);
     r3.cancel();



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

Reply via email to