blob: c077f5d85b4d207163430780249a90c307bbfbec [file] [log] [blame]
/*
* 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.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 $Revision: 8803 $
* @ThreadSafe
*/
public interface BundleStateMBean {
/**
* The Object Name for a Bundle State MBean.
*/
String OBJECTNAME = JmxConstants.OSGI_CORE
+ ":type=bundleState,version=1.5";
/**
* 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 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 #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, 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);
/**
* 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;
/**
* 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;
/**
* 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 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;
}