Plugin development

OpenMOLE is a pluggable platform. It means that you can easily write your own extension 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...

This tutorial exposes how to design a plugin. 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:

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())