Browse Source

Rhino 表达式执行引擎

lzpeng723 5 years ago
parent
commit
bc896bf8ef

+ 7 - 0
hutool-extra/pom.xml

@@ -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>

+ 41 - 0
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引擎封装<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;
+	}
+}

+ 7 - 0
hutool-extra/src/main/java/cn/hutool/extra/expression/engine/rhino/package-info.java

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

+ 2 - 1
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
+cn.hutool.extra.expression.engine.spel.SpELEngine
+cn.hutool.extra.expression.engine.rhino.RhinoEngine

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