Tutorial OSGi

Creation d'un bundle simple

Cet exemple montre un composant qui écoute et affiche les évènements du framework.

Du fait que le composant implémente l'interface BundleActivator, il doit implémenter les méthodes start() et stop() à travers lesquelles il recevra un BundleContext, qui lui permet de s'abonner aux évènements du framework.

L'interface ServiceListener est implémentée car le composant est intéressé à ce type d'évènements

/*
* OSGi and Gravity Service Binder tutorial.
* Copyright (c) 2003 Richard S. Hall
* http://oscar-osgi.sourceforge.net
**/

package tutorial.example1;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceEvent;

/**
* This class implements a simple bundle that utilizes the OSGi
* framework's event mechanism to listen for service events. Upon
* receiving a service event, it prints out the event's details.
**/

public class Activator implements BundleActivator, ServiceListener
{

/**
* Implements BundleActivator.start(). Prints
* a message and adds itself to the bundle context as a service
* listener.
* @param context the framework context for the bundle.
**/

public void start(BundleContext context)
{
System.out.println("Starting to listen for service events.");
context.addServiceListener(this);
}

/**
* Implements BundleActivator.stop(). Prints
* a message and removes itself from the bundle context as a
* service listener.
* @param context the framework context for the bundle.
**/

public void stop(BundleContext context)
{
context.removeServiceListener(this);
System.out.println("Stopped listening for service events.");

// Note: It is not required that we remove the listener here,
// since the framework will do it automatically anyway.

}

/**
* Implements ServiceListener.serviceChanged().
* Prints the details of any service event from the framework.
* @param event the fired service event.
**/

public void serviceChanged(ServiceEvent event)
{
String[] objectClass = (String[])
event.getServiceReference().getProperty("objectClass");

if (event.getType() == ServiceEvent.REGISTERED)
{
System.out.println(
"Ex1: Service of type " + objectClass[0] + " registered.");
}
else if (event.getType() == ServiceEvent.UNREGISTERING)
{
System.out.println(
"Ex1: Service of type " + objectClass[0] + " unregistered.");
}
else if (event.getType() == ServiceEvent.MODIFIED)
{
System.out.println(
"Ex1: Service of type " + objectClass[0] + " modified.");
}
}
}

Cette classe doit être enregistrée sous le nom Activator.java. Il faut maintenant écrire un manifeste et packager le tout pour procéder à l'installation dans le framework. Le fichier manifeste est le suivant:

Bundle-Activator: tutorial.example1.Activator
Bundle-Name: Service listener example
Bundle-Description: A bundle that displays messages at startup and when service events occur
Bundle-Vendor: Richard Hall
Bundle-Version: 1.0.0

Ce fichier doit être enregistré avec le nom manifest.mf

Pour faciliter le développement, il est recommandé de mettre le fichier manifeste à coté du fichier activator. A ce point là, la structure de notre projet doit être similaire a ce qui suit:


Si on ne dispose pas de Ant

Ignorer le fichier build.xml pour le moment.

La compilation se réalise de la manière suivante (en se placant dans le répertoire au dessus de src)

Creer le répertoire classes/tutorial/example1

Ensuite compiler (depuis le répertoire au dessus de src):

javac -classpath lib/osgi.jar -d classes src/tutorial/example1/*.java

Création du JAR (depuis le répertoire au dessus de src):

jar cfm bundle/example1.jar src/tutorial/example1/manifest.mf -C classes tutorial/example1

Nous devons maintenant avoir un fichier example1.jar dans le répertoire bundle, ce fichier est un bundle prêt à être installé dans le framework

Si on dispose de Ant

Voici le fichier build_example1.xml permettant de construire le projet. Attention, il faut respecter la structure montrée auparavant.

Le fichier contient plusieurs cibles:

  • clean: pour tout effacer
  • compile: réaliser seulement la compilation
  • init: creation des répertoires
  • javadoc: creation de la documentation
  • example1.bundle: creation du bundle

Si tout se passe bien, à la fin de l'exécution de la cible example1.bundle, nous trouverons un répertoire bundle avec un fichier nommé example1.jar. Ce fichier est le bundle prêt à être installé dans le framework

Installation du Bundle

Pour installer le bundle, nous executons la commande install dans OSCAR:

-> install file:/chemin_du_projet/bundle/example1.jar
-> ps

[  0] [Active     ] System Bundle
[  1] [Active     ] Oscar Shell Service
[  2] [Active     ] Shell TUI
[  3] [Active     ] Oscar Bundle Repository
[  4] [Installed  ] Service listener example
-> start 4
Starting to listen for service events.
->

A ce point le premier bundle est installé. Il n'est pas encore très utile vu qu'il n'y à pas de services qui soient enregistrés ou desenregistrés en ce moment...

Retour au sommaire


Last update: 22 February 2003
contact: Humberto.Cervantes@imag.fr
Homepage