summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorKenneth Anthony Giusti <kgiusti@apache.org>2010-05-21 17:39:51 +0000
committerKenneth Anthony Giusti <kgiusti@apache.org>2010-05-21 17:39:51 +0000
commita3462820c7f5af8bbb7300334c49d47b239fe901 (patch)
treea7b80c797d774f43130dd67e9c6e00ca7fee1ced /cpp
parentb8d8b5b3b620e63052f60524ebb54ef0be92c6d1 (diff)
downloadqpid-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.py15
-rw-r--r--cpp/bindings/qmf/ruby/qmf.rb15
-rw-r--r--cpp/include/qmf/engine/Console.h3
-rw-r--r--cpp/include/qpid/console/SessionManager.h14
-rw-r--r--cpp/src/qmf/engine/ConsoleImpl.cpp30
-rw-r--r--cpp/src/qmf/engine/ConsoleImpl.h2
-rw-r--r--cpp/src/qpid/console/SessionManager.cpp27
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();