260 likes | 494 Views
Eclipse. Plugin Design Patterns in. Vortrag im Rahmen des Seminars Software Design Patterns 23.06.2004. Einleitung. Inhalt. Allgemeines zu Plugins Vom Starten der Applikation bis zum Benutzen der Plugin Funktionalität Umsetzung in Eclipse Eclipse Plugin Grundlagen
E N D
Eclipse Plugin Design Patternsin Vortrag im Rahmen des Seminars Software Design Patterns 23.06.2004
Einleitung Inhalt • Allgemeines zu Plugins • Vom Starten der Applikation bis zum Benutzen der Plugin Funktionalität • Umsetzung in Eclipse • Eclipse Plugin Grundlagen • Konzepte im Eclipse Plugin Mechanismus • Fazit
Einleitung Motivation Ein Programm soll um Funktionen erweitert werden können. Diese sind zur Entwicklungszeit des Programms jedoch noch nicht bekannt.
Allgemein Begriffe Plugin: Software, die ein Programm um Funktionalität erweitert Hostanwendung: Software, die erweiterbar sein soll
Allgemein Ladevorgang und Zugriff • Starten der Hostanwendung • Suchen der Plugins • Konfigurationsdatei • Festes Verzeichnis • Laden und Instanziieren der Plugins • Zur Ladezeit der Hostanwendung • Wenn Funktion benötigt (Lazy Loading) • Nutzen der Funktionalität des Plugins • Reflection • Callback Interface
Beispiele Beispiel 1 • Berechnungsklasse • Rechenoperationen als Plugins • Festes Plugin Verzeichnis • Plugins werden zur Ladezeit der Hostanwendung geladen • Suchen der Methoden über Reflection
Beispiele Beispiel 2 • Callback Interfaces anstatt Reflection
Beispiele Beispiel 3 • Laden der Plugins bei Bedarf der Funktionalität (Lazy Loading) kürzere Ladezeit der Hostanwendung
Umsetzung in Eclipse Ladevorgang und Zugriff in Eclipse (1) • Starten von Eclipse • Durchsuchen eines festgelegten Verzeichnisses nach Plugins (Eclipse/plugins)
Umsetzung in Eclipse Plugin Verzeichnis (1)
Umsetzung in Eclipse Plugin Verzeichnis (2) Verzeichnis: Eclipse/plugins/org.junit_3.8.1 • junit.jar • plugin.xml • Icons • Weitere Ressourcen
Umsetzung in Eclipse Ladevorgang und Zugriff in Eclipse (2) • Parsen der Manifest Datei jedes Plugins • Aufbau der Plugin Registry • Instanziierung über Lazy Loading • Zugriff über Callback Interface
Plugin Grundlagen Begriffe in Eclipse Host Plugin Extender Plugin 1 Extension Points Extension Member1 Member2 Member3 Extender Plugin 2
Plugin Grundlagen Plugin Manifest <?xml version="1.0" encoding="UTF-8"?> <plugin id="de.hdm.dp.plugins.helloworld" name="Hello World Plugin" version="1.0.0" class="de.hdm.dp.plugins.example.HelloWorldPlugin"> <requires> <importplugin="org.eclipse.core.resources"/> <importplugin="org.eclipse.ui"/> </requires> <extensionpoint="org.eclipse.ui.actionSets"> <actionSetlabel="My Action Set„ id="de.hdm.dp.plugins.helloworld.actionSet"> <menulabel="My Menu"id="myMenu"> <separatorname="myGroup"/> </menu> <action label="My Action" icon="icons/sample.gif" tooltip="Hello, Eclipse world" class="de.hdm.dp.plugins.example.actions.HelloWorldAction" menubarPath="myMenu/myGroup" id="de.hdm.dp.plugins.actions.HelloWorldAction"> </action> </actionSet> </extension> </plugin> • Extensions • Dependencies • Identifier • GUI Informationen • Konfiguration • Extension Point Definitionen
Plugin Grundlagen Definition eines Extension Points <?xml version="1.0" encoding="UTF-8"?> <plugin id="org.eclipse.ui" name="Eclipse UI" version="2.1.0" provider-name="Eclipse.org" class="org.eclipse.ui.internal.UIPlugin"> <extension-pointid="actionSets"name="Action Sets" schema="schema/actionSets.exsd"/> </plugin>
Plugin Grundlagen Extension Point Schema Definition <schematargetNamespace="org.eclipse.ui"> <elementname="actionSet"> <complexType> <sequence> <elementref="menu"minOccurs="0"maxOccurs="unbounded"/> <elementref="action"minOccurs="0"maxOccurs="unbounded"/> </sequence> <attributename="id"type="string"use="required"></attribute> <attributename="label"type="string"use="required"></attribute> <attributename="visible"type="boolean"></attribute> <attributename="description"type="string"></attribute> </complexType> </element> <elementname="action"> <complexType> <choice> <elementref="selection"minOccurs="0"maxOccurs="unbounded"/> <elementref="enablement"minOccurs="0"maxOccurs="1"/> </choice> <attributename="id"type="string"use="required"></attribute> <attributename="label"type="string"use="required"></attribute> <attributename="toolbarPath"type="string"> <attributename="icon"type="string"></attribute> <attributename="tooltip"type="string"></attribute> <attributename="class"type="string"></attribute> </complexType> </element> </schema>
Konzepte Ladevorgang im Detail • Aufbau der Plugin Registry beim Start von Eclipse aus Plugin Manifest Dateien • Host Plugin muss beim Aufruf sämtliche Extender Plugins instanziieren Informationen aus Platform API • Aufruf des Default Konstruktors der Callback Klasse • eventuelles setzen der Konfigurationsparameter • Einmal geladene Plugins bleiben bis zum Beendenvon Eclipse aktiv
Konzepte Lazy Loading Problem: • Rekursive Instanziierung aller Callback Klassen zeitaufwändig Lösung: • Instanziieren „leichter“ Dummy Objekte instanziieren bei Bedarf die eigentlichen Callback Objekte leiten Aufrufe an Callback Objekte weiter • Auslagern der GUI Informationen in Plugin Manifest
Konzepte Lazy Loading – Virtual Proxy Host Plugin Extender Plugin instantiates
Konzepte Lazy Loading – Virtual Adapter Eclipse Host Plugin Extender Plugin instantiates
Konzepte Service Extension Pattern • Ein Event im Host Plugin bewirkt das Aufrufen von einem Callback Objekt eines Extender Plugins Extender Plugin 1 Host Plugin Event1 Extender Plugin 2
Konzepte Listener Extension Pattern (1) • Art des Observer Patterns • Registrierung als Listener/Observer für ein bestimmtes Event bei einem Host Plugin • Registrierung über das Erweitern eines Extension Points des Host Plugins • Callback Interface entspricht Observer Interface im Observer Pattern
Konzepte Listener Extension Pattern (2) • Ein Event im Host Plugin bewirkt das Aufrufen sämtlicher Callback Objekte der registrierten Extender Plugins Extender Plugin 1 Host Plugin Member 1 Member 2 Event Extender Plugin 2
Fazit Fazit • Heutige Programme kommen an einem Plugin Konzept nicht vorbei. • Eclipse stellt durch seine flexiblen Erweiterungs-möglichkeiten ein sehr mächtiges Plugin Konzept zur Verfügung, das wesentlicher Bestandteil des Erfolges der Eclipse IDE ist.
Quellen • Notes on the Eclipse Plug-in Architecture(Azad Bolour)http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html • Eclipse Platform Technical Overview(Object Technology International, Inc.)http://www.eclipse.org/whitepapers/eclipse-overview.pdf
Fragen Fragen zum Thema?