Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Rhino instead of ScriptEngine to run Javascript code in Java

Tags:

Based on the discussion converting string representation of unknown date-format to Date in java, I want to use the JavaScript Date function in my App-Engine project. However, ScriptEngine does not work on App-Engine. So I need a little help converting to Rhino. Here is the ScriptEngine code I need to convert:

ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine engine = scriptEngineManager.getEngineByName("JavaScript"); String script = "var date = new Date('" + dateInUnknownFormat + "'); var timestamp = date.getTime();"; engine.eval(script); long timestamp = ((Double) engine.get("timestamp")).longValue(); 

The following has not worked

private static long parseDateUsingRhino(String dateInUnknownFormat){     Context mozillaJsContext = Context.enter();     Scriptable scope = mozillaJsContext.initStandardObjects();     String script = "var date = new Date('" + dateInUnknownFormat + "'); var timestamp = date.getTime();";     Object obj = mozillaJsContext.evaluateString( scope, script, "TestScript", 1, null );     Double timeDouble = Double.parseDouble((String) obj);     long timestamp = timeDouble.longValue();     return  timestamp; } 

and I have already replaced "TestScript" with null and "".

like image 439
learner Avatar asked Oct 17 '15 22:10

learner


1 Answers

In the script that is executed by the JavaScript engine, you just need to calculate the value you want using new Date(dateString).getTime() (you could also use "var date = new Date(dateString); date.getTime()";). You should not store the result inside a variable.

I also made two additions to your method:

  • To convert the result of the evaluation to a String, you should use Context.toString(obj). Since here, the result is actually a number, we can use directly Context.toNumber(obj), which returns a double, and cast it to long.
  • I added a finally block which exits from the Context.

Working code:

private static long parseDateUsingRhino(String dateInUnknownFormat) {     Context mozillaJsContext = Context.enter();     try {         Scriptable scope = mozillaJsContext.initStandardObjects();         String script = "new Date('" + dateInUnknownFormat + "').getTime()";         Object obj = mozillaJsContext.evaluateString(scope, script, "TestScript", 1, null);         return (long) Context.toNumber(obj);     } finally {         Context.exit();     } } 

Sample:

System.out.println(parseDateUsingRhino("2015-10-25T15:06:42.000Z")); // prints 1445785602000 

Side note: this was tested with Rhino 1.7.7.

like image 111
Tunaki Avatar answered Sep 19 '22 11:09

Tunaki