/*
 * Copyright (c) OSGi Alliance (2002, 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.service.startlevel;

import org.osgi.framework.Bundle;

The StartLevel service allows management agents to manage a start level assigned to each bundle and the active start level of the Framework. There is at most one StartLevel service present in the OSGi environment.

A start level is defined to be a state of execution in which the Framework exists. StartLevel 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. e.g. 2 is a higher start level than 1.

Access to the StartLevel service is protected by corresponding ServicePermission. In addition AdminPermission is required to actually modify start level information.

Start Level support in the Framework includes the ability to control the beginning start level of the Framework, to modify the active start level of the Framework and to assign a specific start level to a bundle. How the beginning start level of a Framework is specified is implementation dependent. It may be a command line argument when invoking the Framework implementation.

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 Bundle.start 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 FrameworkEvent.STARTED to announce it has completed its launch.

Within a start level, bundles may be started in an order defined by the Framework implementation. This may be something like ascending 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.

The StartLevel service can be used by management bundles to alter the active start level of the framework.

Author:$Id: 42f3c6bbf682a69ea3914c737d5b0001694383db $
@ThreadSafe
@noimplement
Deprecated:This service has been replaced by the org.osgi.framework.startlevel package.
/** * The StartLevel service allows management agents to manage a start level * assigned to each bundle and the active start level of the Framework. There is * at most one StartLevel service present in the OSGi environment. * * <p> * A start level is defined to be a state of execution in which the Framework * exists. StartLevel 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. e.g. 2 is a * higher start level than 1. * <p> * Access to the StartLevel service is protected by corresponding * {@code ServicePermission}. In addition {@code AdminPermission} * is required to actually modify start level information. * <p> * Start Level support in the Framework includes the ability to control the * beginning start level of the Framework, to modify the active start level of * the Framework and to assign a specific start level to a bundle. How the * beginning start level of a Framework is specified is implementation * dependent. It may be a command line argument when invoking the Framework * implementation. * <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 * {@code Bundle.start} 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 * {@code 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 * {@code 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 StartLevel service can be used by management bundles to alter the active * start level of the framework. * * @ThreadSafe * @noimplement * @author $Id: 42f3c6bbf682a69ea3914c737d5b0001694383db $ * @deprecated This service has been replaced by the * <code>org.osgi.framework.startlevel</code> package. */
public interface StartLevel {
Return the active start level value of the Framework. If the Framework is in the process of changing the start level this method must return the active start level if this differs from the requested start level.
Returns:The active start level value of the Framework.
/** * Return the active start level value of the Framework. * * If the Framework is in the process of changing the start level this * method must return the active start level if this differs from the * requested start level. * * @return The active start level value of the Framework. */
public int getStartLevel();
Modify the active start level of the Framework.

The Framework will move to the requested start level. This method will return immediately to the caller and the start level change will occur asynchronously on another thread.

If the specified start level is higher than the active start level, the Framework will continue to increase the start level until the Framework has reached the specified start level. At each intermediate start level value on the way to and including the target start level, the Framework must:

  1. Change the active start level to the intermediate start level value.
  2. Start bundles at the intermediate start level whose autostart setting indicate they must be started. They are started as described in the Bundle.start(int) method using the Bundle.START_TRANSIENT option. The Bundle.START_ACTIVATION_POLICY option must also be used if isBundleActivationPolicyUsed(Bundle) returns true for the bundle.
When this process completes after the specified start level is reached, the Framework will fire a Framework event of type FrameworkEvent.STARTLEVEL_CHANGED to announce it has moved to the specified start level.

If the specified start level is lower than the active start level, the Framework will continue to decrease the start level until the Framework has reached the specified start level. At each intermediate start level value on the way to and including the specified start level, the framework must:

