org.osgi.jmx.framework.BundleStateMBean Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.apache.aries.jmx.api Show documentation
Show all versions of org.apache.aries.jmx.api Show documentation
This bundle contains the JMX 1.1.0 API
The newest version!
/*
* 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:
*
* - {@link #INSTALLED}
* - {@link #RESOLVED}
* - {@link #STARTING}
* - {@link #ACTIVE}
* - {@link #STOPPING}
* - {@link #UNINSTALLED}
* - {@link #UNKNOWN}
*
*/
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:
*
* - {@link #IDENTIFIER}
* - {@link #LOCATION}
* - {@link #SYMBOLIC_NAME}
* - {@link #EVENT}
*
*/
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:
*
* - {@link #EXPORTED_PACKAGES}
* - {@link #FRAGMENT}
* - {@link #FRAGMENTS}
* - {@link #HEADERS}
* - {@link #HOSTS}
* - {@link #IDENTIFIER}
* - {@link #IMPORTED_PACKAGES}
* - {@link #LAST_MODIFIED}
* - {@link #LOCATION}
* - {@link #ACTIVATION_POLICY_USED}
* - {@link #PERSISTENTLY_STARTED}
* - {@link #REGISTERED_SERVICES}
* - {@link #REMOVAL_PENDING}
* - {@link #REQUIRED}
* - {@link #REQUIRED_BUNDLES}
* - {@link #REQUIRING_BUNDLES}
* - {@link #START_LEVEL}
* - {@link #STATE}
* - {@link #SERVICES_IN_USE}
* - {@link #SYMBOLIC_NAME}
* - {@link #VERSION}
*
* 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 <packageName;version>
* @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 <packageName;version>
* @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;
}