‘commands’ in Eclipse (Teil 1)
Einführung
Mit Eclipse 3.3 wurde das commands framework als legitimer Nachfolger der actions dem Entwickler angeboten. Es bietet gegenüber den etablierten Aktionen einige Vorteile, die von einer besseren Entkopplung des UI vom Code, bis zu weniger redundanten Sourcen reichen. Die Details kann man auf den Portalseiten von Eclipse und in einigen Artikeln nachlesen. Entsprechende Links habe ich am Ende eingefügt.
Im ersten Teil werde ich den Einsatz in der Menüleiste demonstrieren.
Vorschau
So wird die Anwendung am Ende unseres ersten Exkurses aussehen.

Anwendung mit Menüs
Grundlagen
Mit dem ‘command’ Framework wurde die Entkopplung von UI und der Anwendungslogik weiter vorangetrieben. Jedes ‘command’ Objekt kann mit einem Handler verknüpft werden, der die eigentliche Logik ausführt. Ebenfalls zentral erfolgt die Zuweisung eines Icons. Um zu spezifizieren, wo die Anzeige erfolgen soll, wird deklarativ eine Location-URI eingesetzt. Die Bezeichnung vor dem Doppelpunkt definiert das Zielobjekt. Es folgt die ID des eigentlichen Ziels. Nachfolgend sind die gültigen URI-Bezeichner aufgelistet:
- menu
- toolbar
- toolbar:view
- popup
bezieht sich auf eine Menüleiste (”menu:org.eclipse.ui.main.menu”)
bezieht sich auf die Toolbar (”toolbar:org.eclipse.ui.main.toolbar”)
bezieht sich auf die ID der Toolbar einer View
bezieht sich auf ein Kontextmenü
Umsetzung
Anlegen des Projekts
Ich lege ein ganz normales Plugin-Projekt mit dem Namen ‘de.emcon.example.commands’ an.

RCP Plugin Projekt
Es handelt sich um ein RCP Projekt dem wir den Namen ‘Commands Test’ geben.Damit wir später die Möglichkeiten eines Kontextmenüs zeigen können, wählen wir als Template eine RCP Anwendung mit einer View aus.

RCP Anwendung
Wenn wir die Anwendung nun starten sehen wir sofort eine View mit einer Liste. Weiterhin wurde auch bereits ein Exit-Button zur Verfügung gestellt, der uns aber stört, weil er mit Actions realisiert wurde. Dazu löschen wir aus der Klasse ApplicationActionBarAdvisor alles heraus, was mit Actions zu tun hat. Die Klasse sollte danach so aussehen:
public class ApplicationActionBarAdvisor extends ActionBarAdvisor
{
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer)
{
super(configurer);
}
@Override
protected void makeActions(final IWorkbenchWindow window) {}
@Override
protected void fillMenuBar(IMenuManager menuBar){}
}
So sieht die Anwendung aus, bevor wir mit der Implementierung der ersten commands beginnen.

Anwendung ohne Menü
Exit command anlegen
Um ein Kommando einsetzen zu können müssen wir die Extension org.eclipse.ui.commands benutzen, die wir der Anwendung über den Reiter Extensions hinzufügen. Es ist ganz praktisch, hier mit Wildcards zu arbeiten und einfach *commands einzugeben.

Extension für commands
Für das weitere Vorgehen werde ich die relevanten Ausschnitte aus dem plugin.xml File anzeigen, da die Screenshots der äquivalenten View zu umfangreich würden. Über das Kontextmenü des Extensionpoints fügen wir ein command hinzu und legen folgende Werte fest:
<extension
point="org.eclipse.ui.commands">
<command
defaultHandler="de.emcon.example.commands.handler.ExitHandler"
id="de.emcon.example.commands.exitcmd"
name="Exit">
</command>
</extension>
Der Handler bezeichnet dabei die Klasse, die das eigentliche Kommando umsetzt. Erzeugt werden kann die Klasse ganz einfach, indem man auf den Hyperlink vor dem Definitionsfeld klickt. Man muss hier nur etwas aufpassen, weil für die Klassen zuweilen mehrer Interfaces möglich wären, aber nur eines als Default gesetzt wird. In der Methode execute platzieren wir den Befehl zum Schließen der Anwendung. Damit haben wir eine, bis dato, frei schwebende Anweisung geschaffen, die nun in das Menü eingebunden werden kann.
public class ExitHandler extends AbstractHandler implements IHandler
{
@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
HandlerUtil.getActiveWorkbenchWindow(event).close();
return null;
}
}
Menü anlegen
Wir fügen den Extension Point org.eclipse.ui.menus im Reiter Extensions hinzu. Hier bauen wir nun die Menüstruktur auf.

