JSR 223: Scripting for the JavaTM Platform

Présentation : Pour chaque task un boolean selected (renseigné par un script) indique si la ressource peut être utilisée par le scheduler.

Objectif : Dans le cadre du scheduler, proposer à l’utilisateur de définir son propre script de sélection dans les langages Javascript, Python et Ruby. Proposer également un ensemble de script prédéfinis utilisables dans ces 3 langages ainsi qu’assurer une version par OS.

Exemple La classe Java SelectionUtils nous permet de comparer le nom de l’os courant avec un string passé en paramètre ainsi que l’architecture:

SelectionUtils.java

package com.script;
public class SelectionUtils {
    public static int checkOSName(String os)
    {
        String localOS = System.getProperty("os.name");
        System.out.println("OS Name = " + localOS);
        if(os.equals(localOS))
        {
            return 1;
        }
        return 0;
    }
    public static int checkOSArch(String osArch)
    {
        String localOSArch = System.getProperty("os.arch");
        System.out.println("OS Architecture = " + localOSArch);
        if(osArch.equals(localOSArch))
        {
            return 1;
        }
        return 0;
    }
}

Nous allons maintenant utiliser ces fonctions depuis nos langages de scripts.

checkOSNameOSArch.js

println("selection script : checkOKName & checkOSArch");
if(com.script.SelectionUtils.checkOSName("Windows XP") && com.script.SelectionUtils.checkOSArch("x86"))
{
    println("OK");
    selected = 1;
}
else
{
    selected = 0;
}

checkOSNameOSArch.py

print "selection script : checkOKName && checkOSArch"
from com.script import SelectionUtils
if SelectionUtils.checkOSName("Windows XP") and SelectionUtils.checkOSArch("x86"):
    print "OK";
    selected = 1;
else:
    print "KO";
    selected = 0;

checkOSNameOSArch.rb

puts "selection script : checkOKName && checkOSArch"
require 'java'
MyClass = Java::com.script.SelectionUtils
if(MyClass.checkOSName("Windows XP") && MyClass.checkOSArch("x86"))
    puts "OK"
    $selected = 1;
else
    puts "KO"
    $selected = 0;
end

Script Engine

Pour utiliser ces scripts, nous allons faire appel à des “Script Engine” :

  • Rhino(déjà intégré à Java) → Javascript
  • Jython → Python
  • Jruby → Ruby

La liste complète des moteurs est disponible ici : https://scripting.dev.java.net/

le code ci-dessous nous permet de lister les moteurs installés :

ScriptEngineManager manager = new ScriptEngineManager();
List factories = manager.getEngineFactories();
for (ScriptEngineFactory factory : factories) {
	System.out.println("Name : " + factory.getEngineName());
	System.out.println("Version : " + factory.getEngineVersion());
	System.out.println("Language name : " + factory.getLanguageName());
	System.out.println("Language version : " + factory.getLanguageVersion());
	System.out.println("Extensions : " + factory.getExtensions());
	System.out.println("Mime types : " + factory.getMimeTypes());
	System.out.println("Names : " + factory.getNames());
}

TestcheckOSNameOSArch.java

Notre main:

package jsrtest;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.List;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.InputStream;
public class TestcheckOSNameOSArch {
    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        // get the engine
        ScriptEngine moteur = manager.getEngineByName("rhino");
        try {
            Bindings bindings = moteur.getBindings(ScriptContext.ENGINE_SCOPE);
            bindings.clear();
            moteur.eval(loadFile(new File("checkOSNameOSArch.js")), bindings);
            //--Get the result
            Double resultat = (Double) bindings.get("selected");
            System.out.println("RESULTAT AVEC JAVASCRIPT = " + resultat);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        System.out.println("===================================");
        moteur = manager.getEngineByName("python");
        try {
            Bindings bindings = moteur.getBindings(ScriptContext.ENGINE_SCOPE);
            bindings.clear();
            moteur.eval(loadFile(new File("checkOSNameOSArch.py")), bindings);
            //--Get the result
            Integer resultat = (Integer)bindings.get("selected");
            System.out.println("RESULTAT AVEC PYTHON = " + resultat);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        System.out.println("===================================");
        moteur = manager.getEngineByName("ruby");
        try {
            Bindings bindings = moteur.getBindings(ScriptContext.ENGINE_SCOPE);
            bindings.clear();
            moteur.eval(loadFile(new File("checkOSNameOSArch.rb")), bindings);
            //--Get the result
            Long resultat = (Long) bindings.get("selected");
            System.out.println("RESULTAT AVEC RUBY = " + resultat);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }
    public static String loadFile(File f) {
        try {
            //--Define input/output
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
            StringWriter out = new StringWriter();
            //--Write file content into output
            int b;
            while ((b = in.read()) != -1) {
                out.write(b);
            }
            //--Clean
            out.flush();
            out.close();
            in.close();
            //--Return file content
            return out.toString();
        } catch (IOException ie) {
            ie.printStackTrace();
            return "none";
        } catch (Exception e) {
            e.printStackTrace();
            return "none";
        }
    }
}

Dans le cas où les conditions sont remplies, on obtient les logs suivants :

selection script : checkOKName & checkOSArch
OS Name = Windows XP
OS Architecture = x86
OK
RESULTAT AVEC JAVASCRIPT = 1.0
===================================
selection script : checkOKName & checkOSArch
OS Name = Windows XP
OS Architecture = x86
OK
RESULTAT AVEC PYTHON = 1
===================================
selection script : checkOKName & checkOSArch
OS Name = Windows XP
OS Architecture = x86
OK
RESULTAT AVEC RUBY = 1
Last modified: 18 August 2010

Author

Comments

Write a Reply or Comment

Your email address will not be published.