From bc896bf8effc2ad16545442fd37f8adfe5e91c65 Mon Sep 17 00:00:00 2001 From: lzpeng723 <1500913306@qq.com> Date: Tue, 17 Nov 2020 23:52:16 +0800 Subject: [PATCH] =?UTF-8?q?Rhino=20=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-extra/pom.xml | 7 ++++ .../expression/engine/rhino/RhinoEngine.java | 41 +++++++++++++++++++ .../expression/engine/rhino/package-info.java | 7 ++++ ...n.hutool.extra.expression.ExpressionEngine | 3 +- .../extra/expression/ExpressionUtilTest.java | 14 +++++++ 5 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/RhinoEngine.java create mode 100644 hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java 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); + } + }