/*
 * 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.logging.log4j.core.osgi;

import java.util.Collection;
import java.util.Hashtable;
import java.util.concurrent.atomic.AtomicReference;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.impl.Log4jProvider;
import org.apache.logging.log4j.core.impl.ThreadContextDataInjector;
import org.apache.logging.log4j.core.impl.ThreadContextDataProvider;
import org.apache.logging.log4j.core.plugins.Log4jPlugins;
import org.apache.logging.log4j.core.util.Constants;
import org.apache.logging.log4j.core.util.ContextDataProvider;
import org.apache.logging.log4j.plugins.processor.PluginService;
import org.apache.logging.log4j.spi.Provider;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;

/**
 * OSGi BundleActivator.
 */
public final class Activator implements BundleActivator {

    private static final Logger LOGGER = StatusLogger.getLogger();

    private final AtomicReference<BundleContext> contextRef = new AtomicReference<>();

    ServiceRegistration provideRegistration = null;
    ServiceRegistration pluginRegistration = null;
    ServiceRegistration contextDataRegistration = null;

    @Override
    public void start(final BundleContext context) throws Exception {
        pluginRegistration = context.registerService(PluginService.class.getName(), new Log4jPlugins(),
                new Hashtable<>());
        final Provider provider = new Log4jProvider();
        final Hashtable<String, String> props = new Hashtable<>();
        props.put("APIVersion", "2.60");
        final ContextDataProvider threadContextProvider = new ThreadContextDataProvider();
        provideRegistration = context.registerService(Provider.class.getName(), provider, props);
        contextDataRegistration = context.registerService(ContextDataProvider.class.getName(), threadContextProvider,
                null);
        loadContextProviders(context);
        // allow the user to override the default ContextSelector (e.g., by using BasicContextSelector for a global cfg)
        if (PropertiesUtil.getProperties().getStringProperty(Constants.LOG4J_CONTEXT_SELECTOR) == null) {
            System.setProperty(Constants.LOG4J_CONTEXT_SELECTOR, BundleContextSelector.class.getName());
        }
        contextRef.compareAndSet(null, context);
    }

    @Override
    public void stop(final BundleContext context) throws Exception {
        provideRegistration.unregister();
        pluginRegistration.unregister();
        contextDataRegistration.unregister();
        this.contextRef.compareAndSet(context, null);
        LogManager.shutdown(false, true);
    }

    private static void loadContextProviders(final BundleContext bundleContext) {
        try {
            final Collection<ServiceReference<ContextDataProvider>> serviceReferences =
                    bundleContext.getServiceReferences(ContextDataProvider.class, null);
            for (final ServiceReference<ContextDataProvider> serviceReference : serviceReferences) {
                final ContextDataProvider provider = bundleContext.getService(serviceReference);
                ThreadContextDataInjector.contextDataProviders.add(provider);
            }
        } catch (final InvalidSyntaxException ex) {
            LOGGER.error("Error accessing context data provider", ex);
        }
    }
}
