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!

Like this? Share it with your network

Share

Scala - OSGi Bundles from Outer (Java) Space

on

  • 1,805 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,805
Views on SlideShare
1,805
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 Presentation Transcript

  • 1. Prof. Dr. Oliver Braun | FH Schmalkalden Christoph Schmidt | FH Schmalkalden Scala – OSGi-Bundles from Outer (Java) Space
  • 2. Inhalt
    • Framework / Tools
      • OSGi
      • 3. Bnd, Pax Runner
      • 4. Sbt, ScalaModules, bnd4sbt
    • Beispiel: Songfinder
      • Code bzw. Vorgehen beim Coden
      • 5. Live-Demo
    • Code unter: http://github.com/c-schmidt/songfinder_example_wjax
  • 6. OSGi
    • Modulsystem für die JVM
      • JSR 291: Dynamic Component Support for Java SE
      • 7. Sichtbarkeitsregeln
      • 8. Abhängigkeitsverwaltung
      • 9. Versionierung
    • Bundles
      • JAR + OSGi-Manifest
  • 10. OSGi
    • Dynamisches Komponentenmodell
      • Zur Laufzeit: install, start, stop, update, uninstall
    • Serviceorientiertes Modulsystem
      • Dienste in JVM zur Laufzeit registrieren und konsumieren
      • 11. Service-Registry für Reaktion auf Hinzufügen oder Entfernen
  • 12. OSGi
    • Eine Klasse im Bundle muss Interface BundleActivator implementieren
    • 13. interface BundleActivator {
      • void start(BundleContext c);
      • 14. void stop(BundleContext c);
    • }
    • 15. Über BundleContext Services registrieren, ...
  • 16. bnd
    • „the swiss army knife of OSGi“
    • 17. Zum Erzeugen von Bundles
    • 18. Generiert Manifest
    • 19. => Vereinfacht OSGi-Entwicklung
  • 20. Pax Runner
    • Startet OSGi-Plattform mit angegebenen Bundles
    • 21. scan-bundle:mvn:http://scala-tools.org/repo-releases!com.weiglewilczek.scala-lang-osgi/scala-library/2.8.0
    • 22. …
    • 23. $ pax-run.sh --bootDelegation="sun.*,com.sun.*" scan-composite:file:songfinder.composite
    • 24. Verschiedene Profile
  • 25. Sbt
    • Simple Build Tool
    • 26. Konfigurieren und Erweitern in Scala
    • 27. Mit interaktiver Shell, z.B.
    • 28. $ sbt
    • 29. > ~ compile
    • 30. Auch für reine Java-Projekte nützlich
  • 31. ScalaModules
    • Scala-DSL für OSGi-Entwicklung
    • 32. 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) }
  • 33. bnd4sbt
    • Plugin für sbt zur Nutzung von bnd
    • 34. Konfiguration in Scala/sbt
    • 35. Kein zusätzliches bnd-File nötig
    • 36. Erstellen eines OSGi-Bundles mit
      • $ sbt bnd-bundle
  • 37. Der Songfinder
  • 38. Sbt-Projekt
    • Projektverzeichnis:
    • 39. $ mkdir radio
    • 40. $ cd radio
    • 41. sbt:
    • 42. $ sbt
    • 43. Project does not exist, create new
    • 44. project? (y/N/s) y
    • 45. Name: radio
    • 46. Organization: org.unsane.radio
    • 47. Version [1.0]: 0.1.0
    • 48. ...
  • 49. Sbt-Projekt
    • Konfigurieren des Projekts:
    • 50. radio/
    • 51. `-- project
    • 52. |-- build
    • 53. | `-- Project.scala
    • 54. |-- build.properties
    • 55. `-- plugins
    • 56. `-- Plugins.scala
  • 57. 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" }
  • 58. 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" } ... }
  • 59. Das API-Bundle
      als Sub-Projekt: songfinder-api/ `-- src `-- main `-- scala `-- Songfinder.scala
  • 60. Erstellen des API-Bundles
    • Der Songfinder-Trait:
    • 61. trait Songfinder {
    • 62. def find
    • 63. def remove(songTitle: String)
    • 64. def stopMsg: String
    • 65. }
    • 66. Bundle in songfinder.composite
    • 67. aufnehmen
  • 68. 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 }...
  • 69. Erstellen eines Services
    • Ein neues Sub-Projekt:
    • 70. songfinder-create/
    • 71. `-- src
    • 72. `-- main
    • 73. `-- scala
    • 74. `-- Activator.scala
    • 75. Sub-Projekt in Project.scala
    • 76. konfigurieren
    • 77. Service-Bundle in
    • 78. songfinder.composite aufnehmen
  • 79. 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 ) {} }
  • 80. Der Watcher
    • Ein weiteres Sub-Projekt: songfinder-watch
    • 81. Project.scala konfigurieren
    • 82. Client-Bundle in die Datei
    • 83. songfinder.composite aufnehmen
  • 84. 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 } }
  • 85. 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) } } }
  • 86. Demo
    • Im Projektverzeichnis radio
    • 87. OSGi- Plattform mit Pax Runner starten:
    • 88. $ pax-run.sh
    • 89. --bootDelegation="sun.*,com.sun.*"
    • 90. scan-composite: file: songfinder.composite
  • 91. 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
  • 92. Und zum Schluss ein kleines bisschen Werbung:
  • 93.
      [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