summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-06-27 22:40:49 +0000
committerAlan Conway <aconway@apache.org>2007-06-27 22:40:49 +0000
commite1de334597e23b55c9e91c1f853f52e8313ba103 (patch)
tree57cc058374abbe27a0a119d795264e428fdf4579 /cpp/src
parent0efcf2c5c91f4927ccc00ad1cf391c2f964cc2e1 (diff)
downloadqpid-python-e1de334597e23b55c9e91c1f853f52e8313ba103.tar.gz
* src/qpid/broker/Plugin.h: Base class for plug-in objects.
Plugins can contribute configuration options and can call extension point functions on the broker. * src/qpid/broker/ChannelInitializer.h: Interface for plug-in objects that want to modify newly created channels, e.g. to modify the handler chains. * src/qpid/broker/Broker.h: Added extension point for plug-ins to contribute ChannelInitializer objects. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@551363 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Makefile.am5
-rw-r--r--cpp/src/qpid/broker/Broker.h5
-rw-r--r--cpp/src/qpid/broker/ChannelInitializer.h43
-rw-r--r--cpp/src/qpid/broker/Plugin.cpp67
-rw-r--r--cpp/src/qpid/broker/Plugin.h80
5 files changed, 199 insertions, 1 deletions
diff --git a/cpp/src/Makefile.am b/cpp/src/Makefile.am
index 1235c4d7fa..f0fbf7e672 100644
--- a/cpp/src/Makefile.am
+++ b/cpp/src/Makefile.am
@@ -217,7 +217,10 @@ libqpidbroker_la_SOURCES = \
qpid/broker/TopicExchange.cpp \
qpid/broker/TxAck.cpp \
qpid/broker/TxBuffer.cpp \
- qpid/broker/TxPublish.cpp
+ qpid/broker/TxPublish.cpp \
+ qpid/broker/Plugin.h \
+ qpid/broker/Plugin.cpp \
+ qpid/broker/ChannelInitializer.h
libqpidclient_la_LIBADD = libqpidcommon.la
libqpidclient_la_SOURCES = \
diff --git a/cpp/src/qpid/broker/Broker.h b/cpp/src/qpid/broker/Broker.h
index efefbd2e3e..4be3d9761e 100644
--- a/cpp/src/qpid/broker/Broker.h
+++ b/cpp/src/qpid/broker/Broker.h
@@ -40,6 +40,8 @@
namespace qpid {
namespace broker {
+class ChannelInitializer;
+
/**
* A broker instance.
*/
@@ -85,6 +87,9 @@ class Broker : public sys::Runnable,
*/
virtual void run();
+ /** Plug-in a channel initializer. */
+ void plugin(const qpid::shared_ptr<ChannelInitializer>&);
+
/** Shut down the broker */
virtual void shutdown();
diff --git a/cpp/src/qpid/broker/ChannelInitializer.h b/cpp/src/qpid/broker/ChannelInitializer.h
new file mode 100644
index 0000000000..84dea7a3d7
--- /dev/null
+++ b/cpp/src/qpid/broker/ChannelInitializer.h
@@ -0,0 +1,43 @@
+#ifndef QPID_BROKER_CHANNELINITIALIZER_H
+#define QPID_BROKER_CHANNELINITIALIZER_H
+
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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 <boost/noncopyable.hpp>
+
+namespace qpid {
+namespace broker {
+
+/**
+ * A ChannelInitializer is called each time a new Channel is created.
+ */
+class ChannelInitializer : boost::noncopyable
+{
+ public:
+ virtual ~ChannelInitializer() {}
+
+ /** Called for each new channel */
+ virtual initialize(Channe&) = 0;
+};
+
+}} // namespace qpid::broker
+
+
+
+#endif /*!QPID_BROKER_CHANNELINITIALIZER_H*/
diff --git a/cpp/src/qpid/broker/Plugin.cpp b/cpp/src/qpid/broker/Plugin.cpp
new file mode 100644
index 0000000000..f018c4e152
--- /dev/null
+++ b/cpp/src/qpid/broker/Plugin.cpp
@@ -0,0 +1,67 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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 "Plugin.h"
+
+namespace qpid {
+namespace broker {
+
+std::vector<Plugin*> Plugin::plugins;
+
+Plugin::Plugin() {
+ // Register myself.
+ plugins.push_back(this);
+}
+
+Plugin::~Plugin() {}
+
+Options* Plugin::getOptions() { return 0; }
+
+void Plugin::start(Broker&) {}
+
+void Plugin::finish(Broker&) {}
+
+const std::vector<Plugin*>& Plugin::getPlugins() { return plugins; }
+
+#ifdef USE_APR_PLATFORM
+
+#include "qpid/sys/apr/APRBase.h"
+#include "qpid/sys/apr/APRPool.h"
+#include <apr_dso.h>
+
+void Plugin::dlopen(const std::string& name) {
+ apr_dso_handle_t* handle;
+ CHECK_APR_SUCCESS(
+ apr_dso_load(&handle, name.c_str(), sys::APRPool::get()));
+}
+
+#else // Posix
+
+#include <dlfcn.h>
+
+void Plugin::dlopen(const std::string& name) {
+ dlerror();
+ dlopen(name.c_str(), RTLD_NOW);
+ const char* error = dlerror();
+ if (error) {
+ THROW_QPID_ERROR(INTERNAL_ERROR, error);
+ }
+}
+#endif // USE_APR_PLATFORM
+
+}} // namespace qpid::broker
diff --git a/cpp/src/qpid/broker/Plugin.h b/cpp/src/qpid/broker/Plugin.h
new file mode 100644
index 0000000000..8c794b86a0
--- /dev/null
+++ b/cpp/src/qpid/broker/Plugin.h
@@ -0,0 +1,80 @@
+#ifndef QPID_BROKER_PLUGIN_H
+#define QPID_BROKER_PLUGIN_H
+
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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 "qpid/Options.h"
+#include "qpid/broker/Broker.h"
+#include <boost/noncopyable.hpp>
+#include <vector>
+
+namespace qpid {
+namespace broker {
+
+/**
+ * Inherit broker plug-ins from this class, override the virtual
+ * functions and create a global (or class static member) instance in
+ * a shared library. When the library is loaded your plug-in will be
+ * registered.
+ */
+class Plugin : boost::noncopyable
+{
+ public:
+ /** Constructor registers the plugin to appear in getPlugins().
+ * Note: Plugin subclasses should only be constructed during
+ * static initialization, i.e. they should only be declared
+ * as global or static member variables.
+ */
+ Plugin();
+
+ virtual ~Plugin();
+
+ /**
+ * Override if your plugin has configuration options.
+ * They will be included in options parsing prior to broker
+ * creation setup.
+ *@return An options group or 0. Default returns 0.
+ */
+ virtual Options* getOptions();
+
+ /** Called immediately after broker creation to allow plug-ins
+ * to do whatever they do to the broker, e.g. add handler chain
+ * manipulators.
+ */
+ virtual void start(Broker& b);
+
+ /** Called just before broker shutdown. Default does nothing */
+ virtual void finish(Broker& b);
+
+ /** Get the list of registered plug-ins. */
+ static const std::vector<Plugin*>& getPlugins();
+
+ /** Load a shared library (that contains plugins presumably!) */
+ static void dlopen(const std::string& libname);
+
+ private:
+ static std::vector<Plugin*> plugins;
+};
+
+}} // namespace qpid::broker
+
+
+
+
+#endif /*!QPID_BROKER_PLUGIN_H*/