Detecting Services

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: