Das Interceptor Muster Implementierung des Interceptor Musters basierend auf OSGi and Friends Benjamin Friedrich Hochschule für Technik und Wirtschaft des Saarlandes Praktische Informatik - Entwurfsmuster Sommersemester 2009 26.07.09 Entwurfsmuster 1
Interceptor Überblick Das Interceptor Muster Struktur Vor- und Nachteile Render Service Was ist OSGi? Equinox Eclipse als IDE für OSGi Komponenten Bundles Die Manifest Datei Services 26.07.09 Entwurfsmuster 2
Interceptor Überblick Dependency Management Probleme und Workarounds Fazit EOF Quellen 26.07.09 Entwurfsmuster 3
Interceptor - Das Interceptor Muster Architekturmuster Erlaubt es neue Dienste in ein Framework über vordefinierte Schnittstellen zu integrieren Dienste haben Zugriff auf das Framework um das Framework beobachten und sein Verhalten beeinflussen zu können Der Eintritt bestimmter Ereignisse im Framework triggert den automatischen Aufruf dieser Dienste 26.07.09 Entwurfsmuster 4
Interceptor - Das Interceptor Muster Ein Framework integriert seine Interceptoren (Dienste) in einen entsprechenden Dispatcher (Verteiler) Für jede Art von Interceptoren sollte es einen eigenen Dispatcher geben Sobald ein definiertes Ereignis im Framework auftritt, werden die Dispatcher vom Framework benachrichtigt Die Dispatcher rufen daraufhin ihre registrierten Interceptoren auf Interceptoren bekommen die Ereignisse in Form eines Context Objects mitgeteilt 26.07.09 Entwurfsmuster 5
Interceptor - Struktur 26.07.09 Entwurfsmuster 6
Interceptor Vor- und Nachteile Vorteile Erweiterbarkeit und Flexibilität Können ohne Auswirkungen auf den Code integriert werden Unterstützung von Monitoring und Steuerung des Frameworks Wiederverwendbarkeit Nachteile Komplexe Entwurfsaspekte Bösartige oder fehlerhafte Interceptoren 26.07.09 Entwurfsmuster 7
Interceptor Render Service Praktikum org.htw.osgi.interceptor.renderservice Http Service Zeichnet anhand URL Paremeter ein Bild und sendet es an den Client Implementiert das Interceptor Muster Basiert auf OSGi Verwendet Interceptoren zur Durchführung von Render- Aufgaben: org.htw.osgi.interceptor.texter org.htw.osgi.interceptor.bgfiller 26.07.09 Entwurfsmuster 8
Interceptor Was ist OSGI? Open Services Gateway initiative aka Dynamic Module System for Java Spezifikation einer Service Plattform in Java Erlaubt dynamische (De-)Aktivierung, Update und (De-) Installation von Komponenten und Services Benötigte eine spezielle Java Laufzeitumgebung die den OSGi Standard implementiert OSGi Container Bekannte Open Source OSGi Container sind Equinox 26.07.09 Entwurfsmuster 9
Interceptor Was ist OSGI? Spezifiziert von der OSGi Alliance Die OSGi Alliance wurde März 1999 gegründet Ziel ist eine offene Spezifikation für die Auslieferung von verwaltbaren Diensten in ein lokales Netzwerk oder Gerät Mitglieder der OSGi Alliance sind unter anderem 26.07.09 Entwurfsmuster 10
Interceptor Equinox Open Source OSGI Laufzeit Container Referenz Implementierung des Framework Teils der OSGi Service Plattform R4 Wird von Eclipse als Plattform für die Eclipse-Plugins genutzt Wird zwar von Eclipse gleich mitgeliefert, ist aber eigenständig nutzbar Siehe eclipse/plugins: java -jar org.eclipse.osgi_xxx.jar -console 26.07.09 Entwurfsmuster 11
Interceptor Eclipse als IDE für OSGi Komponenten Eignet sich besonders für OSGi Einsteiger Eclipse bietet u.a. folgende Vorzüge Komfortable Konfiguration und Interaktion mit Equinox Editor für Manifest Datei Wizard zum deployen von Bundles Unterstützung im Dependency Management uvm. Trotz allem achtet Eclipse darauf, dass es nicht zu einfach wird... 26.07.09 Entwurfsmuster 12
Interceptor Bundles Einzige Einheit zur Verwendung einer Java basierten Anwendung im OSGi Framework Eclipse Plugins sind im wesentlichen OSGi Bundles mit zusätzl. Eclipse spezifischen Code Zusammengesetzt aus Java Klassen und anderen Resourcen Läuft eigenständig oder in Abhängigkeit zu anderen Bundles Können Java Packages exportieren und somit dessen Klassen öffentlich verfügbar machen Überraschung: Import von Packages aus anderen Bundles 26.07.09 Entwurfsmuster 13
Interceptor Bundles Jedes Bundle benötigt einen BundleActivator Dieser Activator muss einen öffentlichen Standardkonstruktor bereitstellen Beim Start eines Bundles wird die Activator Methode start(bundlecontext context) vom Framework aufgerufen stop(bundlecontext context) entsprechend BundleContext bietet dabei Interaktionsmöglichkeiten mit dem Framework Kommt uns irgendwie bekannt vor, oder? Bei alledem spielt die Datei MANIFEST.MF eine zentrale Rolle 26.07.09 Entwurfsmuster 14
Interceptor Die Manifest Datei Beschreibt das Deployment seines Bundles Gleiches Format wie bei einer normalen JAR Allerdings mit zusätzlichen Headern die der OSGi Container benötigt: ID und Version des Bundles an Import und Export von Java Packages BundleActivator uvm. Eclipse übernimmt bereits viele Einstellungen automatisch und stellt einen komfortablen Manifest- Editor zur Verfügung 26.07.09 Entwurfsmuster 15
Interceptor Services Stellt seine Dienste im ganzen OSGi Container zur Verfügung Werden von Bundles exportiert Kann von anderen Bundles konsumiert werden ohne dass diese etwas über das exportierende Bundle wissen Implementierung bleibt verborgen Wird über beliebiges Interface im OSGi Container als Service registriert Wird von anderen Bundles über sein Interface vom OSGi Container erfragt 26.07.09 Entwurfsmuster 16
Interceptor Dependency Management Per Default sind Klassen von einem Bundle nicht durch andere Bundles zugreifbar Klassen werden von einem Bundle durch das Exportieren von dem jeweiligen package veröffentlicht Durch den Import dieses Packages werden die Klassen im jeweiligen Bundle verfügbar Dies ist auch bei Services relevant, da ja das entsprechende Interface irgendwo herkommen muss... 26.07.09 Entwurfsmuster 17
Interceptor Dependency Management INSTALLED Bundle wurde installiert konnte aber nicht alle Abhänigkeiten auflösen RESOLVED Alle Abhängigkeiten aufgelöst Kann API exportieren Bundle KANN gestartet werden ACTiVE Bundle wurde erfolgreich gestartet und ist aktiv 26.07.09 Entwurfsmuster 18
Interceptor Probleme und Workarounds Verwendung externer Bibliotheken (JAR) Naiver Ansatz Lösung JAR in Build Path legen Lässt sich ohne Problem compilieren Funktioniert aber trotzdem nicht JAR muss lokal im Bundle liegen Relative im Build Path auf die JAR verweisen Weitere Ansätze: Bundle für JARs anlegen Exportieren der Packages von JAR 26.07.09 Entwurfsmuster 19
Interceptor Probleme und Workarounds Zugriff auf Datei Naiver Ansatz Lösung Relativer Zugriff auf gewünschte Ressource Datei wird nicht gefunden Zugriff über den Bundle Classpath URL myurl = this.getclass().getresource("/cfg/file.txt"); 26.07.09 Entwurfsmuster 20
Interceptor Fazit OSGi ermöglicht eine flexible und standardisierte Möglichkeit für modulare Entwicklung Software basierend auf OSGI kann zur Laufzeit gewartet werden Einsatz von OSGi nimmt immer mehr zu Hohe Komplexität des Frameworks Eclipse bietet in Verbindung mit Equinox eine komfortable Enwticklungsumgebung bei der Entwicklung von OSGi Bundles Allerdings ist die Unterstützung durch Eclipse noch nicht ganz ausgereift 26.07.09 Entwurfsmuster 21
Interceptor EOF SVN http://render-service.googlecode.com/svn/trunk/ Alle Source zum herunterladen Hauptdokument (coming soon) Präsentation Java Sourcen Vielen Dank für Ihre Aufmerksamkeit! 26.07.09 Entwurfsmuster 22
Interceptor Quellen OSGi Service Platform Core Specification, OSGi Alliance, Release 4, Version 4.1, April 2007, http://www.osgi.org/specifications/homepage Hello, OSGi, Part 1: Bundles for beginners, JAVAWORLD, März 2008 http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules, JAVAWORLD, April 2008 http://www.javaworld.com/javaworld/jw-04-2008/jw-04-osgi2.html Hello, OSGi, Part 3: Take it to the server side, JAVAWORLD, Juni 2008 http://www.javaworld.com/javaworld/jw-06-2008/jw-06-osgi3.html Apache Felix OSGi Tutorial, Apache http://cwiki.apache.org/felix/apache-felix-osgi-tutorial.html 26.07.09 Entwurfsmuster 23
Interceptor Quellen Equinox QuickStart Guide, Eclipse Foundation, http://www.eclipse.org/equinox/documents/quickstart.php OSGi in kleinen Dosen Bundles und Life Cycle, JAXCenter, Februar 2009 http://it-republik.de/jaxenter/artikel/osgi-in-kleinen-dosen-%96-bundles-und-life OSGi Service Tutorial, Knoplerfish http://www.knopflerfish.org/osgi_service_tutorial.html Sun and OSGi: Cooperation through competition, Eric Newcomer's Weblog, Dezember 2008 http://blogs.iona.com/newcomer/archives/000580.html Spring Dynamic Modules Reference Guide, SpringSource, Version 1.2, April 2009 http://static.springsource.org/osgi/docs/1.2.0/reference/pdf/spring-dm-reference 26.07.09 Entwurfsmuster 24