You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2013/06/28 14:23:09 UTC
svn commit: r1497748 - in /qpid/trunk/qpid/cpp/src/qpid/messaging/amqp:
AddressHelper.cpp AddressHelper.h
Author: gsim
Date: Fri Jun 28 12:23:09 2013
New Revision: 1497748
URL: http://svn.apache.org/r1497748
Log:
QPID-4965: check filters on assert
Modified:
qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h
Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp?rev=1497748&r1=1497747&r2=1497748&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp Fri Jun 28 12:23:09 2013
@@ -105,6 +105,12 @@ pn_bytes_t convert(const std::string& s)
result.size = s.size();
return result;
}
+
+std::string convert(pn_bytes_t in)
+{
+ return std::string(in.start, in.size);
+}
+
bool hasWildcards(const std::string& key)
{
return key.find('*') != std::string::npos || key.find('#') != std::string::npos;
@@ -356,9 +362,9 @@ void AddressHelper::addFilter(const qpid
}
-AddressHelper::Filter::Filter() : descriptorCode(0){}
-AddressHelper::Filter::Filter(const std::string& n, uint64_t d, const qpid::types::Variant& v) : name(n), descriptorCode(d), value(v) {}
-AddressHelper::Filter::Filter(const std::string& n, const std::string& d, const qpid::types::Variant& v) : name(n), descriptorSymbol(d), descriptorCode(0), value(v) {}
+AddressHelper::Filter::Filter() : descriptorCode(0), confirmed(false) {}
+AddressHelper::Filter::Filter(const std::string& n, uint64_t d, const qpid::types::Variant& v) : name(n), descriptorCode(d), value(v), confirmed(false) {}
+AddressHelper::Filter::Filter(const std::string& n, const std::string& d, const qpid::types::Variant& v) : name(n), descriptorSymbol(d), descriptorCode(0), value(v), confirmed(false) {}
void AddressHelper::addFilter(const std::string& name, uint64_t descriptor, const qpid::types::Variant& value)
{
@@ -373,7 +379,7 @@ void AddressHelper::checkAssertion(pn_te
{
if (assertEnabled(mode)) {
QPID_LOG(debug, "checking assertions: " << capabilities);
- //ensure all desired capabilities have been offerred
+ //ensure all desired capabilities have been offered
std::set<std::string> desired;
if (type.size()) desired.insert(type);
if (durableNode) desired.insert(DURABLE);
@@ -398,6 +404,57 @@ void AddressHelper::checkAssertion(pn_te
}
throw qpid::messaging::AssertionFailed(missing.str());
}
+
+ //ensure all desired filters are in use
+ data = pn_terminus_filter(terminus);
+ if (pn_data_next(data)) {
+ size_t count = pn_data_get_map(data);
+ pn_data_enter(data);
+ for (size_t i = 0; i < count && pn_data_next(data); ++i) {
+ //skip key:
+ if (!pn_data_next(data)) break;
+ //expecting described value:
+ if (pn_data_is_described(data)) {
+ pn_data_enter(data);
+ pn_data_next(data);
+ if (pn_data_type(data) == PN_ULONG) {
+ confirmFilter(pn_data_get_ulong(data));
+ } else if (pn_data_type(data) == PN_SYMBOL) {
+ confirmFilter(convert(pn_data_get_symbol(data)));
+ }
+ pn_data_exit(data);
+ }
+ }
+ pn_data_exit(data);
+ }
+ std::stringstream missing;
+ missing << "Desired filters not in use: ";
+ bool first(true);
+ for (std::vector<Filter>::iterator i = filters.begin(); i != filters.end(); ++i) {
+ if (!i->confirmed) {
+ if (first) first = false;
+ else missing << ", ";
+ missing << i->name << "(";
+ if (i->descriptorSymbol.empty()) missing << "0x" << std::hex << i->descriptorCode;
+ else missing << i->descriptorSymbol;
+ missing << ")";
+ }
+ }
+ if (!first) throw qpid::messaging::AssertionFailed(missing.str());
+ }
+}
+
+void AddressHelper::confirmFilter(const std::string& descriptor)
+{
+ for (std::vector<Filter>::iterator i = filters.begin(); i != filters.end(); ++i) {
+ if (descriptor == i->descriptorSymbol) i->confirmed = true;
+ }
+}
+
+void AddressHelper::confirmFilter(uint64_t descriptor)
+{
+ for (std::vector<Filter>::iterator i = filters.begin(); i != filters.end(); ++i) {
+ if (descriptor == i->descriptorCode) i->confirmed = true;
}
}
Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h?rev=1497748&r1=1497747&r2=1497748&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.h Fri Jun 28 12:23:09 2013
@@ -49,6 +49,7 @@ class AddressHelper
std::string descriptorSymbol;
uint64_t descriptorCode;
qpid::types::Variant value;
+ bool confirmed;
Filter();
Filter(const std::string& name, uint64_t descriptor, const qpid::types::Variant& value);
@@ -79,6 +80,8 @@ class AddressHelper
void addFilter(const std::string& name, uint64_t descriptor, const qpid::types::Variant& value);
void addFilter(const std::string& name, const std::string& descriptor, const qpid::types::Variant& value);
void addFilters(const qpid::types::Variant::List&);
+ void confirmFilter(const std::string& descriptor);
+ void confirmFilter(uint64_t descriptor);
};
}}} // namespace qpid::messaging::amqp
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org