# Beispiel für die Verwendung von OSGi Services auf Basis von Equinox



## Thomas Darimont (17. März 2007)

Hallo,

hier mal ein kleines Beispiel für die Verwendung von OSGi Services.
Dazu erstellen wir zwei Plugins:
de.tutorials.training.osgi.simple
de.tutorials.training.osgi.extended

Als Plugin-Projekt Typ wählen wir "equinox" aus.

Im Plugin de.tutorials.training.osgi.simple haben wir ein Interface IAggregator:

```
/**
 * 
 */
package de.tutorials.training.osgi.simple.services;

/**
 * @author Tom
 *
 */
public interface IAggregatorService {
  int aggregate(int[] values);
}
```

Dann haben wir folgende Implementierung:

```
/**
 * 
 */
package de.tutorials.training.osgi.simple.services.internal;

import de.tutorials.training.osgi.simple.services.IAggregatorService;

/**
 * @author Tom
 *
 */
public class AggregatorService implements IAggregatorService{
  public int aggregate(int[] values) {
    int sum = 0;
    for(int value : values){
      sum += value;
    }
    return sum;
  }
}
```

Anschließend implementieren wir unseren Bundle-Activator wie folgt:

```
package de.tutorials.training.osgi.simple;

import java.util.Hashtable;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;

import de.tutorials.training.osgi.simple.services.IAggregatorService;
import de.tutorials.training.osgi.simple.services.internal.AggregatorService;

public class Activator implements BundleActivator {

  private IAggregatorService aggregatorService;
  private ServiceTracker aggregatorServiceTracker;


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
   */
  public void start(BundleContext context) throws Exception {

    String serviceClassName = IAggregatorService.class.getName();
    context.registerService(serviceClassName, new AggregatorService(), new Hashtable());
    aggregatorServiceTracker = new ServiceTracker(context, serviceClassName, null);
    aggregatorServiceTracker.open();
    aggregatorService = (IAggregatorService) aggregatorServiceTracker.getService();
  }


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
   */
  public void stop(BundleContext context) throws Exception {
    aggregatorServiceTracker.close();
    aggregatorServiceTracker = null;
    aggregatorService = null;
  }
}
```

Danach gehen wir ins Plugin Manifest unter Runtime und Exportieren das Package:
package de.tutorials.training.osgi.simple.services

Damit ist das interface IAggregatorService  auch für andere verwender dieses Plugins sichtbar.

Nun erzeugen wir ein neues Plugin:
de.tutorials.training.osgi.extended

Dort gehen wir ins Plugin Manifest und geben bei Dependencies unter Required Plug-ins das Plugin:
de.tutorials.training.osgi.simple an.

Anschließend implementieren wir dessen Activator wie folgt:

```
package de.tutorials.training.osgi.extended;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

import de.tutorials.training.osgi.simple.services.IAggregatorService;

public class Activator implements BundleActivator {

  IAggregatorService aggregatorService;
  ServiceReference aggregatorServiceReference;


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
   */
  public void start(BundleContext context) throws Exception {
    aggregatorServiceReference = context.getServiceReference(IAggregatorService.class.getName());
    if (null != aggregatorServiceReference) {
      aggregatorService = (IAggregatorService) context.getService(aggregatorServiceReference);
    }

    if (null != aggregatorService) {
      System.out.println(aggregatorService.aggregate(new int[] { 1, 2, 3, 4, 5 }));
    }
  }


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
   */
  public void stop(BundleContext context) throws Exception {
    if (null != aggregatorServiceReference) {
      context.ungetService(aggregatorServiceReference); 
    }
  }
}
```

Anschließend selektieren wir das de.tutorials.training.osgi.extended Plugin-Projekt und wählen im
Kontextmenü Run-As Equinox.

Nun bekommen wir die Ausgabe:

```
osgi> 15
```

Gruß Tom


----------

