/*******************************************************************************
 * Copyright (c) 2007, 2017 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Red Hat, Inc (Krzysztof Daniel) - Bug 421935: Extend simpleconfigurator to
 * read .info files from many locations
 *******************************************************************************/
package org.eclipse.equinox.internal.simpleconfigurator;

import java.util.Dictionary;
import java.util.Hashtable;
import org.eclipse.equinox.internal.provisional.configurator.Configurator;
import org.eclipse.equinox.internal.simpleconfigurator.utils.EquinoxUtils;
import org.eclipse.equinox.internal.simpleconfigurator.utils.SimpleConfiguratorConstants;
import org.osgi.framework.*;

/**
 * At its start, SimpleConfigurator bundle does the followings.
 *
 * 1. A value will be gotten by @{link BundleContext#getProperty(key)} with
 * {@link SimpleConfiguratorConstants#PROP_KEY_CONFIGURL} as a key.
 * The value will be used for the referal URL. Under the url, there must be a simple
 * bundles list file to be installed with thier start level and flag of marked as started.
 *
 * 2. If the value is null, do nothing any more.
 * 3. Otherwise, retrieve the bundles list from the url and install,
 *  set start level of and start bundles, as specified.
 *
 * 4. A value will be gotten by @{link BundleContext#getProperty(key)} with
 * {@link SimpleConfiguratorConstants#PROP_KEY_EXCLUSIVE_INSTALLATION} as a key.
 *
 * 5. If it equals "false", it will do exclusive installation, which means that
 * the bundles will not be listed in the specified url but installed at the time
 * of the method call except SystemBundle will be uninstalled.
 * Otherwise, no uninstallation will not be done.
 *
 */
public class Activator implements BundleActivator {
	public final static boolean DEBUG = false;

	/**
	 * If this property is set to true, simpleconfigurator will attempt to read
	 * multiple *.info files.
	 *
	 * This field is writable only for test purposes.
	 */
	public static String EXTENSIONS = System.getProperty("p2.fragments");
	public static boolean EXTENDED = (EXTENSIONS != null);

	private ServiceRegistration<?> configuratorRegistration;
	private ServiceRegistration<?> commandRegistration;

	@Override
	public void start(BundleContext context) throws Exception {
		SimpleConfiguratorImpl bundleConfigurator = new SimpleConfiguratorImpl(context, context.getBundle());
		bundleConfigurator.applyConfiguration();

		Dictionary<String, String> props = new Hashtable<>();
		props.put(Constants.SERVICE_VENDOR, "Eclipse"); //$NON-NLS-1$
		props.put(Constants.SERVICE_PID, SimpleConfiguratorConstants.TARGET_CONFIGURATOR_NAME);
		ServiceFactory<?> configurationFactory = new SimpleConfiguratorFactory(context);
		configuratorRegistration = context.registerService(Configurator.class.getName(), configurationFactory, props);

		try {
			if (null != context.getBundle().loadClass("org.eclipse.osgi.framework.console.CommandProvider")) //$NON-NLS-1$
				commandRegistration = EquinoxUtils.registerConsoleCommands(context);
		} catch (ClassNotFoundException e) {
			// CommandProvider is not available
			// Ok -- optional
		}

		if (DEBUG)
			System.out.println("registered Configurator"); //$NON-NLS-1$
	}

	@Override
	public void stop(BundleContext context) throws Exception {
		if (configuratorRegistration != null) {
			configuratorRegistration.unregister();
			configuratorRegistration = null;
		}
		if (commandRegistration != null) {
			commandRegistration.unregister();
			commandRegistration = null;
		}
	}
}
