Rhino 表达式执行引擎

This commit is contained in:
lzpeng723 2020-11-17 23:52:16 +08:00
parent 9ca25e26d6
commit bc896bf8ef
5 changed files with 71 additions and 1 deletions

View File

@ -410,6 +410,13 @@
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
<version>1.7.12</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<!-- 表达式引擎可选依赖 end -->
<dependency>
<groupId>org.apache.commons</groupId>

View File

@ -0,0 +1,41 @@
package cn.hutool.extra.expression.engine.rhino;
import cn.hutool.extra.expression.ExpressionEngine;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import java.util.Map;
/**
* rhino引擎封装<br>
* https://github.com/mozilla/rhino
*
* @since 5.5.2
* @author lzpeng
*/
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);
}
}
Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null);
Context.exit();
return result;
}
}

View File

@ -0,0 +1,7 @@
/**
* rhino引擎封装<br>
* https://github.com/mozilla/rhino
*
* @author lzpeng
*/
package cn.hutool.extra.expression.engine.rhino;

View File

@ -2,4 +2,5 @@ cn.hutool.extra.expression.engine.aviator.AviatorEngine
cn.hutool.extra.expression.engine.jexl.JexlEngine
cn.hutool.extra.expression.engine.mvel.MvelEngine
cn.hutool.extra.expression.engine.jfireel.JfireELEngine
cn.hutool.extra.expression.engine.spel.SpELEngine
cn.hutool.extra.expression.engine.spel.SpELEngine
cn.hutool.extra.expression.engine.rhino.RhinoEngine

View File

@ -4,6 +4,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.extra.expression.engine.jexl.JexlEngine;
import cn.hutool.extra.expression.engine.jfireel.JfireELEngine;
import cn.hutool.extra.expression.engine.mvel.MvelEngine;
import cn.hutool.extra.expression.engine.rhino.RhinoEngine;
import cn.hutool.extra.expression.engine.spel.SpELEngine;
import org.junit.Assert;
import org.junit.Test;
@ -67,4 +68,17 @@ public class ExpressionUtilTest {
final Object eval = engine.eval("#a-(#b-#c)", dict);
Assert.assertEquals(-143.8, (double)eval, 2);
}
@Test
public void rhinoTest(){
ExpressionEngine engine = new RhinoEngine();
final Dict dict = Dict.create()
.set("a", 100.3)
.set("b", 45)
.set("c", -199.100);
final Object eval = engine.eval("a-(b-c)", dict);
Assert.assertEquals(-143.8, (double)eval, 2);
}
}