Your SlideShare is downloading. ×

Eclipse Magazin 14 - Getting hooked on Equinox

935

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
935
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Enterprise Equinox-Erweiterung Equinox erweitern und modifizieren Getting Hooked on Equinox Speaker @ Quellcode >> MARTIN LIPPERT UND HEIKO SEEBERGER auf CD stallieren, zu deinstallieren oder zu aktu- Viele verwenden Equinox als fertige OSGi Runtime, auf deren Basis alisieren. Zusätzlich dazu realisiert dieser Layer auch einen Event-Mechanismus, vorhandene Anwendungen erweitert oder neu implementiert werden. über den OSGi das System über Zu- Dazu kann Equinox in der Regel out-of-the-box verwendet werden. Was standsänderungen benachrichtigt. Der dritte Layer ist der Service Layer. Dieser passiert aber, wenn diese Box nicht das leistet, was benötigt wird? Equi- implementiert das OSGi-Servicekon- nox bietet einen eleganten und wertvollen Mechanismus, um in solchen zept, mit dem Bundles innerhalb einer Java Virtual Machine serviceorientiert Situationen die Runtime selbst zu erweitern und zu modifizieren. zusammenarbeiten können. Die Anbindung dieser Layer an eine konkret zugrunde liegende Plattform E wird durch das Framework Adaptor API quinox ist nicht nur Lieferant einer soll der konzeptionelle Aufbau von hergestellt. Der FrameworkAdaptor de- OSGi-Implementierung und erlaubt Equinox betrachtet werden. niert das Format der Bundles, realisiert es damit, Anwendungen auf Basis von Equinox realisiert einerseits die drei den Zugriff auf Ressourcen der Bundles OSGi zu entwickeln. Die Equinox Run- OSGi Framework Layer: Der Module Lay- über den Classloading-Mechanismus time selbst ist mit dem Blick auf Erwei- er ist dafür zuständig, das OSGi-Modul- und verwaltet die Speicherung der persis- terbarkeit realisiert und bietet einen sehr Konzept in Form von Bundles umzuset- tenten Daten der OSGi Runtime. mächtigen Mechanismus, um die OSGi zen sowie die Abhängigkeiten zwischen Natürlich bringt Equinox eine Stan- Runtime zu erweitern oder zu modi zie- Bundles zu verwalten und aufzulösen. dardimplementierung des Framework- ren [1]. Zunächst soll ein Blick auf den Dazu gehört auch das umfangreiche De- Adaptors mit. Dieser BaseAdaptor er- Aufbau geworfen werden. legationsmodell, mit dem die im Bundle- laubt es, durch so genannte Framework Manifest de nierten Sichtbarkeiten von Aufbau der Equinox-OSGi- Extensions alle drei Bereiche (Bundle- Packages zwischen Bundles realisiert Implementierung Formate, Classloading und Persistent werden. Der Life Cycle Layer kontrol- Storage) zu erweitern. Dazu bietet die- liert den Lebenszyklus von Bundles und Bevor der Erweiterungsmechanismus ser BaseAdaptor einen umfangreichen gestattet es, Bundles zur Laufzeit zu in- von Equinox im Detail vorgestellt wird, 89 www.eclipse-magazin.de eclipse magazin Vol. 14
  • 2. Enterprise Equinox-Erweiterung Abb. 1: AdaptorHook klinkt sich direkt Konzep- in verschiedene Methoden des Frame- tioneller workAdaptors bzw. des BaseAdap- Aufbau der tors ein. So kann z.B. beim Starten und Equinox- Stoppen der OSGi Runtime eingegrif- OSGi-Im- fen oder die Behandlung von Laufzeit- plemen- fehlern erweitert werden. tierung [2] BundleFileFactoryHook ist es Abb. 2: Der Aufbau des Base Framework Adaptors [2] möglich, spezielle Formate für Bundles zu verwenden, die über den Equinox- Das führt zur nächsten Frage: Wie Standard (JARs und Verzeichnisse) hi- werden HookCon gurators von Equi- nausgehen. nox erkannt? Der eleganteste Weg führt BundleFileWrapperFactoryHook über die Datei hookcon gurators.pro- ermöglicht es, den Zugriff auf die Res- perties, die von Equinox im Root von sourcen eines Bundles zu wrappen, Framework Extensions erwartet wird, z.B. um Security zu implementieren, und dort die Property hook.con gura- oder den Inhalt von einzelnen Res- Hook-Mechanismus, der es sehr einfach tors. So kann eine Fragment Extension sourcen beim Laden gezielt zu mani- erlaubt, an vordefinierten Stellen die selbst angeben, welche HookConfi- pulieren. Standardfunktionalität zu erweitern. gurators sie liefert. Über die System BundleWatcher kann der Hookable Adaptor Properties osgi.hook.configurators. Lifecycle von Bundles verfolgt werden, include bzw. osgi.hook.con gurators. wobei für jeden Statusübergang Start- Vor Eclipse 3.2 war es nötig, für jegli- exclude können weitere bekannt gege- und End-Events propagiert werden. che Anpassungen oder Erweiterungen ben bzw. vorhandene ausgeschlossen Die Funktionalität ist jedoch ähnlich einen eigenen FrameworkAdaptor zu werden. wie bei den OSGi BundleListenern. implementieren, entweder komplett ClassLoadingHook dient dazu, das oder durch Erweiterung der gegebenen Ein Beispiel Classloading-Verhalten zu modi zie- Standardimplementierung. Existierten ren. So kann zum Beispiel der Bytecode mehrere, voneinander unabhängige Er- Die Framework Extension de.meta- modi ziert werden, bevor eine Klasse weiterungen (also mehrere Framework- nanz.demo.equinox.extension enthält in der Virtual Machine de niert wird. Adaptors), konnte allerdings nur einer mit dem DemoHook einen AdaptorHook, StorageHook wird für das Spei- davon von Equinox verwendet werden der beim Starten und Stoppen der OSGi chern und Laden von installierten (System Property osgi.adaptor), weil es Runtime Trace Messages auf der Konsole Bundles verwendet. konzeptionell nur einen Framework- ausgibt. Weiterhin implementiert Demo- Adaptor zur Laufzeit geben kann. Hook auch HookCon gurator, wobei er Da es sich bei den Hooks um Erweite- Seit Eclipse 3.2 sieht der Standard- sich selbst registriert und dabei ebenfalls rungen der Standardfunktionalität der FrameworkAdaptor, der oben erwähnte eine Trace Message ausgibt. In Listing 1 OSGi Runtime handelt, die zum Groß- BaseAdaptor, explizit Erweiterungs- sehen wir, wie mit der ersten Methode teil im System Bundle org.eclipse.osgi möglichkeiten in Form von so genannten das HookCon gurator Interface imple- implementiert ist, kommen so genannte Hooks vor, weshalb er auch als Hook- mentiert wird, indem das eigene Objekt Framework Extensions zum Einsatz. able Adaptor bezeichnet wird. Im Ge- bei der übergebenen HookRegistry an- Eine Framework Extension ist ein Frag- gensatz zu selbst de nierten Framework- gemeldet wird. Die restlichen Methoden ment Bundle zum System Bundle, d.h. Adaptors kann es zur Laufzeit nun belie- erfüllen das Interface AdaptorHook. der Fragment Host ist system.bundle big viele dieser Hooks geben. Sie werden Um dieses Beispiel im Eclipse SDK bzw. org.eclipse.osgi. Damit Fragment alle vom BaseAdaptor entsprechend auszuführen, ist es erforderlich, das Sys- Extensions von Equinox verwendet wer- berücksichtigt. Es können also mehre- tem Bundle org.eclipse.osgi als Source den, müssen sie über die System Property re Erweiterungen (in Form von Hooks) in den Workspace zu importieren (im osgi.framework.extensions bekannt ge- gleichzeitig zum Einsatz kommen. Vom mitgelieferten Beispiel-Workspace be- geben werden, als JAR vorliegen und im Equinox-Team wird ausdrücklich emp- reits enthalten), damit die Framework Dateisystem im gleichen Verzeichnis wie fohlen, diesen Hook-Mechanismus zu Extension zur Laufzeit im selben Ver- das System Bundle liegen. verwenden und keinen eigenen Frame- zeichnis liegt wie das System Bundle Um Equinox einzelne Hooks be- workAdaptor mehr zu implementieren. (siehe oben). Zum Ausführen wird eine kannt zu machen, müssen sie über so ge- Falls dies aufgrund von besonderen An- OSGi Framework Run Configuration nannte HookCon gurators bzw. deren forderungen nicht möglich ist, sollte ein (im mitgelieferten Beispiel-Workspace addHooks()-Methode bei der HookRe- entsprechender Bug gemeldet werden. bereits enthalten) verwendet, welche die gistry registriert werden. Dabei ist es ein Workspace Bundles org.eclipse.osgi und Hook Interfaces geläu ges Pattern, dass konkrete Hooks de.metafinanz.demo.equinox.extensi- sowohl ein spezielles Hook Interface als on enthält und die System Property osgi. Welche verschiedenen Möglichkeiten auch HookCon gurator implementie- framework.extensions mit dem Wert bietet Equinox nun, um die Standard- ren und sich somit selbst registrieren. funktionalität zu erweitern? de.meta nanz.demo.equinox.extension 90 eclipse magazin Vol. 14 www.eclipse-magazin.de
  • 3. Enterprise Equinox-Erweiterung sparen. Andererseits müssen die Klas- belegt. Die passende hookcon gurators. sen nicht aufwändig geladen werden, properties-Datei ist ebenfalls schon fertig wenn sie bereits im Cache liegen, was in der Framework Extension enthalten: Performance-Vorteile bringt. Das nor- hook.configurators=de.metafinanz.demo.equinox. URLClassLoader ein und wirkt sich extension.DemoHook damit nicht auf eine Equinox-basierte Existierende Erweiterungen OSGi-Anwendung aus, da dort spe- Abb. 3: Ausgabe des Beispiels zielle ClassLoader zum Einsatz kom- Wofür man diesen Mechanismus bei- men. Mit passenden Hooks lässt sich spielsweise einsetzen kann, zeigen einige aber das Classloading von Equinox so existierende Hook-Implementierungen: blem aussehen, durch die normalen OS- Gi- oder Equinox-Mechanismen lösen. angesprochen wird und so das Class - Der Hook-Mechanismus sollte wirklich Sharing auch für OSGi-Anwendungen reits Hook-Implementierungen, die un- ausschließlich für Spezial-Lösungen nutzbar wird. ter der Haube verwendet werden. Der herangezogen werden, die sich mit den Eclipse LazyStart Header im Bundle- OSGi- und Equinox-Bordmitteln nicht Equinox-Aspects-Incubator-Projekt Manifest wird beispielsweise durch lösen lassen und gleichzeitig eine echte nutzt den Hook-Mechanismus von den EclipseLazyStarter realisiert, der und vor allem OSGi-konforme Erwei- Equinox, um Aspect Weaving beim einen ClassLoadingStatsHook sowie terung der Runtime darstellen. Dann Laden der Klassen durchzuführen einen AdaptorHook registriert und ein aber bietet der Hook-Mechanismus von (Load-Time Weaving). Dort wird u.a. Bundle beim Zugriff auf dessen Klas- Equinox einen beeindruckenden Reich- der ClassLoadingHook verwendet, um sen aktiviert. Weitere intern genutzte tum an Möglichkeiten, der nicht zuletzt den Bytecode der geladenen Klassen Hooks sind unter [3] beschrieben. auch Spaß beim Ausschöpfen macht. per Aspect Weaving zu modi zieren. - Zusätzlich wird der BundleFileWrap- bator-Projekt aus dem Equinox-Um- perFactoryHook genutzt, um durch feld erlaubt es, mittels unterschiedlicher Heiko Seeberger leitet die Market Unit Enterprise Architecture der das Weaving entstehende zusätzliche Techniken Ressourcen eines Bundles zu metafinanz GmbH (www.metafinanz. Abhängigkeiten zwischen Bundles modi zieren, bevor auf sie zugegriffen de). Er erstellt seit etwa zehn mittels Modifikationen am Bundle- wird. Die Modi zierungen können mit Jahren Enterprise-Anwendungen Manifest zu ermöglichen. unterschiedlichen Techniken vorge- mit Java, wobei sein aktueller Fokus auf Eclipse nommen werden. Ein besonders attrak- und AspectJ liegt. Kontakt: heiko.seeberger@ Situationen, in denen Class-Dateien tives Beispiel ist, die plugin.xml-Dateien metafinanz.de. nicht im üblichen Class-File-Format mittels XSLT zu transformieren, um ausgeliefert werden. Stattdessen kom- beispielsweise de nierte Extensions je Martin Lippert ist Senior-IT-Berater men spezialisierte Formate zum Ein- nach eingeloggtem Benutzer auszublen- bei der akquinet it-agile GmbH. Er ar- satz. den. Damit könnte man elegant den Ex- beitet dort als Coach und Berater für tension-Point-Mechanismus mit einem agile Softwareentwicklung, Refacto- Fazit Autorisierungskonzept verbinden. ring und Eclipse-Technologie und ist Zunächst sei noch einmal darauf hinge- Committer im Eclipse-Equinox-Incubator-Projekt. [6] für Java bietet einen Mechanismus wiesen, dass dieser Hook-Mechanismus Kontakt: martin.lippert@akquinet.de. an, bereits geladene Klassen in einem nicht zum Standard für jede Anwen- Cache abzulegen, um damit einerseits dung werden sollte. In der Regel lassen zwischen parallel laufenden VM- sich die meisten Herausforderungen, >> Links & Literatur Instanzen die geladenen Klassen ge- auch wenn sie vielleicht auf den ersten meinsam zu benutzen, um Speicher zu Blick nach einem Classloading-Pro- [ 1] Informationen zum Aufbau der Equinox- Runtime: www.eclipsecon.org/2007/ index.php?page=sub/&id=3762 Listing 1 [2] Chris Laffra, Thomas Watson, Matthew Webster: Getting Hooked on the Equinox Die Hook-Implementierung Framework, IBM, EclipseCon 2007, Crea- public class DemoHook implements HookConfigurator, (“- DemoHook.frameworkStart()”); tive Commons Att. Nc Nd 2.5 license AdaptorHook { } [3] Beschreibung der Technik: wiki.eclipse.org/ public void frameworkStop(final BundleContext Adaptor_Hooks public void addHooks(final HookRegistry hookRegistry) { context) { [4] Equinox Transforms: wiki.eclipse.org/ hookRegistry.addAdaptorHook(this); System.out.println(“- DemoHook.frameworkStop()”); Equinox_Transforms System.out.println(“- DemoHook.addHooks()”); } [5] J9 Class Sharing: www.ibm.com/ } developerworks/java/library/j-ibmjava4 // Other AdaptorHook methods are implemented empty public void frameworkStart(final BundleContext // and not shown here! [6] IBM J9 VM: wiki.eclipse.org/J9 context) { } [7] Equinox-Aspects-Incubator: www.eclipse. System.out.println org/equinox/incubator/aspects/index.php 91 www.eclipse-magazin.de eclipse magazin Vol. 14

×