From 2b87d88b857e666ef81d31bcde3db0b17bb72ef3 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Sat, 17 Nov 2012 17:06:55 +0000 Subject: QPID-4368: Added support for some specific AMQP 0-10 derived node options git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1410748 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp | 31 +++++++++++++++++++++--- qpid/cpp/src/qpid/broker/amqp/NodeProperties.h | 7 ++++++ qpid/cpp/src/qpid/broker/amqp/Session.cpp | 8 +++--- 3 files changed, 38 insertions(+), 8 deletions(-) (limited to 'qpid/cpp/src') diff --git a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp index c12b161e8b..eea7612cb9 100644 --- a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp @@ -35,11 +35,16 @@ namespace { //distribution modes: const std::string MOVE("move"); const std::string COPY("copy"); - const std::string SUPPORTED_DIST_MODES("supported-dist-modes"); + +//AMQP 0-10 standard parameters: +const std::string DURABLE("durable"); +const std::string AUTO_DELETE("auto-delete"); +const std::string ALTERNATE_EXCHANGE("alternate-exchange"); +const std::string EXCHANGE_TYPE("exchange-type"); } -NodeProperties::NodeProperties() : queue(true) {} +NodeProperties::NodeProperties() : queue(true), durable(false), autoDelete(false), exchangeType("topic") {} void NodeProperties::read(pn_data_t* data) { @@ -53,6 +58,14 @@ void NodeProperties::process(const std::string& key, const qpid::types::Variant& if (key == SUPPORTED_DIST_MODES) { if (value == MOVE) queue = true; else if (value == COPY) queue = false; + } else if (key == DURABLE) { + durable = value; + } else if (key == AUTO_DELETE) { + autoDelete = value; + } else if (key == ALTERNATE_EXCHANGE) { + alternateExchange = value.asString(); + } else if (key == EXCHANGE_TYPE) { + exchangeType = value.asString(); } else { properties[key] = value; } @@ -140,7 +153,7 @@ void NodeProperties::onSymbolValue(const CharSequence& key, const CharSequence& QueueSettings NodeProperties::getQueueSettings() { - QueueSettings settings(false/*durable*/, false/*auto-delete*/); + QueueSettings settings(durable, autoDelete); qpid::types::Variant::Map unused; settings.populate(properties, unused); return settings; @@ -150,5 +163,17 @@ bool NodeProperties::isQueue() const { return queue; } +bool NodeProperties::isDurable() const +{ + return durable; +} +std::string NodeProperties::getExchangeType() const +{ + return exchangeType; +} +std::string NodeProperties::getAlternateExchange() const +{ + return alternateExchange; +} }}} // namespace qpid::broker::amqp diff --git a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h index 2b3a98b6bd..b81d1d712c 100644 --- a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h +++ b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h @@ -53,8 +53,15 @@ class NodeProperties : public qpid::amqp::MapReader void onSymbolValue(const qpid::amqp::CharSequence&, const qpid::amqp::CharSequence&, const qpid::amqp::Descriptor*); bool isQueue() const; QueueSettings getQueueSettings(); + bool isDurable() const; + std::string getExchangeType() const; + std::string getAlternateExchange() const; private: bool queue; + bool durable; + bool autoDelete; + std::string exchangeType; + std::string alternateExchange; qpid::types::Variant::Map properties; void process(const std::string&, const qpid::types::Variant&); diff --git a/qpid/cpp/src/qpid/broker/amqp/Session.cpp b/qpid/cpp/src/qpid/broker/amqp/Session.cpp index f0756bc14d..93b8a747dc 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Session.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/Session.cpp @@ -22,9 +22,6 @@ #include "Outgoing.h" #include "Message.h" #include "ManagedConnection.h" -#include "qpid/amqp/CharSequence.h" -#include "qpid/amqp/Descriptor.h" -#include "qpid/amqp/descriptors.h" #include "qpid/broker/AsyncCompletion.h" #include "qpid/broker/Broker.h" #include "qpid/broker/DeliverableMessage.h" @@ -99,10 +96,11 @@ Session::ResolvedNode Session::resolve(const std::string name, pn_terminus_t* te NodeProperties properties; properties.read(pn_terminus_properties(terminus)); if (properties.isQueue()) { - node.queue = broker.createQueue(name, properties.getQueueSettings(), this, "", connection.getUserid(), connection.getId()).first; + node.queue = broker.createQueue(name, properties.getQueueSettings(), this, properties.getAlternateExchange(), connection.getUserid(), connection.getId()).first; } else { qpid::framing::FieldTable args; - node.exchange = broker.createExchange(name, "topic"/*type*/, false/*durable*/, ""/*alternateExchange*/, args, connection.getUserid(), connection.getId()).first; + node.exchange = broker.createExchange(name, properties.getExchangeType(), properties.isDurable(), properties.getAlternateExchange(), + args, connection.getUserid(), connection.getId()).first; } } else if (node.queue && node.exchange) { QPID_LOG_CAT(warning, protocol, "Ambiguous node name; " << name << " could be queue or exchange, assuming queue"); -- cgit v1.2.1