/* * 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 <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; }