package org.hsweb.web.service.impl.script;
import org.hsweb.commons.MD5;
import org.hsweb.expands.script.engine.*;
import org.hsweb.web.bean.common.QueryParam;
import org.hsweb.web.bean.common.UpdateParam;
import org.hsweb.web.bean.po.script.DynamicScript;
import org.hsweb.web.bean.po.script.DynamicScript.Property;
import org.hsweb.web.core.authorize.ExpressionScopeBean;
import org.hsweb.web.dao.script.DynamicScriptMapper;
import org.hsweb.web.core.exception.BusinessException;
import org.hsweb.web.service.impl.AbstractServiceImpl;
import org.hsweb.web.service.script.DynamicScriptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* 动态脚本服务类
* Created by generator
*/
@Service("dynamicScriptService")
public class DynamicScriptServiceImpl extends AbstractServiceImpl<DynamicScript, String> implements DynamicScriptService {
private static final String CACHE_KEY = "dynamic_script";
//默认数据映射接口
@Resource
protected DynamicScriptMapper dynamicScriptMapper;
@Override
protected DynamicScriptMapper getMapper() {
return this.dynamicScriptMapper;
}
@Override
public String insert(DynamicScript data) {
DynamicScript old = selectSingle(QueryParam.build().where("name", data.getName()).and("type", data.getType()));
if (old != null) throw new BusinessException("已存在相同名称和类型的脚本!", 400);
data.setStatus(1);
return super.insert(data);
}
@Override
@Cacheable(value = CACHE_KEY, key = "'script.'+#pk")
public DynamicScript selectByPk(String pk) {
return super.selectByPk(pk);
}
@Override
@Cacheable(value = CACHE_KEY, key = "'script.md5.'+#pk")
public String getScriptMd5(String scriptId) {
DynamicScript script = selectByPk(scriptId);
assertNotNull(script, "脚本不存在");
return MD5.defaultEncode(script.getContent());
}
@Override
@Cacheable(value = CACHE_KEY, key = "'script.'+#name+'.'+#type")
public DynamicScript selectByNameAndType(String name, String type) throws Exception {
return createQuery().where(Property.name, name).and(Property.type, type).single();
}
@Override
@CacheEvict(value = CACHE_KEY, allEntries = true)
public int update(DynamicScript data) {
DynamicScript old = createQuery()
.fromBean(data)
.where(Property.name).and(Property.type).not(Property.id)
.single();
if (old != null) throw new BusinessException("已存在相同名称和类型的脚本!", 400);
return createUpdate(data).excludes(Property.status).fromBean().where(Property.id).exec();
}
@Override
@CacheEvict(value = CACHE_KEY, allEntries = true)
public int update(List<DynamicScript> datas) {
return super.update(datas);
}
@Override
@CacheEvict(value = CACHE_KEY, allEntries = true)
public int delete(String pk) {
return super.delete(pk);
}
public void compile(String id) throws Exception {
DynamicScript script = this.selectByPk(id);
assertNotNull(script, "脚本不存在");
DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(script.getType());
assertNotNull(engine, "不支持的引擎");
engine.compile(script.getId(), script.getContent());
}
public void compileAll() throws Exception {
List<DynamicScript> list = createQuery().where(Property.status, 1).listNoPaging();
for (DynamicScript script : list) {
DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(script.getType());
assertNotNull(engine, "不支持的引擎");
engine.compile(script.getId(), script.getContent());
}
}
}