Author: cctrieloff
Date: Wed Oct 15 10:05:31 2008
New Revision: 704962

URL: http://svn.apache.org/viewvc?rev=704962&view=rev
Log:
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.


Added:
    incubator/qpid/trunk/qpid/cpp/src/qpid/xml/
    incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlBinding.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchangePlugin.cpp
    incubator/qpid/trunk/qpid/cpp/src/xml.mk
Removed:
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/XmlExchange.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/XmlExchange.h
Modified:
    incubator/qpid/trunk/qpid/cpp/examples/verify_all
    incubator/qpid/trunk/qpid/cpp/src/Makefile.am
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp
    incubator/qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp

Modified: incubator/qpid/trunk/qpid/cpp/examples/verify_all
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/examples/verify_all?rev=704962&r1=704961&r2=704962&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/examples/verify_all (original)
+++ incubator/qpid/trunk/qpid/cpp/examples/verify_all Wed Oct 15 10:05:31 2008
@@ -9,7 +9,7 @@
 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

Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?rev=704962&r1=704961&r2=704962&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Wed Oct 15 10:05:31 2008
@@ -115,6 +115,7 @@
 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 @@
   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 @@
   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 @@
   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

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h?rev=704962&r1=704961&r2=704962&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h Wed Oct 15 10:05:31 
2008
@@ -129,7 +129,6 @@
     std::vector<Url> knownBrokers;
     std::vector<Url> getKnownBrokersImpl();
 
