0
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. Vorgeh...
OSGi
• Modulsystem für die JVM
– JSR 291: Dynamic Component
Support for Java SE
– Sichtbarkeitsregeln
– Abhängigkeitsverwa...
OSGi
• Dynamisches Komponentenmodell
– Zur Laufzeit: install, start, stop,
update, uninstall
• Serviceorientiertes Modulsy...
OSGi
• Eine Klasse im Bundle muss
Interface BundleActivator
implementieren
• interface BundleActivator {
void start(Bundle...
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.wei...
Sbt
• Simple Build Tool
• Konfigurieren und Erweitern in Scala
• Mit interaktiver Shell, z.B.
$ sbt
> ~ compile
• Auch für...
ScalaModules
• Scala-DSL für OSGi-Entwicklung
• Spart eine Menge Boilerplate
// Java
ServiceReference reference =
context....
bnd4sbt
• Plugin für sbt zur Nutzung von bnd
• Konfiguration in Scala/sbt
• Kein zusätzliches bnd-File nötig
• Erstellen e...
Der Songfinder
Sbt-Projekt
• Projektverzeichnis:
$ mkdir radio
$ cd radio
• sbt:
$ sbt
Project does not exist, create new
project? (y/N/s...
Sbt-Projekt
• Konfigurieren des Projekts:
radio/
`-- project
|-- build
| `-- Project.scala
|-- build.properties
`-- plugin...
Plugins.scala
class Plugins(info: ProjectInfo) extends
PluginDefinition(info) {
lazy val aquteRepo = "aQute Maven Reposito...
Project.scala
class RadioParentProject(info: ProjectInfo) extends
ParentProject(info) {
object Dependencies {
val osgiVers...
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: S...
Konfiguration: Project.scala
...
val songfinderAPIProject = project("songfinder-api",
"radio-songfinder-api",
new Songfind...
Erstellen eines Services
• Ein neues Sub-Projekt:
songfinder-create/
`-- src
`-- main
`-- scala
`-- Activator.scala
• Sub-...
Erstellen eines Services
//songfinder-create/../Activator.scala
class Activator extends BundleActivator {...
override def ...
Der Watcher
• Ein weiteres Sub-Projekt:
songfinder-watch
• Project.scala konfigurieren
• Client-Bundle in die Datei
songfi...
Der Watcher
//songfinder-watch/../Activator.scala
class Activator extends BundleActivator {
case class Stop()
class WatchA...
Der Watcherclass WatchActor(context: BundleContext) extends
Actor {
def act() {
println("[radio/songfinder-watch] watching...
Demo
• Im Projektverzeichnis radio
• OSGi-Plattform mit Pax Runner starten:
$ pax-run.sh
--bootDelegation="sun.*,com.sun.*...
Quellen
http://github.com/c-
schmidt/songfinder_example_wjax
http://github.com/weiglewilczek/scalamodules
http://github.co...
Und zum Schluss ein kleines
bisschen Werbung:
c.schmidt@stud.fh-sm.de
http://github.com/c-schmidt
o.braun@fh-sm.de
http://pads.fh-schmalkalden.de/
http://twitter.com/ob...
Upcoming SlideShare
Loading in...5
×

Scala - OSGi Bundles from Outer (Java) Space

1,529

Published on

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

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,529
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Scala - OSGi Bundles from Outer (Java) Space"

  1. 1. Prof. Dr. Oliver Braun | FH Schmalkalden Christoph Schmidt | FH Schmalkalden Scala – OSGi-Bundles from Outer (Java) Space
  2. 2. 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
  3. 3. OSGi • Modulsystem für die JVM – JSR 291: Dynamic Component Support for Java SE – Sichtbarkeitsregeln – Abhängigkeitsverwaltung – Versionierung • Bundles – JAR + OSGi-Manifest
  4. 4. 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
  5. 5. OSGi • Eine Klasse im Bundle muss Interface BundleActivator implementieren • interface BundleActivator { void start(BundleContext c); void stop(BundleContext c); } • Über BundleContext Services registrieren, ...
  6. 6. bnd • „the swiss army knife of OSGi“ • Zum Erzeugen von Bundles • Generiert Manifest => Vereinfacht OSGi-Entwicklung
  7. 7. 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
  8. 8. Sbt • Simple Build Tool • Konfigurieren und Erweitern in Scala • Mit interaktiver Shell, z.B. $ sbt > ~ compile • Auch für reine Java-Projekte nützlich
  9. 9. 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) }
  10. 10. 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
  11. 11. Der Songfinder
  12. 12. 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 ...
  13. 13. Sbt-Projekt • Konfigurieren des Projekts: radio/ `-- project |-- build | `-- Project.scala |-- build.properties `-- plugins `-- Plugins.scala
  14. 14. 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" }
  15. 15. 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" } ... }
  16. 16. Das API-Bundle als Sub-Projekt: songfinder-api/ `-- src `-- main `-- scala `-- Songfinder.scala
  17. 17. Erstellen des API-Bundles • Der Songfinder-Trait: trait Songfinder { def find def remove(songTitle: String) def stopMsg: String } • Bundle in songfinder.composite aufnehmen
  18. 18. 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 }...
  19. 19. 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
  20. 20. 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) {} }
  21. 21. Der Watcher • Ein weiteres Sub-Projekt: songfinder-watch • Project.scala konfigurieren • Client-Bundle in die Datei songfinder.composite aufnehmen
  22. 22. Der Watcher //songfinder-watch/../Activator.scala class Activator extends BundleActivator { case class Stop() class WatchActor(context: BundleContext) extends Actor {…} private[this] var watcher: WatchActor = _ override def start(context: BundleContext) { watcher = new WatchActor(context) watcher.start() } override def stop(context: BundleContext) { watcher ! Stop } }
  23. 23. Der Watcherclass WatchActor(context: BundleContext) extends Actor { def act() { println("[radio/songfinder-watch] watching") context watchServices withInterface[Songfinder] andHandle { case AddingService(songfinder, _) => songfinder.find case ServiceRemoved(songfinder, _) => println(songfinder stopMsg) } receiveWithin(3000) { case Stop => case _ => act() } }
  24. 24. Demo • Im Projektverzeichnis radio • OSGi-Plattform mit Pax Runner starten: $ pax-run.sh --bootDelegation="sun.*,com.sun.*" scan-composite:file:songfinder.composite
  25. 25. 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
  26. 26. Und zum Schluss ein kleines bisschen Werbung:
  27. 27. c.schmidt@stud.fh-sm.de http://github.com/c-schmidt o.braun@fh-sm.de http://pads.fh-schmalkalden.de/ http://twitter.com/obcode http://github.com/obcode http://slideshare.net/obcode Vielen Dank für Ihre Aufmerksamkeit
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×