diff options
author | Gordon Sim <gsim@apache.org> | 2014-09-19 13:28:17 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2014-09-19 13:28:17 +0000 |
commit | 8838838218dec2e52ef2daca21c7fb493b89d4b1 (patch) | |
tree | b1ed665b727c94518d276f3537f958346204e22c | |
parent | b51db5ba9941e1553251aff0924a7881cfdd23ca (diff) | |
download | qpid-python-8838838218dec2e52ef2daca21c7fb493b89d4b1.tar.gz |
QPID-5590: handle unknown exchange type for topic policy
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1626206 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | cpp/src/qpid/broker/ExchangeRegistry.cpp | 12 | ||||
-rw-r--r-- | cpp/src/qpid/broker/ExchangeRegistry.h | 18 | ||||
-rw-r--r-- | cpp/src/qpid/broker/amqp/NodePolicy.cpp | 3 |
3 files changed, 29 insertions, 4 deletions
diff --git a/cpp/src/qpid/broker/ExchangeRegistry.cpp b/cpp/src/qpid/broker/ExchangeRegistry.cpp index c43e6afc89..02eb00b7f4 100644 --- a/cpp/src/qpid/broker/ExchangeRegistry.cpp +++ b/cpp/src/qpid/broker/ExchangeRegistry.cpp @@ -72,7 +72,7 @@ pair<Exchange::shared_ptr, bool> ExchangeRegistry::declare( }else{ FunctionMap::iterator i = factory.find(type); if (i == factory.end()) { - throw UnknownExchangeTypeException(); + throw UnknownExchangeTypeException(type); } else { exchange = i->second(name, durable, autodelete, args, parent, broker); } @@ -155,6 +155,16 @@ void ExchangeRegistry::registerType(const std::string& type, FactoryFunction f) factory[type] = f; } +void ExchangeRegistry::checkType(const std::string& type) +{ + if (type != TopicExchange::typeName && type != DirectExchange::typeName && type != FanOutExchange::typeName + && type != HeadersExchange::typeName && type != ManagementDirectExchange::typeName + && type != ManagementTopicExchange::typeName && type != Link::exchangeTypeName + && factory.find(type) == factory.end()) { + throw UnknownExchangeTypeException(type); + } +} + namespace { diff --git a/cpp/src/qpid/broker/ExchangeRegistry.h b/cpp/src/qpid/broker/ExchangeRegistry.h index 99caf30269..fc741dce27 100644 --- a/cpp/src/qpid/broker/ExchangeRegistry.h +++ b/cpp/src/qpid/broker/ExchangeRegistry.h @@ -37,8 +37,20 @@ namespace qpid { namespace broker { - -struct UnknownExchangeTypeException{}; +namespace { +const std::string UNKNOWN_EXCHANGE_TYPE("Unknown exchange type: "); +} + +struct UnknownExchangeTypeException : std::exception +{ + const std::string message; + UnknownExchangeTypeException(const std::string& type) throw() : message(UNKNOWN_EXCHANGE_TYPE + type) {} + ~UnknownExchangeTypeException() throw() {} + const char* what() const throw() + { + return message.c_str(); + } +}; class ExchangeRegistry{ public: @@ -89,6 +101,8 @@ class ExchangeRegistry{ QPID_BROKER_EXTERN void registerType(const std::string& type, FactoryFunction); + QPID_BROKER_EXTERN void checkType(const std::string& type); + /** Call f for each exchange in the registry. */ template <class F> void eachExchange(F f) const { qpid::sys::RWlock::ScopedRlock l(lock); diff --git a/cpp/src/qpid/broker/amqp/NodePolicy.cpp b/cpp/src/qpid/broker/amqp/NodePolicy.cpp index 6546102ca7..69b41dafa2 100644 --- a/cpp/src/qpid/broker/amqp/NodePolicy.cpp +++ b/cpp/src/qpid/broker/amqp/NodePolicy.cpp @@ -160,6 +160,8 @@ TopicPolicy::TopicPolicy(Broker& broker, const std::string& pattern, const qpid: : NodePolicy(TOPIC_POLICY, pattern, props), exchangeType(getProperty(EXCHANGE_TYPE, props)), autodelete(get(AUTO_DELETE, props, !durable)) { + if (exchangeType.empty()) exchangeType = TOPIC; + broker.getExchanges().checkType(exchangeType); qpid::types::Variant::Map::const_iterator i = props.find(LIFETIME_POLICY); if (i != props.end()) { if (i->second == MANUAL) { @@ -173,7 +175,6 @@ TopicPolicy::TopicPolicy(Broker& broker, const std::string& pattern, const qpid: topicSettings = filterForTopic(props); copy(QPID_IVE, props, exchangeSettings); copy(QPID_MSG_SEQUENCE, props, exchangeSettings); - if (exchangeType.empty()) exchangeType = TOPIC; qpid::management::ManagementAgent* agent = broker.getManagementAgent(); if (agent != 0) { |