
edi.rule.core.JSRuleService Maven / Gradle / Ivy
package edi.rule.core;
import edi.rule.config.JSRuleContext;
import edi.rule.config.JSRuleSecurity;
import edi.rule.work.enums.JSRuleSecurityEnum;
import edi.rule.model.JSBody;
import edi.rule.model.JSResult;
import edi.rule.model.JSRuleAction;
import edi.rule.util.ZSRule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author 摩拉克斯
* @apiNote 所有调用start方法上加事务是因为考虑到嵌套使用start时如果后面的方法报错,前面的方法应该回滚
* 框架内置的service,用于启动引擎解析json字符串
* */
@Service
public class JSRuleService {
@Autowired
private JSRuleArgsVessel vessel;
/**
*
用于启动插件引擎,此方式需自行考虑globalArgs参数的初始化,此外如果项目中有全局异常处理并涵盖了JSRuleException异常(如@ExceptionHandler),则需自行处理异常返回结果
*
非http的请求时如内部rpc请求,此时可以关闭安全模式配置
* @apiNote 此处不能抛出异常否则会有事务失效的问题
* @apiNote 修改此处应同步修改IJSRuleActionModel对应方法
* */
private String start(JSRuleGlobalArgs globalArgs) {
try{
vessel.init(globalArgs);
R rm = JSResult.success();
JSBody> body = vessel.getGlobalArgs().getBody();
for (JSRuleAction> action: body.getActions()) {
rm.getResult().put(action.getName(), action.getModel().start(action, vessel));
}
String result = ZSRule.modelToJson(rm);
JSRuleSecurityEnum security = JSRuleContext.getSecurity();
if (JSRuleSecurity.isSecurityMode(security)){
if (body.getEncrypt()){
result = security.encrypt.apply(result);
}
if (body.getSign()){
security.httpResponse.accept(vessel.getGlobalArgs().getResponse(),security.sign.apply(result));
}
}
return result;
}finally{
vessel.clean();
}
}
/**
* 用于启动插件引擎,此方式需自行考虑globalArgs参数的初始化
*
globalArgs中如果存在sign属性文本则会以该文本为签名对文本进行签名验证
* @param body 请求的body字符串
* @param args 全局参数对象
* */
@Transactional(rollbackFor = Exception.class)
public String start(String body, JSRuleGlobalArgs args) {
if (args == null){
args = new JSRuleGlobalArgs();
}
args.setBody(ZSRule.parseJSBody(body,args.getSign()));
return start(args);
}
}