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

svn commit: r929138 [1/2] - in /qpid/branches/0.5.x-dev/qpid/java: broker/etc/ broker/src/main/java/org/apache/qpid/server/configuration/ broker/src/test/java/org/apache/qpid/server/configuration/ systests/etc/ systests/src/main/java/org/apache/qpid/se...

Author: robbie
Date: Tue Mar 30 13:46:48 2010
New Revision: 929138

URL: http://svn.apache.org/viewvc?rev=929138&view=rev
Log:
QPID-2630, QPID-2631: Restore the virtualhosts.xml file. When a virtualhosts.xml file is specified load it as its own Configuration object to ensure the property heirarchy is not lost. Enforce that virtualhost config can only be specified in either the main config.xml file or the virtualhosts.xml file, but not both. Allow the virtualhosts.xml file to be a combined configuration and use to provide override abilities for testing.

Applied patch from Andrew Kennedy <an...@gmail.com>

Added:
    qpid/branches/0.5.x-dev/qpid/java/broker/etc/virtualhosts.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl-settings.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl.xml
      - copied, changed from r928703, qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-derby.xml
      - copied, changed from r928703, qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-firewall-2.xml
      - copied, changed from r928703, qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-ServerConfigurationTest-New.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-firewall-3.xml
      - copied, changed from r928703, qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-ServerConfigurationTest-New.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-firewall.xml
      - copied, changed from r928703, qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests.xml
      - copied, changed from r928703, qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml
Removed:
    qpid/branches/0.5.x-dev/qpid/java/broker/etc/persistent_config.xml
    qpid/branches/0.5.x-dev/qpid/java/broker/etc/transient_config.xml
Modified:
    qpid/branches/0.5.x-dev/qpid/java/broker/etc/config.xml
    qpid/branches/0.5.x-dev/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
    qpid/branches/0.5.x-dev/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-ServerConfigurationTest-New.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl-settings.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby-settings.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-2.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-3.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-settings.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-settings.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-ServerConfigurationTest-New.xml
    qpid/branches/0.5.x-dev/qpid/java/systests/src/main/java/org/apache/qpid/server/configuration/ServerConfigurationFileTest.java
    qpid/branches/0.5.x-dev/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/AlertingTest.java
    qpid/branches/0.5.x-dev/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java
    qpid/branches/0.5.x-dev/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/VirtualHostLoggingTest.java
    qpid/branches/0.5.x-dev/qpid/java/systests/src/main/java/org/apache/qpid/server/security/firewall/FirewallConfigTest.java
    qpid/branches/0.5.x-dev/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java
    qpid/branches/0.5.x-dev/qpid/java/test-profiles/log4j-test.xml

Modified: qpid/branches/0.5.x-dev/qpid/java/broker/etc/config.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/broker/etc/config.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/broker/etc/config.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/broker/etc/config.xml Tue Mar 30 13:46:48 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>

Added: qpid/branches/0.5.x-dev/qpid/java/broker/etc/virtualhosts.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/broker/etc/virtualhosts.xml?rev=929138&view=auto
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/broker/etc/virtualhosts.xml (added)
+++ qpid/branches/0.5.x-dev/qpid/java/broker/etc/virtualhosts.xml Tue Mar 30 13:46:48 2010
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ -
+ - 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.
+ -
+ -->
+<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>
+
+

Modified: qpid/branches/0.5.x-dev/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java (original)
+++ qpid/branches/0.5.x-dev/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java Tue Mar 30 13:46:48 2010
@@ -24,14 +24,15 @@ import java.io.File;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.Locale;
+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;
@@ -50,18 +51,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;
 
@@ -69,6 +69,7 @@ public class ServerConfiguration impleme
     private SecurityConfiguration _securityConfiguration = null;
 
     private File _configFile;
+    private File _vhostsFile;
 
     private Logger _log = LoggerFactory.getLogger(this.getClass());
 
@@ -132,8 +133,6 @@ public class ServerConfiguration impleme
     {
         setConfig(conf);
 
-        substituteEnvironmentVariables();
-
         _jmxPort = getConfig().getInt("management.jmxport", 8999);
         _securityConfiguration = new SecurityConfiguration(conf.subset("security"));
 
@@ -141,61 +140,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(_vhostsFile);
+	        }
+        }
+        
+        // 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;
     }
 