Extension Point für das Menü
Im Kontextmenü der Extension wählen wir nun eine menuContribution aus und setzen den Parameter der llocationURI auf folgenden Wert: “menu:org.eclipse.ui.main.menu”. Damit fügen greifen wir auf das Hauptmenü der Anwendung zu. Aus dem Kontextmenü der ‘menuContribution’ selektieren wir nun den Eintrag menu, setzen das Label auf File und die ID auf de.emcon.example.commands.menu.main.file. Damit ist ein erster Eintrag in der Menüleiste mit dem Namen ‘File’ gesetzt. Jetzt müssen wir noch unserem Menü einen Eintrag hinzufügen, der mit dem erstellten ‘command’ verknüpft wird. Das tun wir wieder über das Kontextmenü und suchen uns nun command heraus. Als commandId benutzen wird natürlich die ID, die wir unserer Anweisung gegeben haben. Wir setzen das Label auf Exit und können auch noch eine Tooltip vereinbaren. Weiterhin habe ich noch ein kleines Icon spendiert das ich ebenfalls auswähle. Nachfolgend habe ich den kompletten Eintrag aus der plugin.xml dargestellt.
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:org.eclipse.ui.main.menu">
<menu
id="de.emcon.example.commands.menu.main.file"
label="File">
<command
commandId="de.emcon.example.commands.exitcmd"
icon="icons/exit.gif"
label="Exit"
style="push"
tooltip="Schließt die Anwendung">
</command>
</menu>
</menuContribution>
</extension>
Um den Eintrag sichtbar zu machen bedarf es noch einer kleinen Korrektur im File ApplicationWorkbenchWindowAdvisor Hier muss die Sichtbarkeit des Menüs deklariert werden.
@Override
public void preWindowOpen()
{
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(400, 300));
configurer.setShowMenuBar(true);
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle("Commands Test");
}
So sieht unsere Anwendung bisher aus:

Anwendung mit Exit Menü
Help Menü mit Standardaktion
Haben wir den Exit-Befehl noch selber ausprogrammiert, können wir jedoch auch die Standardactions benutzen. Nachfolgend werden wir ein Help-Menü hinzufügen und einen About-Dialog einbetten, den wir über eine vorkonfigurierte Action referenzieren. Dazu fügen wir der menuContribution, die ja nun schon den Eintrag für das File enthält, ein zusätzliches menu zu. Dieses erhält als Label Help. Wir definieren eine neue ID (de.emcon.example.commands.menu.main.help). Auch hier fügen wir dem gerade initialisierten Menü aus dem Kontext ein command hinzu. Jedoch öffnen wir nun über den Browse Button den Auswahldialog und fügen die org.eclipse.ui.help.aboutAction hinzu. Die Suche gestaltet sich einfacher, indem wir einfach ‘*about’ eingeben. Ich habe noch ein Icon hinzugefügt und und das Lable ‘About’ vergeben. Wie das im Reiter Extension aussieht, zeigt nachfolgender Screenshot:

