/*******************************************************************************
 * 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();
        }
    }
}