@@ -309,13 +333,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);
             }
@@ -578,7 +614,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()

Modified: qpid/branches/0.5.x-dev/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java (original)
+++ qpid/branches/0.5.x-dev/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/ServerConfigurationTest.java Tue Mar 30 13:46:48 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.codec.AMQCodecFactory;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.exchange.Exchange;
 import org.apache.qpid.server.protocol.AMQMinaProtocolSession;
 import org.apache.qpid.server.protocol.AMQProtocolSession;
 import org.apache.qpid.server.protocol.TestIoSession;
@@ -33,17 +42,8 @@ import org.apache.qpid.server.registry.C
 import org.apache.qpid.server.virtualhost.VirtualHost;
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
 
-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
@@ -749,10 +749,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
@@ -879,6 +878,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");
@@ -903,15 +906,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
@@ -1011,35 +1100,538 @@ public class ServerConfigurationTest ext
         assertFalse(reg.getAccessManager().authoriseConnect(session, virtualHost));
     }
 
-    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");
+
+        // 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"));
 
-    public void testNoVirtualhostXMLFile() throws Exception
+        assertEquals("Incorrect virtualhost count", 1, virtualHostRegistry.getVirtualHosts().size());
+        assertEquals("Incorrect virtualhost name", "test", virtualHost.getName());
+        assertEquals("Incorrect exchange type", "topic", exchange.getType().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);
 
-        ApplicationRegistry.initialise(new ConfigurationFileApplicationRegistry(configFile), REGISTRY);
+        // Test config
+        VirtualHostRegistry virtualHostRegistry = reg.getVirtualHostRegistry();
+        VirtualHost virtualHost = virtualHostRegistry.getVirtualHost("test");
+        Exchange exchange = virtualHost.getExchangeRegistry().getExchange(new AMQShortString("test.topic"));
 
