add engine and fix bug

This commit is contained in:
Looly
2020-11-18 00:34:51 +08:00
parent 83a2244f80
commit 9867333f68
5 changed files with 21 additions and 20 deletions

View File

@@ -413,7 +413,7 @@
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
<version>1.7.12</version>
<version>1.7.13</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>

View File

@@ -1,5 +1,6 @@
package cn.hutool.extra.expression.engine.rhino;
import cn.hutool.core.map.MapUtil;
import cn.hutool.extra.expression.ExpressionEngine;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
@@ -11,30 +12,22 @@ import java.util.Map;
* rhino引擎封装<br>
* 见https://github.com/mozilla/rhino
*
* @since 5.5.2
* @author lzpeng
* @since 5.5.2
*/
public class RhinoEngine implements ExpressionEngine {
/**
* 构造
*/
public RhinoEngine(){
}
@Override
public Object eval(String expression, Map<String, Object> context) {
Context ctx = Context.enter();
Scriptable scope = ctx.initStandardObjects();
if (context != null && !context.isEmpty()) {
for (Map.Entry<String, Object> entry : context.entrySet()) {
// 将java对象转为js对象
Object jsObj = Context.javaToJS(entry.getValue(), scope);
// 将java对象放置JS的作用域中
ScriptableObject.putProperty(scope, entry.getKey(), jsObj);
}
final Context ctx = Context.enter();
final Scriptable scope = ctx.initStandardObjects();
if (MapUtil.isNotEmpty(context)) {
context.forEach((key, value)->{
// 将java对象转为js对象后放置于JS的作用域中
ScriptableObject.putProperty(scope, key, Context.javaToJS(value, scope));
});
}
Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null);
final Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null);
Context.exit();
return result;
}