Hallo,
ich bin auf der Suche nach einer EL für ein kleineres Projekt. Ich habe schon mehrere probiert, aber es passt alles nicht so ganz.
Meine Anforderungen also nochmal kompakt: leichtgewichtige Syntax ohne viel Drumrum (es sollten if, while etc. dabei sein, aber functions nicht unbedingt); ich kann als Kontext Objekte und Methoden (per XY.class.getMethod(...)) verwenden (schön wäre es natürlich, wenn ich eine eigene Kontextklasse definieren dürfte, an welche Methodenaufrufe delegiert werden würden).
Gibt es etwas vorgefertigtes, oder muss ich das selbst implementieren? Ich hatte schon darüber nachgedacht, einfach doch JEXL zu nutzen und den Eingabestring etwas umzubauen. Mein Code sieht bisher so aus:
Functions ist dabei eine Klasse, die eine Methode run(String function,Object... arguments) anbietet. Allerdings gibt es zwei Probleme: Arrayliterale geben einen Syntax-Error; und für JEXL sieht die run-Methode so aus: String,Object[]. Der Aufruf würde klappen, aber ich rufe ja mit String,Object auf.
Grüße,
Lars
ich bin auf der Suche nach einer EL für ein kleineres Projekt. Ich habe schon mehrere probiert, aber es passt alles nicht so ganz.
- JUEL - kann nur Attributzugriff bei Objekten, außerdem keine Strukturelemente
- Commons JEXL - schränkt sehr ein beim Kontext; ich kann z. B. keine Funktionen ohne Objekt aufrufen (d. h. wenn ich das Objekt "o" bekannt mache, kann man o.method() aufrufen, aber method() gibt einen Parse Error)
- ScriptEngine-API mit JavaScript - im Prinzip gut, aber ich möchte nicht, dass der Benutzer Zugriff auf native calls hat, z. B. Dateien anlegen etc.
Meine Anforderungen also nochmal kompakt: leichtgewichtige Syntax ohne viel Drumrum (es sollten if, while etc. dabei sein, aber functions nicht unbedingt); ich kann als Kontext Objekte und Methoden (per XY.class.getMethod(...)) verwenden (schön wäre es natürlich, wenn ich eine eigene Kontextklasse definieren dürfte, an welche Methodenaufrufe delegiert werden würden).
Gibt es etwas vorgefertigtes, oder muss ich das selbst implementieren? Ich hatte schon darüber nachgedacht, einfach doch JEXL zu nutzen und den Eingabestring etwas umzubauen. Mein Code sieht bisher so aus:
Code:
String expr = "$inc(0)";
expr = expr.replaceAll("(?<!\\\\)\\$([a-z]+)\\(","fct.run(\"$1\",");
System.out.println(expr); // ergibt fct.run("inc",0)
Script s = ScriptFactory.createScript(expr);
JexlContext jc = JexlHelper.createContext();
jc.getVars().put("fct",new Functions());
System.out.println(s.execute(jc));
Functions ist dabei eine Klasse, die eine Methode run(String function,Object... arguments) anbietet. Allerdings gibt es zwei Probleme: Arrayliterale geben einen Syntax-Error; und für JEXL sieht die run-Methode so aus: String,Object[]. Der Aufruf würde klappen, aber ich rufe ja mit String,Object auf.
Grüße,
Lars