-
   public:
 
   

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp?rev=704962&r1=704961&r2=704962&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp Wed Oct 
15 10:05:31 2008
@@ -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 @@
         }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()) {

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlBinding.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlBinding.h?rev=704962&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlBinding.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlBinding.h Wed Oct 15 10:05:31 
2008
@@ -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

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp?rev=704962&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.cpp Wed Oct 15 
10:05:31 2008
@@ -0,0 +1,261 @@
+/*
+ *
+ * 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 "config.h"
+
+#include "XmlExchange.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 "qpid/Plugin.h"
+
+#include <xercesc/framework/MemBufInputSource.hpp>
+#include <xqilla/context/ItemFactory.hpp>
+#include <xqilla/xqilla-simple.hpp>
+
+#include <iostream>
+#include <sstream>
+
+using namespace qpid::framing;
+using namespace qpid::sys;
+using qpid::management::Manageable;
+namespace _qmf = qmf::org::apache::qpid::broker;
+
+namespace qpid {
+namespace broker {
+
+
+XmlExchange::XmlExchange(const string& _name, Manageable* _parent) : 
Exchange(_name, _parent)
+{
+    if (mgmtExchange != 0)
+        mgmtExchange->set_type (typeName);
+}
+
+XmlExchange::XmlExchange(const std::string& _name, bool _durable,
+                         const FieldTable& _args, Manageable* _parent) :
+    Exchange(_name, _durable, _args, _parent)
+{
+    if (mgmtExchange != 0)
+        mgmtExchange->set_type (typeName);
+}
+
+/*
+ *  Use the name of the query as the binding key.
+ *
+ *  The first time a given name is used in a binding, the query body
+ *  must be provided.After that, no query body should be present.
+ *  
+ *  To modify an installed query, the user must first unbind the
+ *  existing query, then replace it by binding again with the same
+ *  name.
+ *
+ */
+
+      // #### TODO: The Binding should take the query text
+      // #### only. Consider encapsulating the entire block, including
+      // #### the if condition.
+      
+
+bool XmlExchange::bind(Queue::shared_ptr queue, const string& routingKey, 
const FieldTable* bindingArguments)
+{
+    string queryText = bindingArguments->getAsString("xquery");
+
+    try {
+        RWlock::ScopedWlock l(lock);
+
+       XmlBinding::vector& bindings(bindingsMap[routingKey]);
+       XmlBinding::vector::ConstPtr p = bindings.snapshot();
+       if (!p || std::find_if(p->begin(), p->end(), MatchQueue(queue)) == 
p->end()) {
+           Query query(xqilla.parse(X(queryText.c_str())));
+           XmlBinding::shared_ptr binding(new XmlBinding (routingKey, queue, 
this, query));
+           bindings.add(binding);
+           QPID_LOG(trace, "Bound successfully with query: " << queryText );
+           
+           if (mgmtExchange != 0) {
+               mgmtExchange->inc_bindingCount();
+            ((_qmf::Queue*) queue->GetManagementObject())->inc_bindingCount();
+           }
+           return true;
+       } else {
+           return false;
+       }
+    }
+    catch (XQException& e) {
+        throw InternalErrorException(QPID_MSG("Could not parse xquery:"+ 
queryText));
+    }
+    catch (...) {
+        throw InternalErrorException(QPID_MSG("Unexpected error - Could not 
parse xquery:"+ queryText));
+    }
+}
+
+bool XmlExchange::unbind(Queue::shared_ptr queue, const string& routingKey, 
const FieldTable* /*args*/)
+{
+    RWlock::ScopedWlock l(lock);
+    if (bindingsMap[routingKey].remove_if(MatchQueue(queue))) {
+        if (mgmtExchange != 0) {
+            mgmtExchange->dec_bindingCount();
+            ((_qmf::Queue*) queue->GetManagementObject())->dec_bindingCount();
+        }
+        return true;
+    } else {
+        return false;      
+    }
+}
+
+bool XmlExchange::matches(Query& query, Deliverable& msg, const 
qpid::framing::FieldTable* args) 
+{
+  // ### TODO: Need istream for frameset
+  // Hack alert - the following code does not work for really large messages
+
+  string msgContent;
+
+  try {
+    msg.getMessage().getFrames().getContent(msgContent);
+
+    QPID_LOG(trace, "matches: query is [" << UTF8(query->getQueryText()) << 
"]");
+    QPID_LOG(trace, "matches: message content is [" << msgContent << "]");
+
+    boost::scoped_ptr<DynamicContext> context(query->createDynamicContext());
+    if (!context.get()) {
+        throw InternalErrorException(QPID_MSG("Query context looks munged 
..."));
+    }
+
+    XERCES_CPP_NAMESPACE::MemBufInputSource xml((XMLByte*) msgContent.c_str(), 
msgContent.length(), "input" );
+    Sequence seq(context->parseDocument(xml));
+
+    if (args) {
+        FieldTable::ValueMap::const_iterator v = args->begin();
+        for(; v != args->end(); ++v) {
+            // ### TODO: Do types properly
+            if (v->second->convertsTo<std::string>()) {
+                QPID_LOG(trace, "XmlExchange, external variable: " << v->first 
<< " = " << v->second->getData().getString().c_str());
+                Item::Ptr value = 
context->getItemFactory()->createString(X(v->second->getData().getString().c_str()),
 context.get());
+                context->setExternalVariable(X(v->first.c_str()), value);
+            }
+        }
+    }
+
+    if(!seq.isEmpty() && seq.first()->isNode()) {
+      context->setContextItem(seq.first());
+      context->setContextPosition(1);
+      context->setContextSize(1);
+    }
+    Result result = query->execute(context.get());
+    return result->getEffectiveBooleanValue(context.get(), 0);
+  }
+  catch (XQException& e) {
+    QPID_LOG(warning, "Could not parse XML content (or message headers):" << 
msgContent);
+    return 0;
+  }
+  catch (...) {
+    QPID_LOG(warning, "Unexpected error routing message: " << msgContent);
+    return 0;
+  }
+  return 0;
+}
+
+void XmlExchange::route(Deliverable& msg, const string& routingKey, const 
FieldTable* args)
+{
+    PreRoute pr(msg, this);
+    try {
+        XmlBinding::vector::ConstPtr p;
+       {
+            RWlock::ScopedRlock l(lock);
+           p = bindingsMap[routingKey].snapshot();
+           if (!p) return;
+       }
+        int count(0);
+
+        for (std::vector<XmlBinding::shared_ptr>::const_iterator i = 
p->begin(); i != p->end(); i++) {
+            if ((*i)->xquery && matches((*i)->xquery, msg, args)) {   // 
Overly defensive? There should always be a query ...
+                msg.deliverTo((*i)->queue);
+                count++;
+                QPID_LOG(trace, "Delivered to queue" );
+
+                if ((*i)->mgmtBinding != 0)
+                    (*i)->mgmtBinding->inc_msgMatched ();
+            }
+       }
+       if (!count) {
+           QPID_LOG(warning, "XMLExchange " << getName() << ": could not route 
message with query " << routingKey);
+           if (mgmtExchange != 0) {
+               mgmtExchange->inc_msgDrops  ();
+               mgmtExchange->inc_byteDrops (msg.contentSize ());
+           }
+       } else {
+           if (mgmtExchange != 0) {
+               mgmtExchange->inc_msgRoutes  (count);
+               mgmtExchange->inc_byteRoutes (count * msg.contentSize ());
+           }
+       }
+
+       if (mgmtExchange != 0) {
+           mgmtExchange->inc_msgReceives  ();
+           mgmtExchange->inc_byteReceives (msg.contentSize ());
+       }
+    } catch (...) {
+        QPID_LOG(warning, "XMLExchange " << getName() << ": exception routing 
message with query " << routingKey);
+    }
+      
+
+}
+
+
+bool XmlExchange::isBound(Queue::shared_ptr queue, const string* const 
routingKey, const FieldTable* const) 
+{
+    RWlock::ScopedRlock l(lock);
+    if (routingKey) {
+        XmlBindingsMap::iterator i = bindingsMap.find(*routingKey);
+
+        if (i == bindingsMap.end())
+           return false;
+        if (!queue)
+           return true;
+        XmlBinding::vector::ConstPtr p = i->second.snapshot();
+        return p && std::find_if(p->begin(), p->end(), MatchQueue(queue)) != 
p->end();
+    } else if (!queue) {
+        //if no queue or routing key is specified, just report whether any 
bindings exist
+        return bindingsMap.size() > 0;
+    } else {
+        for (XmlBindingsMap::iterator i = bindingsMap.begin(); i != 
bindingsMap.end(); i++) {
+           XmlBinding::vector::ConstPtr p = i->second.snapshot();
+            if (p && std::find_if(p->begin(), p->end(), MatchQueue(queue)) != 
p->end()) return true;
+       }
+       return false;
+    }
+
+}
+
+
+XmlExchange::~XmlExchange() 
+{
+    bindingsMap.clear();
+}
+
+const std::string XmlExchange::typeName("xml");
+ 
+}
+}

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.h?rev=704962&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchange.h Wed Oct 15 
10:05:31 2008
@@ -0,0 +1,88 @@
+/*
+ *
+ * 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.
+ *
+ */
+#ifndef _XmlExchange_
+#define _XmlExchange_
+
+#include "qpid/broker/Exchange.h"
+#include "qpid/framing/FieldTable.h"
+#include "qpid/sys/CopyOnWriteArray.h"
+#include "qpid/sys/Monitor.h"
+#include "qpid/broker/Queue.h"
+
+#include <xqilla/xqilla-simple.hpp>
+
+#include <boost/scoped_ptr.hpp>
+
+#include <map>
+#include <vector>
+
+namespace qpid {
+namespace broker {
+
+class XmlExchange : public virtual Exchange {
+
+    typedef boost::shared_ptr<XQQuery> Query;
+
+    struct XmlBinding : public Exchange::Binding {
+        typedef boost::shared_ptr<XmlBinding> shared_ptr;
+        typedef qpid::sys::CopyOnWriteArray<XmlBinding::shared_ptr> vector;
+
+        boost::shared_ptr<XQQuery> xquery;
+
+        XmlBinding(const std::string& key, const Queue::shared_ptr queue, 
Exchange* parent, Query query):
+            Binding(key, queue, parent), xquery(query) {}
+    };
+
+        
+    typedef std::map<string, XmlBinding::vector > XmlBindingsMap;
+
+    XmlBindingsMap bindingsMap;
+    XQilla xqilla;
+    qpid::sys::RWlock lock;
+
+    bool matches(Query& query, Deliverable& msg, const 
qpid::framing::FieldTable* args);
+
+  public:
+    static const std::string typeName;
+        
+    XmlExchange(const std::string& name, management::Manageable* parent = 0);
+    XmlExchange(const string& _name, bool _durable,
+               const qpid::framing::FieldTable& _args, management::Manageable* 
parent = 0);
+
+    virtual std::string getType() const { return typeName; }
+        
+    virtual bool bind(Queue::shared_ptr queue, const std::string& routingKey, 
const qpid::framing::FieldTable* args);
+
+    virtual bool unbind(Queue::shared_ptr queue, const std::string& 
routingKey, const qpid::framing::FieldTable* args);
+
+    virtual void route(Deliverable& msg, const std::string& routingKey, const 
qpid::framing::FieldTable* args);
+
+    virtual bool isBound(Queue::shared_ptr queue, const string* const 
routingKey, const qpid::framing::FieldTable* const args);
+
+    virtual ~XmlExchange();
+};
+
+
+}
+}
+
+
+#endif

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchangePlugin.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchangePlugin.cpp?rev=704962&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchangePlugin.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/xml/XmlExchangePlugin.cpp Wed Oct 15 
10:05:31 2008
@@ -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

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp?rev=704962&r1=704961&r2=704962&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/XmlClientSessionTest.cpp Wed Oct 15 
10:05:31 2008
@@ -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::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 @@
 
 // ########### START HERE ####################################
 
+
+
 QPID_AUTO_TEST_CASE(testXmlBinding) {
   ClientSessionFixture f;
 
@@ -149,9 +154,10 @@
 /**
  * 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 @@
     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
 

Added: incubator/qpid/trunk/qpid/cpp/src/xml.mk
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/xml.mk?rev=704962&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/xml.mk (added)
+++ incubator/qpid/trunk/qpid/cpp/src/xml.mk Wed Oct 15 10:05:31 2008
@@ -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)


Reply via email to