/*
 * Copyright (c) OSGi Alliance (2010, 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.
 */

/**
 * Framework Start Level Package Version 1.0.
 * 
 * <p>
 * The Framework Start Level package allows management agents to manage a start
 * level assigned to each bundle and the active start level of the Framework.
 * This package is a replacement for the now deprecated
 * {@code org.osgi.service.startlevel} package.
 * 
 * <p>
 * A start level is defined to be a state of execution in which the Framework
 * exists. Start level values are defined as unsigned integers with 0 (zero)
 * being the state where the Framework is not launched. Progressively higher
 * integral values represent progressively higher start levels. For example, 2
 * is a higher start level than 1.
 * 
 * <p>
 * {@code AdminPermission} is required to modify start level information.
 * 
 * <p>
 * Start Level support in the Framework includes the ability to modify the
 * active start level of the Framework and to assign a specific start level to a
 * bundle. The beginning start level of a Framework is specified via the
 * {@link org.osgi.framework.Constants#FRAMEWORK_BEGINNING_STARTLEVEL} framework
 * property when configuring a framework.
 * 
 * <p>
 * When the Framework is first started it must be at start level zero. In this
 * state, no bundles are running. This is the initial state of the Framework
 * before it is launched. When the Framework is launched, the Framework will
 * enter start level one and all bundles which are assigned to start level one
 * and whose autostart setting indicates the bundle should be started are
 * started as described in the {@link org.osgi.framework.Bundle#start(int)}
 * method. The Framework will continue to increase the start level, starting
 * bundles at each start level, until the Framework has reached a beginning
 * start level. At this point the Framework has completed starting bundles and
 * will then fire a Framework event of type
 * {@link org.osgi.framework.FrameworkEvent#STARTED} to announce it has
 * completed its launch.
 * 
 * <p>
 * Within a start level, bundles may be started in an order defined by the
 * Framework implementation. This may be something like ascending
 * {@link org.osgi.framework.Bundle#getBundleId()} order or an order based upon
 * dependencies between bundles. A similar but reversed order may be used when
 * stopping bundles within a start level.
 * 
 * <p>
 * The Framework Start Level package can be used by management bundles to alter
 * the active start level of the framework.
 * 
 * <p>
 * Bundles wishing to use this package must list the package in the
 * Import-Package header of the bundle's manifest. For example:
 * 
 * <pre>
 * Import-Package: org.osgi.framework.startlevel; version=&quot;[1.0,2.0)&quot;
 * </pre>
 * 
 * @author $Id$
 */

@Version("1.0")
package org.osgi.framework.startlevel;

import org.osgi.annotation.versioning.Version;

