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 * 【crypto 】 KeyUtil增加重载AES构造增加重载issue#I25NNZ@Gitee
* 【json 】 JSONUtil增加toList重载issue#1228@Github * 【json 】 JSONUtil增加toList重载issue#1228@Github
* 【core 】 新增CollStreamUtilissue#1228@Github * 【core 】 新增CollStreamUtilissue#1228@Github
* 【extra 】 新增Rhino表达式执行引擎pr#1229@Github
### Bug修复 ### Bug修复
* 【cron 】 修复CronTimer可能死循环的问题issue#1224@Github * 【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] = '-'; arr[0] = '-';
return "0" + new String(arr); return "0" + new String(arr);
} else { } else {

View File

@ -16,4 +16,10 @@ public class CalculatorTest {
final double conversion = Calculator.conversion("77 * 12"); final double conversion = Calculator.conversion("77 * 12");
Assert.assertEquals(924.0, conversion, 2); 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> <dependency>
<groupId>org.mozilla</groupId> <groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId> <artifactId>rhino</artifactId>
<version>1.7.12</version> <version>1.7.13</version>
<scope>compile</scope> <scope>compile</scope>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>

View File

@ -1,5 +1,6 @@
package cn.hutool.extra.expression.engine.rhino; package cn.hutool.extra.expression.engine.rhino;
import cn.hutool.core.map.MapUtil;
import cn.hutool.extra.expression.ExpressionEngine; import cn.hutool.extra.expression.ExpressionEngine;
import org.mozilla.javascript.Context; import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.Scriptable;
@ -11,30 +12,22 @@ import java.util.Map;
* rhino引擎封装<br> * rhino引擎封装<br>
* https://github.com/mozilla/rhino * https://github.com/mozilla/rhino
* *
* @since 5.5.2
* @author lzpeng * @author lzpeng
* @since 5.5.2
*/ */
public class RhinoEngine implements ExpressionEngine { public class RhinoEngine implements ExpressionEngine {
/**
* 构造
*/
public RhinoEngine(){
}
@Override @Override
public Object eval(String expression, Map<String, Object> context) { public Object eval(String expression, Map<String, Object> context) {
Context ctx = Context.enter(); final Context ctx = Context.enter();
Scriptable scope = ctx.initStandardObjects(); final Scriptable scope = ctx.initStandardObjects();
if (context != null && !context.isEmpty()) { if (MapUtil.isNotEmpty(context)) {
for (Map.Entry<String, Object> entry : context.entrySet()) { context.forEach((key, value)->{
// 将java对象转为js对象 // 将java对象转为js对象后放置于JS的作用域中
Object jsObj = Context.javaToJS(entry.getValue(), scope); ScriptableObject.putProperty(scope, key, Context.javaToJS(value, scope));
// 将java对象放置JS的作用域中 });
ScriptableObject.putProperty(scope, entry.getKey(), jsObj);
} }
} final Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null);
Object result = ctx.evaluateString(scope, expression, "rhino.js", 1, null);
Context.exit(); Context.exit();
return result; return result;
} }