/*
 * Copyright (c) OSGi Alliance (2000, 2013). All Rights Reserved.
 * 
 * Licensed 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.osgi.framework;

import org.osgi.annotation.versioning.ConsumerType;

/**
 * Customizes the starting and stopping of a bundle.
 * <p>
 * {@code BundleActivator} is an interface that may be implemented when a bundle
 * is started or stopped. The Framework can create instances of a bundle's
 * {@code BundleActivator} as required. If an instance's
 * {@code BundleActivator.start} method executes successfully, it is guaranteed
 * that the same instance's {@code BundleActivator.stop} method will be called
 * when the bundle is to be stopped. The Framework must not concurrently call a
 * {@code BundleActivator} object.
 * 
 * <p>
 * {@code BundleActivator} is specified through the {@code Bundle-Activator}
 * Manifest header. A bundle can only specify a single {@code BundleActivator}
 * in the Manifest file. Fragment bundles must not have a
 * {@code BundleActivator}. The form of the Manifest header is:
 * 
 * <p>
 * {@code Bundle-Activator:} <i>class-name</i>
 * 
 * <p>
 * where <i>class-name</i> is a fully qualified Java classname.
 * <p>
 * The specified {@code BundleActivator} class must have a public constructor
 * that takes no parameters so that a {@code BundleActivator} object can be
 * created by {@code Class.newInstance()}.
 * 
 * @NotThreadSafe
 * @author $Id: a9d91a8ae13157f49a6a55b0c7f25b63b6bd00bd $
 */
@ConsumerType
public interface BundleActivator {
	/**
	 * Called when this bundle is started so the Framework can perform the
	 * bundle-specific activities necessary to start this bundle. This method
	 * can be used to register services or to allocate any resources that this
	 * bundle needs.
	 * 
	 * <p>
	 * This method must complete and return to its caller in a timely manner.
	 * 
	 * @param context The execution context of the bundle being started.
	 * @throws Exception If this method throws an exception, this bundle is
	 *         marked as stopped and the Framework will remove this bundle's
	 *         listeners, unregister all services registered by this bundle, and
	 *         release all services used by this bundle.
	 */
	public void start(BundleContext context) throws Exception;

	/**
	 * Called when this bundle is stopped so the Framework can perform the
	 * bundle-specific activities necessary to stop the bundle. In general, this
	 * method should undo the work that the {@code BundleActivator.start} method
	 * started. There should be no active threads that were started by this
	 * bundle when this bundle returns. A stopped bundle must not call any
	 * Framework objects.
	 * 
	 * <p>
	 * This method must complete and return to its caller in a timely manner.
	 * 
	 * @param context The execution context of the bundle being stopped.
	 * @throws Exception If this method throws an exception, the bundle is still
	 *         marked as stopped, and the Framework will remove the bundle's
	 *         listeners, unregister all services registered by the bundle, and
	 *         release all services used by the bundle.
	 */
	public void stop(BundleContext context) throws Exception;
}
