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
Comments