Kategorie: OSGI

Apache Sling & CQ5 Tech Meetup

Wer sich tiefergehend für das Open Source Framework Apache Sling interessiert oder mit dem WCM CQ5 von Adobe/Day arbeitet, dem empfehle ich die Folien auf der pro!vision-Hompepage. Dort wurde im Sommer 2011 ein sehr anspruchsvolles Tech Meetup u.a. zu folgenden Themen abgehalten:

  • Apache CFX and Sling
  • Integrate Apache Wicket in Sling
  • QueryBuilder
  • CQ Dev Tricks

Sehr interesant finde ich auch das Thema „Bringing real-time collaboration to CQ5 Authors“.
Zu einigen der Themen kann man sich auch den Source Code downloaden.

Übrigens sucht pro!vision auch noch fähige Entwickler…



OSGI mit Felix

Hier ein kleines Beispiel zu OSGI mit Apache Felix

Man benötigt:

Apache Felix
BND-Tool
oder, ganz neu, für noch komfortableres Arbeiten das BND-Tool als Eclipse-Plugin

bndtools
Eclipse

Einstellungen für Eclipse:
Man legt eine neue User Library mit Namen Felix an: Window->Preferences->Java->Build path->User Libraries->New

Die felix.jar wird mit der neuen User Library verlinkt: Window->Preferences->Java->Build path->User Libraries->Add JARs

Anschließend legt man ein neues Java-Projekt in Eclipse an und fügen die neue User Library hinzu.
Danach kopiert man die beiden Ordner bundle und conf direkt in das Projektverzeichnis des erstellten Projekts.

Felix starten:
Man richtet unter Eclipse eine neue Laufzeitkonfiguration für Felixein: Run->Run Configurations->Java Applaction->New

In der Console kann man sich jetzt mit “ps” die installierten Bundles oder mit “help” die verfügbaren Kommandos ansehen.

BND-Tool:
Die Jar des BND-Tools wird in das Projektverzeichnis kopiert und außerdem in das Dropin-Verzeichnis von Eclipse. Danach muss man Eclipse neu starten.

Das eigentliche Programm:

Man erzeugt ein Service-Interface sowie die Implementierung dazu:

package de.pmannel.osgi;

public interface HelloService
{
	void sayHello();
}
package de.pmannel.osgi;

public class HelloServiceImpl implements HelloService
{

	@Override
	public void sayHello()
	{
		System.out.println("Hello Felix! Greetings from Service");

	}
}

Außerdem erzeugt man einen Activator, der beim Starten/Stoppen des Bundles ausgeführt wird.

package de.pmannel.osgi;

import java.util.Dictionary;
import java.util.Hashtable;

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

public class HelloFelixActivator implements BundleActivator
{
	private HelloService helloService;
	private ServiceTracker serviceTracker;

	@Override
	public void start(BundleContext context) throws Exception
	{
		Dictionary props = new Hashtable();
		props.put("objectName", "de.pmannel.osgi<:type=HelloService");
		context.registerService(HelloService.class.getName(), new HelloServiceImpl(), props);
		serviceTracker = new ServiceTracker(context, HelloService.class.getName(), null);
		serviceTracker.open();
		helloService = (HelloService)serviceTracker.getService();

		helloService.sayHello();
	}

	@Override
	public void stop(BundleContext context) throws Exception
	{
		serviceTracker.close();
		serviceTracker = null;
		helloService = null;
		System.out.println("Goodby Felix..");

	}
}

Nun erzeugt man im Projektverzeichnis eine .bnd-Datei, in der man bestimmte Parameter für die spätere Manifest-datei des OSGI-Bundles setzt.

# felix.bnd
Private-Package: de.pmannel.osgi
Bundle-Activator: de.pmannel.osgi.HelloFelixActivator
Bundle-SymbolicName: HelloFelix
Bundle-Version: 1.1.0

Mit einem Rechtsklick auf der Datei ->Make Bundle erzeugt man automatisch die Manifest-Datei.

Manifest-Version: 1.0
Private-Package: de.pmannel.osgi
Bundle-Version: 1.1.0
Tool: Bnd-0.0.384
Bnd-LastModified: 1273493680531
Bundle-Name: HelloFelix
Bundle-ManifestVersion: 2
Created-By: 1.6.0_07 (Sun Microsystems Inc.)
Bundle-Activator: de.pmannel.osgi.HelloFelixActivator
Import-Package: org.osgi.framework,org.osgi.util.tracker
Bundle-SymbolicName: HelloFelix

Das Bundle wird in Felix über die Console installiert:

install file:HelloFelix.jar

Anschließend wird das Bundle gestartet, indem man sich über “ps” die ID des Bundles holt:

start 9

Das war’s!

Man kann jetzt auch im laufenden Betrieb zb.: die sayhello()-Methode ändern und dann mit

update 9

eine neue Ausgabe erzeugen….