You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2010/03/30 23:35:13 UTC

svn commit: r929307 [3/5] - in /qpid/branches/qmf-devel0.7a: ./ qpid/ qpid/cpp/bindings/qmf/python/ qpid/cpp/bindings/qmf/ruby/ qpid/cpp/bindings/qmf/tests/ qpid/cpp/examples/messaging/ qpid/cpp/examples/tradedemo/ qpid/cpp/include/qmf/engine/ qpid/cpp...

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/MessagingSessionTests.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/MessagingSessionTests.cpp?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/MessagingSessionTests.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/MessagingSessionTests.cpp Tue Mar 30 21:35:08 2010
@@ -48,6 +48,7 @@ namespace tests {
 QPID_AUTO_TEST_SUITE(MessagingSessionTests)
 
 using namespace qpid::messaging;
+using namespace qpid::types;
 using namespace qpid;
 using qpid::broker::Broker;
 using qpid::framing::Uuid;
@@ -130,7 +131,7 @@ struct MessagingFixture : public BrokerF
         Message out(Uuid(true).str());
         s.send(out);
         Message in;
-        BOOST_CHECK(r.fetch(in, 5*DURATION_SEC));
+        BOOST_CHECK(r.fetch(in, 5*Duration::SECOND));
         BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
         r.close();
         s.close();
@@ -196,7 +197,7 @@ struct MultiQueueFixture : MessagingFixt
     }
 
 };
-std::vector<std::string> fetch(Receiver& receiver, int count, Duration timeout=DURATION_SEC*5)
+std::vector<std::string> fetch(Receiver& receiver, int count, Duration timeout=Duration::SECOND*5)
 {
     std::vector<std::string> data;
     Message message;
@@ -215,7 +216,7 @@ void send(Sender& sender, uint count = 1
 }
 
 void receive(Receiver& receiver, uint count = 1, uint start = 1,
-             const std::string& base = "Message", Duration timeout=DURATION_SEC*5)
+             const std::string& base = "Message", Duration timeout=Duration::SECOND*5)
 {
     for (uint i = start; i < start + count; ++i) {
         BOOST_CHECK_EQUAL(receiver.fetch(timeout).getContent(), (boost::format("%1%_%2%") % base % i).str());
@@ -229,7 +230,7 @@ QPID_AUTO_TEST_CASE(testSimpleSendReceiv
     Message out("test-message");
     sender.send(out);
     Receiver receiver = fix.session.createReceiver(fix.queue);
-    Message in = receiver.fetch(5 * DURATION_SEC);
+    Message in = receiver.fetch(Duration::SECOND * 5);
     fix.session.acknowledge();
     BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
 }
@@ -240,15 +241,15 @@ QPID_AUTO_TEST_CASE(testSendReceiveHeade
     Sender sender = fix.session.createSender(fix.queue);
     Message out("test-message");
     for (uint i = 0; i < 10; ++i) {
-        out.getHeaders()["a"] = i;
+        out.getProperties()["a"] = i;
         sender.send(out);
     }
     Receiver receiver = fix.session.createReceiver(fix.queue);
     Message in;
     for (uint i = 0; i < 10; ++i) {
-        BOOST_CHECK(receiver.fetch(in, 5 * DURATION_SEC));
+        BOOST_CHECK(receiver.fetch(in, Duration::SECOND * 5));
         BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
-        BOOST_CHECK_EQUAL(in.getHeaders()["a"].asUint32(), i);
+        BOOST_CHECK_EQUAL(in.getProperties()["a"].asUint32(), i);
         fix.session.acknowledge();
     }
 }
@@ -300,7 +301,7 @@ QPID_AUTO_TEST_CASE(testSimpleTopic)
     BOOST_CHECK_EQUAL(fetch(sub1, 4), boost::assign::list_of<std::string>("two")("three")("four")("five"));
     BOOST_CHECK_EQUAL(fetch(sub3, 2), boost::assign::list_of<std::string>("four")("five"));
     Message in;
-    BOOST_CHECK(!sub2.fetch(in, 0));//TODO: or should this raise an error?
+    BOOST_CHECK(!sub2.fetch(in, Duration::IMMEDIATE));//TODO: or should this raise an error?
 
 
     //TODO: check pending messages...
@@ -323,7 +324,7 @@ QPID_AUTO_TEST_CASE(testNextReceiver)
 
     for (uint i = 0; i < fix.queues.size(); i++) {
         Message msg;
-        BOOST_CHECK(fix.session.nextReceiver().fetch(msg, DURATION_SEC));
+        BOOST_CHECK(fix.session.nextReceiver().fetch(msg, Duration::SECOND));
         BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("Message_%1%") % (i+1)).str());
     }
 }
@@ -345,7 +346,7 @@ QPID_AUTO_TEST_CASE(testMapMessage)
     content.encode();
     sender.send(out);
     Receiver receiver = fix.session.createReceiver(fix.queue);
-    Message in = receiver.fetch(5 * DURATION_SEC);
+    Message in = receiver.fetch(5 * Duration::SECOND);
     MapView view(in);
     BOOST_CHECK_EQUAL(view["abc"].asString(), "def");
     BOOST_CHECK_EQUAL(view["pi"].asFloat(), 3.14f);
@@ -368,7 +369,7 @@ QPID_AUTO_TEST_CASE(testMapMessageWithIn
     content.encode();
     sender.send(out);
     Receiver receiver = fix.session.createReceiver(fix.queue);
-    Message in = receiver.fetch(5 * DURATION_SEC);
+    Message in = receiver.fetch(5 * Duration::SECOND);
     MapView view(in);
     BOOST_CHECK_EQUAL(view["abc"].asString(), "def");
     BOOST_CHECK_EQUAL(view["pi"].asFloat(), 3.14f);
@@ -388,7 +389,7 @@ QPID_AUTO_TEST_CASE(testListMessage)
     content.encode();
     sender.send(out);
     Receiver receiver = fix.session.createReceiver(fix.queue);
-    Message in = receiver.fetch(5 * DURATION_SEC);
+    Message in = receiver.fetch(5 * Duration::SECOND);
     ListView view(in);
     BOOST_CHECK_EQUAL(view.size(), content.size());
     BOOST_CHECK_EQUAL(view.front().asString(), "abc");
@@ -422,7 +423,7 @@ QPID_AUTO_TEST_CASE(testListMessageWithI
     content.encode();
     sender.send(out);
     Receiver receiver = fix.session.createReceiver(fix.queue);
-    Message in = receiver.fetch(5 * DURATION_SEC);
+    Message in = receiver.fetch(5 * Duration::SECOND);
     ListView view(in);
     BOOST_CHECK_EQUAL(view.size(), content.size());
     BOOST_CHECK_EQUAL(view.front().asString(), "abc");
@@ -451,10 +452,10 @@ QPID_AUTO_TEST_CASE(testReject)
     Message m2("accept-me");
     sender.send(m2);
     Receiver receiver = fix.session.createReceiver(fix.queue);
-    Message in = receiver.fetch(5 * DURATION_SEC);
+    Message in = receiver.fetch(5 * Duration::SECOND);
     BOOST_CHECK_EQUAL(in.getContent(), m1.getContent());
     fix.session.reject(in);
-    in = receiver.fetch(5 * DURATION_SEC);
+    in = receiver.fetch(5 * Duration::SECOND);
     BOOST_CHECK_EQUAL(in.getContent(), m2.getContent());
     fix.session.acknowledge();
 }
@@ -833,17 +834,17 @@ QPID_AUTO_TEST_CASE(testTx)
     send(sender2, 5, 1, "B");
     ssn2.commit();
     receive(receiver1, 5, 1, "B");//(only those from sender2 should be received)
-    BOOST_CHECK(!receiver1.fetch(in, 0));//check there are no more messages
+    BOOST_CHECK(!receiver1.fetch(in, Duration::IMMEDIATE));//check there are no more messages
     ssn1.rollback();
     receive(receiver2, 5, 1, "B");
-    BOOST_CHECK(!receiver2.fetch(in, 0));//check there are no more messages
+    BOOST_CHECK(!receiver2.fetch(in, Duration::IMMEDIATE));//check there are no more messages
     ssn2.rollback();
     receive(receiver1, 5, 1, "B");
-    BOOST_CHECK(!receiver1.fetch(in, 0));//check there are no more messages
+    BOOST_CHECK(!receiver1.fetch(in, Duration::IMMEDIATE));//check there are no more messages
     ssn1.commit();
     //check neither receiver gets any more messages:
-    BOOST_CHECK(!receiver1.fetch(in, 0));
-    BOOST_CHECK(!receiver2.fetch(in, 0));
+    BOOST_CHECK(!receiver1.fetch(in, Duration::IMMEDIATE));
+    BOOST_CHECK(!receiver2.fetch(in, Duration::IMMEDIATE));
 }
 
 QPID_AUTO_TEST_SUITE_END()

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Uuid.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Uuid.cpp?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Uuid.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Uuid.cpp Tue Mar 30 21:35:08 2010
@@ -18,7 +18,7 @@
 
 #include "qpid/framing/Uuid.h"
 #include "qpid/framing/Buffer.h"
