[ 29. April 2013 ]

Eclipse 4 Rich Client Applikationen mit P2 automatisch aktualisieren

Autor: Beat Schaller

Mit Eclipse 4 wurden diverse Interfaces und Klassen überarbeitet. Zahlreiche nützliche Klassen aus Eclipse 3 sind seither nur noch über den Kompatibilitätsmodus verfügbar. Betroffen sind ebenfalls die Verwendung des automatischen Updates P2 und der Sprachenwechsel verbunden mit einem automatischen Neustart. Mit wenigen Programmzeilen lässt sich diese Update Funktionalität unter Verwendung des Eclipse 4 Frameworks nachbauen.

Eclipse verfügt mit P2 über einen Update Mechanismus, mit dem beim Starten einer Applikation neue Plugins und Features über einen Link heruntergeladen werden können. Diese Funktionalität wird für Eclipse Equinox im korrespondierenden Wiki [1] und u.a. auf den Seiten von Lars Vogel [2], Ralf Ebert [3] sowie Andrew Niefert [4] beschrieben.

In einer reinen Eclipse 4 Applikation ist ein Neustart nach einem P2 Update nicht mehr einfach realisierbar. Nachfolgend erläutere ich wie diese Funktionalität trotzdem einfach umgesetzt werden kann.

Sample Applikation

Mit dem Eclipse Wizard erstellen wir die notwendigen Projekte für eine Sample Applikation.

Dieses Projekt bildet den Einstieg und die Hauptfunktionalität. Dazu erstellen wir ein Fragment für die log4j Konfigurationsdatei, ein Plugin für einen OSGi Service, um das Login zu simulieren und ein Feature Projekt, das alle Plugins beinhaltet.

ch.ipt.p2update
ch.ipt.p2update.log4j.config
ch.ipt.p2update.service
ch.ipt.p2update.feature

P2Util

Die Klasse P2Util [6] wird im Plugin ch.ipt.p2update implementiert. Die Grundfunktionalität entspricht derjenigen aus dem Eclipse Equinox Wiki [1]. Erweitert wurde sie um die Möglichkeit, dynamisch die URL ins Repository aufzunehmen.

public static IStatus checkForUpdates(final IProvisioningAgent agent, final IProgressMonitor monitor)

public static boolean addRepository(final IProvisioningAgent agent, final String repo)

In checkForUpdates wird überprüft, ob ein Update durchzuführen ist und falls ja, wird die Aktualisierung automatisch ausgeführt. Der Einfachheit halber wird hier auf die Möglichkeit einer entsprechenden Benutzerabfrage verzichtet. Mit addRepository wird die konfigurativ definierte URL dynamisch in das Repository eingefügt. Die Datei p2.inf entfällt zu Gunsten dieser Lösung.

P2Util.addRepository(provisioningAgent, updateServerURL);
IStatus updateStatus = P2Util.checkForUpdates(provisioningAgent, monitor);

Restart und lifeCycleURI

In Eclipse 4 ist es möglich, über einen LifeCycleHandler in den Startup Prozess einer Applikation einzugreifen. Er lässt sich über das Property lifeCycleURI in der products Extension definieren.

Diverse Aktionen sind in diesem Handler denkbar. Von Jobs, die Stammdaten von der DB lesen bis zum Erweitern des Application Modells durch das Ausführen spezifischer Add-ons. Das Login kann ebenfalls in diesem Handler implementiert werden, hat jedoch seine Limiten. Wird die Sprache im Login Dialog gewählt und dadurch gewechselt ist auch in Eclipse 4 ein Restart der Applikation notwendig [5]. Innerhalb des LifeCycleHandler ist das nicht mehr möglich, da nicht vorgesehen. Ein PlatformUI.getWorkbench().restart(), das in den Eclipse 3.x Applikationen verwendet wurde ist ohne Kompatibilitätslayer nicht mehr anwendbar.

Die Applikation sollte nach einem erfolgreichen Update über P2 ebenfalls neu gestartet werden. Wir suchen deshalb nach einer weiteren Möglichkeit. Eine bessere Lösung wird mittels geänderter application erzielt. Standardmässig wird das Produkt über die Klasse E4Application gestartet. Mit einem Wrapper lässt sich das umgehen.

public class MyE4Application implements IApplication

Im Plugin.xml wird eine Extension application definiert.

<extension
     id="MyE4Application"
     point="org.eclipse.core.runtime.applications">
  <application>
    <run
        class="ch.ipt.p2update.application.MyE4Application">
    </run>
  </application>
</extension>

Die gewrappten Methoden erlauben nun noch vor dem Start der Applikation einzugreifen.

@Override
public Object start(final IApplicationContext context) throws Exception {
    // ret = P2 update
    // ret = Login
    // falls kein Restart -> starte E4
    e4app = new E4Application();
    ret = e4app.start(context);
    return ret;
}

@Override
public void stop() {
    e4app.stop();
}

Die start Methode bietet sich an sowohl das P2 Update, wie auch das Login vor dem Start von E4 auszuführen. Ein Return-Wert IApplication.EXIT_RESTART startet die Applikation neu. OSGi Services lassen sich einfach einbinden, wie das Beispiel MyE4Application [7] zeigt. Sowohl P2, wie auch ein Sprachenwechsel lassen sich auf diese Weise einfach bewerkstelligen, ohne auf den Kompatibilitätslayer zurückzugreifen.

Mit dieser Lösung sind zwei Phasen des Start-ups vorhanden. Die erste vor dem Start der E4 Applikation, und die zweite bevor die Applikation gerendert wird.

Produkt

Als letzter Schritt wird das product neu definiert. Es basiert nicht mehr auf plugins sondern auf features. Folgende Features werden benötigt:

ch.ipt.p2update.feature
org.eclipse.e4.rcp
org.eclipse.emf.common
org.eclipse.emf.ecore
org.eclipse.equinox.p2.core.feature
org.eclipse.equinox.p2.extras.feature

Fazit

P2 Update und Restart können mit Eclipse 4 auch ohne Kompatibilitätslayer verwendet werden. Einziger kleiner Wehrmutstopfen - die Klasse E4Application ist eine internal Klasse. Da nur die öffentlichen Methoden des Interfaces verwendet werden, kann diese Unschönheit vernachlässigt werden. Eclipse 4 ist ohne Kompatibilitätslayer bereits jetzt für den produktiven Einsatz bestens geeignet.

Referenzen:

[1] Eclipse Equinox, wiki.eclipse.org/Equinox/p2/Adding_Self-Update_to_an_RCP_Application

[2] Lars Vogel, www.vogella.com/articles/EclipseP2Update/article.html

[3] Ralf Ebert, www.ralfebert.de/blog/eclipsercp/p2_updates_tutorial_36

[4] Andrew Niefer, haniefer.blogspot.ch/2009/03/building-p2-rcp-products-in-eclipse.html

[5] Kai Tödter, www.toedter.com/blog/?p=19

[6] P2Util.java. Download 

[7] MyE4Application.java. Download 


Gastautor

Beat Schaller ist IT-Architekt bei der [ipt]. Er verfügt über langjährige Erfahrung mit Eclipse RCP 3.x/4.x und JEE Server Applikationen in Grossprojekten. Seine Schwerpunkte liegen in der Analyse, dem Design, der Architektur und in der Implementierung von Client und Server sowie deren Integration mit Umsystemen.

Diesen Artikel kommentieren

Wir sind sehr an einer offenen Diskussion interessiert, behalten uns aber vor, beleidigende Kommentare sowie solche, die offensichtlich zwecks Suchmaschinenoptimierung abgegeben werden, zu editieren oder zu löschen.