blob: bcb8f7084b4cb2b236d1c5b741e7c68cc9ffbe36 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.config.internal;
import java.io.IOException;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ConfigurationListener;
import org.eclipse.virgo.kernel.config.internal.commandline.CommandLinePropertiesSource;
import org.eclipse.virgo.kernel.config.internal.ovf.OvfPropertiesSource;
import org.eclipse.virgo.medic.dump.DumpContributor;
import org.eclipse.virgo.medic.eventlog.EventLogger;
import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
/**
* ConfigurationInitialiser
* <p />
*
* <strong>Concurrent Semantics</strong><br />
* threadsafe
*
*/
public final class ConfigurationInitialiser {
private final ServiceRegistrationTracker tracker = new ServiceRegistrationTracker();
private volatile ConfigurationAdminExporter configAdminExporter;
private ConsoleConfigurationConvertor consoleConfigurationConvertor;
public KernelConfiguration start(BundleContext context, EventLogger eventLogger) throws IOException {
//The ConfigurationAdmin service is already available because the caller of this method(CoreBundleActivator.activate)
//is a DS component that statically requires it
ServiceReference<ConfigurationAdmin> configurationAdminReference = context.getServiceReference(ConfigurationAdmin.class);
ConfigurationAdmin configAdmin = null;
if (configurationAdminReference != null) {
configAdmin = (ConfigurationAdmin) context.getService(configurationAdminReference);
}
if (configAdmin == null) {
throw new IllegalStateException("ConfigurationAdmin service missing");
}
KernelConfiguration configuration = new KernelConfiguration(context);
publishConfiguration(context, eventLogger, configuration, configAdmin);
this.configAdminExporter = initializeConfigAdminExporter(context, configuration, configAdmin);
initializeDumpContributor(context, configAdmin);
initializeConsoleConfigurationConvertor(context, configAdmin);
return configuration;
}
private void publishConfiguration(BundleContext context, EventLogger eventLogger, KernelConfiguration configuration,
ConfigurationAdmin configAdmin) throws IOException {
PropertiesSource[] sources = new PropertiesSource[] { new UserConfigurationPropertiesSource(configuration.getConfigDirectories()),
new OvfPropertiesSource(context, eventLogger), new KernelConfigurationPropertiesSource(configuration),
new CommandLinePropertiesSource(context, eventLogger) };
ConfigurationPublisher configPublisher = new ConfigurationPublisher(configAdmin, sources);
configPublisher.publishConfigurations();
configPublisher.registerConfigurationExporterService(context);
}
private void initializeDumpContributor(BundleContext context, ConfigurationAdmin configAdmin) {
ConfigurationAdminDumpContributor dumpContributor = new ConfigurationAdminDumpContributor(configAdmin);
this.tracker.track(context.registerService(DumpContributor.class.getName(), dumpContributor, null));
}
private ConfigurationAdminExporter initializeConfigAdminExporter(BundleContext context, KernelConfiguration configuration, ConfigurationAdmin configAdmin) {
ConfigurationAdminExporter exporter = new ConfigurationAdminExporter(configuration.getDomain(), configAdmin);
this.tracker.track(context.registerService(ConfigurationListener.class.getName(), exporter, null));
exporter.init();
return exporter;
}
private void initializeConsoleConfigurationConvertor(BundleContext context, ConfigurationAdmin configAdmin) {
consoleConfigurationConvertor = new ConsoleConfigurationConvertor(context, configAdmin);
consoleConfigurationConvertor.start();
}
public void stop() {
this.tracker.unregisterAll();
consoleConfigurationConvertor.stop();
ConfigurationAdminExporter local = this.configAdminExporter;
if (local != null) {
this.configAdminExporter = null;
local.stop();
}
}
}