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);
+ }
+
}