diff options
author | Carl C. Trieloff <cctrieloff@apache.org> | 2008-10-15 17:05:31 +0000 |
---|---|---|
committer | Carl C. Trieloff <cctrieloff@apache.org> | 2008-10-15 17:05:31 +0000 |
commit | ca2c15b9121db502807221936bc146a4b5520234 (patch) | |
tree | aa1be37782166521f8a772f18d2047927506aaa5 | |
parent | 207dbcb73d225bdd21e797706a6ea2f235790f98 (diff) | |
download | qpid-python-ca2c15b9121db502807221936bc146a4b5520234.tar.gz |
QPID-1341 from Jonathan
- Patch applied for Jonathan
- Made the following changes
- added PreRoute for route() for sequencing
- changed xmlexchange form struct to class
- added xml.so to verify script
- removed two unsed files.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@704962 13f79535-47bb-0310-9956-ffa450edef68
-rwxr-xr-x | cpp/examples/verify_all | 2 | ||||
-rw-r--r-- | cpp/src/Makefile.am | 13 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Broker.h | 1 | ||||
-rw-r--r-- | cpp/src/qpid/broker/ExchangeRegistry.cpp | 8 | ||||
-rw-r--r-- | cpp/src/qpid/xml/XmlBinding.h | 37 | ||||
-rw-r--r-- | cpp/src/qpid/xml/XmlExchange.cpp (renamed from cpp/src/qpid/broker/XmlExchange.cpp) | 8 | ||||
-rw-r--r-- | cpp/src/qpid/xml/XmlExchange.h (renamed from cpp/src/qpid/broker/XmlExchange.h) | 4 | ||||
-rw-r--r-- | cpp/src/qpid/xml/XmlExchangePlugin.cpp | 67 | ||||
-rw-r--r-- | cpp/src/tests/XmlClientSessionTest.cpp | 62 | ||||
-rw-r--r-- | cpp/src/xml.mk | 10 |
10 files changed, 183 insertions, 29 deletions
diff --git a/cpp/examples/verify_all b/cpp/examples/verify_all index ea641e2443..9b09fee0df 100755 --- a/cpp/examples/verify_all +++ b/cpp/examples/verify_all @@ -9,7 +9,7 @@ exclude_regexp=$3 python=${QPID_PYTHON_DIR:-$topsrcdir/python} trap "$qpidd -q" exit -QPID_PORT=`$qpidd -dp0 --no-module-dir --data-dir "" --auth no` || { echo "Can't run qpidd" ; exit 1; } +QPID_PORT=`$qpidd -dp0 --no-module-dir --data-dir "" --auth no --load-module $topsrcdir/cpp/src/.libs/xml.so` || { echo "Can't run qpidd" ; exit 1; } PYTHON_EXAMPLES=$python/examples PYTHONPATH=$python:$PYTHONPATH export QPID_PORT PYTHON_EXAMPLES PYTHONPATH diff --git a/cpp/src/Makefile.am b/cpp/src/Makefile.am index cde2847728..37fa6b50d6 100644 --- a/cpp/src/Makefile.am +++ b/cpp/src/Makefile.am @@ -115,6 +115,7 @@ cmodule_LTLIBRARIES = include cluster.mk include acl.mk include qmf.mk +include xml.mk # The logger library uses boost::date_time to format time. # We have to disable the unused parameters warning to get around @@ -285,9 +286,6 @@ libqpidcommon_la_SOURCES = \ qpid/pointer_to_other.h libqpidbroker_la_LIBADD = libqpidcommon.la -luuid -if HAVE_XML -libqpidbroker_la_LIBADD += -lxerces-c -lxqilla -endif if HAVE_SASL libqpidbroker_la_LIBADD += -lsasl2 endif @@ -360,11 +358,6 @@ libqpidbroker_la_SOURCES = \ qpid/management/ManagementExchange.cpp \ qpid/sys/TCPIOPlugin.cpp -if HAVE_XML -libqpidbroker_la_SOURCES += qpid/broker/XmlExchange.cpp -endif - - libqpidclient_la_LIBADD = libqpidcommon.la -luuid libqpidclient_la_SOURCES = \ @@ -637,10 +630,6 @@ nobase_include_HEADERS = \ qpid/sys/TimeoutHandler.h \ qpid/sys/uuid.h -if HAVE_XML -nobase_include_HEADERS += qpid/broker/XmlExchange.h -endif - # Force build of qpidd during dist phase so help2man will work. dist-hook: $(BUILT_SOURCES) $(MAKE) qpidd diff --git a/cpp/src/qpid/broker/Broker.h b/cpp/src/qpid/broker/Broker.h index 97a4a36eca..a7496f1510 100644 --- a/cpp/src/qpid/broker/Broker.h +++ b/cpp/src/qpid/broker/Broker.h @@ -129,7 +129,6 @@ class Broker : public sys::Runnable, public Plugin::Target, std::vector<Url> knownBrokers; std::vector<Url> getKnownBrokersImpl(); - public: diff --git a/cpp/src/qpid/broker/ExchangeRegistry.cpp b/cpp/src/qpid/broker/ExchangeRegistry.cpp index 309e88e8be..7abb2ad443 100644 --- a/cpp/src/qpid/broker/ExchangeRegistry.cpp +++ b/cpp/src/qpid/broker/ExchangeRegistry.cpp @@ -25,9 +25,6 @@ #include "FanOutExchange.h" #include "HeadersExchange.h" #include "TopicExchange.h" -#ifdef HAVE_XML -#include "XmlExchange.h" -#endif #include "qpid/management/ManagementExchange.h" #include "qpid/framing/reply_exceptions.h" @@ -61,11 +58,6 @@ pair<Exchange::shared_ptr, bool> ExchangeRegistry::declare(const string& name, c }else if (type == ManagementExchange::typeName) { exchange = Exchange::shared_ptr(new ManagementExchange(name, durable, args, parent)); } -#ifdef HAVE_XML - else if (type == XmlExchange::typeName) { - exchange = Exchange::shared_ptr(new XmlExchange(name, durable, args, parent)); - } -#endif else{ FunctionMap::iterator i = factory.find(type); if (i == factory.end()) { diff --git a/cpp/src/qpid/xml/XmlBinding.h b/cpp/src/qpid/xml/XmlBinding.h new file mode 100644 index 0000000000..cc6b4dca5d --- /dev/null +++ b/cpp/src/qpid/xml/XmlBinding.h @@ -0,0 +1,37 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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/framing/FieldTable> +#include <string> + +#ifndef _XmlBinding_ +#define _XmlBinding_ + +namespace qpid { +namespace client { + +class XmlBinding : public framing::FieldTable { + public: + setQuery(string query) { setString("xquery", query); } +}; + +} +} +#endif diff --git a/cpp/src/qpid/broker/XmlExchange.cpp b/cpp/src/qpid/xml/XmlExchange.cpp index 0ff5b2fdbf..53eb0f20b8 100644 --- a/cpp/src/qpid/broker/XmlExchange.cpp +++ b/cpp/src/qpid/xml/XmlExchange.cpp @@ -20,17 +20,19 @@ */ #include "config.h" + #include "XmlExchange.h" -#include "DeliverableMessage.h" +#include "qpid/broker/DeliverableMessage.h" #include "qpid/log/Statement.h" #include "qpid/framing/FieldTable.h" #include "qpid/framing/FieldValue.h" #include "qpid/framing/reply_exceptions.h" -#include <xercesc/framework/MemBufInputSource.hpp> +#include "qpid/Plugin.h" +#include <xercesc/framework/MemBufInputSource.hpp> #include <xqilla/context/ItemFactory.hpp> #include <xqilla/xqilla-simple.hpp> @@ -45,6 +47,7 @@ namespace _qmf = qmf::org::apache::qpid::broker; namespace qpid { namespace broker { + XmlExchange::XmlExchange(const string& _name, Manageable* _parent) : Exchange(_name, _parent) { if (mgmtExchange != 0) @@ -176,6 +179,7 @@ bool XmlExchange::matches(Query& query, Deliverable& msg, const qpid::framing::F void XmlExchange::route(Deliverable& msg, const string& routingKey, const FieldTable* args) { + PreRoute pr(msg, this); try { XmlBinding::vector::ConstPtr p; { diff --git a/cpp/src/qpid/broker/XmlExchange.h b/cpp/src/qpid/xml/XmlExchange.h index 57d6c26e0d..066a26489d 100644 --- a/cpp/src/qpid/broker/XmlExchange.h +++ b/cpp/src/qpid/xml/XmlExchange.h @@ -21,11 +21,11 @@ #ifndef _XmlExchange_ #define _XmlExchange_ -#include "Exchange.h" +#include "qpid/broker/Exchange.h" #include "qpid/framing/FieldTable.h" #include "qpid/sys/CopyOnWriteArray.h" #include "qpid/sys/Monitor.h" -#include "Queue.h" +#include "qpid/broker/Queue.h" #include <xqilla/xqilla-simple.hpp> diff --git a/cpp/src/qpid/xml/XmlExchangePlugin.cpp b/cpp/src/qpid/xml/XmlExchangePlugin.cpp new file mode 100644 index 0000000000..97e221589d --- /dev/null +++ b/cpp/src/qpid/xml/XmlExchangePlugin.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 <sstream> +#include "qpid/acl/Acl.h" +#include "qpid/broker/Broker.h" +#include "qpid/Plugin.h" +#include "qpid/shared_ptr.h" +#include "qpid/log/Statement.h" + +#include <boost/utility/in_place_factory.hpp> + +#include "XmlExchange.h" + +namespace qpid { +namespace broker { // ACL uses the acl namespace here - should I? + +using namespace std; + +Exchange::shared_ptr create(const std::string& name, bool durable, + const framing::FieldTable& args, + management::Manageable* parent) +{ + Exchange::shared_ptr e(new XmlExchange(name, durable, args, parent)); + return e; +} + + +class XmlExchangePlugin : public Plugin +{ +public: + void earlyInitialize(Plugin::Target& target); + void initialize(Plugin::Target& target); +}; + + +void XmlExchangePlugin::initialize(Plugin::Target& target) +{ + Broker* broker = dynamic_cast<broker::Broker*>(&target); + if (broker) { + broker->getExchanges().registerType(XmlExchange::typeName, &create); + QPID_LOG(info, "Registered xml exchange"); + } +} + +void XmlExchangePlugin::earlyInitialize(Target&) {} + + +static XmlExchangePlugin matchingPlugin; + + +}} // namespace qpid::acl diff --git a/cpp/src/tests/XmlClientSessionTest.cpp b/cpp/src/tests/XmlClientSessionTest.cpp index fc92a338a8..df515a6adb 100644 --- a/cpp/src/tests/XmlClientSessionTest.cpp +++ b/cpp/src/tests/XmlClientSessionTest.cpp @@ -20,6 +20,7 @@ */ #include "unit_test.h" #include "BrokerFixture.h" +#include "qpid/sys/Shlib.h" #include "qpid/sys/Monitor.h" #include "qpid/sys/Thread.h" #include "qpid/sys/Runnable.h" @@ -43,11 +44,13 @@ using namespace qpid::client; using namespace qpid::client::arg; using namespace qpid::framing; using namespace qpid; +using qpid::sys::Shlib; using qpid::sys::Monitor; using std::string; using std::cout; using std::endl; +Shlib shlib("../.libs/xml.so"); struct DummyListener : public sys::Runnable, public MessageListener { std::vector<Message> messages; @@ -118,6 +121,8 @@ struct ClientSessionFixture : public ProxySessionFixture // ########### START HERE #################################### + + QPID_AUTO_TEST_CASE(testXmlBinding) { ClientSessionFixture f; @@ -149,9 +154,10 @@ QPID_AUTO_TEST_CASE(testXmlBinding) { /** * Ensure that multiple queues can be bound using the same routing key */ -QPID_AUTO_TEST_CASE(testBindMultipleQueues) { +QPID_AUTO_TEST_CASE(testXMLBindMultipleQueues) { ClientSessionFixture f; + f.session.exchangeDeclare(arg::exchange="xml", arg::type="xml"); f.session.queueDeclare(arg::queue="blue", arg::exclusive=true, arg::autoDelete=true); f.session.queueDeclare(arg::queue="red", arg::exclusive=true, arg::autoDelete=true); @@ -176,9 +182,59 @@ QPID_AUTO_TEST_CASE(testBindMultipleQueues) { BOOST_CHECK_EQUAL(sent2.getData(), received.getData()); } -//### Test: Bad XML does not kill the server +//### Test: Bad XML does not kill the server - and does not even +// raise an exception, the content is not required to be XML. + +QPID_AUTO_TEST_CASE(testXMLSendBadXML) { + ClientSessionFixture f; + + f.session.exchangeDeclare(arg::exchange="xml", arg::type="xml"); + f.session.queueDeclare(arg::queue="blue", arg::exclusive=true, arg::autoDelete=true)\ + ; + f.session.queueDeclare(arg::queue="red", arg::exclusive=true, arg::autoDelete=true); + + FieldTable blue; + blue.setString("xquery", "./colour = 'blue'"); + f.session.exchangeBind(arg::exchange="xml", arg::queue="blue", arg::bindingKey="by-c\ +olour", arg::arguments=blue); + FieldTable red; + red.setString("xquery", "./colour = 'red'"); + f.session.exchangeBind(arg::exchange="xml", arg::queue="red", arg::bindingKey="by-co\ +lour", arg::arguments=red); + + Message sent1("<>colour>blue</colour>", "by-colour"); + f.session.messageTransfer(arg::content=sent1, arg::destination="xml"); + + BOOST_CHECK_EQUAL(1, 1); +} + + +//### Test: Bad XQuery does not kill the server, but does raise an exception + +QPID_AUTO_TEST_CASE(testXMLBadXQuery) { + ClientSessionFixture f; + + f.session.exchangeDeclare(arg::exchange="xml", arg::type="xml"); + f.session.queueDeclare(arg::queue="blue", arg::exclusive=true, arg::autoDelete=true)\ + ; + + try { + FieldTable blue; + blue.setString("xquery", "./colour $=! 'blue'"); + f.session.exchangeBind(arg::exchange="xml", arg::queue="blue", arg::bindingKey="by-c\ +olour", arg::arguments=blue); + } + catch (const InternalErrorException& e) { + return; + } + BOOST_ERROR("A bad XQuery must raise an exception when used in an XML Binding."); + +} + + +//### Test: Each session can provide its own definition for a query name + -//### Test: Bad XQuery does not kill the server //### Test: Bindings persist, surviving broker restart diff --git a/cpp/src/xml.mk b/cpp/src/xml.mk new file mode 100644 index 0000000000..011e34e576 --- /dev/null +++ b/cpp/src/xml.mk @@ -0,0 +1,10 @@ +dmodule_LTLIBRARIES += xml.la + +xml_la_SOURCES = \ + qpid/xml/XmlExchange.cpp \ + qpid/xml/XmlExchange.h \ + qpid/xml/XmlExchangePlugin.cpp + +xml_la_LIBADD = -lxerces-c -lxqilla libqpidbroker.la + +xml_la_LDFLAGS = $(PLUGINLDFLAGS) |