JAX 08 - Experiences using Equinox Aspects in a real-world Project
Eclipse Magazin 14 - Getting hooked on Equinox
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