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 2015/08/29 00:16:34 UTC

svn commit: r1698427 - in /qpid/trunk/qpid/cpp/src/qpid: amqp/descriptors.h broker/amqp/Filter.cpp broker/amqp/Filter.h

Author: gsim
Date: Fri Aug 28 22:16:34 2015
New Revision: 1698427

URL: http://svn.apache.org/r1698427
Log:
QPID-6391: add support for no-local filter

Modified:
    qpid/trunk/qpid/cpp/src/qpid/amqp/descriptors.h
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.h

Modified: qpid/trunk/qpid/cpp/src/qpid/amqp/descriptors.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/amqp/descriptors.h?rev=1698427&r1=1698426&r2=1698427&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/amqp/descriptors.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/amqp/descriptors.h Fri Aug 28 22:16:34 2015
@@ -85,12 +85,14 @@ namespace filters {
 const std::string LEGACY_DIRECT_FILTER_SYMBOL("apache.org:legacy-amqp-direct-binding:string");
 const std::string LEGACY_TOPIC_FILTER_SYMBOL("apache.org:legacy-amqp-topic-binding:string");
 const std::string LEGACY_HEADERS_FILTER_SYMBOL("apache.org:legacy-amqp-headers-binding:map");
+const std::string NO_LOCAL_FILTER_SYMBOL("apache.org:no-local-filter:list");
 const std::string SELECTOR_FILTER_SYMBOL("apache.org:selector-filter:string");
 const std::string XQUERY_FILTER_SYMBOL("apache.org:xquery-filter:string");
 
 const uint64_t LEGACY_DIRECT_FILTER_CODE(0x0000468C00000000ULL);
 const uint64_t LEGACY_TOPIC_FILTER_CODE(0x0000468C00000001ULL);
 const uint64_t LEGACY_HEADERS_FILTER_CODE(0x0000468C00000002ULL);
+const uint64_t NO_LOCAL_FILTER_CODE(0x0000468C00000003ULL);
 const uint64_t SELECTOR_FILTER_CODE(0x0000468C00000004ULL);
 const uint64_t XQUERY_FILTER_CODE(0x0000468C00000005ULL);
 }

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.cpp?rev=1698427&r1=1698426&r2=1698427&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.cpp Fri Aug 28 22:16:34 2015
@@ -46,7 +46,7 @@ const std::string DEFAULT_XQUERY_FILTER(
 const std::string DEFAULT_XQUERY_VALUE("true()");
 const std::string WILDCARD("#");
 }
-Filter::Filter() : inHeadersMap(false) {}
+Filter::Filter() : inHeadersMap(false), nolocal(false) {}
 
 void Filter::read(pn_data_t* data)
 {
@@ -88,6 +88,9 @@ void Filter::onStringValue(const qpid::a
                 setFilter(selectorFilter, filter);
             } else if (descriptor->match(qpid::amqp::filters::XQUERY_FILTER_SYMBOL, qpid::amqp::filters::XQUERY_FILTER_CODE)) {
                 setFilter(xqueryFilter, filter);
+            } else if (descriptor && descriptor->match(qpid::amqp::filters::NO_LOCAL_FILTER_SYMBOL, qpid::amqp::filters::NO_LOCAL_FILTER_CODE)) {
+                //though the no-local-filter is define to be a list, the JMS client sends it as a string
+                nolocal = true;
             } else {
                 QPID_LOG(notice, "Skipping unrecognised string filter with key " << filter.key << " and descriptor " << filter.descriptor);
             }
@@ -155,6 +158,14 @@ void Filter::onDoubleValue(const qpid::a
     headersFilter.value[std::string(key.data, key.size)] = value;
 }
 
+bool Filter::onStartListValue(const qpid::amqp::CharSequence& /*key*/, uint32_t /*count*/, const qpid::amqp::Descriptor* descriptor)
+{
+    if (descriptor && descriptor->match(qpid::amqp::filters::NO_LOCAL_FILTER_SYMBOL, qpid::amqp::filters::NO_LOCAL_FILTER_CODE)) {
+        nolocal = true;
+    }
+    return false;
+}
+
 bool Filter::onStartMapValue(const qpid::amqp::CharSequence& key, uint32_t /*count*/, const qpid::amqp::Descriptor* descriptor)
 {
     if (inHeadersMap) {
@@ -234,6 +245,10 @@ void Filter::configure(QueueSettings& se
         settings.filter = getSelectorFilter();
         active.push_back(&selectorFilter);
     }
+    if (nolocal) {
+        settings.noLocal = true;
+        QPID_LOG(notice, "No local filter set");
+    }
 }
 
 std::string Filter::getBindingKey(boost::shared_ptr<Exchange> exchange) const

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.h?rev=1698427&r1=1698426&r2=1698427&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Filter.h Fri Aug 28 22:16:34 2015
@@ -101,6 +101,7 @@ class Filter : private qpid::amqp::MapRe
     void onLongValue(const qpid::amqp::CharSequence&, int64_t, const qpid::amqp::Descriptor*);
     void onFloatValue(const qpid::amqp::CharSequence&, float, const qpid::amqp::Descriptor*);
     void onDoubleValue(const qpid::amqp::CharSequence&, double, const qpid::amqp::Descriptor*);
+    bool onStartListValue(const qpid::amqp::CharSequence& key, uint32_t count, const qpid::amqp::Descriptor* descriptor);
     bool onStartMapValue(const qpid::amqp::CharSequence& key, uint32_t count, const qpid::amqp::Descriptor* descriptor);
     void onEndMapValue(const qpid::amqp::CharSequence& key, uint32_t count, const qpid::amqp::Descriptor* descriptor);
     void setFilter(StringFilter&, const StringFilter&);
@@ -120,6 +121,7 @@ class Filter : private qpid::amqp::MapRe
     MapFilter headersFilter;
     std::vector<FilterBase*> active;
     bool inHeadersMap;
+    bool nolocal;
 };
 }}} // namespace qpid::broker::amqp
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org