diff options
Diffstat (limited to 'qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java')
-rw-r--r-- | qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java | 1267 |
1 files changed, 0 insertions, 1267 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java deleted file mode 100644 index aec78ba414..0000000000 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java +++ /dev/null @@ -1,1267 +0,0 @@ -/* - * - * 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.model.adapter; - -import java.lang.reflect.Type; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.security.AccessControlException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import org.apache.log4j.Logger; -import org.apache.qpid.common.QpidProperties; -import org.apache.qpid.server.BrokerOptions; -import org.apache.qpid.server.configuration.BrokerConfigurationStoreCreator; -import org.apache.qpid.server.configuration.ConfigurationEntryStore; -import org.apache.qpid.server.configuration.IllegalConfigurationException; -import org.apache.qpid.server.configuration.updater.TaskExecutor; -import org.apache.qpid.server.logging.LogRecorder; -import org.apache.qpid.server.logging.RootMessageLogger; -import org.apache.qpid.server.logging.actors.BrokerActor; -import org.apache.qpid.server.logging.actors.CurrentActor; -import org.apache.qpid.server.logging.messages.BrokerMessages; -import org.apache.qpid.server.model.AccessControlProvider; -import org.apache.qpid.server.model.AuthenticationProvider; -import org.apache.qpid.server.model.Broker; -import org.apache.qpid.server.model.ConfigurationChangeListener; -import org.apache.qpid.server.model.ConfiguredObject; -import org.apache.qpid.server.model.GroupProvider; -import org.apache.qpid.server.model.KeyStore; -import org.apache.qpid.server.model.LifetimePolicy; -import org.apache.qpid.server.model.Model; -import org.apache.qpid.server.model.Plugin; -import org.apache.qpid.server.model.Port; -import org.apache.qpid.server.model.State; -import org.apache.qpid.server.model.Statistics; -import org.apache.qpid.server.model.TrustStore; -import org.apache.qpid.server.model.UUIDGenerator; -import org.apache.qpid.server.model.VirtualHost; -import org.apache.qpid.server.model.adapter.AuthenticationProviderAdapter.SimpleAuthenticationProviderAdapter; -import org.apache.qpid.server.plugin.VirtualHostFactory; -import org.apache.qpid.server.security.SecurityManager; -import org.apache.qpid.server.security.SubjectCreator; -import org.apache.qpid.server.security.access.Operation; -import org.apache.qpid.server.security.auth.manager.AuthenticationManager; -import org.apache.qpid.server.security.auth.manager.SimpleAuthenticationManager; -import org.apache.qpid.server.stats.StatisticsGatherer; -import org.apache.qpid.server.store.MessageStoreCreator; -import org.apache.qpid.server.util.MapValueConverter; -import org.apache.qpid.server.virtualhost.VirtualHostRegistry; - -public class BrokerAdapter extends AbstractAdapter implements Broker, ConfigurationChangeListener -{ - private static final Logger LOGGER = Logger.getLogger(BrokerAdapter.class); - - @SuppressWarnings("serial") - public static final Map<String, Type> ATTRIBUTE_TYPES = Collections.unmodifiableMap(new HashMap<String, Type>(){{ - put(QUEUE_ALERT_THRESHOLD_MESSAGE_AGE, Long.class); - put(QUEUE_ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES, Long.class); - put(QUEUE_ALERT_THRESHOLD_QUEUE_DEPTH_BYTES, Long.class); - put(QUEUE_ALERT_THRESHOLD_MESSAGE_SIZE, Long.class); - put(QUEUE_ALERT_REPEAT_GAP, Long.class); - put(QUEUE_FLOW_CONTROL_SIZE_BYTES, Long.class); - put(QUEUE_FLOW_CONTROL_RESUME_SIZE_BYTES, Long.class); - put(VIRTUALHOST_HOUSEKEEPING_CHECK_PERIOD, Long.class); - - put(QUEUE_DEAD_LETTER_QUEUE_ENABLED, Boolean.class); - put(STATISTICS_REPORTING_RESET_ENABLED, Boolean.class); - - put(QUEUE_MAXIMUM_DELIVERY_ATTEMPTS, Integer.class); - put(CONNECTION_SESSION_COUNT_LIMIT, Integer.class); - put(CONNECTION_HEART_BEAT_DELAY, Integer.class); - put(CONNECTION_CLOSE_WHEN_NO_ROUTE, Boolean.class); - put(STATISTICS_REPORTING_PERIOD, Integer.class); - - put(NAME, String.class); - put(DEFAULT_VIRTUAL_HOST, String.class); - - put(VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_CLOSE, Long.class); - put(VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_WARN, Long.class); - put(VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE, Long.class); - put(VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_WARN, Long.class); - put(MODEL_VERSION, String.class); - put(STORE_VERSION, String.class); - }}); - - public static final int DEFAULT_STATISTICS_REPORTING_PERIOD = 0; - public static final boolean DEFAULT_STATISTICS_REPORTING_RESET_ENABLED = false; - public static final long DEFAULT_ALERT_REPEAT_GAP = 30000l; - public static final long DEFAULT_ALERT_THRESHOLD_MESSAGE_AGE = 0l; - public static final long DEFAULT_ALERT_THRESHOLD_MESSAGE_COUNT = 0l; - public static final long DEFAULT_ALERT_THRESHOLD_MESSAGE_SIZE = 0l; - public static final long DEFAULT_ALERT_THRESHOLD_QUEUE_DEPTH = 0l; - public static final boolean DEFAULT_DEAD_LETTER_QUEUE_ENABLED = false; - public static final int DEFAULT_MAXIMUM_DELIVERY_ATTEMPTS = 0; - public static final long DEFAULT_FLOW_CONTROL_RESUME_SIZE_BYTES = 0l; - public static final long DEFAULT_FLOW_CONTROL_SIZE_BYTES = 0l; - public static final long DEFAULT_HOUSEKEEPING_CHECK_PERIOD = 30000l; - public static final int DEFAULT_HEART_BEAT_DELAY = 0; - public static final int DEFAULT_SESSION_COUNT_LIMIT = 256; - public static final String DEFAULT_NAME = "QpidBroker"; - public static final long DEFAULT_STORE_TRANSACTION_IDLE_TIMEOUT_CLOSE = 0l; - public static final long DEFAULT_STORE_TRANSACTION_IDLE_TIMEOUT_WARN = 0l; - public static final long DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE = 0l; - public static final long DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_WARN = 0l; - public static final boolean DEFAULT_CONNECTION_CLOSE_WHEN_NO_ROUTE = true; - - @SuppressWarnings("serial") - private static final Map<String, Object> DEFAULTS = Collections.unmodifiableMap(new HashMap<String, Object>(){{ - put(Broker.STATISTICS_REPORTING_PERIOD, DEFAULT_STATISTICS_REPORTING_PERIOD); - put(Broker.STATISTICS_REPORTING_RESET_ENABLED, DEFAULT_STATISTICS_REPORTING_RESET_ENABLED); - put(Broker.QUEUE_ALERT_REPEAT_GAP, DEFAULT_ALERT_REPEAT_GAP); - put(Broker.QUEUE_ALERT_THRESHOLD_MESSAGE_AGE, DEFAULT_ALERT_THRESHOLD_MESSAGE_AGE); - put(Broker.QUEUE_ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES, DEFAULT_ALERT_THRESHOLD_MESSAGE_COUNT); - put(Broker.QUEUE_ALERT_THRESHOLD_MESSAGE_SIZE, DEFAULT_ALERT_THRESHOLD_MESSAGE_SIZE); - put(Broker.QUEUE_ALERT_THRESHOLD_QUEUE_DEPTH_BYTES, DEFAULT_ALERT_THRESHOLD_QUEUE_DEPTH); - put(Broker.QUEUE_DEAD_LETTER_QUEUE_ENABLED, DEFAULT_DEAD_LETTER_QUEUE_ENABLED); - put(Broker.QUEUE_MAXIMUM_DELIVERY_ATTEMPTS, DEFAULT_MAXIMUM_DELIVERY_ATTEMPTS); - put(Broker.QUEUE_FLOW_CONTROL_RESUME_SIZE_BYTES, DEFAULT_FLOW_CONTROL_RESUME_SIZE_BYTES); - put(Broker.QUEUE_FLOW_CONTROL_SIZE_BYTES, DEFAULT_FLOW_CONTROL_SIZE_BYTES); - put(Broker.VIRTUALHOST_HOUSEKEEPING_CHECK_PERIOD, DEFAULT_HOUSEKEEPING_CHECK_PERIOD); - put(Broker.CONNECTION_HEART_BEAT_DELAY, DEFAULT_HEART_BEAT_DELAY); - put(Broker.CONNECTION_SESSION_COUNT_LIMIT, DEFAULT_SESSION_COUNT_LIMIT); - put(Broker.CONNECTION_CLOSE_WHEN_NO_ROUTE, DEFAULT_CONNECTION_CLOSE_WHEN_NO_ROUTE); - put(Broker.NAME, DEFAULT_NAME); - put(Broker.VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_CLOSE, DEFAULT_STORE_TRANSACTION_IDLE_TIMEOUT_CLOSE); - put(Broker.VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_WARN, DEFAULT_STORE_TRANSACTION_IDLE_TIMEOUT_WARN); - put(Broker.VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE, DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE); - put(Broker.VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_WARN, DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_WARN); - }}); - - private String[] POSITIVE_NUMERIC_ATTRIBUTES = { QUEUE_ALERT_THRESHOLD_MESSAGE_AGE, QUEUE_ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES, - QUEUE_ALERT_THRESHOLD_QUEUE_DEPTH_BYTES, QUEUE_ALERT_THRESHOLD_MESSAGE_SIZE, QUEUE_ALERT_REPEAT_GAP, QUEUE_FLOW_CONTROL_SIZE_BYTES, - QUEUE_FLOW_CONTROL_RESUME_SIZE_BYTES, QUEUE_MAXIMUM_DELIVERY_ATTEMPTS, VIRTUALHOST_HOUSEKEEPING_CHECK_PERIOD, CONNECTION_SESSION_COUNT_LIMIT, - CONNECTION_HEART_BEAT_DELAY, STATISTICS_REPORTING_PERIOD, VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_CLOSE, - VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_WARN, VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE, - VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_WARN}; - - - private final StatisticsGatherer _statisticsGatherer; - private final VirtualHostRegistry _virtualHostRegistry; - private final LogRecorder _logRecorder; - private final RootMessageLogger _rootMessageLogger; - private StatisticsAdapter _statistics; - - private final Map<String, VirtualHost> _vhostAdapters = new HashMap<String, VirtualHost>(); - private final Map<UUID, Port> _portAdapters = new HashMap<UUID, Port>(); - private final Map<Port, Integer> _stillInUsePortNumbers = new HashMap<Port, Integer>(); - private final Map<UUID, AuthenticationProvider> _authenticationProviders = new HashMap<UUID, AuthenticationProvider>(); - private final Map<String, GroupProvider> _groupProviders = new HashMap<String, GroupProvider>(); - private final Map<UUID, ConfiguredObject> _plugins = new HashMap<UUID, ConfiguredObject>(); - private final Map<String, KeyStore> _keyStores = new HashMap<String, KeyStore>(); - private final Map<String, TrustStore> _trustStores = new HashMap<String, TrustStore>(); - private final Map<UUID, AccessControlProvider> _accessControlProviders = new HashMap<UUID, AccessControlProvider>(); - - private final GroupProviderFactory _groupProviderFactory; - private final AuthenticationProviderFactory _authenticationProviderFactory; - private final AccessControlProviderFactory _accessControlProviderFactory; - private final PreferencesProviderCreator _preferencesProviderCreator; - private final PortFactory _portFactory; - private final SecurityManager _securityManager; - - private final Collection<String> _supportedVirtualHostStoreTypes; - private Collection<String> _supportedBrokerStoreTypes; - private final ConfigurationEntryStore _brokerStore; - - private AuthenticationProvider _managementAuthenticationProvider; - private BrokerOptions _brokerOptions; - - public BrokerAdapter(UUID id, Map<String, Object> attributes, StatisticsGatherer statisticsGatherer, VirtualHostRegistry virtualHostRegistry, - LogRecorder logRecorder, RootMessageLogger rootMessageLogger, AuthenticationProviderFactory authenticationProviderFactory, - GroupProviderFactory groupProviderFactory, AccessControlProviderFactory accessControlProviderFactory, PortFactory portFactory, - PreferencesProviderCreator preferencesProviderCreatory, TaskExecutor taskExecutor, ConfigurationEntryStore brokerStore, BrokerOptions brokerOptions) - { - super(id, DEFAULTS, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES), taskExecutor); - _statisticsGatherer = statisticsGatherer; - _virtualHostRegistry = virtualHostRegistry; - _logRecorder = logRecorder; - _rootMessageLogger = rootMessageLogger; - _statistics = new StatisticsAdapter(statisticsGatherer); - _authenticationProviderFactory = authenticationProviderFactory; - _preferencesProviderCreator = preferencesProviderCreatory; - _groupProviderFactory = groupProviderFactory; - _accessControlProviderFactory = accessControlProviderFactory; - _portFactory = portFactory; - _brokerOptions = brokerOptions; - _securityManager = new SecurityManager(this, _brokerOptions.isManagementMode()); - _supportedVirtualHostStoreTypes = new MessageStoreCreator().getStoreTypes(); - _supportedBrokerStoreTypes = new BrokerConfigurationStoreCreator().getStoreTypes(); - _brokerStore = brokerStore; - if (_brokerOptions.isManagementMode()) - { - AuthenticationManager authManager = new SimpleAuthenticationManager(BrokerOptions.MANAGEMENT_MODE_USER_NAME, _brokerOptions.getManagementModePassword()); - AuthenticationProvider authenticationProvider = new SimpleAuthenticationProviderAdapter(UUID.randomUUID(), this, - authManager, Collections.<String, Object> emptyMap(), Collections.<String> emptySet(), _preferencesProviderCreator); - _managementAuthenticationProvider = authenticationProvider; - } - } - - public Collection<VirtualHost> getVirtualHosts() - { - synchronized(_vhostAdapters) - { - return new ArrayList<VirtualHost>(_vhostAdapters.values()); - } - } - - public Collection<Port> getPorts() - { - synchronized (_portAdapters) - { - final ArrayList<Port> ports = new ArrayList<Port>(_portAdapters.values()); - return ports; - } - } - - public Collection<AuthenticationProvider> getAuthenticationProviders() - { - synchronized (_authenticationProviders) - { - return new ArrayList<AuthenticationProvider>(_authenticationProviders.values()); - } - } - - public AuthenticationProvider findAuthenticationProviderByName(String authenticationProviderName) - { - if (isManagementMode()) - { - return _managementAuthenticationProvider; - } - Collection<AuthenticationProvider> providers = getAuthenticationProviders(); - for (AuthenticationProvider authenticationProvider : providers) - { - if (authenticationProvider.getName().equals(authenticationProviderName)) - { - return authenticationProvider; - } - } - return null; - } - - public KeyStore findKeyStoreByName(String keyStoreName) - { - synchronized(_keyStores) - { - return _keyStores.get(keyStoreName); - } - } - - public TrustStore findTrustStoreByName(String trustStoreName) - { - synchronized(_trustStores) - { - return _trustStores.get(trustStoreName); - } - } - - @Override - public Collection<GroupProvider> getGroupProviders() - { - synchronized (_groupProviders) - { - final ArrayList<GroupProvider> groupManagers = - new ArrayList<GroupProvider>(_groupProviders.values()); - return groupManagers; - } - } - - private VirtualHost createVirtualHost(final Map<String, Object> attributes) - throws AccessControlException, IllegalArgumentException - { - final VirtualHostAdapter virtualHostAdapter = new VirtualHostAdapter(UUID.randomUUID(), attributes, this, - _statisticsGatherer, getTaskExecutor()); - addVirtualHost(virtualHostAdapter); - - // permission has already been granted to create the virtual host - // disable further access check on other operations, e.g. create exchange - SecurityManager.setAccessChecksDisabled(true); - try - { - virtualHostAdapter.setDesiredState(State.INITIALISING, State.ACTIVE); - } - finally - { - SecurityManager.setAccessChecksDisabled(false); - } - return virtualHostAdapter; - } - - private boolean deleteVirtualHost(final VirtualHost vhost) throws AccessControlException, IllegalStateException - { - synchronized (_vhostAdapters) - { - _vhostAdapters.remove(vhost.getName()); - } - vhost.removeChangeListener(this); - return true; - } - - public String getName() - { - return (String)getAttribute(NAME); - } - - public String setName(final String currentName, final String desiredName) - throws IllegalStateException, AccessControlException - { - return null; //TODO - } - - - public State getActualState() - { - return null; //TODO - } - - - public boolean isDurable() - { - return true; - } - - public void setDurable(final boolean durable) - throws IllegalStateException, AccessControlException, IllegalArgumentException - { - throw new IllegalStateException(); - } - - public LifetimePolicy getLifetimePolicy() - { - return LifetimePolicy.PERMANENT; - } - - public LifetimePolicy setLifetimePolicy(final LifetimePolicy expected, final LifetimePolicy desired) - throws IllegalStateException, AccessControlException, IllegalArgumentException - { - throw new IllegalStateException(); - } - - public long getTimeToLive() - { - return 0; - } - - public long setTimeToLive(final long expected, final long desired) - throws IllegalStateException, AccessControlException, IllegalArgumentException - { - throw new IllegalStateException(); - } - - public Statistics getStatistics() - { - return _statistics; - } - - @SuppressWarnings("unchecked") - @Override - public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz) - { - if(clazz == VirtualHost.class) - { - return (Collection<C>) getVirtualHosts(); - } - else if(clazz == Port.class) - { - return (Collection<C>) getPorts(); - } - else if(clazz == AccessControlProvider.class) - { - return (Collection<C>) getAccessControlProviders(); - } - else if(clazz == AuthenticationProvider.class) - { - return (Collection<C>) getAuthenticationProviders(); - } - else if(clazz == GroupProvider.class) - { - return (Collection<C>) getGroupProviders(); - } - else if(clazz == KeyStore.class) - { - return (Collection<C>) getKeyStores(); - } - else if(clazz == TrustStore.class) - { - return (Collection<C>) getTrustStores(); - } - else if(clazz == Plugin.class) - { - return (Collection<C>) getPlugins(); - } - - return Collections.emptySet(); - } - - @SuppressWarnings("unchecked") - @Override - public <C extends ConfiguredObject> C addChild(Class<C> childClass, Map<String, Object> attributes, ConfiguredObject... otherParents) - { - if(childClass == VirtualHost.class) - { - return (C) createVirtualHost(attributes); - } - else if(childClass == Port.class) - { - return (C) createPort(attributes); - } - else if(childClass == AccessControlProvider.class) - { - return (C) createAccessControlProvider(attributes); - } - else if(childClass == AuthenticationProvider.class) - { - return (C) createAuthenticationProvider(attributes); - } - else if(childClass == KeyStore.class) - { - return (C) createKeyStore(attributes); - } - else if(childClass == TrustStore.class) - { - return (C) createTrustStore(attributes); - } - else if(childClass == GroupProvider.class) - { - return (C) createGroupProvider(attributes); - } - else - { - throw new IllegalArgumentException("Cannot create child of class " + childClass.getSimpleName()); - } - } - - /** - * Called when adding a new port via the management interface - */ - private Port createPort(Map<String, Object> attributes) - { - Port port = _portFactory.createPort(UUID.randomUUID(), this, attributes); - addPort(port); - - //1. AMQP ports are disabled during ManagementMode. - //2. The management plugins can currently only start ports at broker startup and - // not when they are newly created via the management interfaces. - //3. When active ports are deleted, or their port numbers updated, the broker must be - // restarted for it to take effect so we can't reuse port numbers until it is. - boolean quiesce = isManagementMode() || !(port instanceof AmqpPortAdapter) || isPreviouslyUsedPortNumber(port); - - port.setDesiredState(State.INITIALISING, quiesce ? State.QUIESCED : State.ACTIVE); - - return port; - } - - private void addPort(Port port) - { - synchronized (_portAdapters) - { - int portNumber = port.getPort(); - String portName = port.getName(); - UUID portId = port.getId(); - - for(Port p : _portAdapters.values()) - { - if(portNumber == p.getPort()) - { - throw new IllegalConfigurationException("Can't add port " + portName + " because port number " + portNumber + " is already configured for port " + p.getName()); - } - - if(portName == p.getName()) - { - throw new IllegalConfigurationException("Can't add Port because one with name " + portName + " already exists"); - } - - if(portId == p.getId()) - { - throw new IllegalConfigurationException("Can't add Port because one with id " + portId + " already exists"); - } - } - - _portAdapters.put(port.getId(), port); - } - port.addChangeListener(this); - } - - private AccessControlProvider createAccessControlProvider(Map<String, Object> attributes) - { - AccessControlProvider accessControlProvider = null; - synchronized (_accessControlProviders) - { - accessControlProvider = _accessControlProviderFactory.create(UUID.randomUUID(), this, attributes); - addAccessControlProvider(accessControlProvider); - } - - boolean quiesce = isManagementMode() ; - accessControlProvider.setDesiredState(State.INITIALISING, quiesce ? State.QUIESCED : State.ACTIVE); - - return accessControlProvider; - } - - /** - * @throws IllegalConfigurationException if an AuthenticationProvider with the same name already exists - */ - private void addAccessControlProvider(AccessControlProvider accessControlProvider) - { - String name = accessControlProvider.getName(); - synchronized (_authenticationProviders) - { - if (_accessControlProviders.containsKey(accessControlProvider.getId())) - { - throw new IllegalConfigurationException("Can't add AccessControlProvider because one with id " + accessControlProvider.getId() + " already exists"); - } - for (AccessControlProvider provider : _accessControlProviders.values()) - { - if (provider.getName().equals(name)) - { - throw new IllegalConfigurationException("Can't add AccessControlProvider because one with name " + name + " already exists"); - } - } - _accessControlProviders.put(accessControlProvider.getId(), accessControlProvider); - } - - accessControlProvider.addChangeListener(this); - accessControlProvider.addChangeListener(_securityManager); - } - - private boolean deleteAccessControlProvider(AccessControlProvider accessControlProvider) - { - AccessControlProvider removedAccessControlProvider = null; - synchronized (_accessControlProviders) - { - removedAccessControlProvider = _accessControlProviders.remove(accessControlProvider.getId()); - } - - if(removedAccessControlProvider != null) - { - removedAccessControlProvider.removeChangeListener(this); - removedAccessControlProvider.removeChangeListener(_securityManager); - } - - return removedAccessControlProvider != null; - } - - private AuthenticationProvider createAuthenticationProvider(Map<String, Object> attributes) - { - AuthenticationProvider authenticationProvider = _authenticationProviderFactory.create(UUID.randomUUID(), this, attributes); - authenticationProvider.setDesiredState(State.INITIALISING, State.ACTIVE); - addAuthenticationProvider(authenticationProvider); - return authenticationProvider; - } - - /** - * @throws IllegalConfigurationException if an AuthenticationProvider with the same name already exists - */ - private void addAuthenticationProvider(AuthenticationProvider authenticationProvider) - { - String name = authenticationProvider.getName(); - synchronized (_authenticationProviders) - { - if (_authenticationProviders.containsKey(authenticationProvider.getId())) - { - throw new IllegalConfigurationException("Cannot add AuthenticationProvider because one with id " + authenticationProvider.getId() + " already exists"); - } - for (AuthenticationProvider provider : _authenticationProviders.values()) - { - if (provider.getName().equals(name)) - { - throw new IllegalConfigurationException("Cannot add AuthenticationProvider because one with name " + name + " already exists"); - } - } - _authenticationProviders.put(authenticationProvider.getId(), authenticationProvider); - } - authenticationProvider.addChangeListener(this); - } - - private GroupProvider createGroupProvider(Map<String, Object> attributes) - { - GroupProvider groupProvider = _groupProviderFactory.create(UUID.randomUUID(), this, attributes); - groupProvider.setDesiredState(State.INITIALISING, State.ACTIVE); - addGroupProvider(groupProvider); - return groupProvider; - } - - private void addGroupProvider(GroupProvider groupProvider) - { - synchronized (_groupProviders) - { - String name = groupProvider.getName(); - if(_groupProviders.containsKey(name)) - { - throw new IllegalConfigurationException("Cannot add GroupProvider because one with name " + name + " already exists"); - } - _groupProviders.put(name, groupProvider); - } - groupProvider.addChangeListener(this); - } - - private boolean deleteGroupProvider(GroupProvider groupProvider) - { - GroupProvider removedGroupProvider = null; - synchronized (_groupProviders) - { - removedGroupProvider = _groupProviders.remove(groupProvider.getName()); - } - - if(removedGroupProvider != null) - { - removedGroupProvider.removeChangeListener(this); - } - - return removedGroupProvider != null; - } - - private KeyStore createKeyStore(Map<String, Object> attributes) - { - KeyStore keyStore = new KeyStoreAdapter(UUIDGenerator.generateRandomUUID(), this, attributes); - addKeyStore(keyStore); - - return keyStore; - } - - private TrustStore createTrustStore(Map<String, Object> attributes) - { - TrustStore trustStore = new TrustStoreAdapter(UUIDGenerator.generateRandomUUID(), this, attributes); - addTrustStore(trustStore); - - return trustStore; - } - - private void addKeyStore(KeyStore keyStore) - { - synchronized (_keyStores) - { - if(_keyStores.containsKey(keyStore.getName())) - { - throw new IllegalConfigurationException("Can't add KeyStore because one with name " + keyStore.getName() + " already exists"); - } - _keyStores.put(keyStore.getName(), keyStore); - } - keyStore.addChangeListener(this); - } - - private boolean deleteKeyStore(KeyStore object) - { - synchronized(_keyStores) - { - String name = object.getName(); - KeyStore removedKeyStore = _keyStores.remove(name); - if(removedKeyStore != null) - { - removedKeyStore.removeChangeListener(this); - } - - return removedKeyStore != null; - } - } - - private void addTrustStore(TrustStore trustStore) - { - synchronized (_trustStores) - { - if(_trustStores.containsKey(trustStore.getName())) - { - throw new IllegalConfigurationException("Can't add TrustStore because one with name " + trustStore.getName() + " already exists"); - } - _trustStores.put(trustStore.getName(), trustStore); - } - trustStore.addChangeListener(this); - } - - private boolean deleteTrustStore(TrustStore object) - { - synchronized(_trustStores) - { - String name = object.getName(); - TrustStore removedTrustStore = _trustStores.remove(name); - if(removedTrustStore != null) - { - removedTrustStore.removeChangeListener(this); - } - - return removedTrustStore != null; - } - } - - @Override - public Collection<String> getAttributeNames() - { - return AVAILABLE_ATTRIBUTES; - } - - @Override - public Object getAttribute(String name) - { - if(ID.equals(name)) - { - return getId(); - } - else if(STATE.equals(name)) - { - return State.ACTIVE; - } - else if(DURABLE.equals(name)) - { - return isDurable(); - } - else if(LIFETIME_POLICY.equals(name)) - { - return LifetimePolicy.PERMANENT; - } - else if(TIME_TO_LIVE.equals(name)) - { - // TODO - } - else if(CREATED.equals(name)) - { - // TODO - } - else if(UPDATED.equals(name)) - { - // TODO - } - else if(BUILD_VERSION.equals(name)) - { - return QpidProperties.getBuildVersion(); - } - else if(BYTES_RETAINED.equals(name)) - { - // TODO - } - else if(OPERATING_SYSTEM.equals(name)) - { - return System.getProperty("os.name") + " " - + System.getProperty("os.version") + " " - + System.getProperty("os.arch"); - } - else if(PLATFORM.equals(name)) - { - return System.getProperty("java.vendor") + " " - + System.getProperty("java.runtime.version", System.getProperty("java.version")); - } - else if(PROCESS_PID.equals(name)) - { - // TODO - } - else if(PRODUCT_VERSION.equals(name)) - { - return QpidProperties.getReleaseVersion(); - } - else if(SUPPORTED_BROKER_STORE_TYPES.equals(name)) - { - return _supportedBrokerStoreTypes; - } - else if(SUPPORTED_VIRTUALHOST_STORE_TYPES.equals(name)) - { - return _supportedVirtualHostStoreTypes; - } - else if(SUPPORTED_VIRTUALHOST_TYPES.equals(name)) - { - return VirtualHostFactory.TYPES.get(); - } - else if(SUPPORTED_AUTHENTICATION_PROVIDERS.equals(name)) - { - return _authenticationProviderFactory.getSupportedAuthenticationProviders(); - } - else if (SUPPORTED_PREFERENCES_PROVIDERS_TYPES.equals(name)) - { - return _preferencesProviderCreator.getSupportedPreferencesProviders(); - } - else if (MODEL_VERSION.equals(name)) - { - return Model.MODEL_VERSION; - } - else if (STORE_VERSION.equals(name)) - { - return _brokerStore.getVersion(); - } - else if (STORE_TYPE.equals(name)) - { - return _brokerStore.getType(); - } - else if (STORE_PATH.equals(name)) - { - return _brokerStore.getStoreLocation(); - } - return super.getAttribute(name); - } - - private boolean deletePort(State oldState, Port portAdapter) - { - Port removedPort = null; - synchronized (_portAdapters) - { - removedPort = _portAdapters.remove(portAdapter.getId()); - } - - if (removedPort != null) - { - removedPort.removeChangeListener(this); - - if(oldState == State.ACTIVE) - { - //Record the originally used port numbers of previously-active ports being deleted, to ensure - //when creating new ports we don't try to re-bind a port number that we are currently still using - recordPreviouslyUsedPortNumberIfNecessary(removedPort, removedPort.getPort()); - } - } - - return removedPort != null; - } - - private boolean deleteAuthenticationProvider(AuthenticationProvider authenticationProvider) - { - AuthenticationProvider removedAuthenticationProvider = null; - synchronized (_authenticationProviders) - { - removedAuthenticationProvider = _authenticationProviders.remove(authenticationProvider.getId()); - } - - if(removedAuthenticationProvider != null) - { - removedAuthenticationProvider.removeChangeListener(this); - } - - return removedAuthenticationProvider != null; - } - - private void addVirtualHost(VirtualHost virtualHost) - { - synchronized (_vhostAdapters) - { - String name = virtualHost.getName(); - if (_vhostAdapters.containsKey(name)) - { - throw new IllegalConfigurationException("Virtual host with name " + name + " is already specified!"); - } - _vhostAdapters.put(name, virtualHost); - } - virtualHost.addChangeListener(this); - } - - @Override - public boolean setState(State currentState, State desiredState) - { - if (desiredState == State.ACTIVE) - { - changeState(_groupProviders, currentState, State.ACTIVE, false); - changeState(_authenticationProviders, currentState, State.ACTIVE, false); - changeState(_accessControlProviders, currentState, State.ACTIVE, false); - - CurrentActor.set(new BrokerActor(getRootMessageLogger())); - try - { - changeState(_vhostAdapters, currentState, State.ACTIVE, false); - } - finally - { - CurrentActor.remove(); - } - - changeState(_portAdapters, currentState,State.ACTIVE, false); - changeState(_plugins, currentState,State.ACTIVE, false); - - if (isManagementMode()) - { - CurrentActor.get().message(BrokerMessages.MANAGEMENT_MODE(BrokerOptions.MANAGEMENT_MODE_USER_NAME, _brokerOptions.getManagementModePassword())); - } - return true; - } - else if (desiredState == State.STOPPED) - { - changeState(_plugins, currentState,State.STOPPED, true); - changeState(_portAdapters, currentState, State.STOPPED, true); - changeState(_vhostAdapters,currentState, State.STOPPED, true); - changeState(_authenticationProviders, currentState, State.STOPPED, true); - changeState(_groupProviders, currentState, State.STOPPED, true); - return true; - } - return false; - } - - private void changeState(Map<?, ? extends ConfiguredObject> configuredObjectMap, State currentState, State desiredState, boolean swallowException) - { - synchronized(configuredObjectMap) - { - Collection<? extends ConfiguredObject> adapters = configuredObjectMap.values(); - for (ConfiguredObject configuredObject : adapters) - { - if (State.ACTIVE.equals(desiredState) && State.QUIESCED.equals(configuredObject.getActualState())) - { - if (LOGGER.isDebugEnabled()) - { - LOGGER.debug(configuredObject + " cannot be activated as it is " +State.QUIESCED); - } - continue; - } - try - { - configuredObject.setDesiredState(currentState, desiredState); - } - catch(RuntimeException e) - { - if (swallowException) - { - LOGGER.error("Failed to stop " + configuredObject, e); - } - else - { - throw e; - } - } - } - } - } - - @Override - public void stateChanged(ConfiguredObject object, State oldState, State newState) - { - if(newState == State.DELETED) - { - boolean childDeleted = false; - if(object instanceof AuthenticationProvider) - { - childDeleted = deleteAuthenticationProvider((AuthenticationProvider)object); - } - else if(object instanceof AccessControlProvider) - { - childDeleted = deleteAccessControlProvider((AccessControlProvider)object); - } - else if(object instanceof Port) - { - childDeleted = deletePort(oldState, (Port)object); - } - else if(object instanceof VirtualHost) - { - childDeleted = deleteVirtualHost((VirtualHost)object); - } - else if(object instanceof GroupProvider) - { - childDeleted = deleteGroupProvider((GroupProvider)object); - } - else if(object instanceof KeyStore) - { - childDeleted = deleteKeyStore((KeyStore)object); - } - else if(object instanceof TrustStore) - { - childDeleted = deleteTrustStore((TrustStore)object); - } - - if(childDeleted) - { - childRemoved(object); - } - } - } - - @Override - public void childAdded(ConfiguredObject object, ConfiguredObject child) - { - // no-op - } - - @Override - public void childRemoved(ConfiguredObject object, ConfiguredObject child) - { - // no-op - } - - @Override - public void attributeSet(ConfiguredObject object, String attributeName, Object oldAttributeValue, Object newAttributeValue) - { - if(object instanceof Port) - { - //Record all the originally used port numbers of active ports, to ensure that when - //creating new ports we don't try to re-bind a port number that we are still using - if(attributeName == Port.PORT && object.getActualState() == State.ACTIVE) - { - recordPreviouslyUsedPortNumberIfNecessary((Port) object, (Integer)oldAttributeValue); - } - } - } - - private void addPlugin(ConfiguredObject plugin) - { - synchronized(_plugins) - { - if (_plugins.containsKey(plugin.getId())) - { - throw new IllegalConfigurationException("Plugin with id '" + plugin.getId() + "' is already registered!"); - } - _plugins.put(plugin.getId(), plugin); - } - plugin.addChangeListener(this); - } - - - private Collection<ConfiguredObject> getPlugins() - { - synchronized(_plugins) - { - return Collections.unmodifiableCollection(_plugins.values()); - } - } - - public void recoverChild(ConfiguredObject object) - { - if(object instanceof AuthenticationProvider) - { - addAuthenticationProvider((AuthenticationProvider)object); - } - else if(object instanceof AccessControlProvider) - { - addAccessControlProvider((AccessControlProvider)object); - } - else if(object instanceof Port) - { - addPort((Port)object); - } - else if(object instanceof VirtualHost) - { - addVirtualHost((VirtualHost)object); - } - else if(object instanceof GroupProvider) - { - addGroupProvider((GroupProvider)object); - } - else if(object instanceof KeyStore) - { - addKeyStore((KeyStore)object); - } - else if(object instanceof TrustStore) - { - addTrustStore((TrustStore)object); - } - else if(object instanceof Plugin) - { - addPlugin(object); - } - else - { - throw new IllegalArgumentException("Attempted to recover unexpected type of configured object: " + object.getClass().getName()); - } - } - - @Override - public RootMessageLogger getRootMessageLogger() - { - return _rootMessageLogger; - } - - @Override - public SecurityManager getSecurityManager() - { - return _securityManager; - } - - @Override - public LogRecorder getLogRecorder() - { - return _logRecorder; - } - - @Override - public VirtualHost findVirtualHostByName(String name) - { - return _vhostAdapters.get(name); - } - - @Override - public SubjectCreator getSubjectCreator(SocketAddress localAddress) - { - AuthenticationProvider provider = getAuthenticationProvider(localAddress); - - if(provider == null) - { - throw new IllegalConfigurationException("Unable to determine authentication provider for address: " + localAddress); - } - - return provider.getSubjectCreator(); - } - - @Override - public AuthenticationProvider getAuthenticationProvider(SocketAddress localAddress) - { - InetSocketAddress inetSocketAddress = (InetSocketAddress)localAddress; - AuthenticationProvider provider = null; - Collection<Port> ports = getPorts(); - for (Port p : ports) - { - if (inetSocketAddress.getPort() == p.getPort()) - { - provider = p.getAuthenticationProvider(); - break; - } - } - return provider; - } - - @Override - public Collection<KeyStore> getKeyStores() - { - synchronized(_keyStores) - { - return Collections.unmodifiableCollection(_keyStores.values()); - } - } - - @Override - public Collection<TrustStore> getTrustStores() - { - synchronized(_trustStores) - { - return Collections.unmodifiableCollection(_trustStores.values()); - } - } - - @Override - public VirtualHostRegistry getVirtualHostRegistry() - { - return _virtualHostRegistry; - } - - @Override - public TaskExecutor getTaskExecutor() - { - return super.getTaskExecutor(); - } - - @Override - protected void changeAttributes(Map<String, Object> attributes) - { - Map<String, Object> convertedAttributes = MapValueConverter.convert(attributes, ATTRIBUTE_TYPES); - validateAttributes(convertedAttributes); - - super.changeAttributes(convertedAttributes); - } - - private void validateAttributes(Map<String, Object> convertedAttributes) - { - if (convertedAttributes.containsKey(MODEL_VERSION) && !Model.MODEL_VERSION.equals(convertedAttributes.get(MODEL_VERSION))) - { - throw new IllegalConfigurationException("Cannot change the model version"); - } - - if (convertedAttributes.containsKey(STORE_VERSION) - && !new Integer(_brokerStore.getVersion()).equals(convertedAttributes.get(STORE_VERSION))) - { - throw new IllegalConfigurationException("Cannot change the store version"); - } - - String defaultVirtualHost = (String) convertedAttributes.get(DEFAULT_VIRTUAL_HOST); - if (defaultVirtualHost != null) - { - VirtualHost foundHost = findVirtualHostByName(defaultVirtualHost); - if (foundHost == null) - { - throw new IllegalConfigurationException("Virtual host with name " + defaultVirtualHost - + " cannot be set as a default as it does not exist"); - } - } - Long queueFlowControlSize = (Long) convertedAttributes.get(QUEUE_FLOW_CONTROL_SIZE_BYTES); - Long queueFlowControlResumeSize = (Long) convertedAttributes.get(QUEUE_FLOW_CONTROL_RESUME_SIZE_BYTES); - if (queueFlowControlSize != null || queueFlowControlResumeSize != null ) - { - if (queueFlowControlSize == null) - { - queueFlowControlSize = (Long)getAttribute(QUEUE_FLOW_CONTROL_SIZE_BYTES); - } - if (queueFlowControlResumeSize == null) - { - queueFlowControlResumeSize = (Long)getAttribute(QUEUE_FLOW_CONTROL_RESUME_SIZE_BYTES); - } - if (queueFlowControlResumeSize > queueFlowControlSize) - { - throw new IllegalConfigurationException("Flow resume size can't be greater than flow control size"); - } - } - for (String attributeName : POSITIVE_NUMERIC_ATTRIBUTES) - { - Number value = (Number) convertedAttributes.get(attributeName); - if (value != null && value.longValue() < 0) - { - throw new IllegalConfigurationException("Only positive integer value can be specified for the attribute " - + attributeName); - } - } - } - - @Override - protected void authoriseSetAttribute(String name, Object expected, Object desired) throws AccessControlException - { - if (!_securityManager.authoriseConfiguringBroker(getName(), Broker.class, Operation.UPDATE)) - { - throw new AccessControlException("Setting of broker attributes is denied"); - } - } - - @Override - protected <C extends ConfiguredObject> void authoriseCreateChild(Class<C> childClass, Map<String, Object> attributes, - ConfiguredObject... otherParents) throws AccessControlException - { - if (!_securityManager.authoriseConfiguringBroker(String.valueOf(attributes.get(NAME)), childClass, Operation.CREATE)) - { - throw new AccessControlException("Creation of new broker level entity is denied"); - } - } - - @Override - protected void authoriseSetAttributes(Map<String, Object> attributes) throws AccessControlException - { - if (!_securityManager.authoriseConfiguringBroker(getName(), Broker.class, Operation.UPDATE)) - { - throw new AccessControlException("Setting of broker attributes is denied"); - } - } - - @Override - public boolean isManagementMode() - { - return _brokerOptions.isManagementMode(); - } - - @Override - public Collection<AccessControlProvider> getAccessControlProviders() - { - synchronized (_accessControlProviders) - { - return new ArrayList<AccessControlProvider>(_accessControlProviders.values()); - } - } - - private void recordPreviouslyUsedPortNumberIfNecessary(Port port, Integer portNumber) - { - //If we haven't previously recorded its original port number, record it now - if(!_stillInUsePortNumbers.containsKey(port)) - { - _stillInUsePortNumbers.put(port, portNumber); - } - } - - private boolean isPreviouslyUsedPortNumber(Port port) - { - return _stillInUsePortNumbers.containsValue(port.getPort()); - } -} |