diff options
| author | Kenneth Anthony Giusti <kgiusti@apache.org> | 2010-05-21 17:39:51 +0000 |
|---|---|---|
| committer | Kenneth Anthony Giusti <kgiusti@apache.org> | 2010-05-21 17:39:51 +0000 |
| commit | a3462820c7f5af8bbb7300334c49d47b239fe901 (patch) | |
| tree | a7b80c797d774f43130dd67e9c6e00ca7fee1ced /cpp | |
| parent | b8d8b5b3b620e63052f60524ebb54ef0be92c6d1 (diff) | |
| download | qpid-python-a3462820c7f5af8bbb7300334c49d47b239fe901.tar.gz | |
QMF: add bindEvent api to allow filtering of unsolicted events.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@947084 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
| -rw-r--r-- | cpp/bindings/qmf/python/qmf.py | 15 | ||||
| -rw-r--r-- | cpp/bindings/qmf/ruby/qmf.rb | 15 | ||||
| -rw-r--r-- | cpp/include/qmf/engine/Console.h | 3 | ||||
| -rw-r--r-- | cpp/include/qpid/console/SessionManager.h | 14 | ||||
| -rw-r--r-- | cpp/src/qmf/engine/ConsoleImpl.cpp | 30 | ||||
| -rw-r--r-- | cpp/src/qmf/engine/ConsoleImpl.h | 2 | ||||
| -rw-r--r-- | cpp/src/qpid/console/SessionManager.cpp | 27 |
7 files changed, 105 insertions, 1 deletions
diff --git a/cpp/bindings/qmf/python/qmf.py b/cpp/bindings/qmf/python/qmf.py index 37442b94ea..06d3070841 100644 --- a/cpp/bindings/qmf/python/qmf.py +++ b/cpp/bindings/qmf/python/qmf.py @@ -1166,9 +1166,22 @@ class Console(Thread): if "class" in kwargs: self.impl.bindClass(package, kwargs["class"]) else: - self.impl.bindClass(package) + self.impl.bindClass(package, "*") else: raise Exception("Argument error: invalid arguments, use 'key' or 'package'[,'class']") + + + def bind_event(self, kwargs = {}): + if "key" in kwargs: + self.impl.bindEvent(kwargs["key"]) + elif "package" in kwargs: + package = kwargs["package"] + if "event" in kwargs: + self.impl.bindEvent(package, kwargs["event"]) + else: + self.impl.bindEvent(package, "*") + else: + raise Exception("Argument error: invalid arguments, use 'key' or 'package'[,'event']") def agents(self, broker=None): diff --git a/cpp/bindings/qmf/ruby/qmf.rb b/cpp/bindings/qmf/ruby/qmf.rb index e50d23a0e0..34d3255d8d 100644 --- a/cpp/bindings/qmf/ruby/qmf.rb +++ b/cpp/bindings/qmf/ruby/qmf.rb @@ -1087,6 +1087,21 @@ module Qmf end end + def bind_event(kwargs = {}) + if kwargs.include?(:key) + @impl.bindEvent(kwargs[:key]) + elsif kwargs.include?(:package) + package = kwargs[:package] + if kwargs.include?(:event) + @impl.bindEvent(package, kwargs[:event]) + else + @impl.bindEvent(package, "*") + end + else + raise ArgumentError, "Invalid arguments, use :key or :package[,:event]" + end + end + def agents(broker = nil) blist = [] if broker diff --git a/cpp/include/qmf/engine/Console.h b/cpp/include/qmf/engine/Console.h index 03b3993395..bd40c63c6c 100644 --- a/cpp/include/qmf/engine/Console.h +++ b/cpp/include/qmf/engine/Console.h @@ -217,6 +217,9 @@ namespace engine { void bindClass(const SchemaClassKey* key); void bindClass(const char* packageName, const char* className); + void bindEvent(const SchemaClassKey *key); + void bindEvent(const char* packageName, const char* eventName); + /* void startSync(const Query& query, void* context, SyncQuery& sync); void touchSync(SyncQuery& sync); diff --git a/cpp/include/qpid/console/SessionManager.h b/cpp/include/qpid/console/SessionManager.h index f27037a559..b46af549ff 100644 --- a/cpp/include/qpid/console/SessionManager.h +++ b/cpp/include/qpid/console/SessionManager.h @@ -138,6 +138,20 @@ class SessionManager QPID_CONSOLE_EXTERN void bindClass(const std::string& packageName, const std::string& className); + /** Request events from a particular package. + * + * Note that this method is only meaningful if a ConsoleListener was provided at session + * creation and if the 'userBindings' flag was set to true. + * + * @param classKey Class key of event of interest + * @param packageName Name of package of event of interest. + * @param eventName Name of event of interest. Default=All events defined by package. + */ + QPID_CONSOLE_EXTERN void bindEvent(const ClassKey& classKey); + QPID_CONSOLE_EXTERN void bindEvent(const std::string& packageName, + const std::string& eventName=""); + + /** Get a list of qmf agents known to the session manager. * *@param agents Vector of Agent objects returned by the session manager. diff --git a/cpp/src/qmf/engine/ConsoleImpl.cpp b/cpp/src/qmf/engine/ConsoleImpl.cpp index 1b66d9e81f..4a5da31bdc 100644 --- a/cpp/src/qmf/engine/ConsoleImpl.cpp +++ b/cpp/src/qmf/engine/ConsoleImpl.cpp @@ -259,6 +259,32 @@ void ConsoleImpl::bindClass(const char* packageName, const char* className) (*iter)->addBinding(QMF_EXCHANGE, key.str()); } + +void ConsoleImpl::bindEvent(const SchemaClassKey* classKey) +{ + bindEvent(classKey->getPackageName(), classKey->getClassName()); +} + +void ConsoleImpl::bindEvent(const char* packageName, const char* eventName) +{ + if (!settings.userBindings) throw qpid::Exception("Console not configured for userBindings."); + if (settings.rcvEvents) throw qpid::Exception("Console already configured to receive all events."); + + stringstream key; + key << "console.event.*.*." << packageName; + if (eventName && *eventName) { + key << "." << eventName << ".#"; + } else { + key << ".#"; + } + + Mutex::ScopedLock _lock(lock); + bindingList.push_back(pair<string, string>(string(), key.str())); + for (vector<BrokerProxyImpl*>::iterator iter = brokerList.begin(); + iter != brokerList.end(); iter++) + (*iter)->addBinding(QMF_EXCHANGE, key.str()); +} + /* void ConsoleImpl::startSync(const Query& query, void* context, SyncQuery& sync) { @@ -421,6 +447,10 @@ const SchemaEventClass* Console::getEventClass(const SchemaClassKey* key) const void Console::bindPackage(const char* packageName) { impl->bindPackage(packageName); } void Console::bindClass(const SchemaClassKey* key) { impl->bindClass(key); } void Console::bindClass(const char* packageName, const char* className) { impl->bindClass(packageName, className); } + +void Console::bindEvent(const SchemaClassKey *key) { impl->bindEvent(key); } +void Console::bindEvent(const char* packageName, const char* eventName) { impl->bindEvent(packageName, eventName); } + //void Console::startSync(const Query& query, void* context, SyncQuery& sync) { impl->startSync(query, context, sync); } //void Console::touchSync(SyncQuery& sync) { impl->touchSync(sync); } //void Console::endSync(SyncQuery& sync) { impl->endSync(sync); } diff --git a/cpp/src/qmf/engine/ConsoleImpl.h b/cpp/src/qmf/engine/ConsoleImpl.h index ace47ec87c..0c27fdabcd 100644 --- a/cpp/src/qmf/engine/ConsoleImpl.h +++ b/cpp/src/qmf/engine/ConsoleImpl.h @@ -94,6 +94,8 @@ namespace engine { void bindPackage(const char* packageName); void bindClass(const SchemaClassKey* key); void bindClass(const char* packageName, const char* className); + void bindEvent(const SchemaClassKey* key); + void bindEvent(const char* packageName, const char* eventName); /* void startSync(const Query& query, void* context, SyncQuery& sync); diff --git a/cpp/src/qpid/console/SessionManager.cpp b/cpp/src/qpid/console/SessionManager.cpp index 0285c5f34a..4f39095a54 100644 --- a/cpp/src/qpid/console/SessionManager.cpp +++ b/cpp/src/qpid/console/SessionManager.cpp @@ -138,6 +138,33 @@ void SessionManager::bindClass(const std::string& packageName, const std::string (*iter)->addBinding(key.str()); } + +void SessionManager::bindEvent(const ClassKey& classKey) +{ + bindEvent(classKey.getPackageName(), classKey.getClassName()); +} + + +void SessionManager::bindEvent(const std::string& packageName, const std::string& eventName) +{ + if (!settings.userBindings) throw Exception("Session not configured for userBindings."); + if (settings.rcvEvents) throw Exception("Session already configured to receive all events."); + + stringstream key; + key << "console.event.*.*." << packageName; + if (eventName.length()) { + key << "." << eventName << ".#"; + } else { + key << ".#"; + } + + bindingKeyList.push_back(key.str()); + for (vector<Broker*>::iterator iter = brokers.begin(); + iter != brokers.end(); iter++) + (*iter)->addBinding(key.str()); +} + + void SessionManager::getAgents(Agent::Vector& agents, Broker* broker) { agents.clear(); |
