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 | 38226900d7736ceac2df70b077000bb378a1a9b4 (patch) | |
| tree | 0a758ce63442214123373d7a305d25b43120baa1 /qpid/cpp | |
| parent | 97113bb9571d753bce88cf3e5dc4ddfeec5b09e5 (diff) | |
| download | qpid-python-38226900d7736ceac2df70b077000bb378a1a9b4.tar.gz | |
QPID-5590: handle unknown exchange type for topic policy
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1626206 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp')
| -rw-r--r-- | qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp | 12 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/ExchangeRegistry.h | 18 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp | 3 |
3 files changed, 29 insertions, 4 deletions
diff --git a/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp b/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp index c43e6afc89..02eb00b7f4 100644 --- a/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp +++ b/qpid/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/qpid/cpp/src/qpid/broker/ExchangeRegistry.h b/qpid/cpp/src/qpid/broker/ExchangeRegistry.h index 99caf30269..fc741dce27 100644 --- a/qpid/cpp/src/qpid/broker/ExchangeRegistry.h +++ b/qpid/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/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp b/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp index 6546102ca7..69b41dafa2 100644 --- a/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp +++ b/qpid/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) { |
