summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2014-09-19 13:28:17 +0000
committerGordon Sim <gsim@apache.org>2014-09-19 13:28:17 +0000
commit8838838218dec2e52ef2daca21c7fb493b89d4b1 (patch)
treeb1ed665b727c94518d276f3537f958346204e22c
parentb51db5ba9941e1553251aff0924a7881cfdd23ca (diff)
downloadqpid-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.cpp12
-rw-r--r--cpp/src/qpid/broker/ExchangeRegistry.h18
-rw-r--r--cpp/src/qpid/broker/amqp/NodePolicy.cpp3
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) {