-#include "qpid/messaging/Uuid.h"
+#include "qpid/types/Uuid.h"
 #include "qpid/sys/alloca.h"
 
 #include "unit_test.h"
@@ -80,15 +80,15 @@ QPID_AUTO_TEST_CASE(testUuidEncodeDecode
                       string(decoded.begin(), decoded.end()));
 }
 
-QPID_AUTO_TEST_CASE(testMessagingUuid)
+QPID_AUTO_TEST_CASE(testTypesUuid)
 {
-    //tests for the Uuid class in the messaging namespace (introduced
+    //tests for the Uuid class in the types namespace (introduced
     //to avoid pulling in dependencies from framing)
-    messaging::Uuid a;
-    messaging::Uuid b(true);
-    messaging::Uuid c(true);
-    messaging::Uuid d(b);
-    messaging::Uuid e;
+    types::Uuid a;
+    types::Uuid b(true);
+    types::Uuid c(true);
+    types::Uuid d(b);
+    types::Uuid e;
     e = c;
 
     BOOST_CHECK(!a);

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Variant.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Variant.cpp?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Variant.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/Variant.cpp Tue Mar 30 21:35:08 2010
@@ -19,11 +19,11 @@
  *
  */
 #include <iostream>
-#include "qpid/messaging/Variant.h"
+#include "qpid/types/Variant.h"
 
 #include "unit_test.h"
 
-using namespace qpid::messaging;
+using namespace qpid::types;
 
 namespace qpid {
 namespace tests {

Propchange: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/cluster_tests.py
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1 +1 @@
-/qpid/trunk/qpid/cpp/src/tests/cluster_tests.py:919043-928107
+/qpid/trunk/qpid/cpp/src/tests/cluster_tests.py:919043-929244

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_recv.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_recv.cpp?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_recv.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_recv.cpp Tue Mar 30 21:35:08 2010
@@ -34,6 +34,7 @@
 #include <memory>
 
 using namespace qpid::messaging;
+using namespace qpid::types;
 using qpid::client::amqp0_10::FailoverUpdates;
 
 using namespace std;
@@ -95,8 +96,8 @@ struct Options : public qpid::Options
 
     Duration getTimeout()
     {
-        if (forever) return INFINITE_DURATION;
-        else return timeout*DURATION_SEC;
+        if (forever) return Duration::FOREVER;
+        else return Duration::SECOND*timeout;
 
     }
     bool parse(int argc, char** argv)
@@ -130,7 +131,7 @@ class SequenceTracker
 
     bool isDuplicate(Message& message)
     {
-        uint sn = message.getHeaders()["sn"];
+        uint sn = message.getProperties()["sn"];
         if (lastSn < sn) {
             lastSn = sn;
             return false;
@@ -172,10 +173,10 @@ int main(int argc, char ** argv)
                             if (msg.getReplyTo()) std::cout << "ReplyTo: " << msg.getReplyTo() << std::endl;
                             if (msg.getCorrelationId().size()) std::cout << "CorrelationId: " << msg.getCorrelationId() << std::endl;
                             if (msg.getUserId().size()) std::cout << "UserId: " << msg.getUserId() << std::endl;
-                            if (msg.getTtl()) std::cout << "TTL: " << msg.getTtl() << std::endl;
+                            if (msg.getTtl().getMilliseconds()) std::cout << "TTL: " << msg.getTtl().getMilliseconds() << std::endl;
                             if (msg.getDurable()) std::cout << "Durable: true" << std::endl;
-                            if (msg.isRedelivered()) std::cout << "Redelivered: true" << std::endl;
-                            std::cout << "Headers: " << msg.getHeaders() << std::endl;
+                            if (msg.getRedelivered()) std::cout << "Redelivered: true" << std::endl;
+                            std::cout << "Properties: " << msg.getProperties() << std::endl;
                             std::cout << std::endl;
                         }
                         std::cout << msg.getContent() << std::endl;//TODO: handle map or list messages

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_send.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_send.cpp?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_send.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_send.cpp Tue Mar 30 21:35:08 2010
@@ -33,6 +33,7 @@
 #include <memory>
 
 using namespace qpid::messaging;
+using namespace qpid::types;
 using qpid::client::amqp0_10::FailoverUpdates;
 
 typedef std::vector<std::string> string_vector;
@@ -144,9 +145,9 @@ struct Options : public qpid::Options
         std::string name;
         std::string value;
         if (nameval(property, name, value)) {
-            message.getHeaders()[name] = value;
+            message.getProperties()[name] = value;
         } else {
-            message.getHeaders()[name] = Variant();
+            message.getProperties()[name] = Variant();
         }    
     }
 
@@ -191,7 +192,7 @@ int main(int argc, char ** argv)
             Message msg;
             msg.setDurable(opts.durable);
             if (opts.ttl) {
-                msg.setTtl(opts.ttl);
+                msg.setTtl(Duration(opts.ttl));
             }
             if (!opts.replyto.empty()) msg.setReplyTo(Address(opts.replyto));
             if (!opts.userid.empty()) msg.setUserId(opts.userid);
@@ -202,7 +203,7 @@ int main(int argc, char ** argv)
             uint txCount = 0;
             while (getline(std::cin, content)) {
                 msg.setContent(content);
-                msg.getHeaders()["sn"] = ++sent;
+                msg.getProperties()["sn"] = ++sent;
                 sender.send(msg);
                 if (opts.tx && (sent % opts.tx == 0)) {
                     if (opts.rollbackFrequency && (++txCount % opts.rollbackFrequency == 0)) {
@@ -213,7 +214,7 @@ int main(int argc, char ** argv)
                 }                
             }
             for (uint i = opts.sendEos; i > 0; --i) {
-                msg.getHeaders()["sn"] = ++sent;
+                msg.getProperties()["sn"] = ++sent;
                 msg.setContent(EOS);//TODO: add in ability to send digest or similar
                 sender.send(msg);
             }

Modified: qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_stream.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_stream.cpp?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_stream.cpp (original)
+++ qpid/branches/qmf-devel0.7a/qpid/cpp/src/tests/qpid_stream.cpp Tue Mar 30 21:35:08 2010
@@ -32,6 +32,7 @@
 #include <string>
 
 using namespace qpid::messaging;
+using namespace qpid::types;
 
 namespace qpid {
 namespace tests {
@@ -118,7 +119,7 @@ struct Publish : Client
         qpid::sys::AbsTime start = qpid::sys::now();
         while (true) {
             qpid::sys::AbsTime sentAt = qpid::sys::now();
-            msg.getHeaders()[TIMESTAMP] = timestamp(sentAt);
+            msg.getProperties()[TIMESTAMP] = timestamp(sentAt);
             sender.send(msg);
             ++sent;
             qpid::sys::AbsTime waitTill(start, sent*interval);
@@ -150,7 +151,7 @@ struct Consume : Client
             }
             //calculate latency
             uint64_t receivedAt = timestamp(qpid::sys::now());
-            uint64_t sentAt = msg.getHeaders()[TIMESTAMP].asUint64();
+            uint64_t sentAt = msg.getProperties()[TIMESTAMP].asUint64();
             double latency = ((double) (receivedAt - sentAt)) / qpid::sys::TIME_MSEC;
 
             //update avg, min & max

Propchange: qpid/branches/qmf-devel0.7a/qpid/dotnet/build-msbuild.bat
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1 +1 @@
-/qpid/trunk/qpid/dotnet/build-msbuild.bat:919043-928107
+/qpid/trunk/qpid/dotnet/build-msbuild.bat:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/dotnet/build-nant-release
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1 +1 @@
-/qpid/trunk/qpid/dotnet/build-nant-release:919043-928107
+/qpid/trunk/qpid/dotnet/build-nant-release:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/dotnet/build-nant.bat
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1 +1 @@
-/qpid/trunk/qpid/dotnet/build-nant.bat:919043-928107
+/qpid/trunk/qpid/dotnet/build-nant.bat:919043-929244

Modified: qpid/branches/qmf-devel0.7a/qpid/extras/qmf/src/py/qmf/console.py
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/extras/qmf/src/py/qmf/console.py?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/extras/qmf/src/py/qmf/console.py (original)
+++ qpid/branches/qmf-devel0.7a/qpid/extras/qmf/src/py/qmf/console.py Tue Mar 30 21:35:08 2010
@@ -988,15 +988,7 @@ class Session:
           data = Object(self, broker, schema, codec, True, True, False)
       else:
           data = self._decodeValue(codec, inner_type_code, broker)
-    elif typecode == 21:                                # List
-        #taken from codec10.read_list
-        sc = Codec(codec.read_vbin32())
-        count = sc.read_uint32()
-        data = []
-        while count > 0:
-          type = sc.read_uint8()
-          data.append(self._decodeValue(sc,type,broker))
-          count -= 1
+    elif typecode == 21: data = codec.read_list()       # List
     elif typecode == 22:                                #Array
         #taken from codec10.read_array
         sc = Codec(codec.read_vbin32()) 
@@ -1032,14 +1024,7 @@ class Session:
     elif typecode == 19: codec.write_int64  (int(value))    # S64
     elif typecode == 20: value._encodeUnmanaged(codec)      # OBJECT
     elif typecode == 15: codec.write_map    (value)         # FTABLE
-    elif typecode == 21:                                    # List
-        sc = Codec()
-        self._encodeValue(sc, len(value), 3)
-        for o in value:
-          ltype=self.encoding(o)
-          self._encodeValue(sc,ltype,1)
-          self._encodeValue(sc, o, ltype)
-        codec.write_vbin32(sc.encoded)
+    elif typecode == 21: codec.write_list   (value)         # List
     elif typecode == 22:                                    # Array
         sc = Codec()
         self._encodeValue(sc, len(value), 3)
@@ -1635,7 +1620,7 @@ class ObjectId:
       else:
         first  = constructor.read_uint64()
         second = constructor.read_uint64()
-      self.agentName = str((first & 0x000000000FFFFFFF) >> 28)
+      self.agentName = str(first & 0x000000000FFFFFFF)
       self.agentEpoch = (first & 0x0FFF000000000000) >> 48
       self.objectName = str(second)
 
@@ -2008,7 +1993,7 @@ class Broker:
       raise
 
   def _updateAgent(self, obj):
-    bankKey = obj.agentBank
+    bankKey = str(obj.agentBank)
     agent = None
     if obj._deleteTime == 0:
       try:
@@ -2166,6 +2151,12 @@ class Broker:
       self.cv.release()
 
   def _v1Cb(self, msg):
+    try:
+      self._v1CbProtected(msg)
+    except Exception, e:
+      print "EXCEPTION in Broker._v1Cb:", e
+
+  def _v1CbProtected(self, msg):
     """
     This is the general message handler for messages received via the QMFv1 exchanges.
     """
@@ -2187,7 +2178,7 @@ class Broker:
         items = rkey.split('.')
         if len(items) >= 4:
           if items[0] == 'console' and items[3].isdigit():
-            agent_addr = int(items[3]) # The QMFv1 Agent Bank
+            agent_addr = str(items[3])  # The QMFv1 Agent Bank
     if agent_addr != None and agent_addr in self.agents:
       agent = self.agents[agent_addr]
 
@@ -2286,7 +2277,7 @@ class Agent:
     self.session = broker.session
     self.schemaCache = self.session.schemaCache
     self.brokerBank = broker.getBrokerBank()
-    self.agentBank = agentBank
+    self.agentBank = str(agentBank)
     self.label = label
     self.isV2 = isV2
     self.heartbeatInterval = interval
@@ -2310,9 +2301,12 @@ class Agent:
     if 'qmf_object' in kwargs:
       if self.session.console:
         self.session.console.objectProps(self.broker, kwargs['qmf_object'])
-    if 'qmf_object_stats' in kwargs:
+    elif 'qmf_object_stats' in kwargs:
       if self.session.console:
         self.session.console.objectStats(self.broker, kwargs['qmf_object_stats'])
+    elif 'qmf_event' in kwargs:
+      if self.session.console:
+        self.session.console.event(self.broker, kwargs['qmf_event'])
 
 
   def touch(self):
@@ -2521,7 +2515,8 @@ class Agent:
     """
     Handle a QMFv1 event indication
     """
-    pass
+    event = Event(self, codec)
+    self.unsolicitedContext.doEvent(event)
 
 
   def _v1HandleContentInd(self, codec, sequence, prop=False, stat=False):
@@ -2808,6 +2803,11 @@ class RequestContext(object):
     self.rawQueryResults.append(data)
 
 
+  def doEvent(self, data):
+    if self.notifiable:
+      self.notifiable(qmf_event=data)
+
+
   def setException(self, ex):
     self.exception = ex
 
@@ -2942,18 +2942,19 @@ class RequestContext(object):
 #===================================================================================================
 class Event:
   """ """
-  def __init__(self, session, broker, codec):
-    self.session = session
-    self.broker  = broker
+  def __init__(self, agent, codec):
+    self.agent = agent
+    self.session = agent.session
+    self.broker  = agent.broker
     self.classKey = ClassKey(codec)
     self.timestamp = codec.read_int64()
     self.severity = codec.read_uint8()
-    self.schema = session.schemaCache.getSchema(self.classKey)
+    self.arguments = {}
+    self.schema = self.session.schemaCache.getSchema(self.classKey)
     if not self.schema:
       return
-    self.arguments = {}
     for arg in self.schema.arguments:
-      self.arguments[arg.name] = session._decodeValue(codec, arg.type, broker)
+      self.arguments[arg.name] = self.session._decodeValue(codec, arg.type, self.broker)
 
   def __repr__(self):
     if self.schema == None:

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -3,4 +3,4 @@
 /qpid/branches/java-broker-0-10/qpid/java:795950-829653
 /qpid/branches/java-network-refactor/qpid/java:805429-821809
 /qpid/trunk/qpid:796646-796653
-/qpid/trunk/qpid/java:919043-928107
+/qpid/trunk/qpid/java:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/broker/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -2,4 +2,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/broker:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/broker:805429-821809
 /qpid/branches/jmx_mc_gsoc09/qpid/java/broker:787599
-/qpid/trunk/qpid/java/broker:742626,743015,743028-743029,743304,743306,743311,743357,744113,747363,747367,747369-747370,747376,747783,747868-747870,747875,748561,748591,748641,748680,748686,749149,749282,749285,749315,749340,749572,753219-753220,753253,754934,754958,755256,757258,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-928107
+/qpid/trunk/qpid/java/broker:742626,743015,743028-743029,743304,743306,743311,743357,744113,747363,747367,747369-747370,747376,747783,747868-747870,747875,748561,748591,748641,748680,748686,749149,749282,749285,749315,749340,749572,753219-753220,753253,754934,754958,755256,757258,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/broker/bin/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /qpid/branches/0.5-release/qpid/java/broker/bin:757268
 /qpid/branches/java-broker-0-10/qpid/java/broker/bin:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/broker/bin:805429-821809
-/qpid/trunk/qpid/java/broker/bin:753219-753220,753253,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-928107
+/qpid/trunk/qpid/java/broker/bin:753219-753220,753253,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-929244

Modified: qpid/branches/qmf-devel0.7a/qpid/java/broker/build.xml
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/java/broker/build.xml?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/java/broker/build.xml (original)
+++ qpid/branches/qmf-devel0.7a/qpid/java/broker/build.xml Tue Mar 30 21:35:08 2010
@@ -52,7 +52,7 @@
         <mkdir dir="${velocity.compile.dir}" />	
         <!-- Compile LogMessages Velocity Generator -->
         <javac source="${java.source}" target="${java.target}"
-               destdir="${velocity.compile.dir}" debug="on"
+               destdir="${velocity.compile.dir}" debug="on" includeantruntime="false"
                deprecation="${javac.deprecation}" 
                srcdir="src/velocity/java" >
           <classpath>

Modified: qpid/branches/qmf-devel0.7a/qpid/java/broker/etc/config.xml
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/java/broker/etc/config.xml?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/java/broker/etc/config.xml (original)
+++ qpid/branches/qmf-devel0.7a/qpid/java/broker/etc/config.xml Tue Mar 30 21:35:08 2010
@@ -23,6 +23,7 @@
     <prefix>${QPID_HOME}</prefix>
     <work>${QPID_WORK}</work>
     <conf>${prefix}/etc</conf>
+    
     <connector>
         <!-- To enable SSL edit the keystorePath and keystorePassword
 	     and set enabled to true. 
@@ -92,145 +93,8 @@
         </jmx>
     </security>
 
-    <virtualhosts>
-
-        <default>test</default>
-        <virtualhost>
-            <name>localhost</name>
-            <localhost>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore
-                    </class>
-                </store>
-
-                <housekeeping>
-                    <expiredMessageCheckPeriod>20000</expiredMessageCheckPeriod>
-                </housekeeping>
-
-                <exchanges>
-                    <exchange>
-                        <type>direct</type>
-                        <name>test.direct</name>
-                        <durable>true</durable>
-                    </exchange>
-                    <exchange>
-                        <type>topic</type>
-                        <name>test.topic</name>
-                    </exchange>
-                </exchanges>
-                <queues>
-                    <exchange>amq.direct</exchange>
-                    <maximumQueueDepth>4235264</maximumQueueDepth>
-                    <!-- 4Mb -->
-                    <maximumMessageSize>2117632</maximumMessageSize>
-                    <!-- 2Mb -->
-                    <maximumMessageAge>600000</maximumMessageAge>
-                    <!-- 10 mins -->
-                    <maximumMessageCount>50</maximumMessageCount>
-                    <!-- 50 messages -->
-
-                    <queue>
-                        <name>queue</name>
-                    </queue>
-                    <queue>
-                        <name>ping</name>
-                    </queue>
-                    <queue>
-                        <name>test-queue</name>
-                        <test-queue>
-                            <exchange>test.direct</exchange>
-                            <durable>true</durable>
-                        </test-queue>
-                    </queue>
-                    <queue>
-                        <name>test-ping</name>
-                        <test-ping>
-                            <exchange>test.direct</exchange>
-                        </test-ping>
-                    </queue>
-
-                </queues>
-            </localhost>
-        </virtualhost>
-
-
-        <virtualhost>
-            <name>development</name>
-            <development>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore
-                    </class>
-                </store>
-
-                <queues>
-                    <minimumAlertRepeatGap>30000</minimumAlertRepeatGap>
-                    <maximumMessageCount>50</maximumMessageCount>
-                    <queue>
-                        <name>queue</name>
-                        <queue>
-                            <exchange>amq.direct</exchange>
-                            <maximumQueueDepth>4235264</maximumQueueDepth>
-                            <!-- 4Mb -->
-                            <maximumMessageSize>2117632</maximumMessageSize>
-                            <!-- 2Mb -->
-                            <maximumMessageAge>600000</maximumMessageAge>
-                            <!-- 10 mins -->
-                        </queue>
-                    </queue>
-                    <queue>
-                        <name>ping</name>
-                        <ping>
-                            <exchange>amq.direct</exchange>
-                            <maximumQueueDepth>4235264</maximumQueueDepth>
-                            <!-- 4Mb -->
-                            <maximumMessageSize>2117632</maximumMessageSize>
-                            <!-- 2Mb -->
-                            <maximumMessageAge>600000</maximumMessageAge>
-                            <!-- 10 mins -->
-                        </ping>
-                    </queue>
-                </queues>
-            </development>
-        </virtualhost>
-        <virtualhost>
-            <name>test</name>
-            <test>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore
-                    </class>
-                </store>
-
-                <queues>
-                    <minimumAlertRepeatGap>30000</minimumAlertRepeatGap>
-                    <maximumMessageCount>50</maximumMessageCount>
-                    <queue>
-                        <name>queue</name>
-                        <queue>
-                            <exchange>amq.direct</exchange>
-                            <maximumQueueDepth>4235264</maximumQueueDepth>
-                            <!-- 4Mb -->
-                            <maximumMessageSize>2117632</maximumMessageSize>
-                            <!-- 2Mb -->
-                            <maximumMessageAge>600000</maximumMessageAge>
-                            <!-- 10 mins -->
-                        </queue>
-                    </queue>
-                    <queue>
-                        <name>ping</name>
-                        <ping>
-                            <exchange>amq.direct</exchange>
-                            <maximumQueueDepth>4235264</maximumQueueDepth>
-                            <!-- 4Mb -->
-                            <maximumMessageSize>2117632</maximumMessageSize>
-                            <!-- 2Mb -->
-                            <maximumMessageAge>600000</maximumMessageAge>
-                            <!-- 10 mins -->
-                        </ping>
-                    </queue>
-                </queues>
-            </test>
-        </virtualhost>
-    </virtualhosts>
+    <virtualhosts>${conf}/virtualhosts.xml</virtualhosts>
+    
     <heartbeat>
         <delay>0</delay>
         <timeoutFactor>2.0</timeoutFactor>

Modified: qpid/branches/qmf-devel0.7a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java (original)
+++ qpid/branches/qmf-devel0.7a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java Tue Mar 30 21:35:08 2010
@@ -21,18 +21,19 @@
 package org.apache.qpid.server.configuration;
 
 import java.io.File;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.Locale;
-import java.util.Collections;
+import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.commons.configuration.CompositeConfiguration;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.ConfigurationFactory;
+import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.SystemConfiguration;
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.qpid.server.configuration.management.ConfigurationManagementMBean;
@@ -52,18 +53,17 @@ public class ServerConfiguration impleme
     private Configuration _config;
 
     // Default Configuration values
-    //todo make these all public, to make validation of configuration easier.
     public static final int DEFAULT_BUFFER_READ_LIMIT_SIZE = 262144;
     public static final int DEFAULT_BUFFER_WRITE_LIMIT_SIZE = 262144;
     public static final boolean DEFAULT_BROKER_CONNECTOR_PROTECTIO_ENABLED = false;
     public static final String DEFAULT_STATUS_UPDATES = "on";
     public static final String SECURITY_CONFIG_RELOADED = "SECURITY CONFIGURATION RELOADED";
     
-    private static final int DEFAULT_FRAME_SIZE = 65536;
-    private static final int DEFAULT_PORT = 5672;
-    private static final int DEFAUL_SSL_PORT = 8672;
-    private static final long DEFAULT_HOUSEKEEPING_PERIOD = 30000L;
-    private static final int DEFAULT_JMXPORT = 8999;
+    public static final int DEFAULT_FRAME_SIZE = 65536;
+    public static final int DEFAULT_PORT = 5672;
+    public static final int DEFAULT_SSL_PORT = 8672;
+    public static final long DEFAULT_HOUSEKEEPING_PERIOD = 30000L;
+    public static final int DEFAULT_JMXPORT = 8999;
 
     private static int _jmxPort = DEFAULT_JMXPORT;
 
@@ -71,6 +71,7 @@ public class ServerConfiguration impleme
     private SecurityConfiguration _securityConfiguration = null;
 
     private File _configFile;
+    private File _vhostsFile;
 
     private Logger _log = LoggerFactory.getLogger(this.getClass());
 
@@ -134,8 +135,6 @@ public class ServerConfiguration impleme
     {
         setConfig(conf);
 
-        substituteEnvironmentVariables();
-
         _jmxPort = getConfig().getInt("management.jmxport", 8999);
         _securityConfiguration = new SecurityConfiguration(conf.subset("security"));
 
@@ -143,61 +142,86 @@ public class ServerConfiguration impleme
 
     }
 
-    private void setupVirtualHosts(Configuration conf) throws ConfigurationException
+    /*
+     * Modified to enforce virtualhosts configuration in external file or main file, but not
+     * both, as a fix for QPID-2360 and QPID-2361.
+     */
+    @SuppressWarnings("unchecked")
+	private void setupVirtualHosts(Configuration conf) throws ConfigurationException
     {
-        List vhosts = conf.getList("virtualhosts");
-        Iterator i = vhosts.iterator();
-        while (i.hasNext())
-        {
-            Object thing = i.next();
-            if (thing instanceof String)
-            {
-                //Open the Virtualhost.xml file and copy values in to main config
-                XMLConfiguration vhostConfiguration = new XMLConfiguration((String) thing);
-                Iterator keys = vhostConfiguration.getKeys();
-                while (keys.hasNext())
-                {
-                    String key = (String) keys.next();
-                    conf.setProperty("virtualhosts." + key, vhostConfiguration.getProperty(key));
-                }
-            }
-        }
+        List<String> vhostFiles = conf.getList("virtualhosts");
+        Configuration vhostConfig = conf.subset("virtualhosts");
 
-        List hosts = conf.getList("virtualhosts.virtualhost.name");
+    	// Only one configuration mechanism allowed
+        if (!vhostFiles.isEmpty() && !vhostConfig.subset("virtualhost").isEmpty())
+        {
+        	throw new ConfigurationException("Only one of external or embedded virtualhosts configuration allowed.");
+        } 
+        
+        // We can only have one vhosts XML file included
+    	if (vhostFiles.size() > 1)
+    	{
+    		throw new ConfigurationException("Only one external virtualhosts configuration file allowed, multiple filenames found.");
+    	}
+        
+        // Virtualhost configuration object
+        Configuration vhostConfiguration = new HierarchicalConfiguration();
+        
+    	// Load from embedded configuration if possible
+        if (!vhostConfig.subset("virtualhost").isEmpty())
+        {
+    		vhostConfiguration = vhostConfig;
+        }
+        else
+        {
+	    	// Load from the external configuration if possible
+	    	for (String fileName : vhostFiles)
+	        {
+	            // Open the vhosts XML file and copy values from it to our config
+                _vhostsFile = new File(fileName);
+	        	vhostConfiguration = parseConfig(new File(fileName));
+	        }
+        }
+        
+        // Now extract the virtual host names from the configuration object
+    	List hosts = vhostConfiguration.getList("virtualhost.name");
         for (int j = 0; j < hosts.size(); j++)
         {
             String name = (String) hosts.get(j);
-            // Add the keys of the virtual host to the main config then bail out
-
-            VirtualHostConfiguration vhostConfig = new VirtualHostConfiguration(name, conf.subset("virtualhosts.virtualhost." + name));
-            _virtualHosts.put(vhostConfig.getName(), vhostConfig);
+            
+            // Add the virtual hosts to the server configuration
+            VirtualHostConfiguration virtualhost = new VirtualHostConfiguration(name, vhostConfiguration.subset("virtualhost." + name));
+            _virtualHosts.put(virtualhost.getName(), virtualhost);
         }
-
     }
 
-    private void substituteEnvironmentVariables()
+    private static void substituteEnvironmentVariables(Configuration conf)
     {
         for (Entry<String, String> var : envVarMap.entrySet())
         {
             String val = System.getenv(var.getKey());
             if (val != null)
             {
-                getConfig().setProperty(var.getValue(), val);
+                conf.setProperty(var.getValue(), val);
             }
         }
     }
 
-    private final static Configuration parseConfig(File file) throws ConfigurationException
+    private static Configuration parseConfig(File file) throws ConfigurationException
     {
         ConfigurationFactory factory = new ConfigurationFactory();
         factory.setConfigurationFileName(file.getAbsolutePath());
         Configuration conf = factory.getConfiguration();
-        Iterator keys = conf.getKeys();
+    	
+        Iterator<?> keys = conf.getKeys();
         if (!keys.hasNext())
         {
             keys = null;
             conf = flatConfig(file);
         }
+
+        substituteEnvironmentVariables(conf);
+
         return conf;
     }
 
@@ -311,13 +335,25 @@ public class ServerConfiguration impleme
         if (_configFile != null)
         {
             Configuration newConfig = parseConfig(_configFile);
+            
             _securityConfiguration = new SecurityConfiguration(newConfig.subset("security"));
-
+         
+            // Reload virtualhosts from correct location
+            Configuration newVhosts;
+            if (_vhostsFile == null)
+            {
+                newVhosts = newConfig.subset("virtualhosts");
+            }
+            else
+            {
+                newVhosts = parseConfig(_vhostsFile);
+            }
+            
             VirtualHostRegistry vhostRegistry = ApplicationRegistry.getInstance().getVirtualHostRegistry();
             for (String hostname : _virtualHosts.keySet())
             {
                 VirtualHost vhost = vhostRegistry.getVirtualHost(hostname);
-                SecurityConfiguration hostSecurityConfig = new SecurityConfiguration(newConfig.subset("virtualhosts.virtualhost."+hostname+".security"));
+                SecurityConfiguration hostSecurityConfig = new SecurityConfiguration(newVhosts.subset("virtualhost."+hostname+".security"));
                 vhost.getAccessManager().configureGlobalPlugins(_securityConfiguration);
                 vhost.getAccessManager().configureHostPlugins(hostSecurityConfig);
             }
@@ -601,7 +637,7 @@ public class ServerConfiguration impleme
 
     public int getSSLPort()
     {
-        return getConfig().getInt("connector.ssl.port", DEFAUL_SSL_PORT);
+        return getConfig().getInt("connector.ssl.port", DEFAULT_SSL_PORT);
     }
 
     public String getKeystorePath()

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/broker/src/main/java/org/apache/qpid/server/management/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -3,4 +3,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/broker/src/main/java/org/apache/qpid/server/management:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/broker/src/main/java/org/apache/qpid/server/management:805429-821809
 /qpid/branches/jmx_mc_gsoc09/qpid/java/broker/src/main/java/org/apache/qpid/server/management:787599
-/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management:753219-753220,753253,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-928107
+/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management:753219-753220,753253,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -3,4 +3,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/broker/src/main/java/org/apache/qpid/server/queue:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/broker/src/main/java/org/apache/qpid/server/queue:805429-821809
 /qpid/branches/jmx_mc_gsoc09/qpid/java/broker/src/main/java/org/apache/qpid/server/queue:787599
-/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue:753219-753220,753253,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-928107
+/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue:753219-753220,753253,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,919043-929244

Modified: qpid/branches/qmf-devel0.7a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java (original)
+++ qpid/branches/qmf-devel0.7a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java Tue Mar 30 21:35:08 2010
@@ -20,11 +20,20 @@
  */
 package org.apache.qpid.server.configuration;
 
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.List;
+import java.util.Locale;
+
 import junit.framework.TestCase;
-import org.apache.commons.configuration.Configuration;
+
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.XMLConfiguration;
-
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.exchange.ExchangeType;
 import org.apache.qpid.server.protocol.AMQProtocolEngine;
 import org.apache.qpid.server.protocol.AMQProtocolSession;
 import org.apache.qpid.server.registry.ApplicationRegistry;
@@ -33,24 +42,15 @@ import org.apache.qpid.server.virtualhos
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
 import org.apache.qpid.transport.TestNetworkDriver;
 
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-
 public class ServerConfigurationTest extends TestCase
 {
-
     private XMLConfiguration _config;
 
     @Override
     public void setUp()
     {
         //Highlight that this test will cause a new AR to be created
-//        ApplicationRegistry.getInstance();
+        ApplicationRegistry.getInstance();
 
         _config = new XMLConfiguration();
     }
@@ -59,7 +59,7 @@ public class ServerConfigurationTest ext
     public void tearDown() throws Exception
     {
         //Correctly Close the AR we created
-//        ApplicationRegistry.remove();
+        ApplicationRegistry.remove();
     }
 
     public void testSetJMXManagementPort() throws ConfigurationException
@@ -756,10 +756,9 @@ public class ServerConfigurationTest ext
 
     public void testFirewallConfiguration() throws Exception
     {
-     // Write out config
+        // Write out config
         File mainFile = File.createTempFile(getClass().getName(), null);
         mainFile.deleteOnExit();
-        FileWriter out;
         writeConfigFile(mainFile, false);
 
         // Load config
@@ -903,6 +902,10 @@ public class ServerConfigurationTest ext
     }
 
     private void writeConfigFile(File mainFile, boolean allow) throws IOException {
+        writeConfigFile(mainFile, allow, true, null, "test");
+    }
+
+    private void writeConfigFile(File mainFile, boolean allow, boolean includeVhosts, File vhostsFile, String name) throws IOException {
         FileWriter out = new FileWriter(mainFile);
         out.write("<broker>\n");
         out.write("\t<management><enabled>false</enabled></management>\n");
@@ -927,15 +930,101 @@ public class ServerConfigurationTest ext
         out.write("\t\t\t<rule access=\""+ ((allow) ? "allow" : "deny") +"\" network=\"127.0.0.1\"/>");
         out.write("\t\t</firewall>\n");
         out.write("\t</security>\n");
+        if (includeVhosts)
+        {
+	        out.write("\t<virtualhosts>\n");
+	        out.write("\t\t<virtualhost>\n");
+	        out.write(String.format("\t\t\t<name>%s</name>\n", name));
+	        out.write(String.format("\t\t<%s> \n", name));
+	        out.write("\t\t\t<exchanges>\n");
+	        out.write("\t\t\t\t<exchange>\n");
+	        out.write("\t\t\t\t\t<type>topic</type>\n");
+	        out.write(String.format("\t\t\t\t\t<name>%s.topic</name>\n", name));
+	        out.write("\t\t\t\t\t<durable>true</durable>\n");
+	        out.write("\t\t\t\t</exchange>\n");
+	        out.write("\t\tt</exchanges>\n");
+	        out.write(String.format("\t\t</%s> \n", name));
+	        out.write("\t\t</virtualhost>\n");
+	        out.write("\t</virtualhosts>\n");
+        }
+        if (vhostsFile != null)
+        {
+        	out.write("\t<virtualhosts>"+vhostsFile.getAbsolutePath()+"</virtualhosts>\n");	
+        }
+        out.write("</broker>\n");
+        out.close();
+    }
+
+    private void writeTestFishConfigFile(File mainFile) throws IOException {
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<broker>\n");
+        out.write("\t<management><enabled>false</enabled></management>\n");
+        out.write("\t<security>\n");
+        out.write("\t\t<principal-databases>\n");
+        out.write("\t\t\t<principal-database>\n");
+        out.write("\t\t\t\t<name>passwordfile</name>\n");
+        out.write("\t\t\t\t<class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>\n");
+        out.write("\t\t\t\t<attributes>\n");
+        out.write("\t\t\t\t\t<attribute>\n");
+        out.write("\t\t\t\t\t\t<name>passwordFile</name>\n");
+        out.write("\t\t\t\t\t\t<value>/dev/null</value>\n");
+        out.write("\t\t\t\t\t</attribute>\n");
+        out.write("\t\t\t\t</attributes>\n");
+        out.write("\t\t\t</principal-database>\n");
+        out.write("\t\t</principal-databases>\n");
+        out.write("\t\t<jmx>\n");
+        out.write("\t\t\t<access>/dev/null</access>\n");
+        out.write("\t\t\t<principal-database>passwordfile</principal-database>\n");
+        out.write("\t\t</jmx>\n");
+        out.write("\t\t<firewall>\n");
+        out.write("\t\t\t<rule access=\"allow\" network=\"127.0.0.1\"/>");
+        out.write("\t\t</firewall>\n");
+        out.write("\t</security>\n");
         out.write("\t<virtualhosts>\n");
         out.write("\t\t<virtualhost>\n");
         out.write("\t\t\t<name>test</name>\n");
+        out.write("\t\t<test> \n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>test.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</test> \n");
+        out.write("\t\t</virtualhost>\n");
+        out.write("\t\t<virtualhost>\n");
+        out.write("\t\t\t<name>fish</name>\n");
+        out.write("\t\t<fish> \n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>fish.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>false</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</fish> \n");
         out.write("\t\t</virtualhost>\n");
         out.write("\t</virtualhosts>\n");
         out.write("</broker>\n");
         out.close();
     }
 
+    private void writeFirewallVhostsFile(File vhostsFile, boolean allow) throws IOException
+    {
+        FileWriter out = new FileWriter(vhostsFile);
+        String ipAddr = "127.0.0.1"; // FIXME: get this from InetAddress.getLocalHost().getAddress() ?
+        out.write("<virtualhosts><virtualhost>");
+        out.write("<name>test</name>");
+        out.write("<test>");
+        out.write("<security><firewall>");
+        out.write("<rule access=\""+((allow) ? "allow" : "deny")+"\" network=\""+ipAddr +"\"/>");
+        out.write("</firewall></security>");
+        out.write("</test>");
+        out.write("</virtualhost></virtualhosts>");
+        out.close();
+    }
+
     public void testCombinedConfigurationFirewallReload() throws Exception
     {
         // Write out config
@@ -1041,42 +1130,538 @@ public class ServerConfigurationTest ext
         }
     }
 
-    public void testnewParserOutputVsOldParserOutput() throws ConfigurationException
-    {
-        String configDir = System.getProperty("QPID_HOME")+"/etc";
+    private void writeVirtualHostsFile(File vhostsFile, String name) throws IOException {
+        FileWriter out = new FileWriter(vhostsFile);
+        out.write("<virtualhosts>\n");
+        out.write("\t<virtualhost>\n");
+        out.write(String.format("\t\t<name>%s</name>\n", name));
+        out.write(String.format("\t\t<%s>\n", name));
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>test.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write(String.format("\t\t</%s>\n", name));
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.close();
+    }
 
-        XMLConfiguration oldConfig = new XMLConfiguration(configDir +"/config-systests-ServerConfigurationTest-Old.xml");
-        Configuration newConfig = new ServerConfiguration(new File(configDir+"/config-systests-ServerConfigurationTest-New.xml")).getConfig();
+    private void writeMultiVirtualHostsFile(File vhostsFile) throws IOException {
+        FileWriter out = new FileWriter(vhostsFile);
+        out.write("<virtualhosts>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<name>topic</name>\n");
+        out.write("\t\t<topic>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>topic</type>\n");
+        out.write("\t\t\t\t\t<name>test.topic</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</topic>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<name>fanout</name>\n");
+        out.write("\t\t<fanout>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<type>fanout</type>\n");
+        out.write("\t\t\t\t\t<name>test.fanout</name>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</fanout>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.close();
+    }
 
-        Iterator xmlKeys = oldConfig.getKeys();
-        while (xmlKeys.hasNext())
+    private void writeMultipleVhostsConfigFile(File mainFile, File[] vhostsFileArray) throws IOException {
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<broker>\n");
+        out.write("\t<management><enabled>false</enabled></management>\n");
+        out.write("\t<security>\n");
+        out.write("\t\t<principal-databases>\n");
+        out.write("\t\t\t<principal-database>\n");
+        out.write("\t\t\t\t<name>passwordfile</name>\n");
+        out.write("\t\t\t\t<class>org.apache.qpid.server.security.auth.database.PlainPasswordFilePrincipalDatabase</class>\n");
+        out.write("\t\t\t\t<attributes>\n");
+        out.write("\t\t\t\t\t<attribute>\n");
+        out.write("\t\t\t\t\t\t<name>passwordFile</name>\n");
+        out.write("\t\t\t\t\t\t<value>/dev/null</value>\n");
+        out.write("\t\t\t\t\t</attribute>\n");
+        out.write("\t\t\t\t</attributes>\n");
+        out.write("\t\t\t</principal-database>\n");
+        out.write("\t\t</principal-databases>\n");
+        out.write("\t\t<jmx>\n");
+        out.write("\t\t\t<access>/dev/null</access>\n");
+        out.write("\t\t\t<principal-database>passwordfile</principal-database>\n");
+        out.write("\t\t</jmx>\n");
+        out.write("\t\t<firewall>\n");
+        out.write("\t\t\t<rule access=\"allow\" network=\"127.0.0.1\"/>");
+        out.write("\t\t</firewall>\n");
+        out.write("\t</security>\n");
+        for (File vhostsFile : vhostsFileArray)
         {
-            String key = (String) xmlKeys.next();
-            assertEquals("Incorrect value for "+key, oldConfig.getProperty(key), newConfig.getProperty(key));
+        	out.write("\t<virtualhosts>"+vhostsFile.getAbsolutePath()+"</virtualhosts>\n");
         }
+	    out.write("</broker>\n");
+        out.close();
     }
 
+    private void writeCombinedConfigFile(File mainFile, File fileA, File fileB) throws Exception
+    {
+        FileWriter out = new FileWriter(mainFile);
+        out.write("<configuration><system/>");
+        out.write("<xml fileName=\"" + fileA.getAbsolutePath() + "\"/>");
+        out.write("<xml fileName=\"" + fileB.getAbsolutePath() + "\"/>");
+        out.write("</configuration>");
+        out.close();
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in the main
+     * configuration file only.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testInternalVirtualhostConfigFile() throws Exception
+    {
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeConfigFile(mainFile, false, true, null, "test");
 
-    public void testNoVirtualhostXMLFile() throws Exception
+        // Load config
+        ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+        ApplicationRegistry.initialise(reg, 1);
+
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+        VirtualHost virtualHost = virtualHostRegistry.getVirtualHost("test");
+        Exchange exchange = virtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.topic"));
+
+        assertEquals("Incorrect virtualhost count", 1, virtualHostRegistry.getVirtualHosts().size());
+        assertEquals("Incorrect virtualhost name", "test", virtualHost.getName());
+        assertEquals("Incorrect exchange type", "topic", exchange.getType().getName().toString());
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in an external
+     * configuration file only.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testExternalVirtualhostXMLFile() throws Exception
     {
-        int REGISTRY=1;
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        vhostsFile.deleteOnExit();
+        writeConfigFile(mainFile, false, false, vhostsFile, null);    
+        writeVirtualHostsFile(vhostsFile, "test");
 
-        File configFile = new File(System.getProperty("QPID_HOME")+"/etc/config.xml");
-        assertTrue(configFile.exists());
+        // Load config
+        ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+        ApplicationRegistry.initialise(reg, 1);
+
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+        VirtualHost virtualHost = virtualHostRegistry.getVirtualHost("test");
+        Exchange exchange = virtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.topic"));
+
+        assertEquals("Incorrect virtualhost count", 1, virtualHostRegistry.getVirtualHosts().size());
+        assertEquals("Incorrect virtualhost name", "test", virtualHost.getName());
+        assertEquals("Incorrect exchange type", "topic", exchange.getType().getName().toString());
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in an external
+     * configuration file only, with two vhosts that have different properties.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testExternalMultiVirtualhostXMLFile() throws Exception
+    {
+        // Write out vhosts
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts-multi");
+        vhostsFile.deleteOnExit();
+        writeMultiVirtualHostsFile(vhostsFile);
+        
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeConfigFile(mainFile, false, false, vhostsFile, null);
 
+        // Load config
+        ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+        ApplicationRegistry.initialise(reg, 1);
+
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+
+        assertEquals("Incorrect virtualhost count", 2, virtualHostRegistry.getVirtualHosts().size());
+        
+        // test topic host
+        VirtualHost topicVirtualHost = virtualHostRegistry.getVirtualHost("topic");
+        Exchange topicExchange = topicVirtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.topic"));
+        
+        assertEquals("Incorrect topic virtualhost name", "topic", topicVirtualHost.getName());
+        assertEquals("Incorrect topic exchange type", "topic", topicExchange.getType().getName().toString());
+        
+        // Test fanout host
+        VirtualHost fanoutVirtualHost = virtualHostRegistry.getVirtualHost("fanout");
+        Exchange fanoutExchange = fanoutVirtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.fanout"));
+        
+        assertEquals("Incorrect fanout virtualhost name", "fanout", fanoutVirtualHost.getName());
+        assertEquals("Incorrect fanout exchange type", "fanout", fanoutExchange.getType().getName().toString());
+    }
+    
+    /**
+     * Test that configuration does not load when virtual hosts are specified in both the main
+     * configuration file and an external file. Should throw a {@link ConfigurationException}.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testInternalAndExternalVirtualhostXMLFile() throws Exception
+    {
+        // Write out vhosts
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        vhostsFile.deleteOnExit();
+        writeVirtualHostsFile(vhostsFile, "test");
+        
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeConfigFile(mainFile, false, true, vhostsFile, "test");
+        
+        // Load config
         try
         {
-            ApplicationRegistry.initialise(new ConfigurationFileApplicationRegistry(configFile), REGISTRY);
-
-            VirtualHostRegistry virtualHostRegistry = ApplicationRegistry.getInstance(REGISTRY).getVirtualHostRegistry();
+            @SuppressWarnings("unused")
+            ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+            fail("Different virtualhost XML configurations not allowed");
+        }
+        catch (ConfigurationException ce)
+        {
+            assertEquals("Incorrect error message", "Only one of external or embedded virtualhosts configuration allowed.", ce.getMessage());
+        }
+    }
+    
+    /**
+     * Test that configuration does not load when virtual hosts are specified in multiple external
+     * files. Should throw a {@link ConfigurationException}.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testMultipleInternalVirtualhostXMLFile() throws Exception
+    {
+        // Write out vhosts
+        File vhostsFileOne = File.createTempFile(getClass().getName(), "vhosts-one");
+        vhostsFileOne.deleteOnExit();
+        writeVirtualHostsFile(vhostsFileOne, "one");
+        File vhostsFileTwo = File.createTempFile(getClass().getName(), "vhosts-two");
+        vhostsFileTwo.deleteOnExit();
+        writeVirtualHostsFile(vhostsFileTwo, "two");
+        
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        writeMultipleVhostsConfigFile(mainFile, new File[] { vhostsFileOne, vhostsFileTwo });
+        
+        // Load config
+        try
+        {
+            @SuppressWarnings("unused")
+            ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+            fail("Multiple virtualhost XML configurations not allowed");
+        }
+        catch (ConfigurationException ce)
+        {
+            assertEquals("Incorrect error message",
+                    "Only one external virtualhosts configuration file allowed, multiple filenames found.",
+                    ce.getMessage());
+        }
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in an external
+     * configuration file in the first of two configurations and embedded in the second. This
+     * will throe a {@link ConfigurationException} since the configurations have different 
+     * types.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedDifferentVirtualhostConfig() throws Exception
+    {
+        // Write out vhosts config
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        vhostsFile.deleteOnExit();  
+        writeVirtualHostsFile(vhostsFile, "external");
+        
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "a");
+        File fileB = File.createTempFile(getClass().getName(), "b");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeConfigFile(fileA, false, false, vhostsFile, null);  
+        writeConfigFile(fileB, false);
 
-            assertEquals("Incorrect virtualhost count", 3 , virtualHostRegistry.getVirtualHosts().size());
+        // Load config
+        try
+        {
+            @SuppressWarnings("unused")
+            ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+            fail("Different virtualhost XML configurations not allowed");
         }
-        finally
+        catch (ConfigurationException ce)
         {
-            ApplicationRegistry.remove(REGISTRY);
+            assertEquals("Incorrect error message", "Only one of external or embedded virtualhosts configuration allowed.", ce.getMessage());
         }
     }
 
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified two overriding configurations
+     * each with an embedded virtualhost section. The first configuration section should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedConfigEmbeddedVirtualhost() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "a");
+        File fileB = File.createTempFile(getClass().getName(), "b");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeConfigFile(fileA, false, true, null, "a");
+        writeConfigFile(fileB, false, true, null, "b"); 
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        
+        // Test config
+        VirtualHostConfiguration virtualHost = config.getVirtualHostConfig("a");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "a", virtualHost.getName());
+    }
+
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified two overriding configurations
+     * each with an external virtualhost XML file. The first configuration file should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedConfigExternalVirtualhost() throws Exception
+    {
+        // Write out vhosts config
+        File vhostsOne = File.createTempFile(getClass().getName(), "vhosts-one");
+        vhostsOne.deleteOnExit();
+        writeVirtualHostsFile(vhostsOne, "one");
+        File vhostsTwo = File.createTempFile(getClass().getName(), "vhosts-two");
+        vhostsTwo.deleteOnExit();
+        writeVirtualHostsFile(vhostsTwo, "two");
+        
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "a");
+        File fileB = File.createTempFile(getClass().getName(), "b");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeConfigFile(fileA, false, false, vhostsOne, null);
+        writeConfigFile(fileB, false, false, vhostsTwo, null);
 
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        
+        // Test config
+        VirtualHostConfiguration virtualHost = config.getVirtualHostConfig("one");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "one", virtualHost.getName());
+    }
+
+    /**
+     * Test that configuration loads correctly when an overriding virtualhost configuration resets
+     * a property of an embedded virtualhost section. The overriding configuration property value
+     * should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedConfigEmbeddedVirtualhostOverride() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File fileA = File.createTempFile(getClass().getName(), "override");
+        File fileB = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeCombinedConfigFile(mainFile, fileA, fileB);
+        writeTestFishConfigFile(fileB);
+        
+        // Write out overriding virtualhosts section
+        FileWriter out = new FileWriter(fileA);
+        out.write("<broker>\n");
+        out.write("<virtualhosts>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<test>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<durable>false</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</test>\n");
+        out.write("\t\t<fish>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<durable>true</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</fish>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.write("</broker>\n");
+        out.close();
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        
+        // Test config
+        VirtualHostConfiguration testHost = config.getVirtualHostConfig("test");
+        ExchangeConfiguration testExchange = testHost.getExchangeConfiguration("test.topic");
+        VirtualHostConfiguration fishHost = config.getVirtualHostConfig("fish");
+        ExchangeConfiguration fishExchange = fishHost.getExchangeConfiguration("fish.topic");
+
+        assertEquals("Incorrect virtualhost count", 2, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "test", testHost.getName());
+        assertFalse("Incorrect exchange durable property", testExchange.getDurable());
+        assertEquals("Incorrect virtualhost name", "fish", fishHost.getName());
+        assertTrue("Incorrect exchange durable property", fishExchange.getDurable());
+    }
+    
+    /**
+     * Test that configuration loads correctly when virtual hosts are specified in an external
+     * configuration file only.
+     * <p>
+     * Test for QPID-2360
+     */
+    public void testExternalFirewallVirtualhostXMLFile() throws Exception
+    {
+        // Write out config
+        File mainFile = File.createTempFile(getClass().getName(), "config");
+        mainFile.deleteOnExit();
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        vhostsFile.deleteOnExit();
+        writeConfigFile(mainFile, false, false, vhostsFile, null);    
+        writeFirewallVhostsFile(vhostsFile, false);
+
+        // Load config
+        ApplicationRegistry reg = new ConfigurationFileApplicationRegistry(mainFile);
+        ApplicationRegistry.initialise(reg, 1);
+
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+        VirtualHost virtualHost = virtualHostRegistry.getVirtualHost("test");
+
+        assertEquals("Incorrect virtualhost count", 1, virtualHostRegistry.getVirtualHosts().size());
+        assertEquals("Incorrect virtualhost name", "test", virtualHost.getName());
+    }
+
+    /**
+     * Test that configuration loads correctly when the virtualhost configuration is a set of overriding
+     * configuration files that resets a property of a virtualhost. The opmost overriding configuration
+     * property value should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedVirtualhostOverride() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        File fileA = File.createTempFile(getClass().getName(), "vhosts-override");
+        File fileB = File.createTempFile(getClass().getName(), "vhosts-base");
+        mainFile.deleteOnExit();
+        vhostsFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeConfigFile(mainFile, true, false, vhostsFile, null);
+        writeCombinedConfigFile(vhostsFile, fileA, fileB);
+
+        // Write out overriding virtualhosts sections
+        FileWriter out = new FileWriter(fileA);
+        out.write("<virtualhosts>\n");
+        out.write("\t<virtualhost>\n");
+        out.write("\t\t<test>\n");
+        out.write("\t\t\t<exchanges>\n");
+        out.write("\t\t\t\t<exchange>\n");
+        out.write("\t\t\t\t\t<durable>false</durable>\n");
+        out.write("\t\t\t\t</exchange>\n");
+        out.write("\t\tt</exchanges>\n");
+        out.write("\t\t</test>\n");
+        out.write("\t</virtualhost>\n");
+        out.write("</virtualhosts>\n");
+        out.close();
+        writeVirtualHostsFile(fileB, "test");
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        
+        // Test config
+        VirtualHostConfiguration testHost = config.getVirtualHostConfig("test");
+        ExchangeConfiguration testExchange = testHost.getExchangeConfiguration("test.topic");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "test", testHost.getName());
+        assertFalse("Incorrect exchange durable property", testExchange.getDurable());
+    }
+
+    /**
+     * Test that configuration loads correctly when the virtualhost configuration is a set of overriding
+     * configuration files that define multiple virtualhosts, one per file. Only the virtualhosts defined in
+     * the topmost file should be used.
+     * <p>
+     * Test for QPID-2361
+     */
+    public void testCombinedMultipleVirtualhosts() throws Exception
+    {
+        // Write out combined config file
+        File mainFile = File.createTempFile(getClass().getName(), "main");
+        File vhostsFile = File.createTempFile(getClass().getName(), "vhosts");
+        File fileA = File.createTempFile(getClass().getName(), "vhosts-one");
+        File fileB = File.createTempFile(getClass().getName(), "vhosts-two");
+        mainFile.deleteOnExit();
+        vhostsFile.deleteOnExit();
+        fileA.deleteOnExit();
+        fileB.deleteOnExit();
+        writeConfigFile(mainFile, true, false, vhostsFile, null);
+        writeCombinedConfigFile(vhostsFile, fileA, fileB);
+
+        // Write both virtualhosts definitions
+        writeVirtualHostsFile(fileA, "test-one");
+        writeVirtualHostsFile(fileB, "test-two");
+
+        // Load config
+        ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        
+        // Test config
+        VirtualHostConfiguration oneHost = config.getVirtualHostConfig("test-one");
+
+        assertEquals("Incorrect virtualhost count", 1, config.getVirtualHosts().length);
+        assertEquals("Incorrect virtualhost name", "test-one", oneHost.getName());
+    }
 }

Modified: qpid/branches/qmf-devel0.7a/qpid/java/client/test/example_build.xml
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/java/client/test/example_build.xml?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/java/client/test/example_build.xml (original)
+++ qpid/branches/qmf-devel0.7a/qpid/java/client/test/example_build.xml Tue Mar 30 21:35:08 2010
@@ -66,7 +66,7 @@
 
     <!-- Compile Java -->
     <target name="compile" depends="init">
-        <javac destdir="${example.classes}" debug="on">
+        <javac destdir="${example.classes}" debug="on" includeantruntime="false">
             <classpath refid="example_amq.classpath"/>
             <src path="${example.src}"/>
             <exclude name="**/Test*.java"/>

Modified: qpid/branches/qmf-devel0.7a/qpid/java/common.xml
URL: http://svn.apache.org/viewvc/qpid/branches/qmf-devel0.7a/qpid/java/common.xml?rev=929307&r1=929306&r2=929307&view=diff
==============================================================================
--- qpid/branches/qmf-devel0.7a/qpid/java/common.xml (original)
+++ qpid/branches/qmf-devel0.7a/qpid/java/common.xml Tue Mar 30 21:35:08 2010
@@ -105,7 +105,7 @@
   </macrodef>
 
   <mkdir dir="${tasks.classes}"/>
-  <javac source="${java.source}" target="${java.target}" srcdir="${tasks.src}" destdir="${tasks.classes}"  classpath="${java.class.path}">
+  <javac source="${java.source}" target="${java.target}" srcdir="${tasks.src}" destdir="${tasks.classes}"  classpath="${java.class.path}" includeantruntime="false">
     <compilerarg line="${javac.compiler.args}"/>
   </javac>
 

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/lib/org.osgi.core_1.0.0.jar
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /incubator/qpid/trunk/qpid/java/lib/org.osgi.core_1.0.0.jar:443187-720930
 /qpid/branches/java-broker-0-10/qpid/java/lib/org.osgi.core_1.0.0.jar:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/lib/org.osgi.core_1.0.0.jar:805429-821809
-/qpid/trunk/qpid/java/lib/org.osgi.core_1.0.0.jar:919043-928107
+/qpid/trunk/qpid/java/lib/org.osgi.core_1.0.0.jar:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/client/src/main/java/org/apache/qpid/management/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /incubator/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management:443187-703176
 /qpid/branches/java-broker-0-10/qpid/java/management/client/src/main/java/org/apache/qpid/management:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/client/src/main/java/org/apache/qpid/management:805429-821809
-/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management:919043-928107
+/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/client/src/test/java/org/apache/qpid/management/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /incubator/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management:443187-703176
 /qpid/branches/java-broker-0-10/qpid/java/management/client/src/test/java/org/apache/qpid/management:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/client/src/test/java/org/apache/qpid/management:805429-821809
-/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management:919043-928107
+/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ConfigurationManagement.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ConfigurationManagement.java:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ConfigurationManagement.java:805429-821809
 /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/management/ConfigurationManagement.java:742626,743015,743028-743029,743304,743306,743311,743357,744113,747363,747367,747369-747370,747376,747783,747868-747870,747875,748561,748591,748641,748680,748686,749149,749282,749285,749315,749340,749572,753219-753220,753253,754934,754958,755256,757258,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790
-/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ConfigurationManagement.java:919043-928107
+/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ConfigurationManagement.java:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/LoggingManagement.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/LoggingManagement.java:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/LoggingManagement.java:805429-821809
 /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/management/LoggingManagement.java:742626,743015,743028-743029,743304,743306,743311,743357,744113,747363,747367,747369-747370,747376,747783,747868-747870,747875,748561,748591,748641,748680,748686,749149,749282,749285,749315,749340,749572,753219-753220,753253,754934,754958,755256,757258,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790
-/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/LoggingManagement.java:919043-928107
+/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/LoggingManagement.java:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedBroker.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -2,4 +2,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedBroker.java:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedBroker.java:805429-821809
 /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/ManagedBroker.java:753219-753220,753253,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790
-/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedBroker.java:919043-928107
+/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedBroker.java:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedConnection.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedConnection.java:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedConnection.java:805429-821809
 /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ManagedConnection.java:742626,743015,743028-743029,743304,743306,743311,743357,744113,747363,747367,747369-747370,747376,747783,747868-747870,747875,748561,748591,748641,748680,748686,749149,749282,749285,749315,749340,749572,753219-753220,753253,754934,754958,755256,757258,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790
-/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedConnection.java:919043-928107
+/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedConnection.java:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedExchange.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -1,4 +1,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedExchange.java:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedExchange.java:805429-821809
 /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ManagedExchange.java:742626,743015,743028-743029,743304,743306,743311,743357,744113,747363,747367,747369-747370,747376,747783,747868-747870,747875,748561,748591,748641,748680,748686,749149,749282,749285,749315,749340,749572,753219-753220,753253,754934,754958,755256,757258,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790
-/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedExchange.java:919043-928107
+/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedExchange.java:919043-929244

Propchange: qpid/branches/qmf-devel0.7a/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedQueue.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 21:35:08 2010
@@ -2,4 +2,4 @@
 /qpid/branches/java-broker-0-10/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedQueue.java:795950-829653
 /qpid/branches/java-network-refactor/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedQueue.java:805429-821809
 /qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ManagedQueue.java:753219-753220,753253,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790
-/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedQueue.java:919043-928107
+/qpid/trunk/qpid/java/management/common/src/main/java/org/apache/qpid/management/common/mbeans/ManagedQueue.java:919043-929244



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org