Software Engineering in der Praxis: Eclipse Development Die Eclipse Plattform Seite 1
Agenda Architekturüberblick Eclipse Plattform Einführung in die Platform Runtime und das Plugin-Konzept Plugin-Entwicklung mit dem PDE Übung Seite 2
Architekturüberblick Seite 3
Architekturüberblick Platform Runtime: Verwaltung der Plugins SWT: Betriebssystem-unabhängige Grafik- und Widgetbibliothek JFace: UI Toolkit für die Abhandlung vieler wiederkehrender Aufgaben der UI Programmierung (Dialoge, Wizards, ) Workbench UI: Eclipse UI-Grundstruktur mit Verwaltung und Anzeige von Views, Perspektiven, Editoren etc. Help: Beschreibung und Darstellung von Hilfesystemen Seite 4
Architekturüberblick JFace Text: Primitiven zur Entwicklung von Texteditoren Workbench Text Editor: Integration von JFace Text in die Workbench Update: Funktionalität und Dialoge zur Installation und Update von Plugins via HTTP Forms: API zur einfachen Entwicklung von Formularen Outline and Properties Views: Wiederverwendbare Sichten zur Anzeige von Strukturen und zum Editieren von Eigenschaften. Seite 5
Architekturüberblick Compare/Search: Differenzanzeige von Texten und Volltextsuche Workspace: Abstraktion des Ressourcenzugriffs in Eclipse. Organisation in Projekten und Projektnaturen Workspace-Based Document Editors: Direkte Anbindung des Workbench Text Editors an Workspaces. Team: Anbindung Versionkontrollsystemen Workbench IDE UI: Wiederverwendbare Workbench-Bausteine für integrierte Entwicklungsumgebungen auf Basis Eclipse. Seite 6
Architekturbaustein: Platform Runtime Seite 7
Platform Runtime: Grundlagen ClassLoader ClassLoader kümmern sich in Java darum, bei Bedarf Klassen zu laden und bereitzustellen. Jeder ClassLoader besitzt einen eigenen ClassPath. Jede Klasse ist mit genau einem ClassLoader verbunden (wurde von diesem geladen). Klassen werden in Java lazy geladen. ClassLoader sind in Hierarchien organisiert, wobei für Klassen in einem ClassLoader nur die eigenen Klassen und die der darüber liegenden ClassLoader sichtbar sind. Die Hierarchie ergibt sich aus der Erzeugung von ClassLoadern innerhalb von Klassen und deren assoziierten ClassLoader. Es können eigene ClassLoader als Erweiterungen der bereits bestehenden ClassLoader implementiert werden. System ClassLoader ClassLoader Plugin1 ClassLoader Plugin2 Seite 8
Platform Runtime: Grundlagen OSGi OSGi ist ein Industriestandard für eine Laufzeitumgebung für komponentenorientierte Systeme. Einführung mit Eclipse 3.0 als Laufzeitumgebung von Plugins OSGi verwaltet Bundles (=Komponenten, =Plugins) Beschreibung von Bundles über Metadaten (MANIFEST.MF) Dynamisches Laden/Entladen von Bundles (Lazy Loading) Kontrolle der Abhängigkeiten zwischen Bundles (Abhängigkeiten werden über Metadaten beschrieben und über einen eigenständigen ClassLoader pro Bundle zur Laufzeit kontrolliert) Versionierung von Bundles, wobei unterschiedliche Major-Release- Nummer inkompatible Plugins ausdrücken (z.b. 1.2 und 2.0) sollten. Plugins mit gleicher Major-Release-Nummer sollen zueinander kompatibel sein. Erkennung von Konflikten Seite 9
OSGi: Bundle Aktivator-Klasse (kontrolliert Lebenszyklus des Bundles) de.fau.i11.a 1.0.0 de.fau.i11.b 2.1.3 de.fau.i11.c 1.0.0 Exportierte Packages (öffentliche Schnittstelle) META-INF/MANIFEST.MF Benötigte Bundles (benötigte Schnittstellen) Bundle-SymbolicName: de.fau.i11.a; singleton:=true Bundle-Version: 1.0.0 Bundle-Activator: de.fau.i11.a.activator Bundle-Vendor: Bundle-ClassPath: a.jar Require-Bundle: de.fau.i11.b,de.fau.i11.c Export-Package: de.fau.i11.a.api Zusätzlich möglich: Versionsbedingungen Friend-Bundles Seite 10
Platform Runtime: Plugins Plugins sind die Modularisierungseinheit innerhalb von Eclipse. Alles außer die Platform Runtime sind Plugins in Eclipse. Name eines Plugins soll immer der Top-Level Packagestuktur entsprechen (Bsp.: de.fau.i11.reqlipse.core ) Definiert Erweiterungsmöglichkeiten und/oder erweitert andere Plugins (Extension Points, Extensions) in plugin.xml Ein Plugin wird als Verzeichnis oder alternativ als JAR mit folgender Namenskonvention geliefert: <PLUGIN_NAME>_<PLUGIN-VERSION> Inhalte des Plugin Verzeichnisses: JAR Datei mit Compilaten META-INF/MANIFEST.MF (OSGi Bundle Manifest) plugin.xml (Plug-in Manifest) Div. statische Ressourcen (z.b. Bilder); Können per Plugin-Klasse zugegriffen werden. Seite 11
Die Plugin-Klasse Bundle-Activator Singleton Klasse Reaktion auf Plugin-Lifecycle Div. Hilfsfunktionen durch Framework-Klassen «interface» org.osgi.framework.bundleactivator org.eclipse.core.runtime.plugin org.eclipse.ui.plugin.abstractuiplugin MyActiv ator Seite 12
Platform Runtime: Plugin Loader Scan in den Plugin Verzeichnissen nach MANIFEST.MF und plugin.xml Dateien Aufbau einer Plugin Registry aus den gesammelten Informationen Weitere Einheiten Feature: Sammlung an Plugins. Wird per Update-Site verteilt. Fragment: Teil eines Plugins wie z.b. Lokalisierung in best. Sprache Seite 13
Die Platform Hilfsklasse Seite 14
Extension Points Mit rein OSGi: Unkontrollierte Erweiterungen über direkte Zugriffe auf Klassen in exportierten Packages. Eclipse Plugins: Kontrollierte Erweiterungen über explizite Definition der Erweiterungspunkten (Extension Points) und Konfiguration der Erweiterungen (Extensions). Bestandteile eines Extension Points Id Name Extension Point Schema (beschreibt, wie eine Extension konfiguriert werden muss) Seite 15
Extension Points: Beispiel Activator de.fau.i11.eclipsetutorial.lesson1 IListProvider public interface IListProvider { String[] getentries(); } IListProvider MyListProvider de.fau.i11.eclipsetutorial.lesson1.model Seite 16
Extension Points: Beispiel plugin.xml <extension-point id="listprovider" name="list Provider" schema="schema/listprovider.exsd"/> listprovider.exsd Seite 17
Extension Points: Beispiel plugin.xml <extension point="de.fau.i11.eclipsetutorial.lesson1.listprovider"> <model name="mitarbeiter" class="de.fau.i11.eclipsetutorial.lesson1.model.mymodel"/> </extension> Seite 18
Extension Points: Beispiel Auf Extension zugreifen IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(ListPlugin.PLUGIN_ID, "listprovider").getextensions(); IConfigurationElement[] configurations = extensions[0].getconfigurationelements(); for (IConfigurationElement conf : configurations){ if (conf.getname().equals( model )) return(ilistprovider)conf.createexecutableextension( class ); } Seite 19
Architekturbaustein: Platform Runtime Seite 20
PDE Projekterstellung aus Vorlagen Unterstützung bei Modifikation plugin.xml, MANIFEST.MF und Extension Point Schema Build&Run von Plugins Seite 21
Übung 1: SimpleView 1. Plugin SimpleView erstellen aus Vorlage Plug-in with a View mit Darstellung einer Liste. Generierten Quellcode analysieren. 2. Debugging der Aufrufhierarchie für die Methode start() in der Aktivator-Klasse (Step return) 3. Stelle finden, an der Listenelemente definiert sind und Listenelemente modifizieren. 4. Stelle finden, an der das Elementsymbol definiert ist und anderes Symbol für Listeneintrag auswählen Seite 22
Übung 2: Logging Hilfsklasse 1. Hilfsklasse für Logging erstellen mit den Methoden info(string msg) error(string msg) Beispielcode für Logging Activator.getDefault().getLog().log( new Status(IStatus.INFO, ListPlugin.getDefault().PLUGIN_ID, IStatus.OK, message, null)); Logging in SimpleView beispielhaft integrieren Seite 23
Übung 3: Test-Plugin schreiben Neues Plugin ohne Vorlage erstellen Abhängigkeit zum JUnit-Plugin hinzufügen Abhängigkeit zum SimpleView-Plugin hinzufügen Testfall im Plugin schreiben, der testet, ob die definierten Elemente auch alle in der Liste vorhanden sind. Code zum Zugriff auf Elemente der Liste: view = (SimpleView)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(VIEW_ID); IStructuredContentProvider contentprovider = (IStructuredContentProvider)view.getViewer().getContentProvider(); Object[] elements = contentprovider.getelements(view.getviewer().getinput()); Seite 24
Übung 4: Extension Point für Model erstellen Wie im Vortrag beschrieben den Extension Point IListProvider für das Plugin SimpleView erstellen. Wie im Vortrag beschrieben ein Plugin erstellen, das als Extension die IListProvider Schnittstelle implementiert. Seite 25
Startup http://www.eclipse.org/downloads http://download.eclipse.org/technology/subversive/0.7/update-site http://www.junitfactory.com/update AspectJ Tools http://www.eclipse.org/ajdt Seite 26
Weiterführende Themen Re-Export von Bundles Extension Point Grammatiken Integration: Nutzung von ActiveX Komponenten Eclipse Adaptoren Seite 27
Quellen [1] John Arthorne; Chris Laffra, 2004: Official Eclipse 3.0 FAQs [2] Eric Clayberg; Dan Rubel, 2006: Eclipse: Building Commercial-Quality Plug-ins, Second Edition [3] IBM, 2006: Eclipse Platform Technical Overview http://www.eclipse.org/articles/whitepaper-platform-3.1/eclipse-platform-whitepaper.pdf [4] Platform Extension Points Reference: http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/extensio n-points/index.html Seite 28
Backup Seite 29
Die Workbench Seite 30
Ressource (Resource): Informationseinheit Sicht (View) Navigation auf Ressourcen Eigenschaften von Ressourcen anzeigen / manipulieren Alle Änderungen werden direkt gespeichert Nur eine Instanz pro Perspektive Zustände: unsichtbar, inaktiv, aktiv Fast Views im Fußbereich als Icons für Views, die viel Platz brauchen, aber nicht immer präsent sein müssen. Editor Bearbeitung einer Ressource Open/Close/Save Mimik Mehrere Instanzen möglich Perspektive (Perspective) Kombination aus Views und Editoren Offene Editoren aus anderen Perspektiven werden übernommen Aktion (Action) Kontextmenü (Context Menu) Werkzeugleiste (Toolbar) Wizards Seite 31
Beispiel: JDT Seite 32