Ausarbeitung - Department of Information Systems

Transcription

Ausarbeitung - Department of Information Systems
Westfälische Wilhelms-Universität Münster
Ausarbeitung
Varianten-freundliches Software-Design:
Die Eclipse-Rich-Client Platform
im Rahmen des Hauptseminars Variantenmanagement
Glenn Schaare
Themensteller: Prof. Dr. Herbert Kuchen
Betreuer: Dipl.-Wirt.Inform. Roger A. Müller
Institut für Wirtschaftsinformatik
Praktische Informatik in der Wirtschaft
Inhaltsverzeichnis
1
Einleitung................................................................................................................... 1
2
Überblick über die Eclipse-Rich-Client-Platform ..................................................... 1
3
2.1
Positionierung von Eclipse als Rich-Client ...................................................... 1
2.2
Funktionsweise der Plug-in-Architektur........................................................... 3
2.3
Lebenszykluskonzept auf Basis des OSGi-Frameworks .................................. 4
2.4
Grundlegende Plug-ins ..................................................................................... 5
Implementierung am Beispiel.................................................................................... 8
3.1
Umsetzung mit Hilfe der Runtime.................................................................... 8
3.2
Erweiterung des Plug-ins ................................................................................ 10
3.3
GUI-basierte Applikationen............................................................................ 12
4
Rich-Clients auf Basis der Eclipse-RCP.................................................................. 13
5
Bewertung der Eclipse-RCP .................................................................................... 15
6
Zusammenfassung und Ausblick ............................................................................. 16
Literaturverzeichnis ........................................................................................................ 17
II
Kapitel 1: Einleitung
1 Einleitung
Der Einsatz von Variantenmanagement kann den Aufwand der Softwareentwicklung
verringern und somit die Kosten der Bereitstellung unterschiedlicher Softwarevarianten
reduzieren. [Ti94] Die Eclipse-Rich-Client-Platform (RCP) unterstützt die Bildung von
Softwarevarianten durch ihren modularen Aufbau. Dabei kann eine neue Anwendung
nach dem Baukastenprinzip durch die Zusammensetzung unterschiedlicher Plug-ins
erstellt werden. Ab der Version 3.0 ist die Trennung von IDE-spezifischen Plug-ins und
Basis-Plug-ins vollzogen, so dass sich die Eclipse-RCP für die Entwicklung
verschiedenartiger Anwendungen empfiehlt. Grundlage dieser flexiblen Architektur ist
die Runtime Engine der Open Services Gateway Initiative (OSGi), die die Ausführung
und Verwaltung unterschiedlicher Plug-ins steuert. Die Plug-ins zur Gestaltung der
Benutzeroberfläche machen dabei den wesentlichen Teil der Eclipse-RCP aus.
Das Ziel der vorliegenden Arbeit besteht in der Untersuchung der Eclipse-RCP vor dem
Hintergrund des Variantenmanagements. Dazu soll zunächst in Kapitel 2 die Plattform
und deren wesentlichen Plug-ins beschrieben werden. Kapitel 3 bildet den Schwerpunkt
dieser Seminararbeit und thematisiert die Plug-in-Architektur der OSGi und deren
Implementierung in der Eclipse-RCP. Kapitel 4 zeigt exemplarisch das Potenzial einer
Rich-Client-Architektur an Hand des IBM Lotus Workplace, der als vollständiger
Rich-Client realisiert ist. Kapitel 5 bewertet die Eclipse-RCP hinsichtlich der im
Variantenmanagement verfolgten Ziele.
Das abschließende Kapitel fasst die wichtigsten Erkenntnisse zusammen und gibt einen
Ausblick auf die weitere Entwicklung.
2 Überblick über die Eclipse-Rich-Client-Platform
2.1 Positionierung von Eclipse als Rich-Client
Die Eclipse-Plattform entstand als Nachfolger von IBM's IDE Visual Age und sollte
zunächst als zentrale Entwicklungsplattform für Small-Talk, Java und weitere Sprachen
dienen. Nach der Freigabe als Open-Source Ende 2001 trug die durch IBM gegründete
Eclipse-Community dazu bei, dass sich die Anzahl der verfügbaren Plug-ins schnell
vergrößerte und die Eclipse-Plattform an Popularität hinzugewann. Ab der Version 2.1
wurde die Eclipse-Plattform experimentell zur Entwicklung von Desktop und
1
Kapitel 2: Überblick über die Eclipse-Rich-Client-Platform
Rich-Client-Anwendungen
verwendet,
wobei
die
Trennung
zwischen
den
Entwicklungskomponenten der IDE und den Basiskomponenten zu dieser Zeit nicht
vollständig realisiert war. Diese Lücke ist mit Eclipse-RCP 3.0 geschlossen worden.
Der Plug-in-Mechanismus ist ab dieser Version konsequent etabliert, so dass die
Eclipse-IDE selbst nur noch eine spezifische Rich-Client-Anwendung darstellt. [Da05]
Die Eclipse-Runtime-Umgebung ist die gemeinsame Basis aller Plug-ins. Diese wurde
in der Version 3.0 auf die OSGi-Runtime umgestellt. Das OSGi-Konsortium wurde
durch eine große Zahl namhafter Firmen gegründet und hat die Bereitstellung einer
offenen Diensteplattform für unterschiedliche vernetzte Geräte zum Ziel. Als
besonderen Vorteil bietet die OSGi-Plattform neben der Standardisierung auch eine
Möglichkeit, Plug-ins dynamisch zur Laufzeit zu (de)installieren.
Die Eclipse-RCP wird explizit als Rich-Client positioniert und grenzt sich damit
bewusst von den vorherrschenden Konzepten eines Slim-Clients bzw. Thick-Clients ab.
Obwohl Slim-Clients in Form von Webapplikationen in den letzten Jahren an
Bedeutung gewonnen haben, sind parallel Anwendungsfelder entstanden, die die
Entwicklung von Rich-Clients rechtfertigen. [Ga04] Hierzu gehören bspw. mobile
Anwendungen, die über keine konstante Verbindung zum Datennetz verfügen. Im
Folgenden werden die grundlegenden Charakteristika eines Rich-Clients beschrieben:
[Da05]
1. State-of-the-Art Benutzeroberfläche: Eine Rich-Client-Benutzeroberfläche sollte
sich an eine native Benutzeroberfläche anlehnen, so dass dem Nutzer die
wesentlichen Bedienelemente vertraut sind.
2. Offline- und Onlinebetrieb: Ein Rich-Client sollte auch dann funktionieren, wenn
keine Verbindung zum Server besteht. Dies setzt neben einer Anwendungslogik vor
allem die Fähigkeit voraus, Daten zu speichern.
3. Server-managed-Clients: Wartung und Installation sollten durch einen zentralen
Server unterstützt werden.
Die Eclipse-RCP greift weitgehend auf betriebssystemeigene Widgets zurück und bietet
dem Nutzer dadurch eine vertrautes Look & Feel. Die beiden übrigen Punkte hängen
maßgeblich von der spezifischen Ausgestaltung der Applikation ab, die auf Basis der
Eclipse-RCP entwickelt wird. Potenziell werden beide Anforderungen unterstützt.
2
Kapitel 2: Überblick über die Eclipse-Rich-Client-Platform
2.2 Funktionsweise der Plug-in-Architektur
Das für die vorliegende Betrachtung konzeptionell wichtigste Merkmal von Eclipse ist
dessen Plug-in-Architektur. Im Gegensatz zu anderen Plug-in-fähigen Applikationen,
bei denen sich Erweiterungen ausschließlich auf bestimmter Funktionsbereiche
beziehen (z. B. Filter in Photoshop), besteht die Eclipse-Architektur vollständig aus
Plug-ins.
So
lassen
sich
je
nach
Anwendungsfall
unterschiedliche
hierarchisch-geschichtete Systeme bilden, in denen Plug-ins einer höheren Schicht auf
Plug-ins einer tieferen Schichten zurückgreifen.
Ein Plug-in kann als Spezialisierung einer Komponente aufgefasst werden. Eine
Komponente ist ein Softwarebaustein, der über eine klar definierte Schnittstellen
Funktionalität bereitstellt. [Ba05] Von Komponenten wird auch gesprochen, wenn in
einem Komponentenmodell (Bsp. EJB) ein Mechanismus zur Verwaltung des
Lebenszyklus bereitgestellt wird. In einer Plug-in-Architektur wird der Lebenzyklus
durch eine Laufzeitumgebung (Runtime) verwaltet, während dies im Fall von
Komponentenmodellen häufig durch einen Container durchgeführt wird, der auch in
einem separaten Application Server betrieben werden kann. Komponenten in Bezug zu
einem Komponentenmodell stellen häufig eine für sich genommen gekapselte
Funktionalität bereit, während Plug-ins tendenziell eher im Zusammenspiel mit anderen
Plug-ins Funktionalität erbringen. Beispielsweise stellt die Eclipse-Workbench nicht nur
eine Erweiterung eines bestehenden Plug-ins dar, sondern wird selbst durch andere
Plug-ins erweitert.
Abb. 1: Verwendung von Extensions und Extension Points
In einer Plug-in-Architektur ist somit die Integration unterschiedlicher Plug-ins
tendenziell bedeutender als in einer Komponenten-Architektur. Diesem Umstand wird
Eclipse durch die explizite Offenlegung der Schnittstellen unter Verwendung von
Extensions und Extension Points gerecht. Der Mechanismus funktioniert wie folgt: Ein
3
Kapitel 2: Überblick über die Eclipse-Rich-Client-Platform
Plug-in definiert einen Extension Point, der Anforderungen an eine Extension
beschreibt. Eine oder mehrere Extensions können einen bereitgestellten Extension Point
verwenden. (Vgl. Abb. 1) Dadurch ist es möglich, eine komplexe Applikationen aus
einer Menge von Plug-ins aufzubauen.
2.3 Lebenszykluskonzept auf Basis des OSGi-Frameworks
Ab
der
Version
3.0
setzt
die
Eclipse-RCP
eine
Implementierung
der
OSGi-Diensteplattform ein. Das auf Java basierende Framework verwaltet Dienste auf
Komponentenbasis. Das ursprüngliche Einsatzgebiet von OSGi waren verteilte
Anwendungen, die auf lokalen Netzen und eingebetteten Geräten zum Einsatz kommen
sollten. Die für die Realisierung von Diensten verwendeten Java-Klassen und
Ressourcen werden in so genannten Bundles zusammengefasst. OSGi-konforme Server
können Bundles laden, installieren und wieder entfernen. Dabei verwaltet der
OSGi-Server die Abhängigkeiten zwischen Bundles in einer dynamischen und
skalierbaren Ablaufumgebung.
Abb. 2: Lebenzyklus eines Bundles [Os05]
Bundles werden in einer JAR-Datei im OSGi-Server deponiert. Beschreibende
Informationen zu den Bundles werden in einer so genannten Manifest-Datei
gespeichert. Für den Start einer Anwendung wertet der OSGi-Server den
Bundle-Activator-header der manifest.mf aus, der den Namen der zu startenden Klasse
enthält. [OS05] Danach kann sich das Bundle in einem der in Abb. 2 beschriebenen
Zustände befinden.
In Eclipse erfüllt die Runtime (genauer die Plug-ins org.eclipse.osgi und
org.eclipse.core.runtime) die Aufgabe des OSGi-Servers. Plug-ins bilden dabei das
4
Kapitel 2: Überblick über die Eclipse-Rich-Client-Platform
Äquivalent zu den Bundles von OSGi. Die interne Realisierung von Eclipse bildet
Plug-ins auf OSGi-konforme Bundles ab. Jedes Plug-in in Eclipse muss entsprechend
der OSGi-Spezifikation eine Instanz des Interfaces BundleActivator und eine
Manifest-Datei bereitstellen. In Eclipse erben alle zu registrierenden Plug-ins von der
abstrakten Klasse Plugin, die einen solchen BundleActivator implementiert und damit
die Methoden start( ) und stop( ) für die jeweilige Klasse bereitstellt. Letztere wird vor
einem Update ausgeführt, sofern sich das Plug-in in aktivem Zustand befindet. [Ec05a]
Plug-ins werden erst in den Speicher geladen, wenn ihre Funktionalität benötigt wird
(Lazy-Loading). Theoretisch ermöglicht das verzögerte Laden, Anwendungen mit einer
nahezu unbegrenzten Anzahl von Plug-ins zu erweitern, da eine installierte Erweiterung
zunächst so gut wie keine Ressourcen benötigt. Als problematisch erweist sich das
dynamische Entladen der Plug-ins in Eclipse 3.0. Der Programmierer muss selbst dafür
sorgen, dass die referenzierten Objekte freigegeben werden, so dass sie über den
Garbage Collector aus der VM entfernt werden können. [Li05] Dazu werden in Eclipse
so genannte Extension-Tracker verwendet, die abhängige Objekte im Nachgang einer
Deinstallation freigeben. Außerdem muss von dem erweiterten Plug-in (das Plug-in,
welches den Extension Point anbietet), die Referenz gelöscht werden. Da dieses jedoch
nicht wissen kann, wann ein Plug-in dynamisch installiert oder deinstalliert wird, muss
es über entsprechende Veränderungen benachrichtigt werden. Die verwaltende Einheit
(Extension Registry) bietet genau für diesen Fall an, entsprechende Listener zu
registrieren.
2.4 Grundlegende Plug-ins
Ein großer Anteil der Plug-ins dient der Bereitstellung der Benutzeroberfläche. Die
Plug-ins Help, Update und Team repräsentieren optionale Plug-ins, während
Workbench, SWT, JFace und Workspace praktisch in jeder Applikation zu finden sind,
die über eine GUI verfügt. Abb. 3 gibt einen Überblick über die wesentlichen Plug-ins
der Eclipse-RCP-Architektur.
5
Kapitel 2: Überblick über die Eclipse-Rich-Client-Platform
Abb. 3: Eclipse-RCP – Architekturüberblick [Ob03]
Im Folgenden seien die wichtigsten Plug-ins kurz beschrieben.
Workbench
Die Workbench definiert die Benutzeroberfläche der Eclipse Anwendung und legt fest,
wie unterschiedliche Workbench-Komponenten angezeigt und verwendet werden. Die
Workbench verwendet sowohl Bestandteile von SWT als auch von JFace. Aus Sicht des
Nutzers besteht die Workbench aus Editoren und Views. Die Eclipse-RCP stellt
unterschiedliche Editoren zur Bearbeitung von Texten bereit, die von der abstrakten
Klasse EditorPart erben. Diese Klasse stellt neben grundlegenden Methoden zum
Zugriff auf Werkzeugleisten oder Menüs auch Methoden zum Sichern der Dateninhalte
bereit. Views bieten Informationen über ein spezifisches Objekt, an dem der Nutzer
gerade arbeitet. Beispiele für Views sind der Standard-Property-View oder der
Outline-View. Editoren und Views können mit dem Plug-in Eclipse Visual Editor 1.1
auf einfache Art und Weise erzeugt und bearbeitet werden.
Zusammenstellungen
von
Editoren
und
Views
werden
in
Perspektiven
zusammengefasst. Eine Perspektive verwaltet das Anzeigeverhalten einzelner
Komponenten und das Layout der Benutzeroberfläche. Über die Extension Points des
Plug-ins org.eclipse.ui.perspectives können unterschiedliche Komponenten einer
Perspektive hinzugefügt werden.
SWT
Das Standard Widget Toolkit (SWT) ist eine Bibliothek für die Erstellung grafischer
Oberflächen, die es ermöglicht, native Widgets des jeweiligen Betriebssystems zu
verwenden. Die Emulierung beschränkt sich auf wenige, nicht-standardisierte Widgets,
die nicht betriebssystemübergreifend vorhanden sind. [Ob03]
Daraus ergeben sich zwei grundlegende Vorteile: Die Applikation integriert sich sowohl
visuell wie auch funktional (Drag & Drop) in die gewohnte Betriebssystemumgebung
und eine aufwendige Emulierung von Widgets kann weitgehend vermieden werden. In
6
Kapitel 2: Überblick über die Eclipse-Rich-Client-Platform
der Eclipse-RCP sind die für SWT relevanten Plug-ins in dem Paket org.eclipse.swt
zusammengefasst.
JFace
JFace ist ein UI-Toolkit, das standardisierte Hilfsklassen für unterschiedliche
Routineaufgaben der UI-Programmierung bereitstellt. Dabei ist sowohl die API als auch
die Implementierung betriebssystemunabhängig. Die bereitgestellten Funktionen lassen
sich in vier Kategorien einteilen [EH05]:
1. Viewers:
JFace
stellt
Viewer-Komponente
einige
des
Viewer
zur
Verfügung,
welche
Model-View-Controller-Entwurfsmusters
die
(MVC)
implementieren. Der Viewer erzeugt Ereignisse, die dem Controller zugesandt
werden, der Änderungen an den Modelldaten vornehmen kann. [Da05] Viewer sind
keine reinen Repräsentationsobjekte der GUI, sondern verwalten zusätzlich ihre
Dateninhalte wie z. B. Tabellen oder Trees. Die Verwendung des Entwurfsmusters
hat neben der sauberen Trennung der Verantwortlichkeiten vor allem den Vorteil,
dass verschiedene Viewer auf ein Modell angewendet werden können.
2. Actions: Der Mechanismus erlaubt die generische Verwendung von Methoden
durch unterschiedliche Widgets. Das Verhalten der Action wird durch den
Übergabeparameter bestimmt (parametrischer Polymorphismus).
3. Ressourcenverwaltung: JFace bietet unterstützende Klassen für die Verwaltung
von Bildern, Schriften und Farben. Verschiedene statische Methoden erlauben die
Entnahme und das Hinzufügen bestimmter Ressourcen zu einem Repository.
Beispielsweise lassen sich durch die Klasse FontRegistry aller Schriftarten einer
Applikation verwalten.
4. Dialoge und Wizards: JFace unterstützt die Erstellung komplexer Dialoge und
Wizards.
Die Klassen von JFace sind nicht unbedingt an Eclipse gebunden, können also auch in
anderen Umgebungen eingesetzt werden. Jedoch macht insbesondere die Workbench
umfangreichen Gebrauch von JFace.
Workspace
Der Workspace stellt eine API zur Verfügung, die es ermöglicht, auf Projekte, Ordner
und Dateien zuzugreifen, die im lokalen Dateisystem des Nutzers abgelegt sind. Diese
7
Kapitel 3: Implementierung am Beispiel
Basisfunktionalität wird um eine Zugriffshistorie und einen Marker-Mechanismus
ergänzt. Letzterer speichert Systemmeldungen wie Compilerfehler oder Suchergebnisse.
Der Marker-Mechanismus ist durch den Plug-in Entwickler erweiterbar. Darüber hinaus
stellt der Workspace unterschiedliche Change-Listener zur Verfügung, die, ausgelöst
durch Änderungen im Dateisystem, eine bestimmte Komponente benachrichtigen.
Aktualisierung, Hilfesystem und Versionsverwaltung,
Die zuvor beschriebenen Plug-ins dienen hauptsächlich der Bereitstellung von
Funktionalität mit Bezug zur Benutzeroberfläche. Darüber hinaus existieren Plug-ins,
die ein Hilfesystems (org.eclipse.help) einbinden und die bestehende Anwendung
aktualisieren bzw. erweitern (org.eclipse.update). Das Plug-in Update muss nicht
zwingend manuell durch den Update-Manager ausgeführt werden (vergleichbar zu der
Umsetzung in der IDE), sondern kann als Teil eines Batch-Prozesses automatisch
angestoßen werden. Für den gemeinsamen Zugriff auf eine zentrale Ressource eignen
sich das Team-Plug-in (org.eclipse.team), welches Zugriff auf einen CVS-Server
bereitstellt.
3 Implementierung am Beispiel
Zur Verdeutlichung der Funktionsweise des Plug-in-Mechanismus wird in diesem
Abschnitt ein einfaches Programm mit Hilfe der Eclipse-Runtime erstellt. Als
Ausgangspunkt dient die Klasse TraditionalViewer. Die Umsetzung erfolgt in zwei
Schritten:
1. Realisierung der bestehender Funktionalität als Plug-in mit Hilfe der
Eclipse-Runtime.
2. Erweiterung des Plug-ins durch die Definition eines eigenen Extension Points.
3.1 Umsetzung mit Hilfe der Runtime
Das herkömmliche Java-Programm TraditionalViewer wird über die main-Methode
gestartet und funktioniert unabhängig von anderen Klassen.
public class TraditionalViewer {
public static void main(String[] args) {
String m_text = "MyTextContent";
System.out.println(m_text);
}
8
Kapitel 3: Implementierung am Beispiel
Für eine Applikation auf Basis der Eclipse Runtime sind mehrere Klassen notwendig.
Abb. 4 gibt einen Überblick über den Aufbau eines Plug-ins.
Abb. 4: Aufbau eines Plug-ins
Damit die Eclipse-Runtime zur Ausführungszeit die verschiedenen Plug-ins erkennt,
wird die Relation zwischen Extension und Extension Points in der plugin.xml
beschrieben. Aus Gründen der Konformität zu der OSGi-Spezifikation wird parallel die
manifest.mf erstellt. Die Runtime wertet die beschriebenen Abhängigkeiten aus und
stellt eine entsprechende Registry bereit, in der die Abhängigkeiten zur Laufzeit
abgefragt werden können.
<plugin>
<extension
id="viewer"
name="Viewer"
point="org.eclipse.core.runtime.applications">
<application>
<run class="textViewer.Viewer"/>
</application>
</extension>
</plugin>
Die Viewer-Klasse (Umsetzung des TraditionalViewers) erweitert das Plug-in am
Extension Point (EP) org.eclipse.core.runtime.applications durch eine Applikation. Die
Spezifikation des EP legt fest, dass eine Application eine run-Methode und das Interface
IPlatformRunnable implementiert. Die Umsetzung erfolgt in der Viewer-Klasse. Der
Methodenaufruf run startet die Runtime und übergibt der Applikation die Argumente in
Form eines nicht näher spezifizierten Objects.
Die wenigen Änderungen reichen aus, um das Programm über die Eclipse-Runtime zu
starten.
9
Kapitel 3: Implementierung am Beispiel
import org.eclipse.core.runtime.IPlatformRunnable;
import org.eclipse.core.runtime.Plugin;
public class Viewer extends Plugin implements
IPlatformRunnable {
/* Start der Runtime. Spezifikation der Run-Methode
* entsprechend IPlatformRunnable.
*/
public Object run(Object args) throws Exception {
String m_text = "MyTextContent";
System.out.println(m_text);
return EXIT_OK;
}
}
}
3.2 Erweiterung des Plug-ins
Möchte man nun das erstellte Plug-in selbst für potentielle Erweiterungen öffnen,
beispielsweise für einen Pretty Printer oder eine Rechtschreibprüfung, so muss darin
ein eigener EP definiert werden. Dazu wird zunächst die plugin.xml um einen
entsprechenden Eintrag ergänzt.
<extension-point id="viewerAdd" name="ViewerAdd">
Um „Viewer“ zu erweitern, wird ein Interface definiert, das den Text an entsprechende
Plug-ins weiterreicht.
public interface PluginViewerAdd {
String performChange(String s);
}
Die folgende Klasse implementiert das Interface und führt eine Trivialoperation aus.
public class PrettyPrinter implements PluginViewerAdd {
public String performChange(String s) {
System.out.println ("Pretty Printer arbeitet");
// Umwandeln in Großbuchstaben
return s.toUpperCase();
} }
Die Erweiterung wird ebenfalls in der plugin.xml beschrieben
<extension
id="prettyprinter"
name="PrettyPrinter"
point="textViewer.viewerAdd">
<filter class ="textViewer.PrettyPrinter"/>
</extension>
10
Kapitel 3: Implementierung am Beispiel
Auf die selbe Art und Weise können weitere Extensions an den definierten EP
angeschlossen werden. Im Folgenden wird ausgehend von der Viewer-Klasse auf
Dienste des Plug-ins Pretty Printer zugegriffen:
public class Viewer extends Plugin implements IPlatformRunnable{
public Object run(Object args) throws Exception {
String m_text = "MyTextContent";
// Referenz auf die Registry holen
IExtensionRegistry registry = Platform.getExtensionRegistry();
/* Verfügbare Plugins zur dem Extension Point "viewerAddID"
* holen und als IConfigurationElement-Array speichern.
* IConfigurationElement stellt eine Methode bereit um
* ausführbare Extensions zu erstellen
*/
IConfigurationElement[] plugins = registry
.getConfigurationElementsFor("textViewer.viewerAddID");
/* Der Text kann potentiell mehreren Plug-ins zur Bearbeitung
* übergeben werden (abhängig von der Anzahl der Extension
* zum EP) die jeweils eine bestimmte Operation
* (Rechschreibprüfung, Pretty Print...)ausführen.
*/
for (int j = 0; j < plugins.length; j++) {
// Eine ausführbare Extension wird erstellt.
PluginViewerAdd pp = (PluginViewerAdd)
plugins[j].createExecutableExtension("class")
// Die jeweilige Methode wird angewandt
m_text = pp.performChange(m_text);
}
// Konsolenausgabe des geänderten Textes
System.out.println(m_text);
return EXIT_OK;
}
}
Die Klasse bedient sich zunächst der Plug-in-Registry um auf verfügbare Plug-ins
zuzugreifen. Plug-ins zum EP viewerAdd werden nacheinander auf den Text angewandt.
So kann auf einfache Art und Weise zusätzliche Funktionalität innerhalb des Plug-ins
Viewer erbracht werden, das selbst ein Plug-in zu einem EP darstellt.
Es wird deutlich, dass Plug-ins eine explizite und robuste Schnittstelle definieren, die
einfach zu erweitern ist. Dabei führt der OSGi-Server das gesamte Management im
Hintergrund durch, so dass sich die Arbeit auf die Implementierung der gewünschten
Funktionen beschränkt.
11
Kapitel 3: Implementierung am Beispiel
3.3 GUI-basierte Applikationen
Die Erstellung einer GUI-basierten Applikation erfolgt prinzipiell ähnlich. Der EP
org.eclipse.core.runtime.applications wird allerdings derart erweitert, dass in der
korrespondierenden Run-Methode eine Workbench erzeugt wird. Der Methodenaufruf
createAndRunWorkbench öffnet ein Fenster und läuft so lange in einer Schleife, bis das
letzte Fenster geschlossen wird. Mit der Terminierung werden die durch das Fenster
belegten Ressourcen freigegeben.
public class Application implements IPlatformRunnable {
public Object run(Object args) throws Exception {
Display dl = PlatformUI.createDisplay();
try {
// Workbench erzeugen und starten. Klasse WbA erbt
// von WorkbenchAdvisor und muss separat erstellt werden
int returnCode =
PlatformUI.createAndRunWorkbench(dl, new WbA());
if (returnCode == PlatformUI.RETURN_RESTART) {
return IPlatformRunnable.EXIT_RESTART;
}
return IPlatformRunnable.EXIT_OK;
} finally {
display.dispose();
}
}
}
Von zentraler Bedeutung ist die Klasse WbA
(ein abweichender Name ist
selbstverständlich möglich), die von der abstrakt definierten Klasse WorkbenchAdvisor
erbt und durch den Programmierer selbst zu erstellen ist. Das Verhalten der
Benutzeroberfläche zur Laufzeit kann gesteuert werden, indem bei der Erstellung der
Klasse WbA die Laufzeitmethoden [Vgl. Ec05a] der Klasse WorkbenchAdvisor
überschrieben werden. Beispielsweise kann durch den Methodenaufruf postShutdown
der Zustand der Workbench dauerhaft gespeichert werden. Innerhalb der Methode
initialize können der Workbench weitere Perspektiven hinzugefügt werden, die dem
Nutzer zur Laufzeit zur Verfügung stehen. Für die Steuerung der Workbench sind
außerdem die Klassen WorkbenchWindowAdvisor und ActionBarAdvisor von
besonderer Bedeutung. Für eine detaillierte Beschreibung sei auf die Literatur
verwiesen.
12
Kapitel 4: Rich-Clients auf Basis der Eclipse-RCP
4 Rich-Clients auf Basis der Eclipse-RCP
In den vorherigen Kapiteln wurden die grundlegenden Konzepte der Eclipse-RCP
beschrieben. Ziel dieses Kapitels ist eine integrierte Betrachtung der Komponenten in
einem existierenden Anwendungssystem. Als Beispiel soll die Groupware-Lösung IBM
Lotus Workplace (LW) dienen, die im Vergleich zu dem parallel durch IBM
vertriebenen Produkte Lotus Notes/Domino (LN/D) technology eine moderne, offene
Architektur aufweist, jedoch zur Zeit als funktional rückständig gegenüber LN/D gilt.
Die beiden Produkte werde vermutlich in den nächsten Jahren in einer einheitlichen
Version integriert.[Ga04]
Der LW setzt auf Clientseite die Eclipse-RCP als Integrationsplattform ein. Neben den
Open-Source-Plug-ins, basiert der LW auf einer Reihe von IBM Plug-ins, die
insbesondere Persistenz- und Kommunikationsdienste in Zusammenhang mit einem
WebSphere Application Server erbringen (vgl. Abb. 5).
WebSphere Application Server
IBM Workplace Client Technology
Update
Manager
Help
Workbench
JFace
Alerts
Logging
SWT
Platform Runtime
JRE
WMM
Model
Manager
Service
Locator
Portal
Integration
J2EE Client Container
(EJB Access)
IBM Cloudscape
(RDBMS)
Operating System
Selected Updated Eclipse Plug-ins
Selected New IBM Workplace Client Technology Plug-ins
Abb. 5:IBM Lotus Workplace Architektur [Ib04]
Der LW erfüllt die in Kapitel 2 beschriebenen Anforderungen an einen Rich-Client
durch die Verwendung einer zeitgemäßen, dem Nutzer vertrauten Benutzeroberfläche,
die auf Basis der Grafikbibliotheken SWT und JFace erstellt wurde. (Vgl. Abb. 6)
Desweiteren kann der LW sowohl im Online- wie auch im Offlinebetrieb verwendet
werden. Die Eigenschaft der Persistenz wird in LW durch einen lokalen, kompakten
EJB-Container realisiert, der im Offlinebetrieb Zugriff auf eine verschlüsselte,
13
Kapitel 4: Rich-Clients auf Basis der Eclipse-RCP
relationale Datenbank hat, in der die Nutzdaten abgelegt sind. Die Aktualität der Daten
wird
bei
erneuter
Synchronisation
mit
der
zentralen
Servereinheit
(WebSphere Application Server) sichergestellt. [Ib05a]
Die Anforderung bezüglich Wartung und Installation von Programmen durch einen
zentralen Server wird durch die Eclipse-RCP-Komponente Update zur Verfügung
gestellt, die installierte Versionen bestimmter Features bzw. Plug-ins auf die
Versionsnummer hin überprüft und diese gegebenenfalls ersetzen kann. Die
IBM Workplace Client Technology, die der LW zu Grunde liegt, verwendet den
WebSphere Application Server
für
die
Auslieferung
neuer
und
zusätzlicher
Komponenten.
Abb. 6: IBM Workplace Benutzeroberfläche
Das Beispiel des IBM Lotus Workplace verdeutlicht, dass sich die Eclipse-RCP als
Ausgangsbasis zur Erstellung komplexer Rich-Clients eignet. IBM profitiert hierbei von
der konsequenten Weiterentwicklung der Eclipse-RCP durch einen großen Nutzerkreis
in der Community. Im Gegenzug stellt IBM immer wieder umfangreiche
Softwarekomponenten unter der Open-Source-Lizenz zur Verfügung.[IB05b]
14
Kapitel 5: Bewertung der Eclipse-RCP
5 Bewertung der Eclipse-RCP
Das Variantenmanagements zielt darauf ab, den Aufwand der Softwareentwicklung zu
verringern und somit die Kosten der Bereitstellung unterschiedlicher Softwarevarianten
zu reduzieren. [Ti94] Bei der Herstellung von Software ist ein umfassender
Kostenbegriff heranzuziehen, der neben den einmaligen Erstellungskosten auch
Wartungs- und Erweiterungskosten miteinbezieht. Als weiteres Ziel, ist die Qualität der
erstellten Software zu garantieren, so dass der Nutzen der Software die Investition des
Kunden
rechtfertigt.
Aus
den
genannten
Forderungen
lassen
sich
vier
Bewertungskriterien ableiten, nach denen die Softwareerstellung mit der Eclipse-RCP
beurteilt werden kann.
1. Implementation: Ein Großteil des Erstellungs- und Integrationsprozesses wird durch
spezielle Wizards und Konfigurationsschaltflächen unterstützt, wodurch sich die
Verwendung des Plug-in-Mechanismus unkompliziert gestaltet. Mit zunehmender
Größe einer Applikation erweist sich eine Plug-in-Architektur als äußerst wirtschaftlich,
da der Programmierer auf standardisierte Plug-ins zurückgreifen kann, die durch einen
großen Nutzerkreis erstellt und getestet werden. Die Verwendung standardisierter
Plug-ins zwingt den Programmierer zwar zur Einhaltung externer Standards, jedoch
erscheint die Einschränkung der Flexibilität vor dem Hintergrund des genannten
Vorteils akzeptabel.
2. Maintenance: Durch die Modularisierung einer Applikation kann die Wartbarkeit
erhöht werden. Dieses Prinzip gilt sowohl auf Ebene einzelner Klassen wie auch auf
Ebene der Plug-ins. Im Idealfall können einzelne Plug-ins zur Laufzeit ausgetauscht
oder aktualisiert werden, ohne den Ablauf der Gesamtapplikation zu unterbrechen. In
der Praxis wird dies jedoch nicht immer erreicht. Beispielsweise kann der
Releasewechsel von Version 3.0 auf 3.1 der Eclipse-RCP zu Kompatibilitätsproblemen
bei bestehenden Plug-ins führen, die Anpassungen am Quellcode erfordern (Dies gilt
sogar für die kompakte Anwendung aus Kapitel 3.1 ff., die auf Basis der Version 3.0
geschrieben
wurde).
Ebenfalls
problematisch
erweist
sich
das
dynamische
Laden / Entladen von Plug-ins (vgl. Kapitel 2.3), das für eine Aktualisierung zur
Laufzeit notwendig ist. Trotz der genannten Schwachstellen kann eine auf Plug-ins
aufgebaute Applikation als wesentlich wartungsfreundlicher angesehen werden, als eine
monolithische Applikation, da die relevanten Schnittstellen transparent gestaltet sind.
15
Kapitel 6: Zusammenfassung und Ausblick
3. Usability: Anwendungen auf Basis der Eclipse-RCP erlauben ein natives
Look & Feel abhängig vom Betriebssystem des Anwenders. Damit wird die Akzeptanz
für die Anwendung durch den Nutzer erhöht und gleichzeitig der potenzielle
Nutzerkreis ausgeweitet.
4. Performance: Die Umsetzung des OSGi-Standards in der Version 3.1 der
Eclipse-RCP erlaubt das dynamische Laden und Entladen von Plug-ins zur Laufzeit, so
dass auch umfangreiche Anwendungen performant umgesetzt werden können. Weitere
Performanceverbesserungen sind für die Version 3.2 der Eclipse-RCP angekündigt.
Hinsichtlich der vier Kriterien kann die Eclipse-RCP überwiegend positiv bewertet
werden. Die beschriebenen Problembereiche des 2. Gliederungspunktes lassen sich
nicht immer eindeutig auf Charakteristika der Plattform zurückführen und können durch
Anpassungen am Quellcode umgangen werden.
6 Zusammenfassung und Ausblick
Die Untersuchung der Eclipse-RCP hat gezeigt, dass die realisierte Plug-in-Architektur
wirtschaftliche Softwareerstellung ermöglicht und bedeutende Vorteile gegenüber einer
monolithischen Implementation mit sich bringt. Große Anwendungen lassen sich
übersichtlich strukturieren und besser warten. Aus Nutzersicht sind insbesondere die
native Benutzeroberfläche und eine vergleichsweise gute Performance hervorzuheben.
Der Erfolg von Eclipse und den auf Eclipse aufbauenden Produkten kann als ein Beweis
angesehen werden, dass die Plug-in-architektur nicht nur eine hervorragende
theoretische Idee ist, sondern auch effizient und skalierbar umgesetzt werden kann.
Diese Eigenschaften machen sie interessant für vielfältige Arten von Anwendungen, die
entweder in bestimmten Bereichen erweiterbar sein oder insgesamt aus Plug-ins
aufgebaut werden sollen. Aus der Sicht des Variantenmanagements sind es exakt die
genannten Vorteile, die positiv auf die Ziele hinsichtlich Wiederverwendbarkeit und
Aufwandsreduzierung im Erstellungsprozess wirken.
Für
die
Zukunft
ist
anzunehmen,
dass
neben
den
bereits
bestehenden
IBM-Implementationen weitere Anwendungssysteme auf Basis der Eclipse-RCP
entstehen werden.
16
Kapitel 0: Literaturverzeichnis
Literaturverzeichnis
[Ba05]
Heide Balzert: Lehrbuch der Objektmodellierung, Spektrum Akademischer
Verlag, 2005.
[Br05]
Kai Brüssau: Eclipse – Die Plattform, Software & Support Verlag GmbH,
2005.
[Da05]
Berthold Daum: Rich-Client-Entwicklung mit Eclipse 3.1, D-Punkt Verlag,
2005.
[Ec05a]
Eclipse Foundation. Eclipse help system, http://help.eclipse.org, 2005.
Abrufdatum: 02.12.05.
[Ec05b]
Eclipse Foundation. The Eclipse Project DRAFT 3.2 Plan,
http://www.eclipse.org/eclipse/development/eclipse_project_plan_3_2.html,
2005. Abrufdatum: 02.12.05.
[Ga04]
Gartner Research. IBM Workplace Will Eclipse Lotus Notes/Domino
Technology, ID Number: G00125012, 2004.
[Ib04]
IBM Corp.: IBM Workplace Client Technology (Rich-Client Edition)
Technical Overview, http://www.redbooks.ibm.com, 2004. Abrufdatum:
02.12.05.
[Ib05a]
IBM Corp.: IBM Workplace Client Technology architecture, http://www128.ibm.com/developerworks/lotus/library/wct-architecture, 2005.
Abrufdatum: 02.12.05.
[Ib05a]
IBM Corp.: IBM to Contribute Software Development Blueprints to Open
Source Community, Press release, Oktober 2005.
[Li05]
Martin Lippert, Bernd Kolb: Neustart?!? Warum? - Mit Eclipse 3
dynamische Plug-ins implementieren, Eclipse Magazin, Volume 3, 2005,
pp. 28-30.
[Ma03]
Klaus Marquardt, Markus Völter: Plug-Ins – applikationsspezifische
Komponenten,Java-Spektrum, Volume 2, 2003, pp. 20-25.
[Mc05]
Jeff McAffer, Jean-Michel Lemieux: Eclipse Rich-Client Platform:
Designing, Coding, and Packaging Java Applications, Addison Wesley,
2005.
[Ob03]
Object Technology International, Inc.: Eclipse Platform Technical
Overview, 2003.
[Os05]
OSGi Alliance: OSGi Service Platform Core Specification, Release 4, 2005.
[Ti94]
Walter Tichy: Configuration management, Wiley, 1994.
17