package com.hauxsoft.service.impl;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.hauxsoft.core.constant.Consts;
import com.hauxsoft.core.constant.Errors;
import com.hauxsoft.core.mvc.dao.BaseDao;
import com.hauxsoft.core.mvc.dao.NativeQuery;
import com.hauxsoft.core.mvc.dao.SqlParamValueParser;
import com.hauxsoft.core.mvc.dao.SqlWhereLogicEnum;
import com.hauxsoft.core.mvc.service.impl.BaseFlatCrudServiceImpl;
import com.hauxsoft.core.util.BeanUtils2;
import com.hauxsoft.core.util.StringUtils2;
import com.hauxsoft.core.util.result.Result;
import com.hauxsoft.core.util.result.Results;
import com.hauxsoft.dao.JavaRuleDao;
import com.hauxsoft.data.CompileResult;
import com.hauxsoft.data.JavaRuleDTO;
import com.hauxsoft.entity.JavaRuleDO;
import com.hauxsoft.service.JavaRuleService;
import com.hauxsoft.utils.BaseRule;
import com.hauxsoft.utils.JavaRuleStorage;
import com.hauxsoft.utils.DynamicRuleUtils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class JavaRuleServiceImpl extends BaseFlatCrudServiceImpl<JavaRuleDO, Long> implements JavaRuleService{
@Override
protected BaseDao<JavaRuleDO, Long> dao() {
return dao;
}
/**
* return jpa entity by id
* @param id
* @return entity in JAVA_RULE
*/
@Override
public JavaRuleDO get(Long id) {
return dao.findById(id).orElse(null);
}
/**
* insert or update jpa entity
* @param entity
*/
@Override
@Transactional
public void save(JavaRuleDO entity) {
Date now = new Date();
boolean isNew = entity.getId() == null;
if(isNew) {
entity.setCreateTime(now);
}
else {
entity.setUpdateTime(now);
}
dao.save(entity);
}
/**
* delete jpa entity by id
* @param id
* @return Results.SUCCESS_RESULT if success, or ErrorResult instance if error
*/
@Override
@Transactional
public Result<?> delete(Long id) {
JavaRuleDO entity = get(id);
return delete(entity);
}
/**
* delete jpa entity by id
* @param id
* @return Results.SUCCESS_RESULT if success, or ErrorResult instance if error
*/
@Override
@Transactional
public Result<?> delete(JavaRuleDO entity) {
return Results.when(entity)
.map(e -> e == null, "entity is not exist", Errors.Entity.NOT_EXIST)
.map(e -> e.getIsDeleted().equals(Consts.Entity.IS_DELETED), "entity is deleted", Errors.Entity.IS_DELETED)
// 设定正在使用的规则不能删除,必须先停掉
.map(e -> Objects.equals(e.getStatus(), Consts.Entity.IS_VALID), "规则处于启用状态,不能删除!")
.run(e -> {
e.setIsDeleted(Consts.Entity.IS_DELETED);
dao.save(e);
})
// 从容器移除
/*.then(entity2 -> {
String groupName = entity2.getGroupName();
try {
BaseRule rule = RuleUtils.getRuleInstance(entity2);
if (javaRuleStorage.contains(groupName, rule) && !javaRuleStorage.remove(groupName, rule)) {
return Results.error("从容器移除规则失败!");
}
} catch (Exception e) {
log.error("从容器移除规则{}异常!", entity2.getName(), e);
return Results.error("从容器移除规则异常!");
}
return Results.success();
})*/;
}
/**
* execute native sql query by conditions in query html page
* @param conditions 查询条件
* @pageNo 页码,从0开始
* @pageSize 每页数据量,必须 > 0
* @sort 排序方式
* @return Results.SUCCESS_RESULT if success, or ErrorResult instance if error
*/
@Override
public Page<Map<String, Object>> query(Map<String, Object> conditions, int pageNo, int pageSize, String sort) throws ParseException {
NativeQuery query = dao.createNativeQuery()
.select("t.id, t.TARGET, t.GROUP_NAME, t.SIMPLE_CLASS_NAME, t.NAME, t.SORT, t.CREATE_TIME, t.STATUS")
.from("JAVA_RULE t")
.where("t.TARGET like :target")
.where("t.GROUP_NAME like :groupName")
.where("t.SIMPLE_CLASS_NAME like :simpleClassName")
.where("t.NAME like :name")
.where("t.STATUS = :status")
.where("t.IS_DELETED = " + Consts.Entity.NOT_DELETED)
.registParameterValueParser("target", SqlParamValueParser.LEFT_LIKE_PARSER)
.registParameterValueParser("groupName", SqlParamValueParser.LEFT_LIKE_PARSER)
.registParameterValueParser("simpleClassName", SqlParamValueParser.LEFT_LIKE_PARSER)
.registParameterValueParser("name", SqlParamValueParser.CONTAIN_PARSER)
.sort(sort)
.setParameters(conditions);
// 系统筛选
if (StringUtils2.notEmpty(ruleTarget)) {
query.where("target in :targets")
.setParameter("targets", Arrays.asList(ruleTarget.split(",")));
}
return query.listPage(pageNo, pageSize);
}
/**
* 返回dto对象
* @param id
* @return success result if entity exist, or error result if entity not exist
*/
@Override
public Result<JavaRuleDTO> getDTO(Long id) {
return getOne(id).map(JavaRuleDTO::of);
}
/**
* 根据dto对象insert一条数据,dto对象的内容一般来自新增页面
* @param id
* @return success or error result
*/
@Override
@Transactional
public Result<?> insertDTO(JavaRuleDTO dto){
return Results.when(dto.toEntity("id", "createTime", "updateTime"))
// 编译
.then(this::compiler)
// 保存
.run(this::save)
// 添加到bean容器或者移除
.then(entity -> {
// 如果是启动状态,顺便添加规则到容器
if (Objects.equals(entity.getStatus(), Consts.Entity.IS_VALID)) {
return addRuleToStorage(entity);
} else if (Objects.equals(entity.getStatus(), Consts.Entity.NOT_VALID)) {
String groupName = entity.getGroupName();
try {
BaseRule rule = DynamicRuleUtils.getRuleInstance(entity);
if (javaRuleStorage.contains(groupName, rule) && !javaRuleStorage.remove(groupName, rule)) {
return Results.error("从容器移除规则失败!");
}
} catch (Exception e) {
log.error("从容器移除规则{}异常!", entity.getName(), e);
return Results.error("从容器移除规则异常!");
}
}
return Results.success(entity);
})
.map(e -> {
dto.setId(e.getId());
dto.setUpdateTime(e.getCreateTime());
return dto;
});
}
/**
* 根据dto对象update一条数据,dto对象的内容一般来自修改页面
* @param id
* @return success or error result
*/
@Override
@Transactional
public Result<?> updateDTO(JavaRuleDTO dto){
return getOne(dto.getId())
.then(e -> {
BeanUtils2.copyProperties(dto.toEntity(), e, "id", "createTime", "updateTime", "createUserId", "createUserName");
return Results.success(e);
})
// 编译
.then(this::compiler)
// 保存
.run(this::save)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性的项目源码,具体详情请查看相关博客https://blog.csdn.net/qq_31142553/article/details/85013989
资源推荐
资源详情
资源评论
收起资源包目录
xboot-rule.rar (70个子文件)
xboot-rule
.gitignore 268B
.mvn
wrapper
maven-wrapper.jar 47KB
maven-wrapper.properties 116B
.springBeans 417B
src
main
resources
static
console
module
rule
java-rule-select-single.html 0B
java-rule-list.html 7KB
java-rule-edit.html 3KB
console.rule.css 12B
console.rule.js 2KB
java
com
hauxsoft
component
DynamicRuleManager.java 2KB
entity
JavaRuleDO.java 2KB
dao
JavaRuleDao.java 305B
data
JavaRuleDTO.java 2KB
CompileResult.java 459B
controller
console
JavaRuleController.java 6KB
listener
AppRunListener.java 2KB
utils
BaseRule.java 799B
MapJavaRuleStorage.java 1KB
DynamicRuleUtils.java 13KB
JavaRuleStorage.java 955B
service
impl
JavaRuleServiceImpl.java 16KB
JavaRuleService.java 3KB
demo
rule
TestController.java 852B
DemoRule1.java 573B
conf
RuleDefaultConf.java 572B
test
java
com
hauxsoft
AppTest.java 678B
.classpath 1KB
mvnw 9KB
.settings
org.eclipse.wst.common.project.facet.core.xml 145B
org.eclipse.m2e.core.prefs 90B
org.eclipse.core.resources.prefs 155B
org.eclipse.jdt.core.prefs 243B
pom.xml 1KB
mvnw.cmd 6KB
target
classes
META-INF
MANIFEST.MF 266B
maven
com.hauxsoft
xboot-rule
pom.properties 238B
pom.xml 1KB
com
hauxsoft
component
DynamicRuleManager$Builder.class 3KB
DynamicRuleManager.class 1KB
entity
JavaRuleDO.class 7KB
dao
JavaRuleDao.class 287B
data
CompileResult.class 2KB
CompileResult$CompileResultBuilder.class 2KB
JavaRuleDTO.class 6KB
controller
console
JavaRuleController.class 9KB
listener
AppRunListener.class 4KB
utils
MapJavaRuleStorage.class 2KB
JavaRuleStorage.class 714B
DynamicRuleUtils$MemoryClassLoader.class 1KB
MemoryJavaFileManager.class 3KB
BaseRule.class 1KB
MemoryJavaFileManager$StringInputBuffer.class 1KB
MemoryJavaFileManager$ClassOutputBuffer$1.class 2KB
DynamicRuleUtils.class 12KB
MemoryJavaFileManager$ClassOutputBuffer.class 1KB
service
impl
JavaRuleServiceImpl.class 18KB
JavaRuleService.class 2KB
demo
rule
TestController.class 2KB
DemoRule1.class 1KB
conf
RuleDefaultConf.class 716B
static
console
module
rule
java-rule-select-single.html 0B
java-rule-list.html 7KB
java-rule-edit.html 3KB
console.rule.css 12B
console.rule.js 2KB
xboot-rule-0.0.1-SNAPSHOT.jar 45KB
maven-archiver
pom.properties 101B
generated-sources
annotations
test-classes
maven-status
maven-compiler-plugin
compile
default-compile
inputFiles.lst 1KB
createdFiles.lst 1KB
.project 1KB
共 70 条
- 1
西红柿系番茄
- 粉丝: 176
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mongodb数据库基本操作.pdf
- C#,布尔可满足性问题(Boolean Satisfiability Problem)算法与源代码
- C#,回文分割问题(Palindrome Partitioning Problem)算法与源代码
- C#,煎饼排序问题(Pancake Sorting Problem)算法与源代码
- C#,排列组合的堆生成法(Heap’s Algorithm for generating permutations)算法与源代码
- C#,老鼠迷宫问题的回溯法求解(Rat in a Maze)算法与源代码
- 6693eeb8d683458a07938615fba9e68f.apk
- C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码
- C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码
- C#,子集和问题(Subset Sum Problem)的算法与源代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页