36
AOP im Einsatz mit OSGi und RCP Martin Lippert, Peter Friese und Heiko Seeberger

W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

AOP im Einsatz mit OSGi und RCP

Martin Lippert, Peter Friese und Heiko Seeberger

Page 2: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP2/?

Agenda

• Einführung

• Aspect-Weaving im Überblick

• Aspect-Weaving für OSGi:– Equinox Aspects

• Anwendungsfall: Security für Eclipse-RCP

• Abschluss

Page 3: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP3/?

Aspektorientierte Programmierung

• Modularisierung mit OO-Mitteln ist gut– Klassen, Interfaces, Vererbung, etc.

• AOP ergänzt die OO-Mittel– AOP modularisiert „Cross-Cutting Concerns“

ClassA ClassB ClassC AspectX

ConcernXConcernXConcernX

ConcernXConcernX

ConcernX

ConcernX

Page 4: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP4/?

AOP im Einsatz

• Mittlerweile etabliertes Werkzeug– AspectJ: Eine mächtige Spracherweiterung für Java

– Spring AOP: Einfache Handhabung für Enterprise-Anwendungen

– App-Server: Verwenden intern AOP-Mittel

Page 5: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP5/?

AspectJ = AOP für Java

• Mächtige AOP-Erweiterung für Java

• Eclipse-Projekt: www.eclipse.org/aspectj

• Gute Tool-Unterstützung:– AJDT für Eclipse

– Spring-IDE für Eclipse• Für die Verbindung von Spring-AOP und AJDT

Page 6: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP6/?

Wie funktioniert es?

• Der Standard-Fall:– AspectJ compiliert die Aspekte und verwebt diese

(Compile-Time Weaving)

– Sehr gute Unterstützung in der IDE• Inkrementelles Compilieren

• Marker und Crosscutting View

– Transparente Technologie für den Entwickler

Page 7: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP7/?

Der Standard-Fall

Java Virtual MachineJava Virtual Machine

App-Classloader

Projekt-Sourcen

ClassA ClassB ClassC AspectX

ConcernXConcernXConcernX

ConcernXConcernX

ConcernX

ConcernX

Page 8: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP8/?

Aspect-Libraries

• Aspekte werden mit AspectJ compiliert und in ein JAR-File verpackt– Z.B. auch abstrakte Aspekte

• Verweben mit anderen Klassen und Aspekten beim Build– In der IDE oder beim „Headless Build“

– Als ob die Aspekte direkt in der IDE vorhanden wären

Page 9: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP9/?

Java Virtual MachineJava Virtual Machine

Aspect-Libraries

App-Classloader

JARProjekt-Sourcen

ClassA ClassB ClassC AspectX

ConcernXConcernXConcernX

ConcernXConcernX

ConcernX

ConcernX

Page 10: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP10/?

„Projektfremde“ Targets

• Was passiert, wenn sich Aspekte auf vorcompilierte Klassen auswirken sollen?– Bibliotheken

– Frameworks

– andere Projekte

– etc.

Page 11: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP11/?

„Projektfremde“ Targets

Java Virtual MachineJava Virtual Machine

App-Classloader

Projekt-SourcenJARs

ClassA ClassB ClassC AspectX

ConcernXConcernXConcernX

ConcernXConcernX

ConcernX

ConcernX

Page 12: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP12/?

Variante 1: Compile-Time

• Der Compiler bekommt die JARs und webt die Aspekte direkt in die JARs ein

• Vor- und Nachteile:+ Direkt in der IDE

+ Zur Auslieferung ist alles fertig

- Alle Libs und Bibliotheken müssen bekannt und veränderbar sein

- Wenn sich etwas verändert, muss neu gebaut werden

Page 13: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP13/?

Variante 2: Load-Time

• Aspect-Weaving beim Laden der Klassen in die VM (Load-Time Weaving - LTW)

• Vor- und Nachteile:+ Kann sogar mit System-Libs umgehen

+ Funktioniert, auch wenn sich etwas verändert

+ Es müssen nicht alle Libs bekannt sein

- Kostet einmalig beim Laden der Klasse Performance

- Man sieht nicht alles in der IDE

Page 14: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP14/?

Load-Time Weaving

• Modularisierung kann lange aufrecht erhalten werden

• Aber nur, solange Aspekte und Klassen durch den gleichen Classloader geladen werden– Normalerweise der App-Classloader

Page 15: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP15/?

Aspekte und Bundles

• Im Kontext von OSGi werden Klassen innerhalb von Bundles gekapselt– Echte Modularisierung oberhalb von Packages

• Unser Ziel: Aspekte in Bundles modularisieren

• Aber: Jedes Bundle hat einen eigenen Classloader

Page 16: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP16/?

LTW und OSGi ?

• OSGi basiert auf einer ausgefeilten Class Loading Architecture.

• AspectJ Doc: „All load-time weaving is done in

the context of a class loader …“.

Herausforderung: Wie können die beiden Ansätze zusammengebracht werden?

Page 17: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP17/?

Java Virtual MachineJava Virtual Machine

Bundle-Classloader

Bundle A

