Boolsche Ausdruecke mit Java und JavaScript

halech

Grünschnabel
Liebe Tutorialsuser,

ich sitze zur Zeit an einem kleinen Unterprojekt in dem ich versuche etwas wie einen Boolsche Ausdruck Parser zu schreiben. Als Eingabe habe ich einen String (vom User) wie z.B. (A > 10) || (B = 'abc') || (C = '2005-05-05'). Die Werte fuer A, B und C werden zur Laufzeit uebergeben und eingesetzt. Als Ausgabe habe ich dann true oder false. Soweit, so gut.

Nun habe ich bereits herausgefunden, dass man das Rad nicht neu erfinden muss und habe mich mit dem Script package in Java beschaeftigt. (Gibt es vielleicht noch andere Ideen, wie ich einen Boolschen Ausdruck (als String) auswerten kann, ohne selber einen Parser zu implementieren?). Das klappt soweit auch ganz gut, solange ich nur Strings oder Zahlen binde.

Code:
String test = "B =(D == 'abc' || (C == A) && (C > 10));";
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("js");
		Bindings bindings = engine.createBindings();
		bindings.put("A", 10);
		bindings.put("C", 11);
		bindings.put("B", null);
		bindings.put("D", "bc");
		boolean returnvalue = false;
		engine.eval(test, bindings);

Aber was mache ich wenn ich 2 Dates vergleichen will? Das eine Date kriege ich ja als String uebergeben (C = '2005-05-05') wohingegen der Wert fuer C ja als java.util.Date uebergeben wird:

Code:
String test2 = "print(B = (C == '2005-05-05'))";
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("js");
		Bindings bindings = engine.createBindings();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		bindings.put("C", format.parseObject("2005-05-05"));
		bindings.put("B", null);
		engine.eval(test2, bindings);

Also die allgemeine Frage ist, wie kriege ich meinen Code dazu, dass der String '2005-05-05' als date interpretiert wird und nicht als String?

Vielen Dank schon im voraus,

Gruesse,
Halech
 
Gibt es vielleicht noch andere Ideen, wie ich einen Boolschen Ausdruck (als String) auswerten kann, ohne selber einen Parser zu implementieren?
vielleicht hilft dir Mozilla Rhino http://www.mozilla.org/rhino/ weiter
Aber was mache ich wenn ich 2 Dates vergleichen will? Das eine Date kriege ich ja als String uebergeben (C = '2005-05-05') wohingegen der Wert fuer C ja als java.util.Date uebergeben wird
Ich würde das Datum einfach immer im festgelegten Format, z.B. "YYYY-MM-DD" abspeichern.
 
Java benutzt standardmaessig Rhino. Also mein Scriptengine ist Rhino.

Nunja das Abspeichern vom Datum ist ja einfach. Aber wie mache ich Vergleiche in der Form date.before(date2) oder date.after(date2), wenn ich das mit javax.script machen will? Das '2005-05-05' wird als String abgespeichert und ein Vergleich gibt dann immer false. Was ich machen will ist zwei Data zu vergleichen. Eine kommt im Stringformat irgendwo im EingabeString vor und den Vergleichswert ziehe ich aus der DB und kann ihn in beliebige Formen umwandeln.
 
hm man kann das datum ja auch als Milliseconds speichern und dann einfach numerische vergleiche ausfuehren. Von daher sollte das Problem gar nicht auftauchen, wenn man vernuenftig designed.
 
Zurück