add engine and fix bug

This commit is contained in:
Looly 2020-11-18 00:34:51 +08:00
parent 83a2244f80
commit 9867333f68
5 changed files with 21 additions and 20 deletions

View File

@ -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 】 新增CollStreamUtilissue#1228@Github
* 【extra 】 新增Rhino表达式执行引擎pr#1229@Github
### Bug修复
* 【cron 】 修复CronTimer可能死循环的问题issue#1224@Github
* 【core 】 修复Calculator.conversion单个数字越界问题issue#1222@Github
-------------------------------------------------------------------------------------------------------------

View File

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

View File

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

View File

@ -413,7 +413,7 @@
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
<version>1.7.12</version>
<version>1.7.13</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>

View File

@ -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引擎封装<br>
* 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<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);
}
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;
}