Plugin development
OpenMOLE is a plugable platform. It means that you can easily include you own java/scala code, and plug it into OpenMOLE. This tutorial explains how to write an OpenMOLE plugin using Scala and SBT. OpenMOLE is based on the JVM so you can create OpenMOLE plugins using Scala or any other JVM based languages such as Java, Groovy, Clojure, Jython...
OpenMOLE plugins are generally used to import you own code and libraries in OpenMOLE. They are actually simple OSGi bundles. The prerequisites are to have
git and
SBT installed on your system.
The first step is to clone the code available
here:
git clone git://github.com/openmole/myopenmoleplugin.git
This repository contains a template to help you to create OpenMOLE plugins easily. The
hello directory contains the source code of the plugin and the materials to build it:
package myopenmoleplugin
trait Hello {
def world(i: Int) = i * 2
}
object Hello extends Hello
The file
build.sbt contains the building instructions for SBT. The most important part are the OSGi
instructions:
OsgiKeys.exportPackage := Seq("myopenmoleplugin.*")
OsgiKeys.importPackage := Seq("*;resolution:=optional")
OsgiKeys.privatePackage := Seq("!scala.*,*")
The
exportPackage instruction makes the
myopenmole package visible to OpenMOLE. The
importPackage
instruction means that every package that is not included into the plugin should be imported.
The
privatePackage means that every package in the project, or in the dependencies, should be embedded except for
the package starting by the scala word. The scala packages provided by OpenMOLE will be used by the plugin instead.
To build the plugin execute:
sbt osgi-bundle
SBT constructs the plugin in
target/scala-2.11/myopenmoleplugin_2.11-1.0.jar. This JAR file contains the
classes you have developed (*.class) along with the metadata realtive to imports and exports in the
MANIFEST.INF
file:
META-INF/MANIFEST.MF
myopenmoleplugin/
myopenmoleplugin/Hello$.class
myopenmoleplugin/Hello.class
To load this plugin in the platform, you can:
-
either use the -p option when starting OpenMOLE console:
./openmole -c -p target/scala-2.11/myopenmoleplugin_2.11-1.0.jar -c
-
or upload it from the GUI plugin panel. This way, the plugins will be loaded every time OpenMOLE starts.
You can now use the
Hello object in your workflows:
// Declare the variable
val i = Val[Int]
// Hello task
val hello = ScalaTask("i = myopenmoleplugin.Hello.world(i)") set (
inputs += i,
outputs += i,
plugins += pluginsOf(myopenmoleplugin.Hello)
)
val exploration = ExplorationTask(i in (0 to 2))
exploration -< (hello hook ToStringHook())