blob: 4bfa0ca7a3674563e6b4257eb2faa4ee53fda23a [file] [log] [blame]
package org.apache.qpid.server.configuration.startup;
import java.util.Collection;
import java.util.Map;
import org.apache.qpid.server.configuration.ConfigurationEntry;
import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
import org.apache.qpid.server.configuration.IllegalConfigurationException;
import org.apache.qpid.server.configuration.RecovererProvider;
import org.apache.qpid.server.logging.LogRecorder;
import org.apache.qpid.server.logging.RootMessageLogger;
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.Broker;
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.Port;
import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
import org.apache.qpid.server.model.adapter.BrokerAdapter;
import org.apache.qpid.server.model.adapter.PortFactory;
import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
import org.apache.qpid.server.configuration.updater.TaskExecutor;
import org.apache.qpid.server.security.group.GroupPrincipalAccessor;
import org.apache.qpid.server.stats.StatisticsGatherer;
import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
public class BrokerRecoverer implements ConfiguredObjectRecoverer<Broker>
{
private final StatisticsGatherer _statisticsGatherer;
private final VirtualHostRegistry _virtualHostRegistry;
private final LogRecorder _logRecorder;
private final RootMessageLogger _rootMessageLogger;
private final AuthenticationProviderFactory _authenticationProviderFactory;
private final PortFactory _portFactory;
private final TaskExecutor _taskExecutor;
public BrokerRecoverer(AuthenticationProviderFactory authenticationProviderFactory, PortFactory portFactory,
StatisticsGatherer statisticsGatherer, VirtualHostRegistry virtualHostRegistry, LogRecorder logRecorder,
RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor)
{
_portFactory = portFactory;
_authenticationProviderFactory = authenticationProviderFactory;
_statisticsGatherer = statisticsGatherer;
_virtualHostRegistry = virtualHostRegistry;
_logRecorder = logRecorder;
_rootMessageLogger = rootMessageLogger;
_taskExecutor = taskExecutor;
}
@Override
public Broker create(RecovererProvider recovererProvider, ConfigurationEntry entry, ConfiguredObject... parents)
{
StoreConfigurationChangeListener storeChangeListener = new StoreConfigurationChangeListener(entry.getStore());
BrokerAdapter broker = new BrokerAdapter(entry.getId(), entry.getAttributes(), _statisticsGatherer, _virtualHostRegistry,
_logRecorder, _rootMessageLogger, _authenticationProviderFactory, _portFactory, _taskExecutor);
broker.addChangeListener(storeChangeListener);
Map<String, Collection<ConfigurationEntry>> childEntries = entry.getChildren();
for (String type : childEntries.keySet())
{
ConfiguredObjectRecoverer<?> recoverer = recovererProvider.getRecoverer(type);
if (recoverer == null)
{
throw new IllegalConfigurationException("Cannot recover entry for the type '" + type + "' from broker");
}
Collection<ConfigurationEntry> entries = childEntries.get(type);
for (ConfigurationEntry childEntry : entries)
{
ConfiguredObject object = recoverer.create(recovererProvider, childEntry, broker);
if (object == null)
{
throw new IllegalConfigurationException("Cannot create configured object for the entry " + childEntry);
}
broker.recoverChild(object);
object.addChangeListener(storeChangeListener);
}
}
wireUpConfiguredObjects(broker, entry.getAttributes());
return broker;
}
private void wireUpConfiguredObjects(BrokerAdapter broker, Map<String, Object> brokerAttributes)
{
AuthenticationProvider defaultAuthenticationProvider = null;
Collection<AuthenticationProvider> authenticationProviders = broker.getAuthenticationProviders();
int numberOfAuthenticationProviders = authenticationProviders.size();
if (numberOfAuthenticationProviders == 0)
{
throw new IllegalConfigurationException("No authentication provider was configured");
}
else if (numberOfAuthenticationProviders == 1)
{
defaultAuthenticationProvider = authenticationProviders.iterator().next();
}
else
{
String name = (String) brokerAttributes.get(Broker.DEFAULT_AUTHENTICATION_PROVIDER);
if (name == null)
{
throw new IllegalConfigurationException("Multiple authentication providers defined, but no default was configured.");
}
defaultAuthenticationProvider = getAuthenticationProviderByName(broker, name);
}
broker.setDefaultAuthenticationProvider(defaultAuthenticationProvider);
GroupPrincipalAccessor groupPrincipalAccessor = new GroupPrincipalAccessor(broker.getGroupProviders());
for (AuthenticationProvider authenticationProvider : authenticationProviders)
{
authenticationProvider.setGroupAccessor(groupPrincipalAccessor);
}
Collection<Port> ports = broker.getPorts();
for (Port port : ports)
{
String authenticationProviderName = (String) port.getAttribute(Port.AUTHENTICATION_MANAGER);
AuthenticationProvider provider = null;
if (authenticationProviderName != null)
{
provider = getAuthenticationProviderByName(broker, authenticationProviderName);
}
else
{
provider = defaultAuthenticationProvider;
}
port.setAuthenticationProvider(provider);
}
}
private AuthenticationProvider getAuthenticationProviderByName(BrokerAdapter broker, String authenticationProviderName)
{
AuthenticationProvider provider = broker.getAuthenticationProviderByName(authenticationProviderName);
if (provider == null)
{
throw new IllegalConfigurationException("Cannot find the authentication provider with name: "
+ authenticationProviderName);
}
return provider;
}
}