enhancement #IA9NOI ELBus中增加对retry构建的api支持

enhancement #IA9QBG el-builder的部分重构
This commit is contained in:
everywhere.z
2024-07-01 19:57:42 +08:00
parent a6f0835e54
commit ff40b749b7
23 changed files with 333 additions and 295 deletions

View File

@@ -1,9 +1,5 @@
package com.yomahub.liteflow.builder.el;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 与或非表达式中的 与表达式
* 参数允许任意数量 参数必须返回true或false
@@ -21,7 +17,7 @@ public class AndELWrapper extends ELWrapper {
}
public AndELWrapper and(Object ... object){
ELWrapper[] wrapper = ELBus.convertToLogicOpt(object);
ELWrapper[] wrapper = ELBus.convertToBooleanOpt(object);
this.addWrapper(wrapper);
return this;
}
@@ -38,12 +34,6 @@ public class AndELWrapper extends ELWrapper {
return this;
}
@Override
public AndELWrapper maxWaitSeconds(Integer maxWaitSeconds){
setMaxWaitSeconds(maxWaitSeconds);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
// 根据depth是否为null决定输出是否格式化

View File

@@ -1,9 +1,5 @@
package com.yomahub.liteflow.builder.el;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 捕获异常表达式
* Catch(a).do(b)
@@ -22,7 +18,7 @@ public class CatchELWrapper extends ELWrapper {
}
public CatchELWrapper doOpt(Object object){
ELWrapper elWrapper = ELBus.convertToNonLogicOpt(object);
ELWrapper elWrapper = ELBus.convertToNonBooleanOpt(object);
this.addWrapper(elWrapper);
return this;
}
@@ -45,6 +41,16 @@ public class CatchELWrapper extends ELWrapper {
return this;
}
public CatchELWrapper retry(Integer count){
super.retry(count);
return this;
}
public CatchELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -27,7 +27,7 @@ public class ELBus {
}
public static ThenELWrapper then(Object ... objects){
ELWrapper[] elWrappers = convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = convertToNonBooleanOpt(objects);
return new ThenELWrapper(elWrappers);
}
@@ -43,7 +43,7 @@ public class ELBus {
}
public static WhenELWrapper when(Object ... objects){
ELWrapper[] elWrappers = convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = convertToNonBooleanOpt(objects);
return new WhenELWrapper(elWrappers);
}
@@ -53,7 +53,7 @@ public class ELBus {
}
public static SerELWrapper ser(Object ... objects){
ELWrapper[] elWrappers = convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = convertToNonBooleanOpt(objects);
return new SerELWrapper(elWrappers);
}
@@ -69,7 +69,7 @@ public class ELBus {
}
public static ParELWrapper par(Object ... objects){
ELWrapper[] elWrappers = convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = convertToNonBooleanOpt(objects);
return new ParELWrapper(elWrappers);
}
@@ -83,43 +83,43 @@ public class ELBus {
* @return {@link IfELWrapper}
*/
public static IfELWrapper ifOpt(NodeELWrapper ifElWrapper, Object trueElWrapper, Object falseElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper), convertToNonLogicOpt(falseElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper), convertToNonBooleanOpt(falseElWrapper));
}
public static IfELWrapper ifOpt(String ifElWrapper, Object trueElWrapper, Object falseElWrapper){
return new IfELWrapper((NodeELWrapper) convertToLogicOpt(ifElWrapper), convertToNonLogicOpt(trueElWrapper), convertToNonLogicOpt(falseElWrapper));
return new IfELWrapper((NodeELWrapper) convertToBooleanOpt(ifElWrapper), convertToNonBooleanOpt(trueElWrapper), convertToNonBooleanOpt(falseElWrapper));
}
public static IfELWrapper ifOpt(AndELWrapper ifElWrapper, Object trueElWrapper, Object falseElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper), convertToNonLogicOpt(falseElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper), convertToNonBooleanOpt(falseElWrapper));
}
public static IfELWrapper ifOpt(OrELWrapper ifElWrapper, Object trueElWrapper, Object falseElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper), convertToNonLogicOpt(falseElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper), convertToNonBooleanOpt(falseElWrapper));
}
public static IfELWrapper ifOpt(NotELWrapper ifElWrapper, Object trueElWrapper, Object falseElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper), convertToNonLogicOpt(falseElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper), convertToNonBooleanOpt(falseElWrapper));
}
public static IfELWrapper ifOpt(NodeELWrapper ifElWrapper, Object trueElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper));
}
public static IfELWrapper ifOpt(String ifElWrapper, Object trueElWrapper){
return new IfELWrapper((NodeELWrapper) convertToLogicOpt(ifElWrapper), convertToNonLogicOpt(trueElWrapper));
return new IfELWrapper((NodeELWrapper) convertToBooleanOpt(ifElWrapper), convertToNonBooleanOpt(trueElWrapper));
}
public static IfELWrapper ifOpt(AndELWrapper ifElWrapper, Object trueElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper));
}
public static IfELWrapper ifOpt(OrELWrapper ifElWrapper, Object trueElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper));
}
public static IfELWrapper ifOpt(NotELWrapper ifElWrapper, Object trueElWrapper){
return new IfELWrapper(ifElWrapper, convertToNonLogicOpt(trueElWrapper));
return new IfELWrapper(ifElWrapper, convertToNonBooleanOpt(trueElWrapper));
}
/**
@@ -150,70 +150,70 @@ public class ELBus {
* 创建 for 次数循环表达式
*
* @param loopNumber 循环次数
* @return {@link ForELWrapper}
* @return {@link LoopELWrapper}
*/
public static ForELWrapper forOpt(Integer loopNumber){
return new ForELWrapper(loopNumber, "FOR");
public static LoopELWrapper forOpt(Integer loopNumber){
return new LoopELWrapper(loopNumber, LoopELWrapper.FOR);
}
/**
* 创建 for 次数循环表达式
*
* @param nodeElWrapper 返回循环次数的节点
* @return {@link ForELWrapper}
* @return {@link LoopELWrapper}
*/
public static ForELWrapper forOpt(NodeELWrapper nodeElWrapper){
return new ForELWrapper(nodeElWrapper, "FOR");
public static LoopELWrapper forOpt(NodeELWrapper nodeElWrapper){
return new LoopELWrapper(nodeElWrapper, LoopELWrapper.FOR);
}
/**
* 创建 for 次数循环表达式
*
* @param nodeElWrapper 返回循环次数的节点Id
* @return {@link ForELWrapper}
* @return {@link LoopELWrapper}
*/
public static ForELWrapper forOpt(String nodeElWrapper){
return new ForELWrapper(convert(nodeElWrapper), "FOR");
public static LoopELWrapper forOpt(String nodeElWrapper){
return new LoopELWrapper(convert(nodeElWrapper), LoopELWrapper.FOR);
}
/**
* 创建 while 条件循环表达式
*
* @param nodeElWrapper 返回布尔值的节点
* @return {@link WhileELWrapper}
* @return {@link LoopELWrapper}
*/
public static WhileELWrapper whileOpt(NodeELWrapper nodeElWrapper){
return new WhileELWrapper(nodeElWrapper, "WHILE");
public static LoopELWrapper whileOpt(NodeELWrapper nodeElWrapper){
return new LoopELWrapper(nodeElWrapper, LoopELWrapper.WHILE);
}
public static WhileELWrapper whileOpt(String nodeElWrapper){
return new WhileELWrapper(convert(nodeElWrapper), "WHILE");
public static LoopELWrapper whileOpt(String nodeElWrapper){
return new LoopELWrapper(convert(nodeElWrapper), LoopELWrapper.WHILE);
}
public static WhileELWrapper whileOpt(AndELWrapper andElWrapper){
return new WhileELWrapper(andElWrapper, "WHILE");
public static LoopELWrapper whileOpt(AndELWrapper andElWrapper){
return new LoopELWrapper(andElWrapper, LoopELWrapper.WHILE);
}
public static WhileELWrapper whileOpt(OrELWrapper orElWrapper){
return new WhileELWrapper(orElWrapper, "WHILE");
public static LoopELWrapper whileOpt(OrELWrapper orElWrapper){
return new LoopELWrapper(orElWrapper, LoopELWrapper.WHILE);
}
public static WhileELWrapper whileOpt(NotELWrapper notElWrapper){
return new WhileELWrapper(notElWrapper, "WHILE");
public static LoopELWrapper whileOpt(NotELWrapper notElWrapper){
return new LoopELWrapper(notElWrapper, LoopELWrapper.WHILE);
}
/**
* 创建迭代循环表达式
*
* @param nodeElWrapper 迭代节点
* @return {@link IteratorELWrapper}
* @return {@link LoopELWrapper}
*/
public static IteratorELWrapper iteratorOpt(NodeELWrapper nodeElWrapper){
return new IteratorELWrapper(nodeElWrapper, "ITERATOR");
public static LoopELWrapper iteratorOpt(NodeELWrapper nodeElWrapper){
return new LoopELWrapper(nodeElWrapper, LoopELWrapper.ITERATOR);
}
public static IteratorELWrapper iteratorOpt(String nodeElWrapper){
return new IteratorELWrapper(convert(nodeElWrapper), "ITERATOR");
public static LoopELWrapper iteratorOpt(String nodeElWrapper){
return new LoopELWrapper(convert(nodeElWrapper), LoopELWrapper.ITERATOR);
}
/**
@@ -223,7 +223,7 @@ public class ELBus {
* @return {@link CatchELWrapper}
*/
public static CatchELWrapper catchException(Object object){
return new CatchELWrapper(convertToNonLogicOpt(object));
return new CatchELWrapper(convertToNonBooleanOpt(object));
}
/**
@@ -233,7 +233,7 @@ public class ELBus {
* @return {@link AndELWrapper}
*/
public static AndELWrapper and(Object ... objects){
ELWrapper[] elWrappers = convertToLogicOpt(objects);
ELWrapper[] elWrappers = convertToBooleanOpt(objects);
return new AndELWrapper(elWrappers);
}
@@ -244,7 +244,7 @@ public class ELBus {
* @return {@link OrELWrapper}
*/
public static OrELWrapper or(Object ... objects){
ELWrapper[] elWrappers = convertToLogicOpt(objects);
ELWrapper[] elWrappers = convertToBooleanOpt(objects);
return new OrELWrapper(elWrappers);
}
@@ -309,13 +309,13 @@ public class ELBus {
* @param objects 表达式或字符串
* @return {@link ELWrapper[]}
*/
public static ELWrapper[] convertToLogicOpt(Object... objects){
public static ELWrapper[] convertToBooleanOpt(Object... objects){
ELWrapper[] elWrappers = convert(objects);
checkBooleanArgs(elWrappers);
return elWrappers;
}
public static ELWrapper convertToLogicOpt(Object object){
public static ELWrapper convertToBooleanOpt(Object object){
ELWrapper elWrapper = convert(object);
checkBooleanArgs(elWrapper);
return elWrapper;
@@ -327,13 +327,13 @@ public class ELBus {
* @param objects 表达式或字符串
* @return {@link ELWrapper[]}
*/
public static ELWrapper[] convertToNonLogicOpt(Object ... objects){
public static ELWrapper[] convertToNonBooleanOpt(Object ... objects){
ELWrapper[] elWrappers = convert(objects);
checkNotBooleanArgs(elWrappers);
return elWrappers;
}
public static ELWrapper convertToNonLogicOpt(Object object){
public static ELWrapper convertToNonBooleanOpt(Object object){
ELWrapper elWrapper = convert(object);
checkNotBooleanArgs(elWrapper);
return elWrapper;

View File

@@ -1,6 +1,7 @@
package com.yomahub.liteflow.builder.el;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.builder.el.vo.RetryELVo;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.ArrayList;
@@ -13,6 +14,7 @@ import java.util.Map;
* 定义所有EL表达式的公有变量 tag、id、data、maxWaitSeconds 以及 子表达式列表 ELWrapperList
*
* @author gezuao
* @author Bryan.Zhang
* @since 2.11.1
*/
public abstract class ELWrapper {
@@ -24,6 +26,7 @@ public abstract class ELWrapper {
private String dataName;
private String data;
private Integer maxWaitSeconds;
private RetryELVo retry;
protected void addWrapper(ELWrapper wrapper){
this.elWrapperList.add(wrapper);
@@ -89,6 +92,14 @@ public abstract class ELWrapper {
return this.maxWaitSeconds;
}
protected RetryELVo getRetry() {
return retry;
}
protected void setRetry(RetryELVo retry) {
this.retry = retry;
}
/**
* 设置组件标记内容
*
@@ -156,6 +167,18 @@ public abstract class ELWrapper {
return this;
}
protected ELWrapper retry(int count){
RetryELVo item = new RetryELVo(count);
setRetry(item);
return this;
}
protected ELWrapper retry(int count, String... exceptions){
RetryELVo item = new RetryELVo(count, exceptions);
setRetry(item);
return this;
}
/**
* 非格式化输出EL表达式
*
@@ -207,6 +230,9 @@ public abstract class ELWrapper {
if(this.getMaxWaitSeconds() != null){
elContext.append(StrUtil.format(".maxWaitSeconds({})", String.valueOf(this.getMaxWaitSeconds())));
}
if (this.getRetry() != null){
elContext.append(StrUtil.format(".retry({})", this.getRetry().toString()));
}
}
/**

View File

@@ -1,9 +1,6 @@
package com.yomahub.liteflow.builder.el;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 后置表达式
@@ -16,7 +13,7 @@ import java.util.Map;
*/
public class FinallyELWrapper extends ELWrapper {
public FinallyELWrapper(Object ... objects){
super.addWrapper(ELBus.convertToNonLogicOpt(objects));
super.addWrapper(ELBus.convertToNonBooleanOpt(objects));
}
@Override
@@ -43,6 +40,16 @@ public class FinallyELWrapper extends ELWrapper {
return this;
}
public FinallyELWrapper retry(Integer count){
super.retry(count);
return this;
}
public FinallyELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -1,63 +0,0 @@
package com.yomahub.liteflow.builder.el;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 次数循环表达式
* FOR只允许一个参数 参数为 Integer 或 返回循环次数的 EL表达式
* DO只允许一个参数 参数类型不为与或非表达式
* 支持调用break方法参数为与或非表达式或返回true false的单节点
*
* 支持设置 id tag data maxWaitSeconds 以及 parallel 属性
*
* @author gezuao
* @since 2.11.1
*/
public class ForELWrapper extends LoopELWrapper {
public ForELWrapper(Integer loopNumber, String loopFunction){
super(loopNumber, loopFunction);
}
public ForELWrapper(ELWrapper elWrapper, String loopFunction){
super(elWrapper, loopFunction);
}
@Override
public ForELWrapper doOpt(Object object){
ELWrapper elWrapper = ELBus.convertToNonLogicOpt(object);
super.addWrapper(elWrapper, 1);
return this;
}
public ForELWrapper breakOpt(Object object){
ELWrapper elWrapper = ELBus.convertToLogicOpt(object);
super.addWrapper(elWrapper, 2);
return this;
}
public ForELWrapper parallel(boolean parallel){
setParallel(parallel);
return this;
}
@Override
public ForELWrapper tag(String tag) {
this.setTag(tag);
return this;
}
@Override
public ForELWrapper id(String id) {
this.setId(id);
return this;
}
@Override
public ForELWrapper maxWaitSeconds(Integer maxWaitSeconds){
setMaxWaitSeconds(maxWaitSeconds);
return this;
}
}

View File

@@ -1,9 +1,7 @@
package com.yomahub.liteflow.builder.el;
import cn.hutool.core.util.ObjectUtil;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
import java.util.Objects;
/**
@@ -115,7 +113,7 @@ public class IfELWrapper extends ELWrapper {
* @return {@link IfELWrapper}
*/
public IfELWrapper elseOpt(Object falseObject){
ELWrapper falseWrapper = ELBus.convertToNonLogicOpt(falseObject);
ELWrapper falseWrapper = ELBus.convertToNonBooleanOpt(falseObject);
// 找到最深层的if组件
ELWrapper prev = this;
ELWrapper succ = this;
@@ -138,8 +136,8 @@ public class IfELWrapper extends ELWrapper {
*/
public IfELWrapper elIfOpt(Object ifObject, Object trueObject) {
// 包装判断表达式和true分支组件
ELWrapper ifWrapper = ELBus.convertToLogicOpt(ifObject);
ELWrapper trueWrapper = ELBus.convertToNonLogicOpt(trueObject);
ELWrapper ifWrapper = ELBus.convertToBooleanOpt(ifObject);
ELWrapper trueWrapper = ELBus.convertToNonBooleanOpt(trueObject);
IfELWrapper elIfWrapper;
if(ifWrapper instanceof NodeELWrapper){
elIfWrapper = new IfELWrapper((NodeELWrapper) ifWrapper, trueWrapper);
@@ -219,6 +217,16 @@ public class IfELWrapper extends ELWrapper {
return this;
}
public IfELWrapper retry(Integer count){
super.retry(count);
return this;
}
public IfELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -1,51 +0,0 @@
package com.yomahub.liteflow.builder.el;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 迭代循环表达式
* ITERATOR只允许一个参数 参数为 EL表达式
* DO只允许一个参数 参数类型不为与或非表达式
*
* 支持设置 id tag data maxWaitSeconds 以及 parallel 属性
*
* @author gezuao
* @since 2.11.1
*/
public class IteratorELWrapper extends LoopELWrapper {
public IteratorELWrapper(ELWrapper elWrapper, String loopFunction){
super(elWrapper, loopFunction);
}
public IteratorELWrapper parallel(boolean parallel){
setParallel(parallel);
return this;
}
@Override
public IteratorELWrapper doOpt(Object object){
ELWrapper elWrapper = ELBus.convertToNonLogicOpt(object);
super.addWrapper(elWrapper, 1);
return this;
}
@Override
public IteratorELWrapper tag(String tag) {
this.setTag(tag);
return this;
}
@Override
public IteratorELWrapper id(String id) {
this.setId(id);
return this;
}
@Override
public IteratorELWrapper maxWaitSeconds(Integer maxWaitSeconds){
setMaxWaitSeconds(maxWaitSeconds);
return this;
}
}

View File

@@ -1,16 +1,19 @@
package com.yomahub.liteflow.builder.el;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* FOR、WHILE、ITERATOR循环表达式的公共抽象父类
*
* @author gezuao
* @author Bryan.Zhang
* @since 2.11.1
*/
public abstract class LoopELWrapper extends ELWrapper {
public class LoopELWrapper extends ELWrapper {
public final static String FOR = "FOR";
public final static String WHILE = "WHILE";
public final static String ITERATOR = "ITERATOR";
protected Integer loopNumber;
@@ -32,12 +35,23 @@ public abstract class LoopELWrapper extends ELWrapper {
this.addWrapper(elWrapper, 0);
}
public LoopELWrapper parallel(boolean parallel){
setParallel(parallel);
return this;
}
public LoopELWrapper doOpt(Object object){
ELWrapper elWrapper = ELBus.convertToNonLogicOpt(object);
ELWrapper elWrapper = ELBus.convertToNonBooleanOpt(object);
this.addWrapper(elWrapper, 1);
return this;
}
public LoopELWrapper breakOpt(Object object){
ELWrapper elWrapper = ELBus.convertToBooleanOpt(object);
super.addWrapper(elWrapper, 2);
return this;
}
protected void setParallel(boolean parallel){
this.parallel = parallel;
}
@@ -60,6 +74,17 @@ public abstract class LoopELWrapper extends ELWrapper {
return this;
}
public LoopELWrapper retry(Integer count){
super.retry(count);
return this;
}
public LoopELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -85,6 +85,16 @@ public class NodeELWrapper extends ELWrapper {
return this;
}
public NodeELWrapper retry(Integer count){
super.retry(count);
return this;
}
public NodeELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
NodeELWrapper nodeElWrapper = this.getNodeWrapper();
@@ -117,5 +127,8 @@ public class NodeELWrapper extends ELWrapper {
if(this.getMaxWaitSeconds() != null){
elContext.append(StrUtil.format(".maxWaitSeconds({})", String.valueOf(this.getMaxWaitSeconds())));
}
if (this.getRetry() != null){
elContext.append(StrUtil.format(".retry({})", this.getRetry().toString()));
}
}
}

View File

@@ -30,12 +30,6 @@ public class NotELWrapper extends ELWrapper {
return this;
}
@Override
public NotELWrapper maxWaitSeconds(Integer maxWaitSeconds){
setMaxWaitSeconds(maxWaitSeconds);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -1,9 +1,5 @@
package com.yomahub.liteflow.builder.el;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 与或非表达式中的 或表达式
* 参数允许任意数量 参数必须返回true或false
@@ -21,7 +17,7 @@ public class OrELWrapper extends ELWrapper {
}
public OrELWrapper or(Object ... object){
ELWrapper[] elWrapper = ELBus.convertToLogicOpt(object);
ELWrapper[] elWrapper = ELBus.convertToBooleanOpt(object);
this.addWrapper(elWrapper);
return this;
}
@@ -38,12 +34,6 @@ public class OrELWrapper extends ELWrapper {
return this;
}
@Override
public OrELWrapper maxWaitSeconds(Integer maxWaitSeconds){
setMaxWaitSeconds(maxWaitSeconds);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -32,7 +32,7 @@ public class ParELWrapper extends ELWrapper {
}
public ParELWrapper par(Object ... objects){
ELWrapper[] elWrappers = ELBus.convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = ELBus.convertToNonBooleanOpt(objects);
// 校验与或非表达式
this.addWrapper(elWrappers);
return this;
@@ -76,6 +76,16 @@ public class ParELWrapper extends ELWrapper {
return this;
}
public ParELWrapper retry(Integer count){
super.retry(count);
return this;
}
public ParELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -36,6 +36,16 @@ public class PreELWrapper extends ELWrapper {
return this;
}
public PreELWrapper retry(Integer count){
super.retry(count);
return this;
}
public PreELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -26,7 +26,7 @@ public class SerELWrapper extends ELWrapper {
}
public SerELWrapper ser(Object ... objects){
ELWrapper[] elWrappers = ELBus.convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = ELBus.convertToNonBooleanOpt(objects);
// 校验与或非表达式
this.addWrapper(elWrappers);
return this;
@@ -80,6 +80,16 @@ public class SerELWrapper extends ELWrapper {
return this;
}
public SerELWrapper retry(Integer count){
super.retry(count);
return this;
}
public SerELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -1,9 +1,6 @@
package com.yomahub.liteflow.builder.el;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 选择组件
@@ -28,13 +25,13 @@ public class SwitchELWrapper extends ELWrapper {
}
public SwitchELWrapper to(Object... objects){
ELWrapper[] elWrappers = ELBus.convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = ELBus.convertToNonBooleanOpt(objects);
this.addWrapper(elWrappers);
return this;
}
public SwitchELWrapper defaultOpt(Object object){
defaultElWrapper = ELBus.convertToNonLogicOpt(object);
defaultElWrapper = ELBus.convertToNonBooleanOpt(object);
return this;
}
@@ -56,6 +53,16 @@ public class SwitchELWrapper extends ELWrapper {
return this;
}
public SwitchELWrapper retry(Integer count){
super.retry(count);
return this;
}
public SwitchELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -1,11 +1,9 @@
package com.yomahub.liteflow.builder.el;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 串行组件
@@ -28,7 +26,7 @@ public class ThenELWrapper extends ELWrapper {
}
public ThenELWrapper then(Object ... objects){
ELWrapper[] elWrappers = ELBus.convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = ELBus.convertToNonBooleanOpt(objects);
// 校验与或非表达式
this.addWrapper(elWrappers);
return this;
@@ -82,6 +80,16 @@ public class ThenELWrapper extends ELWrapper {
return this;
}
public ThenELWrapper retry(Integer count){
super.retry(count);
return this;
}
public ThenELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -2,7 +2,6 @@ package com.yomahub.liteflow.builder.el;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.*;
@@ -31,7 +30,7 @@ public class WhenELWrapper extends ELWrapper {
}
public WhenELWrapper when(Object ... objects){
ELWrapper[] elWrappers = ELBus.convertToNonLogicOpt(objects);
ELWrapper[] elWrappers = ELBus.convertToNonBooleanOpt(objects);
// 校验与或非表达式
this.addWrapper(elWrappers);
return this;
@@ -75,6 +74,16 @@ public class WhenELWrapper extends ELWrapper {
return this;
}
public WhenELWrapper retry(Integer count){
super.retry(count);
return this;
}
public WhenELWrapper retry(Integer count, String... exceptions){
super.retry(count, exceptions);
return this;
}
@Override
protected String toEL(Integer depth, StringBuilder paramContext) {
Integer sonDepth = depth == null ? null : depth + 1;

View File

@@ -1,58 +0,0 @@
package com.yomahub.liteflow.builder.el;
import com.yomahub.liteflow.util.JsonUtil;
import java.util.Map;
/**
* 条件循环表达式
* WHILE只允许一个参数 参数为 返回布尔值的EL表达式
* DO只允许一个参数 参数类型不为与或非表达式
* 支持调用break方法参数为与或非表达式或返回true false的单节点
*
* 支持设置 id tag data maxWaitSeconds 以及 parallel 属性
*
* @author gezuao
* @since 2.11.1
*/
public class WhileELWrapper extends LoopELWrapper {
public WhileELWrapper(ELWrapper elWrapper, String loopFunction){
super(elWrapper, loopFunction);
}
public WhileELWrapper parallel(boolean parallel){
setParallel(parallel);
return this;
}
@Override
public WhileELWrapper doOpt(Object object){
ELWrapper elWrapper = ELBus.convertToNonLogicOpt(object);
super.addWrapper(elWrapper, 1);
return this;
}
public WhileELWrapper breakOpt(Object object){
ELWrapper elWrapper = ELBus.convertToLogicOpt(object);
super.addWrapper(elWrapper, 2);
return this;
}
@Override
public WhileELWrapper tag(String tag) {
this.setTag(tag);
return this;
}
@Override
public WhileELWrapper id(String id) {
this.setId(id);
return this;
}
@Override
public WhileELWrapper maxWaitSeconds(Integer maxWaitSeconds){
setMaxWaitSeconds(maxWaitSeconds);
return this;
}
}

View File

@@ -0,0 +1,37 @@
package com.yomahub.liteflow.builder.el.vo;
import cn.hutool.core.util.StrUtil;
import java.util.Arrays;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 用于ELBus中设置retry关键字的对象
* @author Bryan.Zhang
* @since 2.12.2
*/
public class RetryELVo {
private int count;
private String[] exceptions;
public RetryELVo(int count) {
this.count = count;
}
public RetryELVo(int count, String... exceptions) {
this.count = count;
this.exceptions = exceptions;
}
@Override
public String toString() {
if (exceptions == null) {
return StrUtil.format("{}", count);
}else{
return StrUtil.format("{},{}", count, Arrays.stream(exceptions).map(s -> StrUtil.format("\"{}\"", s)).collect(Collectors.joining(",")));
}
}
}

View File

@@ -57,19 +57,19 @@ public class LogicELBuilderTest extends BaseTest {
// 属性设置
@Test
public void testlogic5(){
String expectedStr = "AND(node(\"a\"),OR(node(\"b\"),node(\"c\")).id(\"this is a id\"),NOT(node(\"d\")).tag(\"this is a tag\")).maxWaitSeconds(4);";
String expectedStr = "AND(node(\"a\"),OR(node(\"b\"),node(\"c\")).id(\"this is a id\"),NOT(node(\"d\")).tag(\"this is a tag\"));";
Assertions.assertEquals(expectedStr,
ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).maxWaitSeconds(4).toEL());
ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).toEL());
System.out.println(expectedStr);
Assertions.assertTrue(LiteFlowChainELBuilder.validate(ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).maxWaitSeconds(4).toEL()));
Assertions.assertTrue(LiteFlowChainELBuilder.validate(ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).toEL()));
}
@Test
public void testlogic6(){
String expectedStr = "AND(\n\tnode(\"a\"),\n\tOR(\n\t\tnode(\"b\"),\n\t\tnode(\"c\")\n\t).id(\"this is a id\"),\n\tNOT(\n\t\tnode(\"d\")\n\t).tag(\"this is a tag\")\n).maxWaitSeconds(4);";
String expectedStr = "AND(\n\tnode(\"a\"),\n\tOR(\n\t\tnode(\"b\"),\n\t\tnode(\"c\")\n\t).id(\"this is a id\"),\n\tNOT(\n\t\tnode(\"d\")\n\t).tag(\"this is a tag\")\n);";
Assertions.assertEquals(expectedStr,
ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).maxWaitSeconds(4).toEL(true));
ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).toEL(true));
System.out.println(expectedStr);
Assertions.assertTrue(LiteFlowChainELBuilder.validate(ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).maxWaitSeconds(4).toEL(true)));
Assertions.assertTrue(LiteFlowChainELBuilder.validate(ELBus.and("a", ELBus.or("b", "c").id("this is a id"), ELBus.not("d").tag("this is a tag")).toEL(true)));
}
@Test
public void testlogic7(){
@@ -191,16 +191,11 @@ public class LogicELBuilderTest extends BaseTest {
@Test
public void testLogic(){
AndELWrapper andEl = ELBus.and("a", "b").id("this is a id").tag("this is a tag").maxWaitSeconds(5);
AndELWrapper andEl = ELBus.and("a", "b").id("this is a id").tag("this is a tag");
Assertions.assertTrue(LiteFlowChainELBuilder.validate(andEl.toEL()));
OrELWrapper orEl = ELBus.or("a", "b").maxWaitSeconds(3);
OrELWrapper orEl = ELBus.or("a", "b");
Assertions.assertTrue(LiteFlowChainELBuilder.validate(orEl.toEL()));
NotELWrapper notEl = ELBus.not("a").maxWaitSeconds(2);
NotELWrapper notEl = ELBus.not("a");
Assertions.assertTrue(LiteFlowChainELBuilder.validate(notEl.toEL()));
// Assertions.assertTrue(LiteFlowChainELBuilder.validate("AND(node(\"a\"),OR(node(\"b\"),node(\"c\")).id(\"this is a id\"),NOT(node(\"d\")).tag(\"this is a tag\").maxWaitSeconds(3))"));
// ThenELWrapper thenELWrapper = ELBus.then(ELBus.when("a", "b", ELBus.when("c", "d").maxWaitSeconds(3)));
// Assertions.assertTrue(LiteFlowChainELBuilder.validate(thenELWrapper.toEL()));
}
}

View File

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.test.builder;
import com.yomahub.liteflow.builder.el.*;
import com.yomahub.liteflow.test.BaseTest;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -62,11 +63,16 @@ public class MaxWaitSecondBuilderTest extends BaseTest {
// 循环层面
@Test
public void testMaxWaitSecond6(){
ForELWrapper forELWrapper = ELBus.forOpt(3).doOpt("a").maxWaitSeconds(5);
LoopELWrapper forELWrapper = ELBus.forOpt(3).doOpt("a").maxWaitSeconds(5);
Assertions.assertEquals("FOR(3).DO(a).maxWaitSeconds(5);", forELWrapper.toEL());
WhileELWrapper whileELWrapper = ELBus.whileOpt("w").doOpt("a").maxWaitSeconds(5);
LoopELWrapper whileELWrapper = ELBus.whileOpt("w").doOpt("a").maxWaitSeconds(5);
Assertions.assertEquals("WHILE(w).DO(a).maxWaitSeconds(5);", whileELWrapper.toEL());
IteratorELWrapper iteratorELWrapper = ELBus.iteratorOpt("i").doOpt("a").maxWaitSeconds(5);
LoopELWrapper iteratorELWrapper = ELBus.iteratorOpt("i").doOpt("a").maxWaitSeconds(5);
Assertions.assertEquals("ITERATOR(i).DO(a).maxWaitSeconds(5);", iteratorELWrapper.toEL());
}
@AfterAll
public static void after(){
ELBus.setNodeWrapper(true);
}
}

View File

@@ -0,0 +1,59 @@
package com.yomahub.liteflow.test.builder;
import com.yomahub.liteflow.builder.el.*;
import com.yomahub.liteflow.test.BaseTest;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = RetryBuilderTest.class)
@EnableAutoConfiguration
public class RetryBuilderTest extends BaseTest {
@BeforeAll
public static void init(){
ELBus.setNodeWrapper(false);
}
// node上进行retry
@Test
public void testRetry1(){
NodeELWrapper nodeA = ELBus.node("a").retry(2);
NodeELWrapper nodeB = ELBus.node("b").retry(3);
WhenELWrapper whenELWrapper = ELBus.when(nodeA, nodeB);
Assertions.assertEquals("WHEN(a.retry(2),b.retry(3));", whenELWrapper.toEL());
}
// node上进行retry带exception
@Test
public void testRetry2(){
NodeELWrapper nodeA = ELBus.node("a").retry(2, "java.lang.NullPointerException");
NodeELWrapper nodeB = ELBus.node("b").retry(3, "java.lang.NullPointerException", "java.lang.ArrayIndexOutOfBoundsException");
WhenELWrapper whenELWrapper = ELBus.when(nodeA, nodeB);
Assertions.assertEquals("WHEN(a.retry(2,\"java.lang.NullPointerException\"),b.retry(3,\"java.lang.NullPointerException\",\"java.lang.ArrayIndexOutOfBoundsException\"));",
whenELWrapper.toEL());
}
// 在表达式上进行retry
@Test
public void testRetry3(){
WhenELWrapper whenELWrapper = ELBus.when("a", "b").retry(4);
Assertions.assertEquals("WHEN(a,b).retry(4);", whenELWrapper.toEL());
}
// 在表达式上进行retry, 带exception
@Test
public void testRetry4(){
WhenELWrapper whenELWrapper = ELBus.when("a", "b").retry(3, "java.lang.NullPointerException", "java.lang.ArrayIndexOutOfBoundsException");
Assertions.assertEquals("WHEN(a,b).retry(3,\"java.lang.NullPointerException\",\"java.lang.ArrayIndexOutOfBoundsException\");",
whenELWrapper.toEL());
}
@AfterAll
public static void after(){
ELBus.setNodeWrapper(true);
}
}