-        VirtualHostRegistry virtualHostRegistry = ApplicationRegistry.getInstance(REGISTRY).getVirtualHostRegistry();
+        assertEquals("Incorrect virtualhost count", 1, virtualHostRegistry.getVirtualHosts().size());
+        assertEquals("Incorrect virtualhost name", "test", virtualHost.getName());
+        assertEquals("Incorrect exchange type", "topic", exchange.getType().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().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().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
+        {
+        	@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);
+
+        // Load config
+        try
+        {
+        	@SuppressWarnings("unused")
+			ServerConfiguration config = new ServerConfiguration(mainFile.getAbsoluteFile());
+        	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 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();
 
-        assertEquals("Incorrect virtualhost count", 3 , virtualHostRegistry.getVirtualHosts().size());
+        // 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 topmost 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/0.5.x-dev/qpid/java/systests/etc/config-systests-ServerConfigurationTest-New.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-ServerConfigurationTest-New.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-ServerConfigurationTest-New.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-ServerConfigurationTest-New.xml Tue Mar 30 13:46:48 2010
@@ -18,9 +18,6 @@
  - specific language governing permissions and limitations
  - under the License.
  -
-
- This is an example config using the BDBMessageStore available from
- the Red Hat Messaging project at etp.108.redhat.com and distributed under GPL.
  -->
         
 <broker>
@@ -68,17 +65,8 @@
         </jmx>
     </security>
 
-    <virtualhosts>
-        <virtualhost>
-            <name>dev-only</name>
-            <dev-only>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore</class>
-                    <environment-path>${work}/bdbstore/dev-only-store</environment-path>
-                </store>
-            </dev-only>
-        </virtualhost>
-    </virtualhosts>
+    <virtualhosts>${conf}/virtualhosts-ServerConfigurationTest-New.xml</virtualhosts>
+    
     <heartbeat>
         <delay>0</delay>
         <timeoutFactor>2.0</timeoutFactor>
@@ -86,8 +74,6 @@
     <queue>
         <auto_register>true</auto_register>
     </queue>
-
-    <virtualhosts>${conf}/virtualhosts-ServerConfigurationTest-New.xml</virtualhosts>
 </broker>
 
 

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl-settings.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl-settings.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl-settings.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl-settings.xml Tue Mar 30 13:46:48 2010
@@ -20,141 +20,7 @@
  -
  -->
 <broker>
-
-    <virtualhosts>
-
-        <virtualhost>
-            <name>test</name>
-            <test>
-                <queues>
-                    <exchange>amq.direct</exchange>
-                    <!-- 4Mb -->
-                    <maximumQueueDepth>4235264</maximumQueueDepth>
-                    <!-- 2Mb -->
-                    <maximumMessageSize>2117632</maximumMessageSize>
-                    <!-- 10 mins -->
-                    <maximumMessageAge>600000</maximumMessageAge>
-                </queues>
-
-
-                <security>
-                    <access>
-                        <class>org.apache.qpid.server.security.access.plugins.SimpleXML</class>
-                    </access>
-                    <access_control_list>
-                        <!-- This section grants pubish rights to an exchange + routing key pair -->
-                        <publish>
-                            <exchanges>
-                                <exchange>
-                                    <name>amq.direct</name>
-                                    <routing_keys>
-
-                                        <!-- Allow clients to publish requests -->
-                                        <routing_key>
-                                            <value>example.RequestQueue</value>
-                                            <users>
-                                                <user>client</user>
-                                            </users>
-                                        </routing_key>
-
-                                        <!-- Allow the processor to respond to a client on their Temporary Topic -->
-                                        <routing_key>
-                                            <value>tmp_*</value>
-                                            <users>
-                                                <user>server</user>
-                                            </users>
-                                        </routing_key>
-                                        <routing_key>
-                                            <value>TempQueue*</value>
-                                            <users>
-                                                <user>server</user>
-                                            </users>
-                                        </routing_key>
-                                    </routing_keys>
-
-                                </exchange>
-                            </exchanges>
-                        </publish>
-
-                        <!-- This section grants users the ability to consume from the broker -->
-                        <consume>
-                            <queues>
-                                <temporary>
-                                    <users>
-                                        <user>client</user>
-                                    </users>
-                                </temporary>
-
-                                <!-- Only allow the server to consume from the Request Queue-->
-                                <queue>
-                                    <name>example.RequestQueue</name>
-                                    <users>
-                                        <user>server</user>
-                                    </users>
-                                </queue>
-
-
-                            </queues>
-                        </consume>
-
-                        <!-- This section grants users the ability to create queues and exchanges -->
-                        <create>
-                            <queues>
-                                <temporary>
-                                    <users>
-                                        <user>client</user>
-                                    </users>
-                                </temporary>
-
-                                <!-- Allow clients to create queue on this exchange-->
-                                <queue>
-                                    <exchanges>                                    
-                                        <exchange>
-                                            <name>amq.direct</name>
-                                            <users>
-                                                <user>client</user>
-                                            </users>
-                                        </exchange>
-                                    </exchanges>
-                                </queue>
-                                <!-- Allow the server to create the Request Queue-->
-                                <queue>
-                                    <name>example.RequestQueue</name>
-                                    <users>
-                                        <user>server</user>
-                                    </users>
-                                </queue>
-
-                            </queues>
-                        </create>
-
-
-                    </access_control_list>
-
-                </security>
-            </test>
-        </virtualhost>
-
-        <virtualhost>
-            <name>test2</name>
-            <test2>
-                <security>
-                    <access>
-                        <class>org.apache.qpid.server.security.access.plugins.SimpleXML</class>
-                    </access>
-                    
-                    <access_control_list>
-                        <!-- This section grants specific users full permissions to all artifacts in this virtualhost -->
-                        <access>
-                            <users>
-                                <user>guest</user>
-                            </users>
-                        </access>
-                    </access_control_list>
-                </security>
-            </test2>
-        </virtualhost>
-    </virtualhosts>
+    <virtualhosts>${QPID_HOME}/etc/virtualhosts-systests-acl.xml</virtualhosts>
 </broker>
 
 

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-acl.xml Tue Mar 30 13:46:48 2010
@@ -22,7 +22,7 @@
 <configuration>
     <system/>
     <override>
-        <xml fileName="${test.config}" config-optional="true"/>
+        <xml fileName="${test.config}" optional="true"/>
         <xml fileName="${QPID_HOME}/etc/config-systests-acl-settings.xml"/>
         <xml fileName="${QPID_HOME}/etc/config-systests-settings.xml"/>
         <xml fileName="${QPID_HOME}/etc/config.xml"/>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby-settings.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby-settings.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby-settings.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby-settings.xml Tue Mar 30 13:46:48 2010
@@ -20,45 +20,7 @@
  -
  -->
 <broker>
-    <virtualhosts>
-        <directory>${conf}/virtualhosts</directory>
-
-        <virtualhost>
-            <name>localhost</name>
-            <localhost>
-                <store>
-                    <class>org.apache.qpid.server.store.DerbyMessageStore</class>
-                    <environment-path>${work}/derbyDB/localhost-store</environment-path>
-                </store>
-
-                <housekeeping>
-                    <expiredMessageCheckPeriod>20000</expiredMessageCheckPeriod>
-                </housekeeping>
-
-            </localhost>
-        </virtualhost>
-
-        <virtualhost>
-            <name>development</name>
-            <development>
-                <store>
-                    <class>org.apache.qpid.server.store.DerbyMessageStore</class>
-                    <environment-path>${work}/derbyDB/development-store</environment-path>                                        
-                </store>
-            </development>
-        </virtualhost>
-
-        <virtualhost>
-            <name>test</name>
-            <test>
-                <store>
-                    <class>org.apache.qpid.server.store.DerbyMessageStore</class>
-                    <environment-path>${work}/derbyDB/test-store</environment-path>
-                </store>
-            </test>
-        </virtualhost>
-
-    </virtualhosts>
+    <virtualhosts>${QPID_HOME}/etc/virtualhosts-systests-derby.xml</virtualhosts>
 </broker>
 
 

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-derby.xml Tue Mar 30 13:46:48 2010
@@ -22,7 +22,7 @@
 <configuration>
     <system/>
     <override>
-        <xml fileName="${test.config}" config-optional="true"/>
+        <xml fileName="${test.config}" optional="true"/>
         <xml fileName="${QPID_HOME}/etc/config-systests-derby-settings.xml"/>
         <xml fileName="${QPID_HOME}/etc/config-systests-settings.xml"/>
         <xml fileName="${QPID_HOME}/etc/config.xml"/>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-2.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-2.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-2.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-2.xml Tue Mar 30 13:46:48 2010
@@ -96,32 +96,8 @@
         </firewall>
     </security>
 
-    <virtualhosts>
-        <default>test</default>
-
-        <virtualhost>
-            <name>test</name>
-            <test>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore
-                    </class>
-                </store>
-                <security>
-                    <firewall default-action="allow"/>
-		</security>
-            </test>
-        </virtualhost>
- 
-        <virtualhost>
-            <name>test2</name>
-            <test2>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore
-                    </class>
-                </store>
-            </test2>
-        </virtualhost>
-    </virtualhosts>
+    <virtualhosts>${conf}/virtualhosts-systests-firewall-2.xml</virtualhosts>
+    
     <heartbeat>
         <delay>0</delay>
         <timeoutFactor>2.0</timeoutFactor>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-3.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-3.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-3.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-3.xml Tue Mar 30 13:46:48 2010
@@ -96,32 +96,8 @@
         </firewall>
     </security>
 
-    <virtualhosts>
-        <default>test</default>
-
-        <virtualhost>
-            <name>test</name>
-            <test>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore
-                    </class>
-                </store>
-            </test>
-        </virtualhost>
- 
-        <virtualhost>
-            <name>test2</name>
-            <test2>
-                <store>
-                    <class>org.apache.qpid.server.store.MemoryMessageStore
-                    </class>
-                </store>
-                <security>
-	            <firewall default-action="deny"/>
-	        </security>
-            </test2>
-        </virtualhost>
-    </virtualhosts>
+    <virtualhosts>${conf}/virtualhosts-systests-firewall-3.xml</virtualhosts>
+    
     <heartbeat>
         <delay>0</delay>
         <timeoutFactor>2.0</timeoutFactor>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-settings.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-settings.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-settings.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall-settings.xml Tue Mar 30 13:46:48 2010
@@ -25,4 +25,6 @@
         <rule access="allow" network="127.0.0.1"/>
     </firewall>
     </security>
+    
+    <virtualhosts>${QPID_HOME}/etc/virtualhosts-systests-firewall.xml</virtualhosts>
 </broker>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-firewall.xml Tue Mar 30 13:46:48 2010
@@ -22,8 +22,9 @@
 <configuration>
     <system/>
     <override>
-        <xml fileName="${test.config}" config-optional="true"/>
-        <xml fileName="${QPID_FIREWALL_SETTINGS}"/>
+        <xml fileName="${test.config}" optional="true"/>
+        <xml fileName="${QPID_FIREWALL_CONFIG_SETTINGS}" optional="true"/>
+        <xml fileName="${QPID_HOME}/etc/config-systests-firewall-settings.xml"/>
         <xml fileName="${QPID_HOME}/etc/config-systests-settings.xml"/>
         <xml fileName="${QPID_HOME}/etc/config.xml"/>                
     </override>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-settings.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-settings.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-settings.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests-settings.xml Tue Mar 30 13:46:48 2010
@@ -26,4 +26,5 @@
             <enabled>false</enabled>
         </ssl>
     </management>
+    <virtualhosts>${QPID_HOME}/etc/virtualhosts-systests.xml</virtualhosts>
 </broker>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml Tue Mar 30 13:46:48 2010
@@ -22,7 +22,7 @@
 <configuration>
     <system/>
     <override>
-        <xml fileName="${test.config}" config-optional="true"/>
+        <xml fileName="${test.config}" optional="true"/>
         <xml fileName="${QPID_HOME}/etc/config-systests-settings.xml"/>
         <xml fileName="${QPID_HOME}/etc/config.xml"/>                
     </override>

Modified: qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-ServerConfigurationTest-New.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-ServerConfigurationTest-New.xml?rev=929138&r1=929137&r2=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-ServerConfigurationTest-New.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-ServerConfigurationTest-New.xml Tue Mar 30 13:46:48 2010
@@ -26,7 +26,7 @@
         <dev-only>            
             <queues>
                 <exchange>amq.direct</exchange>
-		<!-- Small defaults for development -->
+                <!-- Small defaults for development -->
                 <maximumQueueDepth>102400</maximumQueueDepth>  <!-- 100k -->
                 <maximumMessageSize>20480</maximumMessageSize> <!-- 20kb -->
                 <maximumMessageAge>60000</maximumMessageAge>  <!-- 1 mins -->
@@ -35,6 +35,11 @@
                     <name>dev-queue</name>
                 </queue>
             </queues>
+            <store>
+                <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+                <environment-path>${QPID_WORK}/bdbstore/dev-only-store</environment-path>
+            </store>
         </dev-only>
     </virtualhost>
 </virtualhosts>
+ 
\ No newline at end of file

Added: qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl-settings.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl-settings.xml?rev=929138&view=auto
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl-settings.xml (added)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl-settings.xml Tue Mar 30 13:46:48 2010
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ -
+ - 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.
+ -
+ -->
+<virtualhosts>
+    <virtualhost>
+        <name>test</name>
+        <test>
+            <queues>
+                <exchange>amq.direct</exchange>
+                <!-- 4Mb -->
+                <maximumQueueDepth>4235264</maximumQueueDepth>
+                <!-- 2Mb -->
+                <maximumMessageSize>2117632</maximumMessageSize>
+                <!-- 10 mins -->
+                <maximumMessageAge>600000</maximumMessageAge>
+            </queues>
+
+
+            <security>
+                <access>
+                    <class>org.apache.qpid.server.security.access.plugins.SimpleXML</class>
+                </access>
+                <access_control_list>
+                    <!-- This section grants pubish rights to an exchange + routing key pair -->
+                    <publish>
+                        <exchanges>
+                            <exchange>
+                                <name>amq.direct</name>
+                                <routing_keys>
+
+                                    <!-- Allow clients to publish requests -->
+                                    <routing_key>
+                                        <value>example.RequestQueue</value>
+                                        <users>
+                                            <user>client</user>
+                                        </users>
+                                    </routing_key>
+
+                                    <!-- Allow the processor to respond to a client on their Temporary Topic -->
+                                    <routing_key>
+                                        <value>tmp_*</value>
+                                        <users>
+                                            <user>server</user>
+                                        </users>
+                                    </routing_key>
+                                    <routing_key>
+                                        <value>TempQueue*</value>
+                                        <users>
+                                            <user>server</user>
+                                        </users>
+                                    </routing_key>
+                                </routing_keys>
+
+                            </exchange>
+                        </exchanges>
+                    </publish>
+
+                    <!-- This section grants users the ability to consume from the broker -->
+                    <consume>
+                        <queues>
+                            <temporary>
+                                <users>
+                                    <user>client</user>
+                                </users>
+                            </temporary>
+
+                            <!-- Only allow the server to consume from the Request Queue-->
+                            <queue>
+                                <name>example.RequestQueue</name>
+                                <users>
+                                    <user>server</user>
+                                </users>
+                            </queue>
+
+
+                        </queues>
+                    </consume>
+
+                    <!-- This section grants users the ability to create queues and exchanges -->
+                    <create>
+                        <queues>
+                            <temporary>
+                                <users>
+                                    <user>client</user>
+                                </users>
+                            </temporary>
+
+                            <!-- Allow clients to create queue on this exchange-->
+                            <queue>
+                                <exchanges>                                    
+                                    <exchange>
+                                        <name>amq.direct</name>
+                                        <users>
+                                            <user>client</user>
+                                        </users>
+                                    </exchange>
+                                </exchanges>
+                            </queue>
+                            <!-- Allow the server to create the Request Queue-->
+                            <queue>
+                                <name>example.RequestQueue</name>
+                                <users>
+                                    <user>server</user>
+                                </users>
+                            </queue>
+
+                        </queues>
+                    </create>
+
+
+                </access_control_list>
+
+            </security>
+        </test>
+    </virtualhost>
+
+    <virtualhost>
+        <name>test2</name>
+        <test2>
+            <security>
+                <access>
+                    <class>org.apache.qpid.server.security.access.plugins.SimpleXML</class>
+                </access>
+                
+                <access_control_list>
+                    <!-- This section grants specific users full permissions to all artifacts in this virtualhost -->
+                    <access>
+                        <users>
+                            <user>guest</user>
+                        </users>
+                    </access>
+                </access_control_list>
+            </security>
+        </test2>
+    </virtualhost>
+</virtualhosts>
+
+

Copied: qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl.xml (from r928703, qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml)
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl.xml?p2=qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl.xml&p1=qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml&r1=928703&r2=929138&rev=929138&view=diff
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/config-systests.xml (original)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-acl.xml Tue Mar 30 13:46:48 2010
@@ -22,8 +22,8 @@
 <configuration>
     <system/>
     <override>
-        <xml fileName="${test.config}" config-optional="true"/>
-        <xml fileName="${QPID_HOME}/etc/config-systests-settings.xml"/>
-        <xml fileName="${QPID_HOME}/etc/config.xml"/>                
+        <xml fileName="${test.virtualhosts}" optional="true"/>
+        <xml fileName="${QPID_HOME}/etc/virtualhosts-systests-acl-settings.xml"/>
+        <xml fileName="${QPID_HOME}/etc/virtualhosts.xml"/>
     </override>
 </configuration>

Added: qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml
URL: http://svn.apache.org/viewvc/qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml?rev=929138&view=auto
==============================================================================
--- qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml (added)
+++ qpid/branches/0.5.x-dev/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml Tue Mar 30 13:46:48 2010
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ -
+ - 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.
+ -
+ -->
+<virtualhosts>
+    <directory>${QPID_HOME}/virtualhosts</directory>
+    <default>test</default>
+    
+    <virtualhost>
+        <localhost>
+            <store>
+                <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+                <environment-path>${QPID_WORK}/derbyDB/localhost-store</environment-path>
+            </store>
+        </localhost>
+    </virtualhost>
+
+    <virtualhost>
+        <development>
+            <store>
+                <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+                <environment-path>${QPID_WORK}/derbyDB/development-store</environment-path>                                        
+            </store>
+        </development>
+    </virtualhost>
+
+    <virtualhost>
+        <test>
+            <store>
+                <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+                <environment-path>${QPID_WORK}/derbyDB/test-store</environment-path>
+            </store>
+        </test>
+    </virtualhost>
+</virtualhosts>
+
+



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