
edi.rule.model.JSRuleAssert Maven / Gradle / Ivy
package edi.rule.model;
import java.util.List;
import edi.rule.core.JSRuleArgsVessel;
import edi.rule.extend.interfaces.IJSRuleAssert;
import edi.rule.util.ZSVessel;
import edi.rule.work.cache.JSRuleFrameCache;
import edi.rule.work.interfaces.IJSRuleAssertModel;
import lombok.Data;
/**
* @author 摩拉克斯
* @date 2023年7月22日 上午10:51:17
* 断言器,用于逻辑判断是否为true,其判断条件属性之间的and和or的与或关系取决于{@link JSRuleShunt#ifAnd}属性
*
当外层{@link JSRuleShunt#ifAnd}属性为true并传导入该对象时,asserts,usual数组内部元素之间的关系为and,且asserts整体与usual整体与bracket整体属性之间的关系为and
*
同理,当外层{@link JSRuleShunt#ifAnd}属性为false并传导入该对象时,asserts,usual数组内部元素之间的关系为or,且asserts整体与usual整体与bracket整体属性之间的关系为or
*/
@Data
public final class JSRuleAssert implements IJSRuleAssertModel{
/**
* @see IJSRuleAssertModel#getName()
* */
public String name;
/**
* @see IJSRuleAssertModel#getPath()
* */
public String path;
/**
* @see IJSRuleAssertModel#getValue()
* */
public Object value;
/**
*
asserts表示使用自定义断言器,自定义断言器需实现{@link IJSRuleAssert}接口并注册成spring bean,其名称为bean名称,因此其数组元素为一组bean的名称
* */
public List asserts;
/**
* usual表示内置常用的判断条件,这里称呼为比较器数组,比较器一般有in,not in(ni),gt(大于),le(小于等于)等
*
同一组usual内的兄弟元素之间的与或关系以及元素内部比较器和比较器之间的关系均取决于其外层传导过来的{@link JSRuleAssert#ifTrue}中的ifAnd参数
* */
public List usual;
/**
* 表示括号bracket,用于将一组断言表达式放在一起形成一个断言组的结果,如if (true && (true||false||false) && false)
*
正常情况下同一括号内的与或(and or)逻辑是一致的,如上,因此当你遇到诸如if (true and true or false)的时候就有歧义了,此时需要加上括号以明确表达式的含义
*
bracket里的断言器为当前断言器的子断言器,其下一层的ifAnd属性会自动反转,如当前断言器的ifAnd如果为true,那么子断言的兄弟节点之间的关系就必定为or,反之亦然
*
因此当你遇到变换逻辑的判断时应该使用该属性,哪怕该属性下只有一个子断言器,其逻辑其实与{@link JSRuleMatches#br}属性逻辑如出一辙
* */
public List br;
/**
* @see IJSRuleAssert#ifTrue(String, String, Object, boolean, JSRuleArgsVessel)
* */
@Override
public boolean ifTrue(String fName, String fPath, Object fValue, boolean ifAnd, JSRuleArgsVessel vessel) {
init(fName,fPath,fValue, vessel);
if (ifAnd) {
if (ZSVessel.isNotEmpty(asserts)) {
for (String assertName:asserts) {
if (!JSRuleFrameCache.getCustomAssert(assertName,name).ifTrue(name,path,value,true, vessel)) {
return false;
}
}
}
if (ZSVessel.isNotEmpty(usual)) {
for (JSRuleAssertUsual usual:usual) {
if (!usual.ifTrue(name, path, value, true, vessel)) {
return false;
}
}
}
if (ZSVessel.isNotEmpty(br)) {
for (JSRuleAssert a: br) {
if (!a.ifTrue(name,path,value,false, vessel)) {
return false;
}
}
}
return true;
}else {
if (ZSVessel.isNotEmpty(asserts)) {
for (String assertName:asserts) {
if (JSRuleFrameCache.getCustomAssert(assertName,name).ifTrue(name,path,value,false, vessel)) {
return true;
}
}
}
if (ZSVessel.isNotEmpty(usual)) {
for (JSRuleAssertUsual usual:usual) {
if (usual.ifTrue(name, path, value, false, vessel)) {
return true;
}
}
}
if (ZSVessel.isNotEmpty(br)) {
for (JSRuleAssert a: br) {
if (a.ifTrue(name,path,value,true, vessel)) {
return true;
}
}
}
return false;
}
}
}