blob: 2e299ed27ebff168411e1f97532b367ccce12ed5 [file] [log] [blame]
/*
* 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.
*
* <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.
*
* @return The active start level value of the Framework.
*/
public int getStartLevel();
/**
* 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.
*
* @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.
*
* <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.
*
* @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.
*
* <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.
* <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.
* <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);
}