• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Scala - OSGi Bundles from Outer (Java) Space

on

  • 1,691 views

Talk auf dem Scala-Day der W-JAX 2010 http://jax.de/wjax2010/sessions/?tid=1732#session-15038

Talk auf dem Scala-Day der W-JAX 2010 http://jax.de/wjax2010/sessions/?tid=1732#session-15038

Statistics

Views

Total Views
1,691
Views on SlideShare
1,691
Embed Views
0

Actions

Likes
0
Downloads
7
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Scala - OSGi Bundles from Outer (Java) Space Scala - OSGi Bundles from Outer (Java) Space Presentation Transcript

    • Prof. Dr. Oliver Braun | FH Schmalkalden Christoph Schmidt | FH Schmalkalden Scala – OSGi-Bundles from Outer (Java) Space
    • Inhalt
      • Framework / Tools
        • OSGi
        • Bnd, Pax Runner
        • Sbt, ScalaModules, bnd4sbt
      • Beispiel: Songfinder
        • Code bzw. Vorgehen beim Coden
        • Live-Demo
      • Code unter: http://github.com/c-schmidt/songfinder_example_wjax
    • OSGi
      • Modulsystem für die JVM
        • JSR 291: Dynamic Component Support for Java SE
        • Sichtbarkeitsregeln
        • Abhängigkeitsverwaltung
        • Versionierung
      • Bundles
        • JAR + OSGi-Manifest
    • OSGi
      • Dynamisches Komponentenmodell
        • Zur Laufzeit: install, start, stop, update, uninstall
      • Serviceorientiertes Modulsystem
        • Dienste in JVM zur Laufzeit registrieren und konsumieren
        • Service-Registry für Reaktion auf Hinzufügen oder Entfernen
    • OSGi
      • Eine Klasse im Bundle muss Interface BundleActivator implementieren
      • interface BundleActivator {
        • void start(BundleContext c);
        • void stop(BundleContext c);
      • }
      • Über BundleContext Services registrieren, ...
    • bnd
      • „the swiss army knife of OSGi“
      • Zum Erzeugen von Bundles
      • Generiert Manifest
      • => Vereinfacht OSGi-Entwicklung
    • Pax Runner
      • Startet OSGi-Plattform mit angegebenen Bundles
      • scan-bundle:mvn:http://scala-tools.org/repo-releases!com.weiglewilczek.scala-lang-osgi/scala-library/2.8.0
      • $ pax-run.sh --bootDelegation="sun.*,com.sun.*" scan-composite:file:songfinder.composite
      • Verschiedene Profile
    • Sbt
      • Simple Build Tool
      • Konfigurieren und Erweitern in Scala
      • Mit interaktiver Shell, z.B.
      • $ sbt
      • > ~ compile
      • Auch für reine Java-Projekte nützlich
    • ScalaModules
      • Scala-DSL für OSGi-Entwicklung
      • Spart eine Menge Boilerplate
      // Java ServiceReference reference = context.getServiceReference(Greeting.class.getName()); if (reference != null) { try { Object service = context.getService(reference); Greeting greeting = (Greeting) service; if (greeting != null) { System.out.println(greeting.welcome()); } else { System.out.println("No Greeting service available!"); } } finally { context.ungetService(reference); } } else { System.out.println("No Greeting service available!"); } // Scala context findService withInterface[Greeting] andApply { _.welcome } match { case None => println("No Greeting service available!") case Some(welcome) => println(welcome) }
    • bnd4sbt
      • Plugin für sbt zur Nutzung von bnd
      • Konfiguration in Scala/sbt
      • Kein zusätzliches bnd-File nötig
      • Erstellen eines OSGi-Bundles mit
        • $ sbt bnd-bundle
    • Der Songfinder
    • Sbt-Projekt
      • Projektverzeichnis:
      • $ mkdir radio
      • $ cd radio
      • sbt:
      • $ sbt
      • Project does not exist, create new
      • project? (y/N/s) y
      • Name: radio
      • Organization: org.unsane.radio
      • Version [1.0]: 0.1.0
      • ...
    • Sbt-Projekt
      • Konfigurieren des Projekts:
      • radio/
      • `-- project
      • |-- build
      • | `-- Project.scala
      • |-- build.properties
      • `-- plugins
      • `-- Plugins.scala
    • Plugins.scala
        class Plugins (info: ProjectInfo) extends PluginDefinition (info) { lazy val aquteRepo = "aQute Maven Repository" at "http://www.aqute.biz/repo" lazy val aquteModuleConfig = ModuleConfiguration("biz.aQute", aquteRepo) lazy val bnd4sbt = "com.weiglewilczek.bnd4sbt" % "bnd4sbt" % "1.0.0" }
    • Project.scala
        class RadioParentProject(info: ProjectInfo) extends ParentProject (info) { object Dependencies { val osgiVersion = "4.2.0" val scalaModulesCore = "com.weiglewilczek.scalamodules" %% "scalamodules-core" % "2.0.0" val osgiCore = "org.osgi" % "org.osgi.core" % osgiVersion % "provided" } ... }
    • Das API-Bundle
        als Sub-Projekt: songfinder-api/ `-- src `-- main `-- scala `-- Songfinder.scala
    • Erstellen des API-Bundles
      • Der Songfinder-Trait:
      • trait Songfinder {
      • def find
      • def remove(songTitle: String)
      • def stopMsg: String
      • }
      • Bundle in songfinder.composite
      • aufnehmen
    • Konfiguration: Project.scala
        ... val songfinderAPIProject = project("songfinder-api", "radio-songfinder-api", new SongfinderAPIProject(_)) class SongfinderAPIProject (info: ProjectInfo) extends DefaultProject (info) with BNDPlugin { override def bndExportPackage = "org.unsane.radio.songfinder;version= %s".format(projectVersion.value) :: Nil }...
    • Erstellen eines Services
      • Ein neues Sub-Projekt:
      • songfinder-create/
      • `-- src
      • `-- main
      • `-- scala
      • `-- Activator.scala
      • Sub-Projekt in Project.scala
      • konfigurieren
      • Service-Bundle in
      • songfinder.composite aufnehmen
    • Erstellen eines Services
        //songfinder-create/../Activator.scala class Activator extends BundleActivator {... override def start(context: BundleContext ) { val songfinder = new Songfinder { override def find = { ... }... override def stopMsg = "shutdown now!" } context createService songfinder } override def stop (context: BundleContext ) {} }
    • Der Watcher
      • Ein weiteres Sub-Projekt: songfinder-watch
      • Project.scala konfigurieren
      • Client-Bundle in die Datei
      • songfinder.composite aufnehmen
    • Der Watcher
        //songfinder-watch/../Activator.scala class Activator extends BundleActivator { var run = true class WatchActor(context: BundleContext) extends Actor {...} override def start (context: BundleContext ) { new WatchActor(context).start() } override def stop (context: BundleContext ) { run = false } }
    • Der Watcher
        class WatchActor(context: BundleContext) extends Actor { def act() { while (run) { println("[radio/songfinder-watch] watching") context watchServices withInterface[Songfinder] andHandle { case AddingService(songfinder, _) => songfinder.find case ServiceRemoved(songfinder, _) => println(songfinder stopMsg) } Thread.sleep(3000) } } }
    • Demo
      • Im Projektverzeichnis radio
      • OSGi- Plattform mit Pax Runner starten:
      • $ pax-run.sh
      • --bootDelegation="sun.*,com.sun.*"
      • scan-composite: file: songfinder.composite
    • Quellen
        http://github.com/c-schmidt/songfinder_example_wjax http://github.com/weiglewilczek/scalamodules http://github.com/weiglewilczek/bnd4sbt http://code.google.com/p/simple-build-tool/ http://www.osgi-buch.com/ http://paxrunner.ops4j.org/space/Pax+Runner
    • Und zum Schluss ein kleines bisschen Werbung:
      • [email_address] http://github.com/c-schmidt [email_address] http://pads.fh-schmalkalden.de/ http://twitter.com/obcode http://github.com/obcode
      Vielen Dank für Ihre Aufmerksamkeit