While SAT primarily supports importing a single implementation of a
service type, it is sometimes necessary to detect and acquire every
service of a type that is registered with the OSGi framework. SAT
supports this need via the interface
IServiceDetector
The technique described here is not
something that should commonly be needed when building a service oriented
OSGi application. Detecting services is only really necessary when the
type that you need to detect is already defined and cannot be changed,
for example when detecting OSGi services such as
LogService
or
ManagedService.
The following example shows how to use the
FactoryUtility singleton to create an
IServiceDetector to detect the registration and
unregistration of the OSGi defined ManagedService type. The
example also shows how a
ServiceDetecterListener is used to be notified when
matching services are added to, and removed from, the service detector.
public class Activator extends Object implements BundleActivator {
private IServiceDetecter detecter;
private ServiceDetecterListener detecterListener;
private ServiceDetecterListener createDetecterListener() {
return new ServiceDetecterListener() {
public void serviceAdded(IServiceDetecter detecter, ServiceReference serviceReference, Object service) {
LogUtility.logInfo("Detected service added: " + service);
}
public void serviceRemoved(IServiceDetecter detecter, ServiceReference serviceReference, Object service) {
LogUtility.logInfo("Detected service removed: " + service);
}
};
}
private IServiceDetecter getDetecter() {
return detecter;
}
private ServiceDetecterListener getDetecterListener() {
return detecterListener;
}
private void setDetecter(IServiceDetecter detecter) {
this.detecter = detecter;
}
private void setDetecterListener(ServiceDetecterListener detecterListener) {
this.detecterListener = detecterListener;
}
public void start(BundleContext context) {
FactoryUtility utility = FactoryUtility.getInstance();
IServiceDetecter detecter = utility.createServiceDetecter(context, ManagedService.class.getName());
setDetecter(detecter);
ServiceDetecterListener listener = createDetecterListener();
setDetecterListener(listener);
detecter.addServiceDetecterListener(listener);
detecter.acquire();
}
public void stop(BundleContext context) {
IServiceDetecter detecter = getDetecter();
detecter.release();
ServiceDetecterListener listener = getDetecterListener();
detecter.removeServiceDetecterListener(listener);
setDetecter(null);
}
}
Other methods defined by the interface
IServiceDetector that are not used in the above example
include:
getName() method simply returns the fully qualified
name of the service type being detected. This method is intended for
debugging purposes.
getServiceReferences() and
getServiceReferences(String filter) methods return a
list of the OSGi
ServiceReference objects for the detected services. The
filter parameter is an LDAP filter that is used to narrow the list of
ServiceReference objects.
getServices() and
getServices(String filter) methods return a list of
detected services. The filter parameter is an LDAP filter that is used
to narrow the list of services.
isAcquired() returns true when the
acquire() method has been called, and false
before acquire() method has been called and after the
release() method has been called. This method has nothing
to do with whether a matching service has been detected or not.
setFilter(String filter) sets an LDAP filter that will
be used to narrow the detected services. Note that when this method is
called after the acquire() method the services
detected by the IServiceDetecter will change to match the
filter and the registered ServiceDetecterListener objects
will be notified accordingly.
Copyright © 2001, 2008 IBM Corporation and others. All Rights Reserved.