/*******************************************************************************
 * Copyright (c) 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.osgi.framework.internal.core;

import java.util.Dictionary;
import java.util.Hashtable;
import org.eclipse.osgi.framework.debug.DebugOptions;
import org.osgi.framework.*;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;

/**
 * This class activates the System Bundle.
 */

public class SystemBundleActivator implements BundleActivator {
	protected BundleContext context;
	protected SystemBundle bundle;
	protected Framework framework;
	protected ServiceRegistration packageAdmin;
	protected ServiceRegistration permissionAdmin;
	protected ServiceRegistration startLevel;
	protected ServiceRegistration debugOptions;

	public SystemBundleActivator() {
	}

	public void start(BundleContext context) throws Exception {
		this.context = context;
		bundle = (SystemBundle) context.getBundle();
		framework = bundle.framework;

		if (framework.packageAdmin != null) {
			packageAdmin = register(Constants.OSGI_PACKAGEADMIN_NAME, framework.packageAdmin);
		}

		if (framework.permissionAdmin != null) {
			permissionAdmin = register(Constants.OSGI_PERMISSIONADMIN_NAME, framework.permissionAdmin);
		}

		if (framework.startLevelManager != null) {
			startLevel = register(Constants.OSGI_STARTLEVEL_NAME, framework.startLevelManager);
		}

		DebugOptions dbgOptions = null;
		if ((dbgOptions = DebugOptions.getDefault()) != null) {
			debugOptions = register(org.eclipse.osgi.service.debug.DebugOptions.class.getName(), dbgOptions);
		}

		// Always call the adaptor.frameworkStart() at the end of this method.
		framework.adaptor.frameworkStart(context);
	}

	public void stop(BundleContext context) throws Exception {
		// Always call the adaptor.frameworkStop() at the begining of this method.
		framework.adaptor.frameworkStop(context);

		if (packageAdmin != null) {
			packageAdmin.unregister();
		}

		if (permissionAdmin != null) {
			permissionAdmin.unregister();
		}

		if (startLevel != null) {
			startLevel.unregister();
		}

		if (debugOptions != null) {
			debugOptions.unregister();
		}

		framework = null;
		bundle = null;
		this.context = null;
	}

	/**
	 * Register a service object.
	 *
	 */
	protected ServiceRegistration register(String name, Object service) {
		Hashtable properties = new Hashtable(7);

		Dictionary headers = bundle.getHeaders();

		properties.put(Constants.SERVICE_VENDOR, headers.get(Constants.BUNDLE_VENDOR));

		properties.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE));

		properties.put(Constants.SERVICE_PID, bundle.getBundleId() + "." + service.getClass().getName());

		return context.registerService(name, service, properties);
	}

}