summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl C. Trieloff <cctrieloff@apache.org>2008-10-15 17:05:31 +0000
committerCarl C. Trieloff <cctrieloff@apache.org>2008-10-15 17:05:31 +0000
commitca2c15b9121db502807221936bc146a4b5520234 (patch)
treeaa1be37782166521f8a772f18d2047927506aaa5
parent207dbcb73d225bdd21e797706a6ea2f235790f98 (diff)
downloadqpid-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-xcpp/examples/verify_all2
-rw-r--r--cpp/src/Makefile.am13
-rw-r--r--cpp/src/qpid/broker/Broker.h1
-rw-r--r--cpp/src/qpid/broker/ExchangeRegistry.cpp8
-rw-r--r--cpp/src/qpid/xml/XmlBinding.h37
-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.cpp67
-rw-r--r--cpp/src/tests/XmlClientSessionTest.cpp62
-rw-r--r--cpp/src/xml.mk10
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)