content: /*
   * Copyright (c) OSGi Alliance (2009, 2010). 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.jmx.framework;
  
  import java.io.IOException;
  import javax.management.openmbean.CompositeData;
  import javax.management.openmbean.CompositeType;
  import javax.management.openmbean.SimpleType;
  import javax.management.openmbean.TabularData;
  import javax.management.openmbean.TabularType;
  
  import org.osgi.jmx.Item;
  import org.osgi.jmx.JmxConstants;
  
  /**
   * This MBean represents the Bundle state of the framework. This MBean also
   * emits events that clients can use to get notified of the changes in the
   * bundle state of the framework.
   *
   * @version $Id: f5d5197fdabb4e0c420bc47812d38fd14edb61d0 $
   * @ThreadSafe
   */
  public interface BundleStateMBean {
  	/**
  	 * The Object Name for a Bundle State MBean.
  	 */
  	String OBJECTNAME = JmxConstants.OSGI_CORE
  			+ ":type=bundleState,version=1.7";
  
  	/**
  	 * The key KEY, used in {@link #KEY_ITEM}.
  	 */
  	String KEY = "Key";
  
  	/**
  	 * The item describing the key of a bundle header entry. The key is
  	 * {@link #KEY} and the type is {@link SimpleType#STRING}.
  	 */
  	Item KEY_ITEM = new Item(KEY, "The bundle header key", SimpleType.STRING);
  	/**
  	 * The key VALUE, used in {@link #VALUE_ITEM}.
  	 */
  	String VALUE = "Value";
  	/**
  	 * The item describing the value of a bundle header entry. The key is
  	 * {@link #VALUE} and the type is {@link SimpleType#STRING}.
  	 */
  	Item VALUE_ITEM = new Item(VALUE, "The bundle header value",
  			SimpleType.STRING);
  
  	/**
  	 * The Composite Type describing an entry in bundle headers. It consists of
  	 * {@link #KEY_ITEM} and {@link #VALUE_ITEM}.
  	 */
  	CompositeType HEADER_TYPE = Item.compositeType("HEADER",
  			"This type encapsulates OSGi bundle header key/value pairs",
  			KEY_ITEM, VALUE_ITEM);
  
  	/**
  	 * The Tabular Type describing the type of the Tabular Data value that is
  	 * returned from {@link #getHeaders(long)} method. The primary item is
  	 * {@link #KEY_ITEM}.
  	 */
  	TabularType HEADERS_TYPE = Item.tabularType("HEADERS",
  																"The table of bundle headers",
  																HEADER_TYPE,
  																KEY);
  
  	/**
  	 * The key LOCATION, used in {@link #LOCATION_ITEM}.
  	 */
  	String LOCATION = "Location";
  	/**
  	 * The item containing the bundle location in {@link #BUNDLE_TYPE}. The key
  	 * is {@link #LOCATION} and the the type is {@link SimpleType#STRING}.
  	 */
  	Item LOCATION_ITEM = new Item(LOCATION, "The location of the bundle",
  			SimpleType.STRING);
  
  	/**
  	 * The key IDENTIFIER, used in {@link #IDENTIFIER_ITEM}.
  	 */
  	String IDENTIFIER = "Identifier";
  
  	/**
  	 * The item containing the bundle identifier in {@link #BUNDLE_TYPE}. The
  	 * key is {@link #IDENTIFIER} and the the type is {@link SimpleType#LONG}.
  	 */
  	Item IDENTIFIER_ITEM = new Item(IDENTIFIER, "The id of the bundle",
  			SimpleType.LONG);
  	/**
  	 * The key SYMBOLIC_NAME, used in {@link #SYMBOLIC_NAME_ITEM}.
  	 */
  	String SYMBOLIC_NAME = "SymbolicName";
  
  	/**
  	 * The item containing the symbolic name in {@link #BUNDLE_TYPE}. The key is
  	 * {@link #SYMBOLIC_NAME} and the the type is {@link SimpleType#STRING}.
  	 */
  	Item SYMBOLIC_NAME_ITEM = new Item(SYMBOLIC_NAME,
  			"The symbolic name of the bundle", SimpleType.STRING);
  	/**
  	 * The key VERSION, used in {@link #VERSION_ITEM}.
  	 */
  	String VERSION = "Version";
  
  	/**
  	 * The item containing the symbolic name in {@link #BUNDLE_TYPE}. The key is
  	 * {@link #SYMBOLIC_NAME} and the the type is {@link SimpleType#STRING}.
  	 */
  	Item VERSION_ITEM = new Item(VERSION, "The version of the bundle",
  			SimpleType.STRING);
  	/**
  	 * The key START_LEVEL, used in {@link #START_LEVEL_ITEM}.
  	 */
  	String START_LEVEL = "StartLevel";
  
  	/**
  	 * The item containing the start level in {@link #BUNDLE_TYPE}. The key is
  	 * {@link #START_LEVEL} and the the type is {@link SimpleType#INTEGER}.
  	 */
  	Item START_LEVEL_ITEM = new Item(START_LEVEL,
  			"The start level of the bundle", SimpleType.INTEGER);
  	/**
  	 * The key STATE, used in {@link #STATE_ITEM}.
  	 */
  	String STATE = "State";
  
  	/**
  	 * Constant INSTALLED for the {@link #STATE}
  	 */
  	String INSTALLED = "INSTALLED";
  	/**
  	 * Constant RESOLVED for the {@link #STATE}
  	 */
  	String RESOLVED = "RESOLVED";
  	/**
  	 * Constant STARTING for the {@link #STATE}
  	 */
  	String STARTING = "STARTING";
  	/**
  	 * Constant ACTIVE for the {@link #STATE}
  	 */
  	String ACTIVE = "ACTIVE";
  	/**
  	 * Constant STOPPING for the {@link #STATE}
  	 */
  	String STOPPING = "STOPPING";
  	/**
  	 * Constant UNINSTALLED for the {@link #STATE}
  	 */
  	String UNINSTALLED = "UNINSTALLED";
  	/**
  	 * Constant UNKNOWN for the {@link #STATE}
  	 */
  	String UNKNOWN = "UNKNOWN";
  	/**
  	 * The item containing the bundle state in {@link #BUNDLE_TYPE}. The key is
  	 * {@link #STATE} and the the type is {@link SimpleType#STRING}. The
  	 * returned values must be one of the following strings:
  	 * <ul>
  	 * <li>{@link #INSTALLED}</li>
  	 * <li>{@link #RESOLVED}</li>
  	 * <li>{@link #STARTING}</li>
  	 * <li>{@link #ACTIVE}</li>
  	 * <li>{@link #STOPPING}</li>
  	 * <li>{@link #UNINSTALLED}</li>
  	 * <li>{@link #UNKNOWN}</li>
  	 * </ul>
  	 */
  	Item STATE_ITEM = new Item(STATE, "The state of the bundle",
  			SimpleType.STRING, INSTALLED, RESOLVED, STARTING, ACTIVE, STOPPING,
  			UNINSTALLED, UNKNOWN);
  	/**
  	 * The key LAST_MODIFIED, used in {@link #LAST_MODIFIED_ITEM}.
  	 */
  	String LAST_MODIFIED = "LastModified";
  
  	/**
  	 * The item containing the last modified time in the {@link #BUNDLE_TYPE}.
  	 * The key is {@link #LAST_MODIFIED} and the the type is
  	 * {@link SimpleType#LONG}.
  	 */
  	Item LAST_MODIFIED_ITEM = new Item(LAST_MODIFIED,
  			"The last modification time of the bundle", SimpleType.LONG);
  
  	/**
  	 * The key ACTIVATION_POLICY_USED, used in {@link #ACTIVATION_POLICY_USED_ITEM}.
  	 */
  	String ACTIVATION_POLICY_USED = "ActivationPolicyUsed";
  
  	/**
  	 * The item containing the indication whether the bundle activation policy
  	 * must be used in {@link #BUNDLE_TYPE}. The key is {@link #ACTIVATION_POLICY_USED} and
  	 * the type is {@link SimpleType#BOOLEAN}.
  	 */
  	Item ACTIVATION_POLICY_USED_ITEM = new Item(ACTIVATION_POLICY_USED,
  	        "Whether the bundle activation policy must be used", SimpleType.BOOLEAN);
  
  	/**
  	 * The key PERSISTENTLY_STARTED, used in {@link #PERSISTENTLY_STARTED_ITEM}.
  	 */
  	String PERSISTENTLY_STARTED = "PersistentlyStarted";
  
  	/**
  	 * The item containing the indication of persistently started in
  	 * {@link #BUNDLE_TYPE}. The key is {@link #PERSISTENTLY_STARTED} and the
  	 * the type is {@link SimpleType#BOOLEAN}.
  	 */
  	Item PERSISTENTLY_STARTED_ITEM = new Item(PERSISTENTLY_STARTED,
  			"Whether the bundle is persistently started", SimpleType.BOOLEAN);
  	/**
  	 * The key REMOVAL_PENDING, used in {@link #REMOVAL_PENDING_ITEM}.
  	 */
  	String REMOVAL_PENDING = "RemovalPending";
  
  	/**
  	 * The item containing the indication of removal pending in
  	 * {@link #BUNDLE_TYPE}. The key is {@link #REMOVAL_PENDING} and the type is
  	 * {@link SimpleType#BOOLEAN}.
  	 */
  	Item REMOVAL_PENDING_ITEM = new Item(REMOVAL_PENDING,
  			"Whether the bundle is pending removal", SimpleType.BOOLEAN);
  	/**
  	 * The key REQUIRED, used in {@link #REQUIRED_ITEM}.
  	 */
  	String REQUIRED = "Required";
  
  	/**
  	 * The item containing the required status in {@link #BUNDLE_TYPE}. The key
  	 * is {@link #REQUIRED} and the the type is {@link SimpleType#BOOLEAN}.
  	 */
  	Item REQUIRED_ITEM = new Item(REQUIRED, "Whether the bundle is required",
  			SimpleType.BOOLEAN);
  	/**
  	 * The key FRAGMENT, used in {@link #FRAGMENT_ITEM}.
  	 */
  	String FRAGMENT = "Fragment";
  
  	/**
  	 * The item containing the fragment status in {@link #BUNDLE_TYPE}. The key
  	 * is {@link #FRAGMENT} and the the type is {@link SimpleType#BOOLEAN}.
  	 */
  	Item FRAGMENT_ITEM = new Item(FRAGMENT, "Whether the bundle is a fragment",
  			SimpleType.BOOLEAN);
  	/**
  	 * The key REGISTERED_SERVICES, used in {@link #REGISTERED_SERVICES_ITEM}.
  	 */
  	String REGISTERED_SERVICES = "RegisteredServices";
  
  	/**
  	 * The item containing the registered services of the bundle in
  	 * {@link #BUNDLE_TYPE}. The key is {@link #REGISTERED_SERVICES} and the the
  	 * type is {@link JmxConstants#LONG_ARRAY_TYPE}.
  	 */
  	Item REGISTERED_SERVICES_ITEM = new Item(REGISTERED_SERVICES,
  			"The registered services of the bundle",
  			JmxConstants.LONG_ARRAY_TYPE);
  	/**
  	 * The key SERVICES_IN_USE, used in {@link #SERVICES_IN_USE_ITEM}.
  	 */
  	String SERVICES_IN_USE = "ServicesInUse";
  
  	/**
  	 * The item containing the services in use by this bundle in
  	 * {@link #BUNDLE_TYPE}. The key is {@link #SERVICES_IN_USE} and the the
  	 * type is {@link JmxConstants#LONG_ARRAY_TYPE}.
  	 */
  	Item SERVICES_IN_USE_ITEM = new Item(SERVICES_IN_USE,
  			"The services in use by the bundle", JmxConstants.LONG_ARRAY_TYPE);
  	/**
  	 * The key HEADERS, used in {@link #HEADERS_ITEM}.
  	 */
  	String HEADERS = "Headers";
  
  	/**
  	 * The item containing the bundle headers in {@link #BUNDLE_TYPE}. The key
  	 * is {@link #HEADERS} and the the type is {@link #HEADERS_TYPE}.
  	 */
  	Item HEADERS_ITEM = new Item(HEADERS, "The headers of the bundle",
  			HEADERS_TYPE);
  
  	/**
  	 * The key EXPORTED_PACKAGES, used in {@link #EXPORTED_PACKAGES_ITEM}.
  	 */
  	String EXPORTED_PACKAGES = "ExportedPackages";
  
  	/**
  	 * The item containing the exported package names in {@link #BUNDLE_TYPE}
  	 * .The key is {@link #EXPORTED_PACKAGES} and the the type is
  	 * {@link JmxConstants#STRING_ARRAY_TYPE}.
  	 */
  	Item EXPORTED_PACKAGES_ITEM = new Item(EXPORTED_PACKAGES,
  			"The exported packages of the bundle",
  			JmxConstants.STRING_ARRAY_TYPE);
  	/**
  	 * The key IMPORTED_PACKAGES, used in {@link #EXPORTED_PACKAGES_ITEM}.
  	 */
  	String IMPORTED_PACKAGES = "ImportedPackages";
  
  	/**
  	 * The item containing the imported package names in {@link #BUNDLE_TYPE}
  	 * .The key is {@link #IMPORTED_PACKAGES} and the the type is
  	 * {@link JmxConstants#STRING_ARRAY_TYPE}.
  	 */
  	Item IMPORTED_PACKAGES_ITEM = new Item(IMPORTED_PACKAGES,
  			"The imported packages of the bundle",
  			JmxConstants.STRING_ARRAY_TYPE);
  	/**
  	 * The key FRAGMENTS, used in {@link #FRAGMENTS_ITEM}.
  	 */
  	String FRAGMENTS = "Fragments";
  
  	/**
  	 * The item containing the list of fragments the bundle is host to in
  	 * {@link #BUNDLE_TYPE}. The key is {@link #FRAGMENTS} and the type is
  	 * {@link JmxConstants#LONG_ARRAY_TYPE}.
  	 */
  	Item FRAGMENTS_ITEM = new Item(FRAGMENTS,
  			"The fragments of which the bundle is host",
  			JmxConstants.LONG_ARRAY_TYPE);
  	/**
  	 * The key HOSTS, used in {@link #HOSTS_ITEM}.
  	 */
  	String HOSTS = "Hosts";
  
  	/**
  	 * The item containing the bundle identifiers representing the hosts in
  	 * {@link #BUNDLE_TYPE}. The key is {@link #HOSTS} and the type is
  	 * {@link JmxConstants#LONG_ARRAY_TYPE}
  	 */
  	Item HOSTS_ITEM = new Item(HOSTS,
  			"The fragments of which the bundle is host",
  			JmxConstants.LONG_ARRAY_TYPE);
  	/**
  	 * The key REQUIRED_BUNDLES, used in {@link #REQUIRED_BUNDLES_ITEM}.
  	 */
  	String REQUIRED_BUNDLES = "RequiredBundles";
  
  	/**
  	 * The item containing the required bundles in {@link #BUNDLE_TYPE}. The key
  	 * is {@link #REQUIRED_BUNDLES} and the type is
  	 * {@link JmxConstants#LONG_ARRAY_TYPE}
  	 */
  	Item REQUIRED_BUNDLES_ITEM = new Item(REQUIRED_BUNDLES,
  			"The required bundles the bundle", JmxConstants.LONG_ARRAY_TYPE);
  	/**
  	 * The key REQUIRING_BUNDLES, used in {@link #REQUIRING_BUNDLES_ITEM}.
  	 */
  	String REQUIRING_BUNDLES = "RequiringBundles";
  
  	/**
  	 * The item containing the bundles requiring this bundle in
  	 * {@link #BUNDLE_TYPE}. The key is {@link #REQUIRING_BUNDLES} and the type
  	 * is {@link JmxConstants#LONG_ARRAY_TYPE}
  	 */
  	Item REQUIRING_BUNDLES_ITEM = new Item(REQUIRING_BUNDLES,
  			"The bundles requiring the bundle", JmxConstants.LONG_ARRAY_TYPE);
  
  	/**
  	 * The key EVENT, used in {@link #EVENT_ITEM}.
  	 */
  	String EVENT = "BundleEvent";
  
  	/**
  	 * The item containing the event type.  The key is {@link #EVENT} and the type is {@link SimpleType#INTEGER}
  	 */
  	Item EVENT_ITEM = new Item(
  			EVENT,
  			"The type of the event: {INSTALLED=1, STARTED=2, STOPPED=4, UPDATED=8, UNINSTALLED=16}",
  			SimpleType.INTEGER);
  
  	/**
  	 * The Composite Type that represents a bundle event.  This composite consists of:
  	 * <ul>
  	 * <li>{@link #IDENTIFIER}</li>
  	 * <li>{@link #LOCATION}</li>
  	 * <li>{@link #SYMBOLIC_NAME}</li>
  	 * <li>{@link #EVENT}</li>
  	 * </ul>
  	 */
  	CompositeType BUNDLE_EVENT_TYPE = Item.compositeType("BUNDLE_EVENT",
  			"This type encapsulates OSGi bundle events", IDENTIFIER_ITEM,
  			LOCATION_ITEM, SYMBOLIC_NAME_ITEM, EVENT_ITEM);
  
  	/**
  	 * The Composite Type that represents a bundle. This composite consist of:
  	 * <ul>
  	 * <li>{@link #EXPORTED_PACKAGES}</li>
  	 * <li>{@link #FRAGMENT}</li>
  	 * <li>{@link #FRAGMENTS}</li>
  	 * <li>{@link #HEADERS}</li>
  	 * <li>{@link #HOSTS}</li>
  	 * <li>{@link #IDENTIFIER}</li>
  	 * <li>{@link #IMPORTED_PACKAGES}</li>
  	 * <li>{@link #LAST_MODIFIED}</li>
  	 * <li>{@link #LOCATION}</li>
  	 * <li>{@link #ACTIVATION_POLICY_USED}</li>
  	 * <li>{@link #PERSISTENTLY_STARTED}</li>
  	 * <li>{@link #REGISTERED_SERVICES}</li>
  	 * <li>{@link #REMOVAL_PENDING}</li>
  	 * <li>{@link #REQUIRED}</li>
  	 * <li>{@link #REQUIRED_BUNDLES}</li>
  	 * <li>{@link #REQUIRING_BUNDLES}</li>
  	 * <li>{@link #START_LEVEL}</li>
  	 * <li>{@link #STATE}</li>
  	 * <li>{@link #SERVICES_IN_USE}</li>
  	 * <li>{@link #SYMBOLIC_NAME}</li>
  	 * <li>{@link #VERSION}</li>
  	 * </ul>
  	 * It is used by {@link #BUNDLES_TYPE}.
  	 */
  	CompositeType BUNDLE_TYPE = Item.compositeType("BUNDLE",
  			"This type encapsulates OSGi bundles", EXPORTED_PACKAGES_ITEM,
  			FRAGMENT_ITEM, FRAGMENTS_ITEM, HEADERS_ITEM, HOSTS_ITEM,
  			IDENTIFIER_ITEM, IMPORTED_PACKAGES_ITEM, LAST_MODIFIED_ITEM,
  			LOCATION_ITEM, ACTIVATION_POLICY_USED_ITEM,
  			PERSISTENTLY_STARTED_ITEM, REGISTERED_SERVICES_ITEM,
  			REMOVAL_PENDING_ITEM, REQUIRED_ITEM, REQUIRED_BUNDLES_ITEM,
  			REQUIRING_BUNDLES_ITEM, START_LEVEL_ITEM, STATE_ITEM,
  			SERVICES_IN_USE_ITEM, SYMBOLIC_NAME_ITEM, VERSION_ITEM);
  
  	/**
  	 * The Tabular Type for a list of bundles. The row type is
  	 * {@link #BUNDLE_TYPE} and the index is {@link #IDENTIFIER}.
  	 */
  	TabularType BUNDLES_TYPE = Item.tabularType("BUNDLES", "A list of bundles",
  																BUNDLE_TYPE,
  																IDENTIFIER);
  
  	/** New!!
  	 * @param id The Bundle ID
  	 * @return The Bundle Data
  	 * @throws IOException
  	 */
  	CompositeData getBundle(long id) throws IOException;
  
  	long[] getBundleIds() throws IOException;
  
  	/**
  	 * Answer the list of identifiers of the bundles this bundle depends upon
  	 *
  	 * @param bundleIdentifier
  	 *            the bundle identifier
  	 * @return the list of bundle identifiers
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	long[] getRequiredBundles(long bundleIdentifier) throws IOException;
  
  	/**
  	 * Answer the bundle state of the system in tabular form.
  	 *
  	 * Each row of the returned table represents a single bundle. The Tabular
  	 * Data consists of Composite Data that is type by {@link #BUNDLES_TYPE}.
  	 *
  	 * @return the tabular representation of the bundle state
  	 * @throws IOException
  	 */
  	TabularData listBundles() throws IOException;
  
  	TabularData listBundles(String ... items) throws IOException;
  
  	/**
  	 * Answer the list of exported packages for this bundle.
  	 *
  	 * @param bundleId
  	 * @return the array of package names, combined with their version in the
  	 *         format &lt;packageName;version&gt;
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	String[] getExportedPackages(long bundleId) throws IOException;
  
  	/**
  	 * Answer the list of the bundle ids of the fragments associated with this
  	 * bundle
  	 *
  	 * @param bundleId
  	 * @return the array of bundle identifiers
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	long[] getFragments(long bundleId) throws IOException;
  
  	/**
  	 * Answer the headers for the bundle uniquely identified by the bundle id.
  	 * The Tabular Data is typed by the {@link #HEADERS_TYPE}.
  	 *
  	 * @param bundleId
  	 *            the unique identifier of the bundle
  	 * @return the table of associated header key and values
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	TabularData getHeaders(long bundleId) throws IOException;
      TabularData getHeaders(long bundleId, String locale) throws IOException;
      String getHeader(long bundleId, String key) throws IOException;
      String getHeader(long bundleId, String key, String locale) throws IOException;
  
  	/**
  	 * Answer the list of bundle ids of the bundles which host a fragment
  	 *
  	 * @param fragment
  	 *            the bundle id of the fragment
  	 * @return the array of bundle identifiers
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	long[] getHosts(long fragment) throws IOException;
  
  	/**
  	 * Answer the array of the packages imported by this bundle
  	 *
  	 * @param bundleId
  	 *            the bundle identifier
  	 * @return the array of package names, combined with their version in the
  	 *         format &lt;packageName;version&gt;
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	String[] getImportedPackages(long bundleId) throws IOException;
  
  	/**
  	 * Answer the last modified time of a bundle
  	 *
  	 * @param bundleId
  	 *            the unique identifier of a bundle
  	 * @return the last modified time
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	long getLastModified(long bundleId) throws IOException;
  
  	/**
  	 * Answer the list of service identifiers representing the services this
  	 * bundle exports
  	 *
  	 * @param bundleId
  	 *            the bundle identifier
  	 * @return the list of service identifiers
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	long[] getRegisteredServices(long bundleId) throws IOException;
  
  	/**
  	 * Answer the list of identifiers of the bundles which require this bundle
  	 *
  	 * @param bundleIdentifier
  	 *            the bundle identifier
  	 * @return the list of bundle identifiers
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	long[] getRequiringBundles(long bundleIdentifier) throws IOException;
  
  	/**
  	 * Answer the list of service identifiers which refer to the the services
  	 * this bundle is using
  	 *
  	 * @param bundleIdentifier
  	 *            the bundle identifier
  	 * @return the list of service identifiers
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	long[] getServicesInUse(long bundleIdentifier) throws IOException;
  
  	/**
  	 * Answer the start level of the bundle
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return the start level
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	int getStartLevel(long bundleId) throws IOException;
  
  	/**
  	 * Answer the symbolic name of the state of the bundle
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return the string name of the bundle state
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	String getState(long bundleId) throws IOException;
  
  	/**
  	 * Answer the symbolic name of the bundle
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return the symbolic name
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	String getSymbolicName(long bundleId) throws IOException;
  
  	/**
  	 * Answer whether the specified bundle's autostart setting indicates that
  	 * the activation policy declared in the bundle's manifest must be used.
  	 *
  	 * @param bundleId
       *            the identifier of the bundle
  	 * @return 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.
       * @throws IOException
       *             if the operation fails
       * @throws IllegalArgumentException
       *             if the bundle indicated does not exist
  	 */
  	boolean isActivationPolicyUsed(long bundleId) throws IOException;
  
  	/**
  	 * Answer if the bundle is persistently started when its start level is
  	 * reached
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return true if the bundle is persistently started
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	boolean isPersistentlyStarted(long bundleId) throws IOException;
  
  	/**
  	 * Answer whether the bundle is a fragment or not
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return true if the bundle is a fragment
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	boolean isFragment(long bundleId) throws IOException;
  
  	/**
  	 * Answer true if the bundle is pending removal
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return true if the bundle is pending removal
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	boolean isRemovalPending(long bundleId) throws IOException;
  
  	/**
  	 * Answer true if the bundle is required by another bundle
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return true if the bundle is required by another bundle
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	boolean isRequired(long bundleId) throws IOException;
  
  	/**
  	 * Answer the location of the bundle.
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return The location string of this bundle
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	String getLocation(long bundleId) throws IOException;
  
  	/**
  	 * Answer the location of the bundle.
  	 *
  	 * @param bundleId
  	 *            the identifier of the bundle
  	 * @return The location string of this bundle
  	 * @throws IOException
  	 *             if the operation fails
  	 * @throws IllegalArgumentException
  	 *             if the bundle indicated does not exist
  	 */
  	String getVersion(long bundleId) throws IOException;
  
  }
  