From 9867333f68cab82a971f2d1f5f77d3829255de42 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 18 Nov 2020 00:34:51 +0800 Subject: [PATCH] add engine and fix bug --- CHANGELOG.md | 4 ++- .../java/cn/hutool/core/math/Calculator.java | 2 +- .../cn/hutool/core/math/CalculatorTest.java | 6 +++++ hutool-extra/pom.xml | 2 +- .../expression/engine/rhino/RhinoEngine.java | 27 +++++++------------ 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c9bcaac0..d3a43fc5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,15 +3,17 @@ ------------------------------------------------------------------------------------------------------------- -# 5.5.2 (2020-11-17) +# 5.5.2 (2020-11-18) ### 新特性 * 【crypto 】 KeyUtil增加重载,AES构造增加重载(issue#I25NNZ@Gitee) * 【json 】 JSONUtil增加toList重载(issue#1228@Github) * 【core 】 新增CollStreamUtil(issue#1228@Github) +* 【extra 】 新增Rhino表达式执行引擎(pr#1229@Github) ### Bug修复 * 【cron 】 修复CronTimer可能死循环的问题(issue#1224@Github) +* 【core 】 修复Calculator.conversion单个数字越界问题(issue#1222@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java b/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java index 0fb845ea7..ac0cd0c94 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/Calculator.java @@ -53,7 +53,7 @@ public class Calculator { } } } - if (arr[0] == '~' || arr[1] == '(') { + if (arr[0] == '~' || (arr.length > 1 && arr[1] == '(')) { arr[0] = '-'; return "0" + new String(arr); } else { diff --git a/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java b/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java index 553c1691e..4cda5bcc0 100644 --- a/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/math/CalculatorTest.java @@ -16,4 +16,10 @@ public class CalculatorTest { final double conversion = Calculator.conversion("77 * 12"); Assert.assertEquals(924.0, conversion, 2); } + + @Test + public void conversationTest3(){ + final double conversion = Calculator.conversion("1"); + Assert.assertEquals(1, conversion, 2); + } } diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 5806b4ce2..3a1db5418 100644 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -413,7 +413,7 @@ org.mozilla rhino - 1.7.12 + 1.7.13 compile true 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 index eef25ffc4..0e3610228 100644 --- 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 @@ -1,5 +1,6 @@ package cn.hutool.extra.expression.engine.rhino; +import cn.hutool.core.map.MapUtil; import cn.hutool.extra.expression.ExpressionEngine; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; @@ -11,30 +12,22 @@ import java.util.Map; * rhino引擎封装
* 见:https://github.com/mozilla/rhino * - * @since 5.5.2 * @author lzpeng + * @since 5.5.2 */ 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); - } + final Context ctx = Context.enter(); + final Scriptable scope = ctx.initStandardObjects(); + if (MapUtil.isNotEmpty(context)) { + context.forEach((key, value)->{ + // 将java对象转为js对象后放置于JS的作用域中 + ScriptableObject.putProperty(scope, key, Context.javaToJS(value, scope)); + }); } - Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null); + final Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null); Context.exit(); return result; }