Menüstruktur mit Exit und Help
Damit haben wir den ersten Teil unserer Einführung in die commands beendet. Der zweite Teil beschäftigt sich mit der Einbettung in die Toolbar.
Weiterführende Links
- Überblick über das Architektur Modell von ‘commands’
- Eclipse Wiki zu ‘commands’
- Artikelserie von Prakash G.R.
“Hallo Felix”
Einführung
In diesem ersten Beitrag möchte ich kurz beschreiben, wie man ein kleines Beispiel mit der OSGi Implementation von Apache Felix aufsetzt. Felix ist eine strikte Community Implementierung der OSGi Spezifikation 4.x Es sollen hier weniger die theoretischen Grundlagen von OSGi erklärt als eine Kurzanleitung für das Aufsetzen eines einfachen Projekts geliefert werden.
Vorbereitung
Welche Tools benötigen wir und wie muss die Umgebung eingerichtet sein? Nachfolgend eine kurze Beschreibung
Ich benutze Eclipse Ganymede unter Java 1.6 und habe mir das aktuelle Binary von Apache Felix heruntergeladen. Weiterhin benötigen wir noch Peter Criens Tool (BND), welches uns auf bequeme Art und Weise zu einem ausführbaren Bundle verhilft.
Eclipse konfigurieren
- Die Binary-Version von Felix herunter und packen sie in einem beliebigen Verzeichnis ausgepackt
- Um Felix als Library einzurichten öffnen wir den Dialog Windows -> Preferences -> Java -> Build Path -> User Libraries und legen mit ‘New’ einen neuen Eintrag ‘Felix’ an.
- Diese Eintrag wird nur ausgewählt und mit dem zugehörigen Jar-File (’Add Jars…’) verlinkt.
Java Projekt aufsetzen
- Wir legen ein neues Java Projekt mit dem Namen ‘Hello Felix Tutorial’ an. Zur besseren Übersichtlichkeit habe ich auch gleich ein entsprechendes Workset mit dem Namen ‘osgi’ angelegt, damit ich andere Projekte einfacher ausblenden kann.
- Auf der zweiten Seite fügen wir dann auch gleich noch die gerade eingebundene Felix-Bibliothek als ‘User Library’ hinzu. Dann kann das Projekt angelegt werden.
- Wir haben die Felix Bibliothek in ein Verzeichnis entpackt, aus dem wir nun noch ein paar ‘Jars’ direkt in das neue Projekt verschieben. Dabei handelt es sich um die beiden Verzeichnisse bundle und conf aus dem Verzeichnis von Felix.
Felix starten
- Felix kann in einer separaten Konsole oder direkt in Eclipse gestartet werden. Wir benutzen unsere IDE (Eclipse), um das Framework zu starten. Dazu richten wir eine neue Laufzeitkonfiguration unter ‘Run ->Run Configurations…’ ein. Hier legen wir eine neue Java Konfiguration (Felix) an.
- Als Projekt muss das von uns gerade erstellte Projekt gesetzt sein und die Main Klasse ist ‘org.apache.felix.main.Main’. Wir speichern die Konfiguration und können nun Felix starten. In der Konsole erscheint die Abfragen nach einem Profil. So kann Felix verschiedene Instanzen des Frameworks verwalten. Hier geben wir einfach mal ‘Tutorial’ ein.
Welcome to Felix: ================ Enter Profile Name: Tutorial
BND-Tool einrichten
- Also Peter Kriens BND-Tool hat nun recht wenig mit unserem Geheimdienst zu tun, sondern macht eigentlich sogar ganz nützliche Dinge. Wir werden es als Eclipse-Plugin einbinden und dazu nutzen, unsere Anwendung ausführbar zu machen.
- Wir laden die letzte stabile Version als ‘Jar’ von Peter Kriens Seiten herunter und kopieren das File sowohl in das Projektverzeichnis als auch in das ‘dropin’ Verzeichnis der Eclipse Installation. Mit der Version 3.4 kann man keine externen Plugin-Sites mehr einbinden. Aber beim Start werden Plugins aus eben erwähntem Verzeichnis mit geladen. Das Projektverzeichnis sollte nach einem Neustart von Eclipse ( bitte mit -clean starten) so aussehen:
- Innerhalb von Eclipse assoziieren wir die Endung *.bnd mit dem Fileeditor.
- Dazu öffnen wir in Eclipse Window -> Preferences -> General -> Editors -> File Associations und fügen den Typ *.bnd hinzu , für den wir als Editor den Property File Editor aus der Auswahl interner Tools auswählen.
Das Programm
Activator Klasse
- So langsam kommt die Ziellinie in Sicht. Da wir nicht einfach nur eine Meldung ausgeben wollen, sondern dies sowohl beim Start als auch Stop planen, benötigen wir eine Aktivator-Klasse, die das Interface BundleActivator implementiert.
- Zuerst legen wir im src-Verzeichnis ein Package org.osgi.tutorial an. Jetzt implementieren wir die Klasse HelloFelixActivator. Die Codezeilen können der nachfolgenden Abbildung entnommen werden
/**
* HelloFelixActivator.java (created by: Uwe Sauerbrei - 22.10.2008)
*/
package org.osgi.tutorial;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
/**
* Einfaches Beispiel für eine Activatorklasse
*
* @author Uwe Sauerbrei
*
*/
public class HelloFelixActivator implements BundleActivator
{
public void start(BundleContext arg0) throws Exception
{
System.out.println("Hello Felix...");
}
public void stop(BundleContext arg0) throws Exception
{
System.out.println("Goodbye Felix...");
}
}
BND Skript
- Auf der obersten Ebene unseres Projekts legen wir noch ein File ‘hellofelix.bnd’ an welches sofort mit dem Property File Editor geöffnet wird. Hier schreiben wir nachfolgende Informationen hinein:
# hellofelix.bnd Private-Package: org.osgi.tutorial Bundle-Activator: org.osgi.tutorial.HelloFelixActivator
Ausführung
- Falls Felix nicht mehr in der Konsole laufen sollte, starten wir es erneut. Dann installieren wir das neue Bundle mit
install file:hellofelix.jar Das Bundle felix wird nun in der Konsole bereits angezeigt. - Das Bundle wir mit dem folgendenKommando start (id) gestartet und gibt die von uns programmierte Meldung aus.
- Wenn wir das Bundle stoppen sehen wir die zweite Botschaft. Um das Framework zu stoppen können wir shutdown eingeben.
Fazit
Letztendlich ist es uns gelungen, mit einigem Vorbereitungsaufwand, ein einfaches Programm in einer modularen OSGi Struktur zum Laufen zu bringen. Hat man diese initiale Hürde einmal bewältigt, kann man von hier seine eigene Entdeckungsreise recht schnell beginnen. Natürlich bedarf es dazu noch weiterer theoretischer Grundlagen.
Ich werde aber an dieser Stelle zum Vergleich auch die Installation mit Equinox beschreiben, auf der ja Eclipse auch selber basiert.
Weiterführende Links
- OSGi Portal
- Apache Felix
- OSGi in Practice
- BND (Peter Criens Tool)
- Eclipse Ganymede





