package com.snowcattle.game.common.config.script;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
import com.snowcattle.game.common.constant.CommonErrorLogInfo;
import com.snowcattle.game.common.util.ErrorsUtil;
import org.apache.commons.io.FileUtils;
/**
* JS脚本执行管理器
*
*
*/
public class JSScriptManagerImpl implements IScriptEngine {
private final String charset;
private final ScriptEngine engine;
/**
* @param charset
* 脚本默认的字符编码
*/
public JSScriptManagerImpl(String charset) {
this.charset = charset;
ScriptEngineManager factory = new ScriptEngineManager();
engine = factory.getEngineByName("JavaScript");
}
/**
* @param charset
* 如果为空,则使用JSScriptMangerImpl的charset
* @exception RuntimeException
*/
@Override
public Object runScript(Map<String, Object> binding, String scriptFile, String charset) {
String content = null;
try {
Bindings _bindings = new SimpleBindings(binding);
content = FileUtils.readFileToString(new File(scriptFile), charset != null ? charset : this.charset);
return engine.eval(content, _bindings);
} catch (IOException e) {
throw new RuntimeException(ErrorsUtil.error(CommonErrorLogInfo.FILE_IO_FAIL, "Throw Exception",
scriptFile), e);
} catch (ScriptException se) {
throw new RuntimeException(ErrorsUtil.error(CommonErrorLogInfo.SCRITP_EXECUTE_FAIL,
"Throw Exception", scriptFile + " content:" + content), se);
}
}
/**
*
* @exception RuntimeException
*/
@Override
public Object runScript(Map<String, Object> binding, String scriptContent) {
try {
if (binding == null || binding.isEmpty()) {
return engine.eval(scriptContent);
} else {
Bindings _bindings = new SimpleBindings(binding);
return engine.eval(scriptContent, _bindings);
}
} catch (ScriptException se) {
throw new RuntimeException(ErrorsUtil.error(CommonErrorLogInfo.SCRITP_EXECUTE_FAIL,
"Throw Exception", scriptContent), se);
}
}
/**
* 获得脚本的内容
*
* @param scriptFile
* @param charset
* @return
*/
public String getScriptContent(String scriptFile, String charset) {
try {
return FileUtils.readFileToString(new File(scriptFile), charset != null ? charset : this.charset);
} catch (IOException e) {
throw new RuntimeException(ErrorsUtil.error(CommonErrorLogInfo.FILE_IO_FAIL, "Throw Exception",
scriptFile), e);
}
}
/**
* 逻辑计算条件表达式
*
* @param context
* @param exp
* 表达式
* @return
* @throws AIException
*/
public boolean doLogicEval(Map<String, Object> binding, String exp) {
if (exp == null || exp.length() == 0) {
throw new IllegalArgumentException("条件表达式不能为空");
}
try {
Bindings _bindings = new SimpleBindings(binding);
Object _ret = engine.eval(exp, _bindings);
if (_ret instanceof Boolean) {
return (Boolean) _ret;
} else {
throw new RuntimeException("无效的逻辑运算表达式:" + exp);
}
} catch (ScriptException se) {
throw new RuntimeException(ErrorsUtil.error(CommonErrorLogInfo.SCRITP_EXECUTE_FAIL,
"Throw Exception", exp), se);
}
}
/**
*
* @param binding
* @param exp
* @return
*/
public double doMathEval(Map<String, Object> binding, String exp) {
if (exp == null || exp.length() == 0) {
throw new IllegalArgumentException("条件表达式不能为空");
}
try {
Bindings _bindings = new SimpleBindings(binding);
Object _ret = engine.eval(exp, _bindings);
if (_ret instanceof Number) {
return ((Number) _ret).doubleValue();
} else {
throw new RuntimeException("无效的逻辑运算表达式:" + exp);
}
} catch (ScriptException se) {
throw new RuntimeException(ErrorsUtil.error(CommonErrorLogInfo.SCRITP_EXECUTE_FAIL,
"Throw Exception", exp), se);
}
}
}