Getting Hooked on Equinox

Abb. 4: Ausgabe des Beispiels
Existierende Erweiterungen

Wofür man diesen Mechanismus beispielsweise einsetzen kann, zeigen einige existierende Hook-Implementierungen:

  • Built-In: In Equinox befinden sich bereits out-of-the-box eine Reihe von Hook-Implementierungen, die unter der Haube verwendet werden, um der OSGi Runtime zusätzliche Funktionalitäten hinzuzufügen. Der Eclipse LazyStart Header im Bundle-Manifest wird beispielsweise durch den EclipseLazyStarter realisiert, der einen ClassLoadingStatsHook sowie einen AdaptorHook registriert und ein Bundle beim Zugriff auf dessen Klassen aktiviert, sofern der Eclipse LazyStart Header true ist. Weitere intern genutzte Hooks sind unter [3] beschrieben.
  • Equinox Transforms [4]: Dieses Incubator-Projekt aus dem Equinox-Umfeld erlaubt es, mittels unterschiedlicher Techniken Ressourcen eines Bundles zu modifizieren, bevor auf sie zugegriffen wird. Die Modifizierungen können mit unterschiedlichen Techniken vorgenommen werden. Ein besonders attraktives Beispiel ist, die plugin.xml-Dateien mittels XSLT zu transformieren, um beispielsweise definierte Extensions je nach eingeloggtem Benutzer auszublenden. Damit könnte man elegant den Extension-Point-Mechanismus mit einem Autorisierungskonzept verbinden.
  • J9 Class Sharing [5]: Die IBM J9 VM [6] für Java bietet einen Mechanismus an, bereits geladene Klassen in einem Cache abzulegen, um damit einerseits zwischen parallel laufenden VM-Instanzen die geladenen Klassen gemeinsam zu benutzen, um Speicher zu sparen. Andererseits müssen die Klassen nicht aufwändig geladen werden, wenn sie bereits im Cache liegen, was Performance-Vorteile bringt. Das normale J9 Class Sharing klinkt sich in den URLClassLoader ein und wirkt sich damit nicht auf eine Equinox-basierte OSGi-Anwendung aus, da dort spezielle ClassLoader zum Einsatz kommen. Mit passenden Hooks lässt sich aber das Classloading von Equinox so anpassen, dass dort die API der J9-VM angesprochen wird und so das Class Sharing auch für OSGi-Anwendungen nutzbar wird.
  • Load-Time Aspect Weaving: Das Equinox-Aspects-Incubator-Projekt nutzt den Hook-Mechanismus von Equinox, um Aspect Weaving beim Laden der Klassen durchzuführen (Load-Time Weaving). Dort wird u.a. der ClassLoadingHook verwendet, um den Bytecode der geladenen Klassen per Aspect Weaving zu modifizieren. Zusätzlich wird der BundleFileWrapperFactoryHook genutzt, um durch das Weaving entstehende zusätzliche Abhängigkeiten zwischen Bundles mittels Modifikationen am Bundle-Manifest zu ermöglichen.
  • Andere Class-File-Formate: Es gibt Situationen, in denen Class-Dateien nicht im üblichen Class-File-Format ausgeliefert werden. Stattdessen kommen spezialisierte Formate zum Einsatz, die beispielsweise speziell zusammengepackt oder vor-verifiziert sind, um Ressourcen in der ausführenden Umgebung zu schonen. Dies ist beispielsweise beim JXE-Format der Fall, welches für Embedded-JVMs zum Einsatz kommt. Entsprechende Hooks erlauben es dann, Bundle-Code im JXE-Format abzulegen.
Fazit

Zunächst sei noch einmal darauf hingewiesen, dass dieser Hook-Mechanismus nicht zum Standard für jede Anwendung werden sollte. In der Regel lassen sich die meisten Herausforderungen, auch wenn sie vielleicht auf den ersten Blick nach einem Classloading-Problem aussehen, durch die normalen OSGi- oder Equinox-Mechanismen lösen. Der Hook-Mechanismus sollte wirklich ausschließlich für Spezial-Lösungen herangezogen werden, die sich mit den OSGi- und Equinox-Bordmitteln nicht lösen lassen und gleichzeitig eine echte und vor allem OSGi-konforme Erweiterung der Runtime darstellen. Dann aber bietet der Hook-Mechanismus von Equinox einen beeindruckenden Reichtum an Möglichkeiten, der nicht zuletzt auch Spaß beim Ausschöpfen macht.

Heiko Seeberger leitet die Market Unit Enterprise Architecture der metafinanz GmbH (www.metafinanz.de). Er erstellt seit etwa zehn Jahren Enterprise-Anwendungen mit Java, wobei sein aktueller Fokus auf Eclipse und AspectJ liegt.

Martin Lippert ist Senior-IT-Berater bei der akquinet it-agile GmbH. Er arbeitet dort als Coach und Berater für agile Softwareentwicklung, Refactoring und Eclipse-Technologie und ist Committer im Eclipse-Equinox-Incubator-Projekt.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.