Bonjour,
je suis sur un programme qui gère des plugins en javascript, grâce à rhino.
Je cherche à savoir s'il est possible de n'avoir qu'un seul moteur de script pour évaluer plusieurs scripts.
Pour expliquer mon cas, je reprends un exemple minimal ici :
On a donc ici une interface "Plugin" avec juste une méthode à implémenter, 3 fonctions capable de l'implémenter, affichant chacune un texte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import java.util.ArrayList; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class Scripting { private interface Plugin { void display(); } public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine; ArrayList<Plugin> plugins = new ArrayList<Plugin>(); String[] functions = {"function display() {println('plugin 1');}", "function display() {println('plugin 2');}", "function display() {println('plugin 3');}"}; for (String f : functions) { engine = manager.getEngineByName("JavaScript"); engine.eval(f); Invocable inv = (Invocable) engine; plugins.add(inv.getInterface(Plugin.class)); } for (Plugin p : plugins) { p.display(); } } }
Je boucle ensuite sur les fonctions, je fais un eval dessus, et je stock le Plugin dans un tableau. Pour terminer je boucle sur tous les plugins et j'appelle "display()".
Ce code fonctionne bien, à l'affichage j'ai bien :
Ce qui me gène est que je créé un nouveau moteur de script pour chaque plugin. Je me dis que dans un gros projet, ca peut être lourd.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 plugin 1 plugin 2 plugin 3
J'ai donc essayé ceci, pour n'utiliser qu'un seul moteur :
Ici je ne créé qu'un seul moteur, puis ensuite dans ma boucle j'evalue le script et stock le plugin. A l'exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); ArrayList<Plugin> plugins = new ArrayList<Plugin>(); String[] functions = {"function display() {println('plugin 1');}", "function display() {println('plugin 2');}", "function display() {println('plugin 3');}"}; for (String f : functions) { engine.eval(f); Invocable inv = (Invocable) engine; plugins.add(inv.getInterface(Plugin.class)); } for (Plugin p : plugins) { p.display(); }
Chaque plugin se retrouve avec la dernière fonction évaluée. Ma question est donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 plugin 3 plugin 3 plugin 3
Est il possible avec Rhino de gérer plusieurs scripts, mais avec un seul moteur ?
PS : j'ai vu qu'on peut faire des choses avec des "scope" et des "context", mais il semble que cela permet de gérer des valeurs différentes pour une même variable exportée dans un script, et non pas gérer plusieurs scripts pour un même moteur.
Merci d'avance pour votre aide.
Partager