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

Vaadin

Vaadin ist ein mächtiges serverseitiges RIA-Framework, das GWT als Rendring Engine einsetzt. Detaillierte Informationen finden Sie unter [2] und im erwähnten Artikel „Vaadin – ein Java-Webframework im Visier„. Es würde den Umfang dieses Artikels sprengen, Vaadin hier detailliert zu beschreiben, daher möchte ich nur ganz kurz auf ein paar Aspekte von Vaadin eingehen. Unter [10] finden Sie eine Liste der Vaadin-Features. Erwähnen möchte ich hier nur einige Merkmale:

  • Einfaches Programmiermodell: Nur Java, (so gut wie) keine Konfiguration, kein JavaScript. Wer schon mal Swing/SWT oder GWT programmiert hat, findet sich sehr schnell zurecht.
  • Serverseitige UI-Logik, aber GWT als Rendering Engine. Im Gegensatz zu „reinem“ GWT, bei dem sich ein Großteil der Applikations- und UI-Logik in JavaScript auf dem Client abspielt und explizite Remote Prcedure Calls zum Server gemacht werden, läuft bei Vaadin die komplette Applikations- und UI-Logik auf dem Server. Deshalb funktioniert auch die Verbindung mit serverseitigem OSGi so gut.
  • Das Look and Feel der Applikation ist einfach zu ändern und zu erweitern. Die mitgelieferten Standard-Themes gefallen mir recht gut.
  • Einfaches Runtime Environment: Vaadin besteht nur aus einem einzigen JAR-File.

In Listing 1 sehen Sie ein „Hello World“-Beispiel mit Vaadin.

Listing 1
import com.vaadin.ui.*;

public class HelloWorld extends com.vaadin.Application {
    public void init() { 
        Window main = new Window("Hello window"); 
        setMainWindow(main);
        main.addComponent(new Label("Hello World!")); 
    }
}

Eine Vaadin-Applikation ist eine Erweiterung der Klasse com.vaadin.application. In der init-Methode wird das Hauptfenster (main) der Applikation erzeugt. In unserem Fall ein einfaches Fenster. Dieses muss der Applikation dann noch mit setMainWindow()als Hauptfenster bekannt gemacht werden. Zum Schluss wird noch ein einfaches Label mit dem Text „Hello World!“ hinzugefügt.

Die Demoapplikation

Die dynamische OSGi-Vaadin-Demo besteht aus einem Applikationsskelett und diversen Bundles, die UI-Beiträge (Contributions) in Form von Views oder Actions liefern, doch dazu später mehr. Das Skelett der Applikation ist sehr einfach aufgebaut. Es besteht im Wesentlichen aus einem Hauptmenü, einer Toolbar und einem TabSheet. Die eigentliche Dynamik der Applikation kommt durch zwei Aspekte zum Tragen: Die Applikation stellt zwei Serviceinterfaces für UI-Contributions bereit: IActionContribution und IViewContribution. Die Listings 2 und 3 zeigen diese beiden Interfaces.

Listing 2
package com.siemens.ct.osgi.vaadin.pm.main.service;

import com.vaadin.Application;

public interface IActionContribution {
  String getIcon();
  String getText();
  void execute(Application application);
}
Listing 3
package com.siemens.ct.osgi.vaadin.pm.main.service;

import com.vaadin.Application;
import com.vaadin.ui.Component;

public interface IViewContribution {
  public Component getView(Application application);
  public String getIcon();
  public String getName();
}

Die Applikation selbst macht vom Whiteboard Pattern [11] Gebrauch: Anstelle eines Toolbar- oder View-Service, bei dem sich Contributors als Listener einhängen können, ist die Applikation selbst eine (OSGi-Declarative-Services-)Komponente, die eine 0..n-Abhängigkeit zu den Services IActionContribution und IViewContribution deklariert. Kommt nun ein Bundle (beim Start-up und dynamisch) ins System, das einen solchen Service anbietet, werden die entsprechenden Methoden bindActionContribution und bindViewContribution aufgerufen. Verlassen die Bundles das System, z. B. durch Stoppen oder Deinstallation, werden die entsprechenden Methoden unbindActionContribution und unbindViewContribution aufgerufen. Um all diese Dynamik muss sich der Entwickler nicht mehr selber kümmern. Die in OSGi Declarative Services (DS) enthaltene Service Component Runtime kümmert sich automatisch darum. Die für DS benötigten Informationen werden in einer kleinen XML-Datei bereitgestellt, die in Listing 4 dargestellt ist. Wenn Sie mit Eclipse arbeiten, bekommen Sie einen formularbasierten Editor mitgeliefert und müssen selbst kein XML schreiben.

Listing 4

Durch die Verwendung von Chris Brinds Vaadin OSGi Binding ist die Vaadin-Applikation selbst wieder eine DS-Komponente und kann einfach Abhängigkeiten zu weiteren OSGi-Services deklarieren. Kommen nun IActionContribution-Services in das OSGi-System, werden diese von der Applikation einfach in die Toolbar und das Menü eingefügt bzw. wieder entfernt, falls der Service verschwindet. Analog dazu werden IViewContribution-Services in das TabSheet eingefügt und auch wieder daraus entfernt. Der Sourcecode für das Einfügen einer IViewContribution ist dabei trivial, wie Listing 5 zeigt.

Listing 5
  public void bindViewContribution(IViewContribution viewContribution) {
    logger.debug("bindViewContribution()");
    viewContributions.add(viewContribution);
    if (initialized) {
      tabSheet.addTab(viewContribution.getView(this),
            viewContribution.getName(),
            new ThemeResource(viewContribution.getIcon()));
    }
  }
Kommentare

Schreibe einen Kommentar

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