/*******************************************************************************
 * 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.medic.impl;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;

import org.eclipse.equinox.log.ExtendedLogReaderService;
import org.eclipse.virgo.medic.dump.DumpGenerator;
import org.eclipse.virgo.medic.impl.config.ConfigurationAdminConfigurationProvider;
import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
import org.eclipse.virgo.medic.log.osgi.OSGiLogServiceListener;
import org.eclipse.virgo.medic.management.MedicMBeanExporter;
import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationListener;
import org.osgi.service.log.LogService;
import org.slf4j.LoggerFactory;

/**
 * This class is threadSafe
 *
 */
public final class MedicActivator implements BundleActivator {

    private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker();

    private volatile ServiceReference<ExtendedLogReaderService> logReaderReference;

    private LogController logController = null;

    private ConfigurationProvider configurationProvider = null;

    private MedicMBeanExporter medicMBeanExporter = null;
    
    public void start(BundleContext context) throws Exception {
        // Avoid logback accidentally obtaining classes from the application class loader.
        System.setProperty("logback.ignoreTCL", "true");
        
        this.configurationProvider = new ConfigurationAdminConfigurationProvider(context);
        this.registrationTracker.track(context.registerService(ConfigurationListener.class.getName(), configurationProvider, null));

        this.logController = new LogController(context, configurationProvider, registrationTracker);

        configurationProvider.addChangeListener(logController);

        logController.logStart();
        logController.eventLogStart();
        DumpGenerator dumpGenerator = logController.dumpStart();
        
        //Register the platformMBeanServer with 
		MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
		context.registerService(MBeanServer.class, platformMBeanServer, null);
        this.medicMBeanExporter = new MedicMBeanExporter(configurationProvider, dumpGenerator);

        this.logReaderReference = context.getServiceReference(ExtendedLogReaderService.class);
        ExtendedLogReaderService logReader = context.getService(this.logReaderReference);
        logReader.addLogListener(new OSGiLogServiceListener(LoggerFactory.getLogger(LogService.class)));
    }

    public void stop(BundleContext context) throws Exception {
    	MedicMBeanExporter medicMBeanExporter2 = this.medicMBeanExporter;
		if(medicMBeanExporter2 != null){
    		medicMBeanExporter2.close();
    	}
        this.registrationTracker.unregisterAll();
        ServiceReference<ExtendedLogReaderService> localLogReaderReference = this.logReaderReference;
        if (localLogReaderReference != null) {
            context.ungetService(localLogReaderReference);
        }

        LogController logController2 = logController;
		ConfigurationProvider configurationProvider2 = configurationProvider;
		if (configurationProvider2 != null) {
            configurationProvider2.removeChangeListener(logController2);
        }

        if (logController2 != null) {
            logController2.dumpStop();
            logController2.logStop();
        }
    }

}
