Plugin Design Patterns in Eclipse Vortrag im Rahmen


























- Slides: 26

Plugin Design Patterns in Eclipse Vortrag im Rahmen des Seminars Software Design Patterns 23. 06. 2004 Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de

Plugin Design Patterns in Eclipse Einleitung Inhalt • Allgemein Plugin • Vom Starten der Applikation bis zum Benutzen der Plugin Funktionalität • Umsetzung bei Eclipse • Konzepte in der Plugin Architektur von Eclipse • Konzepte • Plugin Patterns Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 2

Plugin Design Patterns in Eclipse Einleitung Motivation Ein Programm soll um Funktionen erweitert werden können. Diese sind zur Entwicklungszeit des Programms jedoch nicht bekannt. Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 3

Plugin Design Patterns in Eclipse Allgemein Begriffe Plugin: Software, die ein Programm um Funktionalität erweitert Hostanwendung: Software, die erweiterbar sein soll Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 4

Plugin Design Patterns in Eclipse 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 Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 5

Plugin Design Patterns in Eclipse Beispiel 1 • Berechnungsklasse • Rechenoperationen als Plugins • Festes Plugin Verzeichnis • Plugins werden zur Ladezeit der Hostanwendung geladen • Suchen der Methoden über Reflection Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 6

Plugin Design Patterns in Eclipse Beispiel 2 • Callback Interfaces anstatt Reflection Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 7

Plugin Design Patterns in Eclipse Beispiel 3 • Laden der Plugins bei Bedarf der Funktionalität (Lazy Loading) kürzere Ladezeit der Hostanwendung Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 8

Plugin Design Patterns in Eclipse Umsetzung in Eclipse Ladevorgang und Zugriff in Eclipse (1) • Starten von Eclipse • Durchsuchen eines festgelegten Verzeichnisses nach Plugins (Eclipse/plugins) Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 9

Plugin Design Patterns in Eclipse Umsetzung in Eclipse Plugin Verzeichnis (1) • Screen. Shot Plugin Verzeichnis Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 10

Plugin Design Patterns in Eclipse Umsetzung in Eclipse Plugin Verzeichnis (2) Verzeichnis: Eclipse/plugins/org. junit_3. 8. 1 • • junit. jar plugin. xml Icons Weitere Ressourcen Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 11

Plugin Design Patterns in Eclipse 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 Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 12

Plugin Design Patterns in Eclipse Grundlagen Plugin Begriffe in Eclipse Host Plugin Extender Plugin Extension Points Extension Member 1 Member 2 Member 3 EP kann von mehreren Plugin erweitert werden Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 13

Plugin Design Patterns in Eclipse Konzepte 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. Hello. World. Plugin"> <requires> <import plugin="org. eclipse. core. resources"/> <import plugin="org. eclipse. ui"/> </requires> • • Extensions Dependencies Identifier GUI Informationen <extension point="org. eclipse. ui. action. Sets"> <action. Set label="My Action Set„ id="de. hdm. dp. plugins. helloworld. action. Set"> <menu label="My Menu" id="my. Menu"> <separator name="my. Group"/> </menu> <action label="My Action" icon="icons/sample. gif" tooltip="Hello, Eclipse world" class="de. hdm. dp. plugins. example. actions. Hello. World. Action" menubar. Path="my. Menu/my. Group" id="de. hdm. dp. plugins. actions. Hello. World. Action"> </action. Set> </extension> </plugin> • • Konfiguration Extension Point Definitionen Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 14

Plugin Design Patterns in Eclipse Konzepte 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-point id="action. Sets" name="Action Sets" schema="schema/action. Sets. exsd"/> </plugin> Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 15

Plugin Design Patterns in Eclipse Konzepte Extension Point Schema Definition <schema target. Namespace="org. eclipse. ui"> <element name="action. Set"> <complex. Type> <sequence> <element ref="menu" min. Occurs="0" max. Occurs="unbounded"/> <element ref="action" min. Occurs="0" max. Occurs="unbounded"/> </sequence> <attribute name="id" type="string" use="required"> </attribute> <attribute name="label" type="string" use="required"> </attribute> <attribute name="visible" type="boolean"> </attribute> <attribute name="description" type="string"> </attribute> </complex. Type> </element> <element name="action"> <complex. Type> <choice> <element ref="selection" min. Occurs="0" max. Occurs="unbounded"/> <element ref="enablement" min. Occurs="0" max. Occurs="1"/> </choice> <attribute name="id" type="string" use="required"> </attribute> <attribute name="label" type="string" use="required"> </attribute> <attribute name="toolbar. Path" type="string"> <attribute name="icon" type="string"> </attribute> <attribute name="tooltip" type="string"> </attribute> <attribute name="class" type="string"> </attribute> </complex. Type> </element> </schema> Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 16

Plugin Design Patterns in Eclipse 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 Beenden von Eclipse aktiv Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 17

Plugin Design Patterns in Eclipse Konzepte Lazy Loading Problem: – Rekursive Instanziierung aller Callback Klassen zeitaufwändig Lösung: – Instanziieren „leichter“ Dummy Objekte instanziieren bei Bedarf eigentlichen Callback Objekte leiten Aufrufe an Callback Objekte weiter – Auslagern der GUI Informationen in Plugin Manifest Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 18

Plugin Design Patterns in Eclipse Konzepte Lazy Loading – Virtual Proxy Host Plugin Extender Plugin instantiates Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 19

Plugin Design Patterns in Eclipse Konzepte Lazy Loading – Virtual Adapter Eclipse Host Plugin Extender Plugin instantiates Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 20

Plugin Design Patterns in Eclipse Konzepte Service Extension Pattern • Ein Event im Host Plugin bewirkt das Aufrufen von einem Callback Objekt eines Extender Plugins Host Plugin Extender Plugin 1 Event 1 Extender Plugin 2 Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 21

Plugin Design Patterns in Eclipse 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 Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 22

Plugin Design Patterns in Eclipse Konzepte Listener Extension Pattern (2) • Ein Event im Host Plugin bewirkt das Aufrufen sämtlicher Callback Objekte der registrierten Extender Plugins Host Plugin Extender Plugin 1 Member 2 Event Extender Plugin 2 Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 23

Plugin Design Patterns in Eclipse Fazit • Heutige Programme kommen an einem Plugin Konzept nicht vorbei. • Eclipse stellt durch seine flexiblen Erweiterungsmöglichkeiten ein sehr mächtiges Plugin Konzept zur Verfügung, das wesentlicher Bestandteil des Erfolges der Eclipse IDE ist. Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 24

Plugin Design Patterns in Eclipse 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 Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 25

Plugin Design Patterns in Eclipse Fragen zum Thema? Markus Block mb 48@hdm-stuttgart. de Ronald Kutschke rk 10@hdm-stuttgart. de 26