  1. Stop bundles at the intermediate start level as described in the Bundle.stop(int) method using the Bundle.STOP_TRANSIENT option.
  2. Change the active start level to the intermediate start level value.
When this process completes after the specified start level is reached, the Framework will fire a Framework event of type FrameworkEvent.STARTLEVEL_CHANGED to announce it has moved to the specified start level.

If the specified start level is equal to the active start level, then no bundles are started or stopped, however, the Framework must fire a Framework event of type FrameworkEvent.STARTLEVEL_CHANGED to announce it has finished moving to the specified start level. This event may arrive before this method return.

Params:
  • startlevel – The requested start level for the Framework.
Throws:
  • IllegalArgumentException – If the specified start level is less than or equal to zero.
  • SecurityException – If the caller does not have AdminPermission[System Bundle,STARTLEVEL] and the Java runtime environment supports permissions.
/** * Modify the active start level of the Framework. * * <p> * The Framework will move to the requested start level. This method will * return immediately to the caller and the start level change will occur * asynchronously on another thread. * * <p> * If the specified start level is higher than the active start level, the * Framework will continue to increase the start level until the Framework * has reached the specified start level. * * At each intermediate start level value on the way to and including the * target start level, the Framework must: * <ol> * <li>Change the active start level to the intermediate start level value.</li> * <li>Start bundles at the intermediate start level whose autostart setting * indicate they must be started. They are started as described in the * {@link Bundle#start(int)} method using the {@link Bundle#START_TRANSIENT} * option. The {@link Bundle#START_ACTIVATION_POLICY} option must also be * used if {@link #isBundleActivationPolicyUsed(Bundle)} returns * {@code true} for the bundle.</li> * </ol> * When this process completes after the specified start level is reached, * the Framework will fire a Framework event of type * {@code FrameworkEvent.STARTLEVEL_CHANGED} to announce it has moved * to the specified start level. * * <p> * If the specified start level is lower than the active start level, the * Framework will continue to decrease the start level until the Framework * has reached the specified start level. * * At each intermediate start level value on the way to and including the * specified start level, the framework must: * <ol> * <li>Stop bundles at the intermediate start level as described in the * {@link Bundle#stop(int)} method using the {@link Bundle#STOP_TRANSIENT} * option.</li> * <li>Change the active start level to the intermediate start level value.</li> * </ol> * When this process completes after the specified start level is reached, * the Framework will fire a Framework event of type * {@code FrameworkEvent.STARTLEVEL_CHANGED} to announce it has moved * to the specified start level. * * <p> * If the specified start level is equal to the active start level, then no * bundles are started or stopped, however, the Framework must fire a * Framework event of type {@code FrameworkEvent.STARTLEVEL_CHANGED} * to announce it has finished moving to the specified start level. This * event may arrive before this method return. * * @param startlevel The requested start level for the Framework. * @throws IllegalArgumentException If the specified start level is less * than or equal to zero. * @throws SecurityException If the caller does not have * {@code AdminPermission[System Bundle,STARTLEVEL]} and the * Java runtime environment supports permissions. */
public void setStartLevel(int startlevel);
Return the assigned start level value for the specified Bundle.
Params:
  • bundle – The target bundle.
Throws:
  • IllegalArgumentException – If the specified bundle has been uninstalled or if the specified bundle was not created by the same framework instance that registered this StartLevel service.
Returns:The start level value of the specified Bundle.
/** * Return the assigned start level value for the specified Bundle. * * @param bundle The target bundle. * @return The start level value of the specified Bundle. * @throws java.lang.IllegalArgumentException If the specified bundle has * been uninstalled or if the specified bundle was not created by * the same framework instance that registered this * {@code StartLevel} service. */
public int getBundleStartLevel(Bundle bundle);
Assign a start level value to the specified Bundle.

The specified bundle will be assigned the specified start level. The start level value assigned to the bundle will be persistently recorded by the Framework.

If the new start level for the bundle is lower than or equal to the active start level of the Framework and the bundle's autostart setting indicates the bundle must be started, the Framework will start the specified bundle as described in the Bundle.start(int) method using the Bundle.START_TRANSIENT option. The Bundle.START_ACTIVATION_POLICY option must also be used if isBundleActivationPolicyUsed(Bundle) returns true for the bundle. The actual starting of this bundle must occur asynchronously.

If the new start level for the bundle is higher than the active start level of the Framework, the Framework will stop the specified bundle as described in the Bundle.stop(int) method using the Bundle.STOP_TRANSIENT option. The actual stopping of this bundle must occur asynchronously.

Params:
  • bundle – The target bundle.
  • startlevel – The new start level for the specified Bundle.
Throws:
  • IllegalArgumentException – If the specified bundle has been uninstalled, or if the specified start level is less than or equal to zero, or if the specified bundle is the system bundle, or if the specified bundle was not created by the same framework instance that registered this StartLevel service.
  • SecurityException – If the caller does not have AdminPermission[bundle,EXECUTE] and the Java runtime environment supports permissions.
/** * Assign a start level value to the specified Bundle. * * <p> * The specified bundle will be assigned the specified start level. The * start level value assigned to the bundle will be persistently recorded by * the Framework. * <p> * If the new start level for the bundle is lower than or equal to the * active start level of the Framework and the bundle's autostart setting * indicates the bundle must be started, the Framework will start the * specified bundle as described in the {@link Bundle#start(int)} method * using the {@link Bundle#START_TRANSIENT} option. The * {@link Bundle#START_ACTIVATION_POLICY} option must also be used if * {@link #isBundleActivationPolicyUsed(Bundle)} returns {@code true} * for the bundle. The actual starting of this bundle must occur * asynchronously. * <p> * If the new start level for the bundle is higher than the active start * level of the Framework, the Framework will stop the specified bundle as * described in the {@link Bundle#stop(int)} method using the * {@link Bundle#STOP_TRANSIENT} option. The actual stopping of this bundle * must occur asynchronously. * * @param bundle The target bundle. * @param startlevel The new start level for the specified Bundle. * @throws IllegalArgumentException If the specified bundle has been * uninstalled, or if the specified start level is less than or * equal to zero, or if the specified bundle is the system bundle, * or if the specified bundle was not created by the same framework * instance that registered this {@code StartLevel} service. * @throws SecurityException If the caller does not have * {@code AdminPermission[bundle,EXECUTE]} and the Java runtime * environment supports permissions. */
public void setBundleStartLevel(Bundle bundle, int startlevel);
Return the initial start level value that is assigned to a Bundle when it is first installed.
See Also:
Returns:The initial start level value for Bundles.
/** * Return the initial start level value that is assigned to a Bundle when it * is first installed. * * @return The initial start level value for Bundles. * @see #setInitialBundleStartLevel(int) */
public int getInitialBundleStartLevel();
Set the initial start level value that is assigned to a Bundle when it is first installed.

The initial bundle start level will be set to the specified start level. The initial bundle start level value will be persistently recorded by the Framework.

When a Bundle is installed via BundleContext.installBundle, it is assigned the initial bundle start level value.

The default initial bundle start level value is 1 unless this method has been called to assign a different initial bundle start level value.

This method does not change the start level values of installed bundles.

Params:
  • startlevel – The initial start level for newly installed bundles.
Throws:
  • IllegalArgumentException – If the specified start level is less than or equal to zero.
  • SecurityException – If the caller does not have AdminPermission[System Bundle,STARTLEVEL] and the Java runtime environment supports permissions.
/** * Set the initial start level value that is assigned to a Bundle when it is * first installed. * * <p> * The initial bundle start level will be set to the specified start level. * The initial bundle start level value will be persistently recorded by the * Framework. * * <p> * When a Bundle is installed via {@code BundleContext.installBundle}, * it is assigned the initial bundle start level value. * * <p> * The default initial bundle start level value is 1 unless this method has * been called to assign a different initial bundle start level value. * * <p> * This method does not change the start level values of installed bundles. * * @param startlevel The initial start level for newly installed bundles. * @throws IllegalArgumentException If the specified start level is less * than or equal to zero. * @throws SecurityException If the caller does not have * {@code AdminPermission[System Bundle,STARTLEVEL]} and the * Java runtime environment supports permissions. */
public void setInitialBundleStartLevel(int startlevel);
Returns whether the specified bundle's autostart setting indicates the bundle must be started.

The autostart setting of a bundle indicates whether the bundle is to be started when its start level is reached.

Params:
  • bundle – The bundle whose autostart setting is to be examined.
Throws:
  • IllegalArgumentException – If the specified bundle has been uninstalled or if the specified bundle was not created by the same framework instance that registered this StartLevel service.
See Also:
Returns:true if the autostart setting of the bundle indicates the bundle is to be started. false otherwise.
/** * Returns whether the specified bundle's autostart setting indicates the * bundle must be started. * <p> * The autostart setting of a bundle indicates whether the bundle is to be * started when its start level is reached. * * @param bundle The bundle whose autostart setting is to be examined. * @return {@code true} if the autostart setting of the bundle * indicates the bundle is to be started. {@code false} * otherwise. * @throws java.lang.IllegalArgumentException If the specified bundle has * been uninstalled or if the specified bundle was not created by * the same framework instance that registered this * {@code StartLevel} service. * @see Bundle#START_TRANSIENT */
public boolean isBundlePersistentlyStarted(Bundle bundle);
Returns whether the specified bundle's autostart setting indicates that the activation policy declared in the bundle's manifest must be used.

The autostart setting of a bundle indicates whether the bundle's declared activation policy is to be used when the bundle is started.

Params:
  • bundle – The bundle whose autostart setting is to be examined.
Throws:
  • IllegalArgumentException – If the specified bundle has been uninstalled or if the specified bundle was not created by the same framework instance that registered this StartLevel service.
See Also:
Returns:true if the bundle's autostart setting indicates the activation policy declared in the manifest must be used. false if the bundle must be eagerly activated.
Since:1.1
/** * Returns whether the specified bundle's autostart setting indicates that * the activation policy declared in the bundle's manifest must be used. * <p> * The autostart setting of a bundle indicates whether the bundle's declared * activation policy is to be used when the bundle is started. * * @param bundle The bundle whose autostart setting is to be examined. * @return {@code true} if the bundle's autostart setting indicates the * activation policy declared in the manifest must be used. * {@code false} if the bundle must be eagerly activated. * @throws java.lang.IllegalArgumentException If the specified bundle has * been uninstalled or if the specified bundle was not created by * the same framework instance that registered this * {@code StartLevel} service. * @since 1.1 * @see Bundle#START_ACTIVATION_POLICY */
public boolean isBundleActivationPolicyUsed(Bundle bundle); }