From a3ae323d3ab0e045da5820215c81af1f938e292d Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 14 Apr 2023 00:35:15 +0800 Subject: [PATCH] fix code --- .../hutool/core/func/SimpleWrapper.java | 39 +++++++++++++ .../hutool/extra/expression/Expression.java | 32 +++++++++++ .../extra/expression/ExpressionEngine.java | 19 +++++-- .../engine/aviator/AviatorEngine.java | 27 +++------ .../engine/aviator/AviatorExpression.java | 41 +++++++++++++ .../expression/engine/jexl/JexlEngine.java | 37 +++++------- .../engine/jexl/JexlExpression.java | 43 ++++++++++++++ .../expression/engine/jexl/JexlScript.java | 49 ++++++++++++++++ .../engine/jfireel/JfireELEngine.java | 15 ++--- .../engine/jfireel/JfireELExpression.java | 40 +++++++++++++ .../expression/engine/mvel/MvelEngine.java | 8 +-- .../engine/mvel/MvelExpression.java | 43 ++++++++++++++ .../engine/qlexpress/QLExpressEngine.java | 18 ++---- .../engine/qlexpress/QLExpressExpression.java | 56 ++++++++++++++++++ .../expression/engine/rhino/RhinoEngine.java | 20 +------ .../engine/rhino/RhinoExpression.java | 57 +++++++++++++++++++ .../expression/engine/spel/SpELEngine.java | 18 ++---- .../engine/spel/SpELExpression.java | 46 +++++++++++++++ 18 files changed, 505 insertions(+), 103 deletions(-) create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/func/SimpleWrapper.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/Expression.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorExpression.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlExpression.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlScript.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELExpression.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelExpression.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressExpression.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoExpression.java create mode 100644 hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELExpression.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/func/SimpleWrapper.java b/hutool-core/src/main/java/org/dromara/hutool/core/func/SimpleWrapper.java new file mode 100644 index 000000000..99b36c95b --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/func/SimpleWrapper.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.func; + +/** + * 简单包装对象 + * + * @param 被包装对象类型 + * @author looly + * @since 6.0.0 + */ +public class SimpleWrapper implements Wrapper { + + protected final T raw; + + /** + * 构造 + * + * @param raw 原始对象 + */ + public SimpleWrapper(final T raw) { + this.raw = raw; + } + + @Override + public T getRaw() { + return this.raw; + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/Expression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/Expression.java new file mode 100644 index 000000000..c1ddf5f5d --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/Expression.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression; + +import java.util.Map; + +/** + * 表达式定义,用于表示编译后的表达式。 + * + * @author looly + * @since 6.0.0 + */ +public interface Expression { + + /** + * 执行表达式 + * + * @param context 表达式上下文,用于存储表达式中所需的变量值等 + * @return 执行结果 + */ + Object eval(final Map context); +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/ExpressionEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/ExpressionEngine.java index f7eeefeae..2fd4d56bf 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/ExpressionEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/ExpressionEngine.java @@ -17,16 +17,27 @@ import java.util.Map; /** * 表达式引擎API接口,通过实现此接口,完成表达式的解析和执行 * - * @author looll,independenter + * @author looll, independenter * @since 5.5.0 */ public interface ExpressionEngine { /** - * 执行表达式 + * 编译表达式 + * * @param expression 表达式 - * @param context 表达式上下文,用于存储表达式中所需的变量值等 + * @return {@link Expression} + */ + Expression compile(String expression); + + /** + * 执行表达式 + * + * @param expression 表达式 + * @param context 表达式上下文,用于存储表达式中所需的变量值等 * @return 执行结果 */ - Object eval(String expression, Map context); + default Object eval(final String expression, final Map context){ + return compile(expression).eval(context); + } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorEngine.java index f58a39e58..0fdc663b9 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorEngine.java @@ -12,41 +12,30 @@ package org.dromara.hutool.extra.expression.engine.aviator; -import org.dromara.hutool.extra.expression.ExpressionEngine; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.AviatorEvaluatorInstance; - -import java.util.Map; +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; +import org.dromara.hutool.extra.expression.ExpressionEngine; /** * Aviator引擎封装
* 见:https://github.com/killme2008/aviatorscript * * @author looly - * @since 5.5.0 */ -public class AviatorEngine implements ExpressionEngine { - - private final AviatorEvaluatorInstance engine; +public class AviatorEngine extends SimpleWrapper + implements ExpressionEngine { /** * 构造 */ public AviatorEngine() { - engine = AviatorEvaluator.getInstance(); + super(AviatorEvaluator.getInstance()); } @Override - public Object eval(final String expression, final Map context) { - return engine.execute(expression, context); - } - - /** - * 获取{@link AviatorEvaluatorInstance} - * - * @return {@link AviatorEvaluatorInstance} - */ - public AviatorEvaluatorInstance getEngine() { - return this.engine; + public Expression compile(final String expression) { + return new AviatorExpression(this.raw.compile(expression)); } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorExpression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorExpression.java new file mode 100644 index 000000000..452832fb9 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/aviator/AviatorExpression.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.aviator; + +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; + +import java.util.Map; + +/** + * {@link com.googlecode.aviator.Expression} 包装 + * + * @author looly + * @since 6.0.0 + */ +public class AviatorExpression extends SimpleWrapper implements Expression { + + /** + * 构造 + * + * @param expression {@link com.googlecode.aviator.Expression} + */ + public AviatorExpression(final com.googlecode.aviator.Expression expression) { + super(expression); + } + + @Override + public Object eval(final Map context) { + return this.raw.execute(context); + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlEngine.java index 725c1c8eb..4b7be6d4a 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlEngine.java @@ -12,11 +12,10 @@ package org.dromara.hutool.extra.expression.engine.jexl; -import org.dromara.hutool.extra.expression.ExpressionEngine; import org.apache.commons.jexl3.JexlBuilder; -import org.apache.commons.jexl3.MapContext; - -import java.util.Map; +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; +import org.dromara.hutool.extra.expression.ExpressionEngine; /** * Jexl3引擎封装
@@ -25,36 +24,30 @@ import java.util.Map; * @since 5.5.0 * @author looly */ -public class JexlEngine implements ExpressionEngine { - - private final org.apache.commons.jexl3.JexlEngine engine; +public class JexlEngine extends SimpleWrapper + implements ExpressionEngine { /** * 构造 */ public JexlEngine(){ - engine = (new JexlBuilder()).cache(512).strict(true).silent(false).create(); + super( + (new JexlBuilder()) + .cache(512) + .strict(true) + .silent(false) + .create() + ); } @Override - public Object eval(final String expression, final Map context) { - final MapContext mapContext = new MapContext(context); - + public Expression compile(final String expression) { try{ - return engine.createExpression(expression).evaluate(mapContext); + return new JexlExpression(this.raw.createExpression(expression)); } catch (final Exception ignore){ // https://gitee.com/dromara/hutool/issues/I4B70D // 支持脚本 - return engine.createScript(expression).execute(mapContext); + return new JexlScript(this.raw.createScript(expression)); } } - - /** - * 获取{@link org.apache.commons.jexl3.JexlEngine} - * - * @return {@link org.apache.commons.jexl3.JexlEngine} - */ - public org.apache.commons.jexl3.JexlEngine getEngine() { - return this.engine; - } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlExpression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlExpression.java new file mode 100644 index 000000000..8aee23808 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlExpression.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.jexl; + +import org.apache.commons.jexl3.MapContext; +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; + +import java.util.Map; + +/** + * Jexl3引擎的{@link org.apache.commons.jexl3.JexlExpression}包装 + * + * @author looly + */ +public class JexlExpression extends SimpleWrapper + implements Expression { + + /** + * 构造 + * + * @param raw {@link org.apache.commons.jexl3.JexlExpression} + */ + public JexlExpression(final org.apache.commons.jexl3.JexlExpression raw) { + super(raw); + } + + @Override + public Object eval(final Map context) { + final MapContext mapContext = new MapContext(context); + return raw.evaluate(mapContext); + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlScript.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlScript.java new file mode 100644 index 000000000..f0649a505 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jexl/JexlScript.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.jexl; + +import org.apache.commons.jexl3.MapContext; +import org.dromara.hutool.core.func.Wrapper; +import org.dromara.hutool.extra.expression.Expression; + +import java.util.Map; + +/** + * Jexl3引擎的{@link org.apache.commons.jexl3.JexlScript}包装 + * + * @author looly + */ +public class JexlScript implements Expression, Wrapper { + + private final org.apache.commons.jexl3.JexlScript raw; + + /** + * 构造 + * + * @param raw {@link org.apache.commons.jexl3.JexlScript} + */ + public JexlScript(final org.apache.commons.jexl3.JexlScript raw) { + this.raw = raw; + } + + @Override + public Object eval(final Map context) { + final MapContext mapContext = new MapContext(context); + return raw.execute(mapContext); + } + + @Override + public org.apache.commons.jexl3.JexlScript getRaw() { + return raw; + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELEngine.java index 261ce8059..4fe2818a4 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELEngine.java @@ -12,10 +12,8 @@ package org.dromara.hutool.extra.expression.engine.jfireel; +import org.dromara.hutool.extra.expression.Expression; import org.dromara.hutool.extra.expression.ExpressionEngine; -import com.jfirer.jfireel.expression.Expression; - -import java.util.Map; /** * JfireEL引擎封装
@@ -26,14 +24,9 @@ import java.util.Map; */ public class JfireELEngine implements ExpressionEngine { - /** - * 构造 - */ - public JfireELEngine(){ - } - @Override - public Object eval(final String expression, final Map context) { - return Expression.parse(expression).calculate(context); + public Expression compile(final String expression) { + return new JfireELExpression( + com.jfirer.jfireel.expression.Expression.parse(expression)); } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELExpression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELExpression.java new file mode 100644 index 000000000..cc4998d09 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/jfireel/JfireELExpression.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.jfireel; + +import org.dromara.hutool.core.func.SimpleWrapper; + +import java.util.Map; + +/** + * JfireEL引擎表达式{@link com.jfirer.jfireel.expression.Expression} 封装 + * + * @author looly + */ +public class JfireELExpression extends SimpleWrapper + implements org.dromara.hutool.extra.expression.Expression { + + /** + * 构造 + * + * @param expression {@link com.jfirer.jfireel.expression.Expression} + */ + public JfireELExpression(final com.jfirer.jfireel.expression.Expression expression) { + super(expression); + } + + @Override + public Object eval(final Map context) { + return this.raw.calculate(context); + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelEngine.java index bd41ca913..6ba9fa56e 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelEngine.java @@ -12,10 +12,8 @@ package org.dromara.hutool.extra.expression.engine.mvel; +import org.dromara.hutool.extra.expression.Expression; import org.dromara.hutool.extra.expression.ExpressionEngine; -import org.mvel2.MVEL; - -import java.util.Map; /** * MVEL (MVFLEX Expression Language)引擎封装
@@ -33,7 +31,7 @@ public class MvelEngine implements ExpressionEngine { } @Override - public Object eval(final String expression, final Map context) { - return MVEL.eval(expression, context); + public Expression compile(final String expression) { + return new MvelExpression(expression); } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelExpression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelExpression.java new file mode 100644 index 000000000..3b7b7f7e2 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/mvel/MvelExpression.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.mvel; + +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; +import org.mvel2.MVEL; +import org.mvel2.templates.TemplateCompiler; + +import java.util.Map; + +/** + * MVEL2的{@link TemplateCompiler}包装 + * + * @author looly + */ +public class MvelExpression extends SimpleWrapper + implements Expression { + + /** + * 构造 + * + * @param expression 表达式字符串 + */ + public MvelExpression(final String expression) { + super(expression); + } + + @Override + public Object eval(final Map context) { + return MVEL.eval(this.raw, context); + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java index 6b9c34b7f..c43157edf 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java @@ -12,12 +12,9 @@ package org.dromara.hutool.extra.expression.engine.qlexpress; -import org.dromara.hutool.extra.expression.ExpressionEngine; -import org.dromara.hutool.extra.expression.ExpressionException; -import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; - -import java.util.Map; +import org.dromara.hutool.extra.expression.Expression; +import org.dromara.hutool.extra.expression.ExpressionEngine; /** * QLExpress引擎封装
@@ -37,14 +34,9 @@ public class QLExpressEngine implements ExpressionEngine { engine = new ExpressRunner(); } + @Override - public Object eval(final String expression, final Map context) { - final DefaultContext defaultContext = new DefaultContext<>(); - defaultContext.putAll(context); - try { - return engine.execute(expression, defaultContext, null, true, false); - } catch (final Exception e) { - throw new ExpressionException(e); - } + public Expression compile(final String expression) { + return new QLExpressExpression(this.engine, expression); } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressExpression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressExpression.java new file mode 100644 index 000000000..8c6942cb1 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/qlexpress/QLExpressExpression.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.qlexpress; + +import com.ql.util.express.DefaultContext; +import com.ql.util.express.ExpressRunner; +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; +import org.dromara.hutool.extra.expression.ExpressionException; + +import java.util.Map; + +/** + * QLExpress引擎表达式封装
+ * 由于QLExpress引擎使用字符串缓存方式存储表达式树,故此处无需存储表达式对象 + * + * @author looly + */ +public class QLExpressExpression extends SimpleWrapper + implements Expression { + + private final ExpressRunner engine; + + /** + * 构造 + * + * @param engine {@link ExpressRunner} + * @param expression 表达式字符串 + */ + public QLExpressExpression(final ExpressRunner engine, final String expression) { + super(expression); + this.engine = engine; + } + + @Override + public Object eval(final Map context) { + final DefaultContext defaultContext = new DefaultContext<>(); + defaultContext.putAll(context); + + try { + return engine.execute(this.raw, defaultContext, null, true, false); + } catch (final Exception e) { + throw new ExpressionException(e); + } + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoEngine.java index a26b2dea9..f882efc11 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoEngine.java @@ -12,13 +12,8 @@ package org.dromara.hutool.extra.expression.engine.rhino; -import org.dromara.hutool.core.map.MapUtil; +import org.dromara.hutool.extra.expression.Expression; import org.dromara.hutool.extra.expression.ExpressionEngine; -import org.mozilla.javascript.Context; -import org.mozilla.javascript.Scriptable; -import org.mozilla.javascript.ScriptableObject; - -import java.util.Map; /** * rhino引擎封装
@@ -30,16 +25,7 @@ import java.util.Map; public class RhinoEngine implements ExpressionEngine { @Override - public Object eval(final String expression, final Map context) { - try(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)); - }); - } - return ctx.evaluateString(scope, expression, "rhino.js", 1, null); - } // auto close + public Expression compile(final String expression) { + return new RhinoExpression(expression); } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoExpression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoExpression.java new file mode 100644 index 000000000..585b62943 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/rhino/RhinoExpression.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.rhino; + +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.core.map.MapUtil; +import org.dromara.hutool.extra.expression.Expression; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ScriptableObject; + +import java.util.Map; + +/** + * rhino引擎表达式包装 + * + * @author looly + */ +public class RhinoExpression extends SimpleWrapper + implements Expression { + + private static final String SOURCE_RHINO_JS = "rhino.js"; + + /** + * 构造 + * + * @param expression 表达式 + */ + public RhinoExpression(final String expression) { + super(expression); + } + + @Override + public Object eval(final Map context) { + try (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)); + }); + } + return ctx.evaluateString(scope, this.raw, + SOURCE_RHINO_JS, 1, null); + } // auto close + } +} diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELEngine.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELEngine.java index 365ada4f7..45c7896c6 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELEngine.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELEngine.java @@ -12,13 +12,11 @@ package org.dromara.hutool.extra.expression.engine.spel; +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; import org.dromara.hutool.extra.expression.ExpressionEngine; -import org.springframework.expression.EvaluationContext; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; - -import java.util.Map; /** * Spring-Expression引擎封装
@@ -27,21 +25,17 @@ import java.util.Map; * @since 5.5.0 * @author looly */ -public class SpELEngine implements ExpressionEngine { - - private final ExpressionParser parser; +public class SpELEngine extends SimpleWrapper implements ExpressionEngine { /** * 构造 */ public SpELEngine(){ - parser = new SpelExpressionParser(); + super(new SpelExpressionParser()); } @Override - public Object eval(final String expression, final Map context) { - final EvaluationContext evaluationContext = new StandardEvaluationContext(); - context.forEach(evaluationContext::setVariable); - return parser.parseExpression(expression).getValue(evaluationContext); + public Expression compile(final String expression) { + return new SpELExpression(this.raw.parseExpression(expression)); } } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELExpression.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELExpression.java new file mode 100644 index 000000000..37131e591 --- /dev/null +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/expression/engine/spel/SpELExpression.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.extra.expression.engine.spel; + +import org.dromara.hutool.core.func.SimpleWrapper; +import org.dromara.hutool.extra.expression.Expression; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.util.Map; + +/** + * Spring-Expression引擎表达式{@link org.springframework.expression.Expression} 包装 + * + * @author looly + */ +public class SpELExpression extends SimpleWrapper + implements Expression { + + /** + * 构造 + * + * @param expression {@link org.springframework.expression.Expression} + */ + public SpELExpression(final org.springframework.expression.Expression expression) { + super(expression); + } + + @Override + public Object eval(final Map context) { + final EvaluationContext evaluationContext = new StandardEvaluationContext(); + context.forEach(evaluationContext::setVariable); + + return this.raw.getValue(evaluationContext); + } +}