diff options
| author | Robert Gemmell <robbie@apache.org> | 2010-03-30 13:45:18 +0000 |
|---|---|---|
| committer | Robert Gemmell <robbie@apache.org> | 2010-03-30 13:45:18 +0000 |
| commit | 849df0c69c5068a6557a5aac8bfce68c3f4ad4af (patch) | |
| tree | 8d9c0e062b7590cd6294db3884cde9f70401f9ad /java/broker/src/main | |
| parent | a6cb3b13f6e4c5790cb4346c771a277c29f5b516 (diff) | |
| download | qpid-python-849df0c69c5068a6557a5aac8bfce68c3f4ad4af.tar.gz | |
QPID-2360, QPID-2361: 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 <andrew.international@gmail.com>
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@929136 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/broker/src/main')
| -rw-r--r-- | java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java | 116 |
1 files changed, 76 insertions, 40 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java index 879eb7c9e6..edf88f9b5a 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java +++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java @@ -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 implements SignalHandler 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 implements SignalHandler private SecurityConfiguration _securityConfiguration = null; private File _configFile; + private File _vhostsFile; private Logger _log = LoggerFactory.getLogger(this.getClass()); @@ -134,8 +135,6 @@ public class ServerConfiguration implements SignalHandler { setConfig(conf); - substituteEnvironmentVariables(); - _jmxPort = getConfig().getInt("management.jmxport", 8999); _securityConfiguration = new SecurityConfiguration(conf.subset("security")); @@ -143,61 +142,86 @@ public class ServerConfiguration implements SignalHandler } - 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()) + List<String> vhostFiles = conf.getList("virtualhosts"); + Configuration vhostConfig = conf.subset("virtualhosts"); + + // Only one configuration mechanism allowed + if (!vhostFiles.isEmpty() && !vhostConfig.subset("virtualhost").isEmpty()) { - 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)); - } - } + 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; } - - List hosts = conf.getList("virtualhosts.virtualhost.name"); + 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 implements SignalHandler 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 implements SignalHandler public int getSSLPort() { - return getConfig().getInt("connector.ssl.port", DEFAUL_SSL_PORT); + return getConfig().getInt("connector.ssl.port", DEFAULT_SSL_PORT); } public String getKeystorePath() |
