Suche

Und ewig grüßt das Rentier: Dynamische Webapplikationen mit OSGi und Vaadin

Action Contributions

Ein Beispiel für eine Action Contribution ist im Projekt com.siemens.ct.osgi.vaadin.pm.runoaction enthalten. Im Verzeichnis OSGI-INF befindet sich die XML-Datei runoAction.xml, die Sie in Listing 6 sehen.

Listing 6

Hier wird also für OSGi Declarative Services spezifiziert, dass dieses Bundle einen Service com.siemens.ct.osgi.vaadin.pm.main.service.IActionContribution liefert, der durch die Klasse com.siemens.ct.osgi.vaadin.pm.runoraction.RunoAction implementiert wird. Die Implementierung der RunoAction finden Sie in Listing 7.

Listing 7
public class RunoAction implements IActionContribution {

  @Override
  public String getIcon() {
    return "icons/color_swatch.png";
  }

  @Override
  public String getText() {
    return "Runo Theme";
  }

  @Override
  public void execute(Application application) {
    application.setTheme(Runo.THEME_NAME);
  }

}

Die Methode getText() liefert den Text, der von der Applikationskomponente dynamisch im Menü als MenuItem und in der Toolbar als Button eingefügt wird. Die Methode getIcon()liefert ein Theme-spezifisches Icon, z. B. für den Toolbar-Button. Auf das Thema „Theming“ gehe ich weiter unten noch gesondert ein. Die execute()-Methode bekommt schließlich die Vaadin-Applikation als Parameter übergeben und kann in dieser das für die gesamte Applikation gültige Theme setzen. Wenn Sie die Demo lokal am Laufen haben, klicken Sie einfach einmal auf den Toolbar-Button RUNO THEME. Das Ergebnis sehen Sie in Abbildung 4.

Abb. 4: Die Vaadin-OSGi-Demo mit Abb. 4: Die Vaadin-OSGi-Demo mit „Runo Theme“ (Vergrößern)

View Contributions

Ein Beispiel für eine View Contribution befindet sich im Projekt com.siemens.ct.osgi.vaadin.pm.bundleview. Im Prinzip funktioniert eine IViewContribution genauso wie eine IActionContribution. Die Applikationskomponente fügt eingehende IViewContribution-Services in das TabSheet ein, den eigentlichen Inhalt für das neue Tab liefert die Methode getView().Analog zum Action-Projekt gibt es auch hier im Verzeichnis OSGI-INF eine XML-Datei, die die benötigten Deklarationen für OSGi DS beinhaltet.

Starten und Stoppen von Bundles

Die Bundle View ist eine besondere View, nämlich die Implementierung eines so genannten Agents, mit dem man interaktiv Bundles im OSGi-Laufzeitsystem starten und stoppen kann. In der Bundle-View-Implementierung werden dabei nur die Bundles angezeigt, für die ein Starten und Stoppen auch Sinn macht. Die Bundle View ist im Prinzip nur ein GUI-Hilfsmittel, um Bundles auf dem Server zu manipulieren. Der Vorteil für die Demo ist dabei, dass Sie kein explizites Browser-Refresh machen müssen, da Vaadin das in diesem Fall automatisch erledigt. Man kann über die Equinox-Konsole natürlich auch manuell Bundles starten und stoppen. Klicken Sie dafür in die Console-View und geben „ss“ ein. „ss“ steht für „Short Status“ und gibt eine Liste aller im Laufzeitsystem vorhandenen Bundles inklusive Status aus.

Die Zeile 13 ACTIVE com.siemens.ct.osgi.vaadin.pm.treeview_1.0.0.qualifier gibt an, dass das Bundle mit der Nummer 13 gerade aktiv ist. Geben Sie nun stop 13 auf der Console ein, stoppen Sie das Bundle. Zum Test geben Sie ss tree ein und bekommen wie erwartet die Ausgabe 13 RESOLVED com.siemens.ct.osgi.vaadin.pm.treeview_1.0.0.qualifier. Das Bundle ist also im Status RESOLVED. Wenn Sie jetzt ein Refresh auf dem Webbrowser machen, werden Sie sehen, dass die View Contribution Tree View verschwunden ist.

Theme Switching

Beim Wechseln des Themes für die gesamte Vaadin-Applikation gibt es einige Besonderheiten zu beachten. Die Theme-Ressourcen, z. B. Icons und Stylesheets, müssen vom Vaadin Bundle kontrolliert werden. Daher müssen alle Bundles, die neue Ressourcen zu Themes hinzufügen wollen, Fragmente vom Vaadin Bundle sein. Als Beispiel dient das Projekt com.siemens.ct.osgi.vaadin.pm.theme. Dieses ist ein Fragment vom Vaadin Bundle und liefert einige Icons im Verzeichnis VAADIN.themes.reindeer.icons. Das führt dazu, dass diese Icons auch nur im Reindeer-Theme zur Verfügung stehen. Wie Sie in Abbildung 4 sehen, sind die Icons im Runo-Theme nicht enthalten. Ich empfehle folgende Vorgehensweise: Stellen Sie ein einziges Bundle zur Verfügung, in dem alle Ressourcen für ein Theme enthalten sind. So können Sie z.B. die Konsistenz der Icons garantieren. Das spricht natürlich ein wenig gegen das Modulkonzept, nach dem Bundles, die UI-Contributions liefern, auch die entsprechenden Theme-Ressourcen liefern könnten. Sicher können Sie das auch so implementieren, müssen aber auf jeden Fall die Theme-Ressourcen in ein eigenes Fragment packen und können diese nicht mit einem normalen OSGi Bundle deployen.

Fazit

In diesem Artikel habe ich gezeigt, wie einfach es ist, mit Vaadin und OSGi dynamische Webapplikationen zu erstellen, die auch auf UI-Seite dynamisch Komponenten zum User Interface der Applikation beisteuern können. Die Demo ist dabei aber natürlich nur als einfaches Anschauungsbeispiel gedacht, um die Prinzipien zu erläutern. Realistische Use Cases wären zum Beispiel folgende:

  • Erweiterung oder Update einer Applikation inklusive GUI-Komponenten zur Laufzeit, ohne den Server herunterfahren zu müssen
  • Verschiedene Deployments mit verschiedenen GUI-Modulen, z.B. für verschiedene Kunden
  • Einfache Administrationsapplikationen, mit denen man das OSGi-Laufzeitsystem auf dem Server steuern kann

Die Zukunft wird zeigen, wie ausgereift die vorgestellten Technologien schon sind und für welche Klasse von Anwendungen sie sich am besten eignen. Serverseitige OSGi-Anwendungen und auch Vaadin bieten meiner Meinung nach jedenfalls ein großes Potenzial. Falls Sie selbst schon Erfahrungen mit OSGi und Vaadin gesammelt haben, wäre ich sehr an einem Erfahrungsaustausch interessiert.

Kai Tödter ist Senior Engineer im Global Technology Field „System Architecture and Platforms“ der Siemens Corporate Technology. Er beschäftigt sich seit vielen Jahren mit Java-Technologie, insbesondere im Rich-Client- und RIA-Umfeld. Kai vertritt Siemens in der Eclipse Foundation und ist durch Beiträge auf internationalen Konferenzen und in seinen Blog bekannt. E-Mail: kai.toedter[at]siemens.com, Blog: http://www.toedter.com/blog, Twitter: http://www.twitter.com/kaitoedter.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.