summaryrefslogtreecommitdiff
path: root/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java')
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java342
1 files changed, 342 insertions, 0 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
new file mode 100644
index 0000000000..a710230616
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
@@ -0,0 +1,342 @@
+/*
+ *
+ * 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.
+ *
+ */
+package org.apache.qpid.server.configuration;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.configuration.CompositeConfiguration;
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.qpid.exchange.ExchangeDefaults;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.configuration.plugins.ConfigurationPlugin;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.store.MemoryMessageStore;
+
+public class VirtualHostConfiguration extends ConfigurationPlugin
+{
+ private String _name;
+ private Map<String, QueueConfiguration> _queues = new HashMap<String, QueueConfiguration>();
+ private Map<String, ExchangeConfiguration> _exchanges = new HashMap<String, ExchangeConfiguration>();
+
+ public VirtualHostConfiguration(String name, Configuration config) throws ConfigurationException
+ {
+ _name = name;
+ setConfiguration(config);
+ }
+
+ /**
+ * Apply the given configuration to this VirtualHostConfiguration
+ *
+ * @param config the config to apply
+ * @throws ConfigurationException if a problem occurs with configuration
+ */
+ public void setConfiguration(Configuration config) throws ConfigurationException
+ {
+ setConfiguration("virtualhosts.virtualhost", config);
+
+ Iterator i = getListValue("queues.queue.name").iterator();
+
+ while (i.hasNext())
+ {
+ String queueName = (String) i.next();
+ _queues.put(queueName, new QueueConfiguration(queueName, this));
+ }
+
+ i = getListValue("exchanges.exchange.name").iterator();
+ int count = 0;
+ while (i.hasNext())
+ {
+ CompositeConfiguration mungedConf = new CompositeConfiguration();
+ mungedConf.addConfiguration(config.subset("exchanges.exchange(" + count++ + ")"));
+ mungedConf.addConfiguration(_configuration.subset("exchanges"));
+ String exchName = (String) i.next();
+ _exchanges.put(exchName, new ExchangeConfiguration(exchName, mungedConf));
+ }
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public long getHousekeepingExpiredMessageCheckPeriod()
+ {
+ return getLongValue("housekeeping.expiredMessageCheckPeriod", ApplicationRegistry.getInstance().getConfiguration().getHousekeepingCheckPeriod());
+ }
+
+ public String getAuthenticationDatabase()
+ {
+ return getStringValue("security.authentication.name");
+ }
+
+ public List getCustomExchanges()
+ {
+ return getListValue("custom-exchanges.class-name");
+ }
+
+ public Configuration getStoreConfiguration()
+ {
+ return _configuration.subset("store");
+ }
+
+ public String getMessageStoreClass()
+ {
+ return getStringValue("store.class", MemoryMessageStore.class.getName());
+ }
+
+ public void setMessageStoreClass(String storeClass)
+ {
+ _configuration.setProperty("store.class", storeClass);
+ }
+
+ public List getExchanges()
+ {
+ return getListValue("exchanges.exchange.name");
+ }
+
+ public String[] getQueueNames()
+ {
+ return _queues.keySet().toArray(new String[_queues.size()]);
+ }
+
+ public ExchangeConfiguration getExchangeConfiguration(String exchangeName)
+ {
+ return _exchanges.get(exchangeName);
+ }
+
+ public QueueConfiguration getQueueConfiguration(String queueName)
+ {
+ // We might be asked for the config for a queue we don't know about,
+ // such as one that's been dynamically created. Those get the defaults by default.
+ if (_queues.containsKey(queueName))
+ {
+ return _queues.get(queueName);
+ }
+ else
+ {
+ try
+ {
+ return new QueueConfiguration(queueName, this);
+ }
+ catch (ConfigurationException e)
+ {
+ // The configuration is empty so there can't be an error.
+ return null;
+ }
+ }
+ }
+
+ public ConfigurationPlugin getQueueConfiguration(AMQQueue queue)
+ {
+ VirtualHostConfiguration hostConfig = queue.getVirtualHost().getConfiguration();
+
+ // First check if we have a named queue configuration (the easy case)
+ if (Arrays.asList(hostConfig.getQueueNames()).contains(queue.getName()))
+ {
+ return null;
+ }
+
+ // We don't have an explicit queue config we must find out what we need.
+ ArrayList<Binding> bindings = new ArrayList<Binding>(queue.getBindings());
+
+ List<AMQShortString> exchangeClasses = new ArrayList<AMQShortString>(bindings.size());
+
+ //Remove default exchange
+ for (int index = 0; index < bindings.size(); index++)
+ {
+ // Ignore the DEFAULT Exchange binding
+ if (bindings.get(index).getExchange().getNameShortString().equals(ExchangeDefaults.DEFAULT_EXCHANGE_NAME))
+ {
+ bindings.remove(index);
+ }
+ else
+ {
+ exchangeClasses.add(bindings.get(index).getExchange().getType().getName());
+
+ if (exchangeClasses.size() > 1)
+ {
+ // If we have more than 1 class of exchange then we can only use the global queue configuration.
+ // and this will be returned from the default getQueueConfiguration
+ return null;
+ }
+ }
+ }
+
+ // If we are just bound the the default exchange then use the default.
+ if (bindings.isEmpty())
+ {
+ return null;
+ }
+
+ // If we are bound to only one type of exchange then we are going
+ // to have to resolve the configuration for that exchange.
+
+ String exchangeName = bindings.get(0).getExchange().getType().getName().toString();
+
+ // Lookup a Configuration handler for this Exchange.
+
+ // Build the expected class name. <Exchangename>sConfiguration
+ // i.e. TopicConfiguration or HeadersConfiguration
+ String exchangeClass = "org.apache.qpid.server.configuration."
+ + exchangeName.substring(0, 1).toUpperCase()
+ + exchangeName.substring(1) + "Configuration";
+
+ ExchangeConfigurationPlugin exchangeConfiguration
+ = (ExchangeConfigurationPlugin) queue.getVirtualHost().getConfiguration().getConfiguration(exchangeClass);
+
+ // now need to perform the queue-topic-topics-queues magic.
+ // So make a new ConfigurationObject that will hold all the configuration for this queue.
+ ConfigurationPlugin queueConfig = new QueueConfiguration.QueueConfig();
+
+ // Initialise the queue with any Global values we may have
+ PropertiesConfiguration newQueueConfig = new PropertiesConfiguration();
+ newQueueConfig.setProperty("name", queue.getName());
+
+ try
+ {
+ //Set the queue name
+ CompositeConfiguration mungedConf = new CompositeConfiguration();
+ //Set the queue name
+ mungedConf.addConfiguration(newQueueConfig);
+ //Set the global queue configuration
+ mungedConf.addConfiguration(getConfig().subset("queues"));
+
+ // Set configuration
+ queueConfig.setConfiguration("virtualhosts.virtualhost.queues", mungedConf);
+ }
+ catch (ConfigurationException e)
+ {
+ // This will not occur as queues only require a name.
+ _logger.error("QueueConfiguration requirements have changed.");
+ }
+
+ // Merge any configuration the Exchange wishes to apply
+ if (exchangeConfiguration != null)
+ {
+ queueConfig.addConfiguration(exchangeConfiguration.getConfiguration(queue));
+ }
+
+ //Finally merge in any specific queue configuration we have.
+ if (_queues.containsKey(queue.getName()))
+ {
+ queueConfig.addConfiguration(_queues.get(queue.getName()));
+ }
+
+ return queueConfig;
+ }
+
+ public long getMemoryUsageMaximum()
+ {
+ return getLongValue("queues.maximumMemoryUsage");
+ }
+
+ public long getMemoryUsageMinimum()
+ {
+ return getLongValue("queues.minimumMemoryUsage");
+ }
+
+ public int getMaximumMessageAge()
+ {
+ return getIntValue("queues.maximumMessageAge");
+ }
+
+ public Long getMaximumQueueDepth()
+ {
+ return getLongValue("queues.maximumQueueDepth");
+ }
+
+ public Long getMaximumMessageSize()
+ {
+ return getLongValue("queues.maximumMessageSize");
+ }
+
+ public Long getMaximumMessageCount()
+ {
+ return getLongValue("queues.maximumMessageCount");
+ }
+
+ public Long getMinimumAlertRepeatGap()
+ {
+ return getLongValue("queues.minimumAlertRepeatGap");
+ }
+
+ public long getCapacity()
+ {
+ return getLongValue("queues.capacity");
+ }
+
+ public long getFlowResumeCapacity()
+ {
+ return getLongValue("queues.flowResumeCapacity", getCapacity());
+ }
+
+ public String[] getElementsProcessed()
+ {
+ return new String[]{"queues", "exchanges", "custom-exchanges", "store", "housekeeping"};
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationException
+ {
+ // QPID-3249. Support for specifying authentication name at vhost level is no longer supported.
+ if (getListValue("security.authentication.name").size() > 0)
+ {
+ String message = "Validation error : security/authentication/name is no longer a supported element within the configuration xml."
+ + " It appears in virtual host definition : " + _name;
+ throw new ConfigurationException(message);
+ }
+ }
+
+ public int getHouseKeepingThreadCount()
+ {
+ return getIntValue("housekeeping.poolSize", Runtime.getRuntime().availableProcessors());
+ }
+
+ public long getTransactionTimeoutOpenWarn()
+ {
+ return getLongValue("transactionTimeout.openWarn", 0L);
+ }
+
+ public long getTransactionTimeoutOpenClose()
+ {
+ return getLongValue("transactionTimeout.openClose", 0L);
+ }
+
+ public long getTransactionTimeoutIdleWarn()
+ {
+ return getLongValue("transactionTimeout.idleWarn", 0L);
+ }
+
+ public long getTransactionTimeoutIdleClose()
+ {
+ return getLongValue("transactionTimeout.idleClose", 0L);
+ }
+}