summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp')
-rw-r--r--qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp219
1 files changed, 0 insertions, 219 deletions
diff --git a/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp b/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp
deleted file mode 100644
index ba55149048..0000000000
--- a/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#include "ProtocolRegistry.h"
-#include "qpid/messaging/exceptions.h"
-#include "qpid/client/ConnectionImpl.h"
-#include "qpid/client/amqp0_10/ConnectionImpl.h"
-#include "qpid/client/LoadPlugins.h"
-#include "qpid/log/Statement.h"
-#include "qpid/sys/Mutex.h"
-#include "qpid/Options.h"
-#include "qpid/StringUtils.h"
-#include "config.h"
-#include <map>
-#include <sstream>
-#include <boost/bind.hpp>
-
-using qpid::types::Variant;
-
-namespace qpid {
-namespace messaging {
-namespace {
-struct ProtocolOptions : qpid::Options
-{
- std::string protocolDefaults;
-
- ProtocolOptions() : qpid::Options("Protocol Settings")
- {
- addOptions()
- ("protocol-defaults", optValue(protocolDefaults, "PROTOCOLS"), "Protocols to use when none are specified");
- }
-};
-const std::string SEPARATOR(", ");
-const std::string EMPTY;
-std::string join(const std::vector<std::string>& in, const std::string& base=EMPTY, const std::string& separator = SEPARATOR)
-{
- std::stringstream out;
- if (!base.empty()) out << base;
- for (std::vector<std::string>::const_iterator i = in.begin(); i != in.end(); ++i) {
- if (i != in.begin()) out << separator;
- out << *i;
- }
- return out.str();
-}
-
-typedef std::map<std::string, ProtocolRegistry::Factory*> Factories;
-typedef std::vector<ProtocolRegistry::Shutdown*> Shutdowns;
-
-ConnectionImpl* create_0_10(const std::string& url, const qpid::types::Variant::Map& options)
-{
- return new qpid::client::amqp0_10::ConnectionImpl(url, options);
-}
-
-class Registry
-{
- public:
- Registry()
- {
- factories["amqp0-10"] = &create_0_10;
- shutdowns.push_back(&qpid::client::shutdown);
- CommonOptions common("", "", QPIDC_CONF_FILE);
- ProtocolOptions options;
- try {
- common.parse(0, 0, common.clientConfig, true);
- options.parse (0, 0, common.clientConfig, true);
- } catch (const std::exception& e) {
- throw qpid::types::Exception(QPID_MSG("Failed to parse options while initialising Protocol Registry: " << e.what()));
- }
- QPID_LOG(debug, "Protocol defaults: " << options.protocolDefaults);
- if (!options.protocolDefaults.empty()) {
- split(versions, options.protocolDefaults, ", ");
- }
- }
- ProtocolRegistry::Factory* find(const std::string& name) const
- {
- Factories::const_iterator i = factories.find(name);
- if (i == factories.end()) {
- std::stringstream error;
- error << "Unsupported protocol: " << name;
- error << " (valid values are " << getNames() << ")";
- throw MessagingException(error.str());
- } else {
- return i->second;
- }
- }
- void add(const std::string& name, ProtocolRegistry::Factory* factory, ProtocolRegistry::Shutdown* shutdown)
- {
- factories[name] = factory;
- shutdowns.push_back(shutdown);
- }
- std::string getNames() const
- {
- std::stringstream names;
- for (Factories::const_iterator i = factories.begin(); i != factories.end(); ++i) {
- if (i != factories.begin()) names << ", ";
- names << i->first;
- }
- return names.str();
- }
- void collectNames(std::vector<std::string>& names) const
- {
- for (std::vector< std::string >::const_iterator i = versions.begin(); i != versions.end(); ++i) {
- Factories::const_iterator j = factories.find(*i);
- if (j == factories.end()) {
- QPID_LOG(notice, "Unsupported protocol specified in defaults " << *i);
- } else {
- names.push_back(*i);
- }
- }
- if (names.empty()) {
- if (!versions.empty()) {
- QPID_LOG(warning, "Protocol defaults specified are not valid (" << join(versions) << ") falling back to " << getNames());
- }
- for (Factories::const_iterator i = factories.begin(); i != factories.end(); ++i) {
- names.push_back(i->first);
- }
- }
- }
- void shutdown() {
- sys::Mutex::ScopedLock l(shutdownLock);
- while (!shutdowns.empty()) {
- shutdowns.back()();
- shutdowns.pop_back();
- }
- }
- private:
- Factories factories;
- Shutdowns shutdowns;
- sys::Mutex shutdownLock;
- std::vector<std::string> versions;
-};
-
-Registry& theRegistry()
-{
- static Registry factories;
- return factories;
-}
-
-bool extract(const std::string& key, Variant& value, const Variant::Map& in, Variant::Map& out)
-{
- bool matched = false;
- for (Variant::Map::const_iterator i = in.begin(); i != in.end(); ++i) {
- if (i->first == key) {
- value = i->second;
- matched = true;
- } else {
- out.insert(*i);
- }
- }
- return matched;
-}
-}
-
-ConnectionImpl* ProtocolRegistry::create(const std::string& url, const Variant::Map& options)
-{
- qpid::client::theModuleLoader();//ensure modules are loaded
- Variant name;
- Variant::Map stripped;
- std::vector<std::string> versions;
- if (extract("protocol", name, options, stripped)) {
- split(versions, name.asString(), ", ");
- } else {
- theRegistry().collectNames(versions);
- }
- bool debugOn;
- QPID_LOG_TEST(debug, debugOn);
- if (debugOn) {
- QPID_LOG(debug, "Trying versions " << join(versions));
- }
- return createInternal(versions, url, stripped, join(versions, "No suitable protocol version supported by peer, tried "));
-}
-
-ConnectionImpl* ProtocolRegistry::createInternal(const std::vector<std::string>& requested, const std::string& url, const Variant::Map& options, const std::string& error)
-{
- std::vector<std::string>::const_iterator i = requested.begin();
- if (i == requested.end())
- throw MessagingException(error);
- std::string name = *i;
- ConnectionImpl* result = theRegistry().find(name)(url, options);
- result->next = boost::bind(&ProtocolRegistry::createInternal, std::vector<std::string>(++i, requested.end()), url, options, error);
- return result;
- }
-
-ConnectionImpl* ProtocolRegistry::next(ConnectionImpl* last)
-{
- if (last->next) {
- return last->next();
- }
- throw MessagingException("No suitable protocol version supported by peer");
-}
-
-void ProtocolRegistry::add(const std::string& name, Factory* factory, Shutdown* shutdown)
-{
- theRegistry().add(name, factory, shutdown);
-}
-
-void ProtocolRegistry::shutdown() {
- theRegistry().shutdown();
-}
-
-
-}} // namespace qpid::messaging