diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 395140b56..5806b4ce2 100644 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -410,6 +410,13 @@ compile true + + org.mozilla + rhino + 1.7.12 + compile + true + org.apache.commons diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/RhinoEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/RhinoEngine.java new file mode 100644 index 000000000..eef25ffc4 --- /dev/null +++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/RhinoEngine.java @@ -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引擎封装
+ * 见: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 context) { + Context ctx = Context.enter(); + Scriptable scope = ctx.initStandardObjects(); + if (context != null && !context.isEmpty()) { + for (Map.Entry 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; + } +} diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java new file mode 100644 index 000000000..8129782be --- /dev/null +++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java @@ -0,0 +1,7 @@ +/** + * rhino引擎封装
+ * 见:https://github.com/mozilla/rhino + * + * @author lzpeng + */ +package cn.hutool.extra.expression.engine.rhino; \ No newline at end of file diff --git a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine index 98ae64b5b..760331b46 100644 --- a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine +++ b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine @@ -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 \ No newline at end of file +cn.hutool.extra.expression.engine.spel.SpELEngine +cn.hutool.extra.expression.engine.rhino.RhinoEngine \ No newline at end of file diff --git a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java index fe68ea7b8..8802ad4b3 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java @@ -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); + } + }