Bundle-Classloader

Bundle B

LTW und OSGi ?

Bundle-Classloader

Bundle C

ClassA ClassB ClassC AspectX

ConcernXConcernXConcernX

ConcernXConcernX

ConcernX

ConcernX

????

Page 18: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP18/?

LTW in OSGi integrieren

• Aspekte werden in Bundles verpackt.

• OSGi-Runtime wird angepasst, sodass das Weaving beim Class Loading erfolgt.

Lösung: OSGi-Classloader erledigen das Aspect-Weaving beim Laden einer Klasse

Page 19: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP19/?

• Weaving erzeugt neue Abhängigkeiten, die nicht im Bundle-Manifest definiert sind.

Herausforderung: Wie können die Aspekte von der Klasse aufgelöst werden?

Abhängigkeiten

<<pointcut || advice>>

<<weaving>>

ClassA

BundleA

AspectX

BundleX

Page 20: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP20/?

Dynamische Abhängigkeiten

Lösung: Die Weaving-Runtime fügt die benötigten Abhängigkeiten dynamisch ein.

• Dazu muss die OSGi-Runtime entsprechend angepasst werden.

Page 21: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP21/?

Equinox Aspects

• Equinox-Incubator-Project– www.eclipse.org/equinox/incubator/aspects

• Framework Ext. org.aspectj.osgi.

• ClassLoadingHook bindet Weaving ein.

• BundleFileWrapperFactoryHook berücksichtigt die „neuen“ Abhängigkeiten.

• Weaving und Caching als OSGi-Services.

Page 22: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP22/?

Equinox Aspects verwenden 1

• aop.xml-Dateien:– Nur die aufgeführten Aspekte werden beim Weaving

berücksichtigt.

– Müssen in exportierten Packages liegen.

– Werden bekannt gegeben über: org.aspectj.weaver.loadtime.configuration, z.B. …configuration=org/aspectj/aop.xml.

Page 23: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP23/?

Equinox Aspects verwenden 2

• Spezielle Manifest-Header für Aspect-Bundles, z.B. Eclipse-SupplementBundle.

• Aufgeführte Bundles erhalten zur Laufzeit Abhängigkeit auf das Aspect-Bundle.

Eclipse-SupplementBundleClassA

BundleA

AspectX

BundleX

Require-Bundle

Page 24: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP24/?

Equinox Aspects verwenden 3

• Co-Location von org.eclipse.osgi und org.aspectj.osgi

• osgi.framework.extensions=org.aspectj.osgi

Page 25: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP25/?

Demo: Equinox Aspects

Page 26: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP26/?

AJEER

• „AspectJ-enabled Eclipse Runtime“:– Frühes Projekt zu AspectJ-Load-Time-Weaving für die

Eclipse-Runtime• Gab es schon für Eclipse 2.1, jetzt bis 3.3

– Aspekte werden per Extension-Point bekanntgemacht

• Mündet in Equinox Aspects

Page 27: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Anwendungsfall: Security

• Was soll erreicht werden?– Actions deaktivieren

– Ausführung von Actions verhindern

• Umsetzungsmöglichkeiten– Eigene Basisklasse für Actions einführen

– Capabilities

– Aspekte nutzen

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP27/?

Page 28: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

AJEER verwenden 1

• Security Aspekt in separatem Bundle

• Actions in anderen Bundles werden advised

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP28/?

org.eclipse.ajeer.weavingruntime.aspectsAJEER

SecurityAspect

Security-Bundle

ActionA

BundleA

ActionB

BundleB

ActionC

BundleC

Page 29: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

AJEER verwenden 2

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP29/?

Aspekt definieren

Page 30: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

AJEER verwenden 3

<extension

point="org.eclipse.ajeer.weavingruntime.aspects">

<aspect

class="jax.security.AuthorizationAspect"/>

</extension>

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP30/?

Aspekt über Extension Point anmelden

Page 31: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Demo: AJEER Aspects

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP31/?

Page 32: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Frontend

Security für Enterprise RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP32/?

org.eclipse.ajeer.weavingruntime.aspectsAJEER

SecurityAspect

Security-Bundle

Authenticator

Security-Connector

Backend

AccessControl

Page 33: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP33/?

Vielen Dank…

• … für die Aufmerksamkeit!!!

Martin Lippert ([email protected])

Peter Friese ([email protected])

Heiko Seeberger ([email protected])

Page 34: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP34/?

Zusatzmaterial

• Wie genau funktionieren die Adaptor-Hooks für Equinox?

Page 35: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP35/?

Equinox Hookable Adaptor

• Equinox ist sehr flexibel:– FrameworkAdaptor impl. oder erweitern.

– Hookable Adaptor (seit 3.2) bietet Hooks für „die wichtigsten“ Funktionalitäten.

• Hooks verwenden:– Framework Extension Bundle.

– HookConfigurator registriert Hooks.

Page 36: W-JAX 07 - AOP im Einsatz mit OSGi und RCP

Lippert, Friese, Seeberger - AOP im Einsatz mit OSGi und RCP36/?

Demo: Equinox Hookable Adaptor