blob: 91fa55912a547e71e21610d5944dfe292a2c2740 [file] [log] [blame]
/*
* $Header: /cvshome/build/org.osgi.framework/src/org/osgi/framework/BundleContext.java,v 1.13 2005/06/21 16:22:12 hargrave Exp $
*
* Copyright (c) OSGi Alliance (2000, 2005). All Rights Reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this
* distribution, and is available at http://www.eclipse.org/legal/epl-v10.html.
*/
package org.osgi.framework;
import java.io.File;
import java.io.InputStream;
import java.util.Dictionary;
/**
* A bundle's execution context within the Framework. The context is used to
* grant access to other methods so that this bundle can interact with the
* Framework.
*
* <p>
* <code>BundleContext</code> methods allow a bundle to:
* <ul>
* <li>Subscribe to events published by the Framework.
* <li>Register service objects with the Framework service registry.
* <li>Retrieve <code>ServiceReferences</code> from the Framework service
* registry.
* <li>Get and release service objects for a referenced service.
* <li>Install new bundles in the Framework.
* <li>Get the list of bundles installed in the Framework.
* <li>Get the {@link Bundle} object for a bundle.
* <li>Create <code>File</code> objects for files in a persistent storage area
* provided for the bundle by the Framework.
* </ul>
*
* <p>
* A <code>BundleContext</code> object will be created and provided to the bundle
* associated with this context when it is started using the
* {@link BundleActivator#start} method. The same <code>BundleContext</code>
* object will be passed to the bundle associated with this context when it is
* stopped using the {@link BundleActivator#stop} method. A <code>BundleContext</code>
* object is generally for the private use of its associated bundle and is not
* meant to be shared with other bundles in the OSGi environment.
*
* <p>
* The <code>Bundle</code> object associated with a <code>BundleContext</code> object
* is called the <em>context bundle</em>.
*
* <p>
* The <code>BundleContext</code> object is only valid during the execution
* of its context bundle; that is, during the period from when the context
* bundle is in the <code>STARTING</code>, <code>STOPPING</code>, and
* <code>ACTIVE</code> bundle states. If the <code>BundleContext</code> object
* is used subsequently, an <code>IllegalStateException</code> must be thrown.
* The <code>BundleContext</code> object must never be reused after its
* context bundle is stopped.
*
* <p>
* The Framework is the only entity that can create <code>BundleContext</code>
* objects and they are only valid within the Framework that created them.
*
* @version $Revision: 1.13 $
*/
public abstract interface BundleContext {
/**
* Returns the value of the specified property. If the key is not found in
* the Framework properties, the system properties are then searched. The
* method returns <code>null</code> if the property is not found.
*
* <p>
* The Framework defines the following standard property keys:
* </p>
* <ul>
* <li>{@link Constants#FRAMEWORK_VERSION}- The OSGi Framework version.
* </li>
* <li>{@link Constants#FRAMEWORK_VENDOR}- The Framework implementation
* vendor.</li>
* <li>{@link Constants#FRAMEWORK_LANGUAGE}- The language being used. See
* ISO 639 for possible values.</li>
* <li>{@link Constants#FRAMEWORK_OS_NAME}- The host computer operating
* system.</li>
* <li>{@link Constants#FRAMEWORK_OS_VERSION}- The host computer operating
* system version number.</li>
* <li>{@link Constants#FRAMEWORK_PROCESSOR}- The host computer processor
* name.</li>
* </ul>
* <p>
* All bundles must have permission to read these properties.
*
* <p>
* Note: The last four standard properties are used by the
* {@link Constants#BUNDLE_NATIVECODE} <code>Manifest</code> header's matching
* algorithm for selecting native language code.
*
* @param key The name of the requested property.
* @return The value of the requested property, or <code>null</code> if the
* property is undefined.
* @exception java.lang.SecurityException If the caller does not have the
* appropriate <code>PropertyPermission</code> to read the
* property, and the Java Runtime Environment supports
* permissions.
*/
public abstract String getProperty(String key);
/**
* Returns the <code>Bundle</code> object associated with this
* <code>BundleContext</code>. This bundle is called the context bundle.
*
* @return The <code>Bundle</code> object associated with this
* <code>BundleContext</code>.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract Bundle getBundle();
/**
* Installs a bundle from the specified location string. A bundle is
* obtained from <code>location</code> as interpreted by the Framework in an
* implementation dependent manner.
* <p>
* Every installed bundle is uniquely identified by its location string,
* typically in the form of a URL.
*
* <p>
* The following steps are required to install a bundle:
* <ol>
* <li>If a bundle containing the same location string is already
* installed, the <code>Bundle</code> object for that bundle is returned.
*
* <li>The bundle's content is read from the location string. If this
* fails, a {@link BundleException} is thrown.
*
* <li>The bundle's <code>Bundle-NativeCode</code> dependencies are resolved.
* If this fails, a <code>BundleException</code> is thrown.
*
* <li>The bundle's associated resources are allocated. The associated
* resources minimally consist of a unique identifier and a persistent
* storage area if the platform has file system support. If this step fails,
* a <code>BundleException</code> is thrown.
*
* <li>If the bundle has declared an Bundle-RequiredExecutionEnvironment
* header, then the listed execution environments must be verified against
* the installed execution environments. If they are not all present, a
* <code>BundleException</code> must be thrown.
*
* <li>The bundle's state is set to <code>INSTALLED</code>.
*
* <li>A bundle event of type {@link BundleEvent#INSTALLED} is broadcast.
*
* <li>The <code>Bundle</code> object for the newly or previously installed
* bundle is returned.
* </ol>
*
* <b>Postconditions, no exceptions thrown </b>
* <ul>
* <li><code>getState()</code> in {<code>INSTALLED</code>,<code>RESOLVED</code>}.
* <li>Bundle has a unique ID.
* </ul>
* <b>Postconditions, when an exception is thrown </b>
* <ul>
* <li>Bundle is not installed and no trace of the bundle exists.
* </ul>
*
* @param location The location identifier of the bundle to install.
* @return The <code>Bundle</code> object of the installed bundle.
* @exception BundleException If the installation failed.
* @exception java.lang.SecurityException If the caller does not have the
* appropriate <code>AdminPermission</code>, and the Java Runtime
* Environment supports permissions.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract Bundle installBundle(String location)
throws BundleException;
/**
* Installs a bundle from the specified <code>InputStream</code> object.
*
* <p>
* This method performs all of the steps listed in
* <code>BundleContext.installBundle(String location)</code>, except that the
* bundle's content will be read from the <code>InputStream</code> object. The
* location identifier string specified will be used as the identity of the
* bundle.
*
* <p>
* This method must always close the <code>InputStream</code> object, even if
* an exception is thrown.
*
* @param location The location identifier of the bundle to install.
* @param input The <code>InputStream</code> object from which this bundle
* will be read.
* @return The <code>Bundle</code> object of the installed bundle.
* @exception BundleException If the provided stream cannot be read or the
* installation failed.
* @exception java.lang.SecurityException If the caller does not have the
* appropriate <code>AdminPermission</code>, and the Java Runtime
* Environment supports permissions.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
* @see #installBundle(java.lang.String)
*/
public abstract Bundle installBundle(String location, InputStream input)
throws BundleException;
/**
* Returns the bundle with the specified identifier.
*
* @param id The identifier of the bundle to retrieve.
* @return A <code>Bundle</code> object or <code>null</code> if the identifier
* does not match any installed bundle.
*/
public abstract Bundle getBundle(long id);
/**
* Returns a list of all installed bundles.
* <p>
* This method returns a list of all bundles installed in the OSGi
* environment at the time of the call to this method. However, since the
* Framework is a very dynamic environment, bundles can be installed or
* uninstalled at anytime.
*
* @return An array of <code>Bundle</code> objects, one object per installed
* bundle.
*/
public abstract Bundle[] getBundles();
/**
* Adds the specified <code>ServiceListener</code> object with the specified
* <code>filter</code> to the context bundle's list of listeners.
* See {@link Filter} for a description of the filter syntax.
* <code>ServiceListener</code> objects are notified when a service has a
* lifecycle state change.
*
* <p>
* If the context bundle's list of listeners already contains a listener
* <code>l</code> such that <code>(l==listener)</code>, then this method replaces
* that listener's filter (which may be <code>null</code>) with the specified
* one (which may be <code>null</code>).
*
* <p>
* The listener is called if the filter criteria is met. To filter based
* upon the class of the service, the filter should reference the
* {@link Constants#OBJECTCLASS} property. If <code>filter</code> is
* <code>null</code>, all services are considered to match the filter.
*
* <p>
* When using a <code>filter</code>, it is possible that the
* <code>ServiceEvent</code>s for the complete lifecycle of a service will
* not be delivered to the listener. For example, if the <code>filter</code>
* only matches when the property <code>x</code> has the value <code>1</code>,
* the listener will not be called if the service is registered with the
* property <code>x</code> not set to the value <code>1</code>. Subsequently,
* when the service is modified setting property <code>x</code> to the value
* <code>1</code>, the filter will match and the listener will be called with
* a <code>ServiceEvent</code> of type <code>MODIFIED</code>. Thus, the
* listener will not be called with a <code>ServiceEvent</code> of type
* <code>REGISTERED</code>.
*
* <p>
* If the Java Runtime Environment supports permissions, the
* <code>ServiceListener</code> object will be notified of a service event
* only if the bundle that is registering it has the
* <code>ServicePermission</code> to get the service using at least one of the
* named classes the service was registered under.
*
* @param listener The <code>ServiceListener</code> object to be added.
* @param filter The filter criteria.
*
* @exception InvalidSyntaxException If <code>filter</code> contains an
* invalid filter string that cannot be parsed.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*
* @see ServiceEvent
* @see ServiceListener
* @see ServicePermission
*/
public abstract void addServiceListener(ServiceListener listener,
String filter) throws InvalidSyntaxException;
/**
* Adds the specified <code>ServiceListener</code> object to the context
* bundle's list of listeners.
*
* <p>
* This method is the same as calling
* <code>BundleContext.addServiceListener(ServiceListener listener,
* String filter)</code>
* with <code>filter</code> set to <code>null</code>.
*
* @param listener The <code>ServiceListener</code> object to be added.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*
* @see #addServiceListener(ServiceListener, String)
*/
public abstract void addServiceListener(ServiceListener listener);
/**
* Removes the specified <code>ServiceListener</code> object from the context
* bundle's list of listeners.
*
* <p>
* If <code>listener</code> is not contained in this context bundle's list of
* listeners, this method does nothing.
*
* @param listener The <code>ServiceListener</code> to be removed.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract void removeServiceListener(ServiceListener listener);
/**
* Adds the specified <code>BundleListener</code> object to the context
* bundle's list of listeners if not already present. BundleListener
* objects are notified when a bundle has a lifecycle state change.
*
* <p>
* If the context bundle's list of listeners already contains a listener
* <code>l</code> such that <code>(l==listener)</code>, this method does
* nothing.
*
* @param listener The <code>BundleListener</code> to be added.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*
* @see BundleEvent
* @see BundleListener
*/
public abstract void addBundleListener(BundleListener listener);
/**
* Removes the specified <code>BundleListener</code> object from the context
* bundle's list of listeners.
*
* <p>
* If <code>listener</code> is not contained in the context bundle's list of
* listeners, this method does nothing.
*
* @param listener The <code>BundleListener</code> object to be removed.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract void removeBundleListener(BundleListener listener);
/**
* Adds the specified <code>FrameworkListener</code> object to the context
* bundle's list of listeners if not already present.
* FrameworkListeners are notified of general Framework events.
*
* <p>
* If the context bundle's list of listeners already contains a listener
* <code>l</code> such that <code>(l==listener)</code>, this method does
* nothing.
*
* @param listener The <code>FrameworkListener</code> object to be added.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*
* @see FrameworkEvent
* @see FrameworkListener
*/
public abstract void addFrameworkListener(FrameworkListener listener);
/**
* Removes the specified <code>FrameworkListener</code> object from the
* context bundle's list of listeners.
*
* <p>
* If <code>listener</code> is not contained in the context bundle's list of
* listeners, this method does nothing.
*
* @param listener The <code>FrameworkListener</code> object to be removed.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract void removeFrameworkListener(FrameworkListener listener);
/**
* Registers the specified service object with the specified properties
* under the specified class names into the Framework. A
* <code>ServiceRegistration</code> object is returned. The
* <code>ServiceRegistration</code> object is for the private use of the
* bundle registering the service and should not be shared with other
* bundles. The registering bundle is defined to be the context bundle.
* Other bundles can locate the service by using either the
* {@link #getServiceReferences} or {@link #getServiceReference} method.
*
* <p>
* A bundle can register a service object that implements the
* {@link ServiceFactory} interface to have more flexibility in providing
* service objects to other bundles.
*
* <p>
* The following steps are required to register a service:
* <ol>
* <li>If <code>service</code> is not a <code>ServiceFactory</code>, an
* <code>IllegalArgumentException</code> is thrown if <code>service</code> is
* not an <code>instanceof</code> all the classes named.
* <li>The Framework adds these service properties to the specified
* <code>Dictionary</code> (which may be <code>null</code>): a property named
* {@link Constants#SERVICE_ID} identifying the registration number of the
* service and a property named {@link Constants#OBJECTCLASS} containing
* all the specified classes. If any of these properties have already been
* specified by the registering bundle, their values will be overwritten by
* the Framework.
* <li>The service is added to the Framework service registry and may now
* be used by other bundles.
* <li>A service event of type {@link ServiceEvent#REGISTERED} is
* synchronously sent.
* <li>A <code>ServiceRegistration</code> object for this registration is
* returned.
* </ol>
*
* @param clazzes The class names under which the service can be located.
* The class names in this array will be stored in the service's
* properties under the key {@link Constants#OBJECTCLASS}.
* @param service The service object or a <code>ServiceFactory</code> object.
* @param properties The properties for this service. The keys in the
* properties object must all be <code>String</code> objects. See
* {@link Constants} for a list of standard service property keys.
* Changes should not be made to this object after calling this
* method. To update the service's properties the
* {@link ServiceRegistration#setProperties} method must be called.
* The set of properties may be <code>null</code> if the service has no
* properties.
*
* @return A <code>ServiceRegistration</code> object for use by the bundle
* registering the service to update the service's properties or to
* unregister the service.
*
* @exception java.lang.IllegalArgumentException If one of the following is
* true:
* <ul>
* <li><code>service</code> is <code>null</code>.
* <li><code>service</code> is not a <code>ServiceFactory</code>
* object and is not an instance of all the named classes in
* <code>clazzes</code>.
* <li><code>properties</code> contains case variants of the same
* key name.
* </ul>
*
* @exception java.lang.SecurityException If the caller does not have the
* <code>ServicePermission</code> to register the service for all
* the named classes and the Java Runtime Environment supports
* permissions.
*
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*
* @see ServiceRegistration
* @see ServiceFactory
*/
public abstract ServiceRegistration registerService(String[] clazzes,
Object service, Dictionary properties);
/**
* Registers the specified service object with the specified properties
* under the specified class name with the Framework.
*
* <p>
* This method is otherwise identical to
* {@link #registerService(java.lang.String[], java.lang.Object,
* java.util.Dictionary)} and is provided as a convenience when
* <code>service</code> will only be registered under a single class name.
* Note that even in this case the value of the service's
* {@link Constants#OBJECTCLASS} property will be an array of strings,
* rather than just a single string.
*
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
* @see #registerService(java.lang.String[], java.lang.Object,
* java.util.Dictionary)
*/
public abstract ServiceRegistration registerService(String clazz,
Object service, Dictionary properties);
/**
* Returns an array of <code>ServiceReference</code> objects. The returned
* array of <code>ServiceReference</code> objects contains services that
* were registered under the specified class, match the specified filter
* criteria, and the packages for the class names under which the services
* were registered match the context bundle's packages as defined in
* {@link ServiceReference#isAssignableTo(Bundle, String)}.
*
* <p>
* The list is valid at the time of the call to this method, however since the
* Framework is a very dynamic environment, services can be modified or
* unregistered at anytime.
*
* <p>
* <code>filter</code> is used to select the registered service whose
* properties objects contain keys and values which satisfy the filter. See
* {@link Filter} for a description of the filter string syntax.
*
* <p>
* If <code>filter</code> is <code>null</code>, all registered services are
* considered to match the filter.
* If <code>filter</code> cannot be parsed, an {@link InvalidSyntaxException}
* will be thrown with a human readable message where the filter became
* unparsable.
*
* <p>
* The following steps are required to select a set of
* <code>ServiceReference</code> objects:
* <ol>
* <li>If the filter string is not <code>null</code>, the filter string is
* parsed and the set <code>ServiceReference</code> objects of registered
* services that satisfy the filter is produced. If the filter string is
* <code>null</code>, then all registered
* services are considered to satisfy the filter.
* <li>If the Java Runtime Environment supports permissions, the
* set of <code>ServiceReference</code> objects produced by the
* previous step is reduced by checking that the caller has
* the <code>ServicePermission</code> to get at least one
* of the class names under which the service was registered. If the caller
* does not have the correct permission for a particular
* <code>ServiceReference</code> object, then it is removed from the set.
* <li>If <code>clazz</code> is not <code>null</code>, the set is further
* reduced to those services that are an <code>instanceof</code> and were
* registered under the specified class. The complete list of classes of
* which a service is an instance and which were specified when the service
* was registered is available from the service's
* {@link Constants#OBJECTCLASS} property.
* <li>The set is reduced one final time by cycling through each
* <code>ServiceReference</code> object and calling
* {@link ServiceReference#isAssignableTo(Bundle, String)} with the
* context bundle and each class name under which the
* <code>ServiceReference</code> object was registered. For any
* given <code>ServiceReference</code> object, if any call to
* {@link ServiceReference#isAssignableTo(Bundle, String)} returns
* <code>false</code>, then it is removed from the set of
* <code>ServiceReference</code> objects.
* <li>An array of the remaining <code>ServiceReference</code> objects
* is returned.
* </ol>
*
* @param clazz The class name with which the service was registered or
* <code>null</code> for all services.
* @param filter The filter criteria.
* @return An array of <code>ServiceReference</code> objects or <code>null</code>
* if no services are registered which satisfy the search.
* @exception InvalidSyntaxException If <code>filter</code> contains an
* invalid filter string that cannot be parsed.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract ServiceReference[] getServiceReferences(String clazz,
String filter) throws InvalidSyntaxException;
/**
* Returns an array of <code>ServiceReference</code> objects. The returned
* array of <code>ServiceReference</code> objects contains services that
* were registered under the specified class and match the
* specified filter criteria.
*
* <p>
* The list is valid at the time of the call to this method, however since the
* Framework is a very dynamic environment, services can be modified or
* unregistered at anytime.
*
* <p>
* <code>filter</code> is used to select the registered service whose
* properties objects contain keys and values which satisfy the filter. See
* {@link Filter} for a description of the filter string syntax.
*
* <p>
* If <code>filter</code> is <code>null</code>, all registered services are
* considered to match the filter.
* If <code>filter</code> cannot be parsed, an {@link InvalidSyntaxException}
* will be thrown with a human readable message where the filter became
* unparsable.
*
* <p>
* The following steps are required to select a set of
* <code>ServiceReference</code> objects:
* <ol>
* <li>If the filter string is not <code>null</code>, the filter string is
* parsed and the set <code>ServiceReference</code> objects of registered
* services that satisfy the filter is produced. If the filter string is
* <code>null</code>, then all registered
* services are considered to satisfy the filter.
* <li>If the Java Runtime Environment supports permissions, the
* set of <code>ServiceReference</code> objects produced by the
* previous step is reduced by checking that the caller has
* the <code>ServicePermission</code> to get at least one
* of the class names under which the service was registered. If the caller
* does not have the correct permission for a particular
* <code>ServiceReference</code> object, then it is removed from the set.
* <li>If <code>clazz</code> is not <code>null</code>, the set is further
* reduced to those services that are an <code>instanceof</code> and were
* registered under the specified class. The complete list of classes of
* which a service is an instance and which were specified when the service
* was registered is available from the service's
* {@link Constants#OBJECTCLASS} property.
* <li>An array of the remaining <code>ServiceReference</code> objects
* is returned.
* </ol>
*
* @param clazz The class name with which the service was registered or
* <code>null</code> for all services.
* @param filter The filter criteria.
* @return An array of <code>ServiceReference</code> objects or <code>null</code>
* if no services are registered which satisfy the search.
* @exception InvalidSyntaxException If <code>filter</code> contains an
* invalid filter string that cannot be parsed.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract ServiceReference[] getAllServiceReferences(String clazz,
String filter) throws InvalidSyntaxException;
/**
* Returns a <code>ServiceReference</code> object for a service that
* implements and was registered under the specified class.
*
* <p>
* This <code>ServiceReference</code> object is valid at the time of the call
* to this method, however as the Framework is a very dynamic environment,
* services can be modified or unregistered at anytime.
*
* <p>
* This method is the same as calling
* {@link BundleContext#getServiceReferences(String, String)} with a
* <code>null</code> filter string. It is provided as a convenience for when
* the caller is interested in any service that implements the specified
* class.
* <p>
* If multiple such services exist, the service with the highest ranking (as
* specified in its {@link Constants#SERVICE_RANKING} property) is returned.
* <p>
* If there is a tie in ranking, the service with the lowest service ID (as
* specified in its {@link Constants#SERVICE_ID} property); that is, the
* service that was registered first is returned.
*
* @param clazz The class name with which the service was registered.
* @return A <code>ServiceReference</code> object, or <code>null</code> if no
* services are registered which implement the named class.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
* @see #getServiceReferences(String, String)
*/
public abstract ServiceReference getServiceReference(String clazz);
/**
* Returns the specified service object for a service.
* <p>
* A bundle's use of a service is tracked by the bundle's use count of that
* service. Each time a service's service object is returned by
* {@link #getService(ServiceReference)} the context bundle's use count for
* that service is incremented by one. Each time the service is released by
* {@link #ungetService(ServiceReference)} the context bundle's use count
* for that service is decremented by one.
* <p>
* When a bundle's use count for a service drops to zero, the bundle should
* no longer use that service.
*
* <p>
* This method will always return <code>null</code> when the service
* associated with this <code>reference</code> has been unregistered.
*
* <p>
* The following steps are required to get the service object:
* <ol>
* <li>If the service has been unregistered, <code>null</code> is returned.
* <li>The context bundle's use count for this service is incremented by
* one.
* <li>If the context bundle's use count for the service is currently one
* and the service was registered with an object implementing the
* <code>ServiceFactory</code> interface, the
* {@link ServiceFactory#getService(Bundle, ServiceRegistration)} method
* is called to create a service object for the context bundle. This service
* object is cached by the Framework. While the context bundle's use count
* for the service is greater than zero, subsequent calls to get the
* services's service object for the context bundle will return the cached
* service object.
* <br>
* If the service object returned by the <code>ServiceFactory</code> object is
* not an <code>instanceof</code> all the classes named when the service was
* registered or the <code>ServiceFactory</code> object throws an exception,
* <code>null</code> is returned and a Framework event of type
* {@link FrameworkEvent#ERROR} is broadcast.
* <li>The service object for the service is returned.
* </ol>
*
* @param reference A reference to the service.
* @return A service object for the service associated with
* <code>reference</code> or <code>null</code> if the service is not
* registered or does not implement the classes under which it was
* registered in the case of a <code>ServiceFactory</code>.
* @exception java.lang.SecurityException If the caller does not have the
* <code>ServicePermission</code> to get the service using at least
* one of the named classes the service was registered under and
* the Java Runtime Environment supports permissions.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
* @see #ungetService(ServiceReference)
* @see ServiceFactory
*/
public abstract Object getService(ServiceReference reference);
/**
* Releases the service object referenced by the specified
* <code>ServiceReference</code> object. If the context bundle's use count for
* the service is zero, this method returns <code>false</code>. Otherwise,
* the context bundle's use count for the service is decremented by one.
*
* <p>
* The service's service object should no longer be used and all references
* to it should be destroyed when a bundle's use count for the service drops
* to zero.
*
* <p>
* The following steps are required to unget the service object:
* <ol>
* <li>If the context bundle's use count for the service is zero or the
* service has been unregistered, <code>false</code> is returned.
* <li>The context bundle's use count for this service is decremented by
* one.
* <li>If the context bundle's use count for the service is currently zero
* and the service was registered with a <code>ServiceFactory</code> object,
* the {@link ServiceFactory#ungetService(Bundle, ServiceRegistration, Object)}
* method is called to release the service object for the context bundle.
* <li><code>true</code> is returned.
* </ol>
*
* @param reference A reference to the service to be released.
* @return <code>false</code> if the context bundle's use count for the
* service is zero or if the service has been unregistered;
* <code>true</code> otherwise.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
* @see #getService
* @see ServiceFactory
*/
public abstract boolean ungetService(ServiceReference reference);
/**
* Creates a <code>File</code> object for a file in the persistent storage
* area provided for the bundle by the Framework. This method will return
* <code>null</code> if the platform does not have file system support.
*
* <p>
* A <code>File</code> object for the base directory of the persistent storage
* area provided for the context bundle by the Framework can be obtained by
* calling this method with an empty string as <code>filename</code>.
*
* <p>
* If the Java Runtime Environment supports permissions, the Framework will
* ensure that the bundle has the <code>java.io.FilePermission</code> with
* actions <code>read</code>,<code>write</code>,<code>delete</code> for all
* files (recursively) in the persistent storage area provided for the
* context bundle.
*
* @param filename A relative name to the file to be accessed.
* @return A <code>File</code> object that represents the requested file or
* <code>null</code> if the platform does not have file system
* support.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*/
public abstract File getDataFile(String filename);
/**
* Creates a <code>Filter</code> object. This <code>Filter</code> object may be
* used to match a <code>ServiceReference</code> object or a
* <code>Dictionary</code> object.
*
* <p>
* If the filter cannot be parsed, an {@link InvalidSyntaxException} will be
* thrown with a human readable message where the filter became unparsable.
*
* @param filter The filter string.
* @return A <code>Filter</code> object encapsulating the filter string.
* @exception InvalidSyntaxException If <code>filter</code> contains an
* invalid filter string that cannot be parsed.
* @exception NullPointerException If <code>filter</code> is null.
* @exception java.lang.IllegalStateException If this BundleContext is no
* longer valid.
*
* @since 1.1
* @see "Framework specification for a description of the filter string syntax."
*/
public abstract Filter createFilter(String filter)
throws InvalidSyntaxException;
}