|
@@ -28,7 +28,7 @@ public class ScriptEnginePro {
|
|
|
private ScriptEngine scriptEngine; //脚本执行引擎
|
|
|
private CompiledScript scriptCompile;//脚本编译
|
|
|
|
|
|
- private String library_id; //算法ID
|
|
|
+ private String library_id; //算法ID
|
|
|
private String library_type; //算法类型: // 1. java 2. js 脚本 3. 数据库 4. webapi
|
|
|
private String computing_expression; //脚本: 1. java输出执行名称 2.JS脚本 3.sql语句 4.空
|
|
|
|
|
@@ -40,20 +40,20 @@ public class ScriptEnginePro {
|
|
|
public ScriptEnginePro(Map<String, Object> calcInfo) {//引擎构造函数
|
|
|
|
|
|
try {
|
|
|
- if(Objects.isNull(calcInfo) || Objects.isNull(calcInfo.get("library_type")) || Objects.isNull(calcInfo.get("computing_expression"))){
|
|
|
- errorMessage = "核心参数为空:".concat(Objects.isNull(calcInfo)?"":calcInfo.toString());
|
|
|
+ if (Objects.isNull(calcInfo) || Objects.isNull(calcInfo.get("library_type")) || Objects.isNull(calcInfo.get("computing_expression"))) {
|
|
|
+ errorMessage = "核心参数为空:".concat(Objects.isNull(calcInfo) ? "" : calcInfo.toString());
|
|
|
return;
|
|
|
}
|
|
|
library_id = calcInfo.get("library_id").toString();//算法编号
|
|
|
library_type = calcInfo.get("library_type").toString();//算法类型
|
|
|
- if(!"1,2".contains(library_type)){//目前只支持JS和JAVA
|
|
|
+ if (!"1,2".contains(library_type)) {//目前只支持JS和JAVA
|
|
|
errorMessage = "未支持的算法类型:".concat(calcInfo.toString());
|
|
|
return;
|
|
|
}
|
|
|
computing_expression = calcInfo.get("computing_expression").toString();//脚本
|
|
|
if ("1".equals(library_type)) {
|
|
|
errorMessage = initJava(calcInfo.get("filePath"), calcInfo.get("className"));//初始化java执行对象
|
|
|
- if(MapTools.isBlank(errorMessage)){
|
|
|
+ if (MapTools.isBlank(errorMessage)) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -61,13 +61,16 @@ public class ScriptEnginePro {
|
|
|
if ("2".equals(library_type)) { // 1. java时记录方法名 (缺 目标对象字段) 2. js时 记录脚本(后期可以运用数据源中的文件名在加载js文件,此时脚本为方法名)
|
|
|
ScriptEngineManager SEManager = new ScriptEngineManager();
|
|
|
NashornScriptEngineFactory NSEFactory = null;
|
|
|
+
|
|
|
for (ScriptEngineFactory SEFactory : SEManager.getEngineFactories()) {
|
|
|
if ("OpenJDK Nashorn".equalsIgnoreCase(SEFactory.getEngineName())) {
|
|
|
NSEFactory = (NashornScriptEngineFactory) SEFactory;
|
|
|
+// NSEFactory.getScriptEngine("--language=es6");
|
|
|
+ System.setProperty("nashorn.args", "--language=es6");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if(Objects.isNull(NSEFactory)){
|
|
|
+ if (Objects.isNull(NSEFactory)) {
|
|
|
errorMessage = "未找到OpenJDK Nashorn";
|
|
|
return;
|
|
|
}
|
|
@@ -79,10 +82,11 @@ public class ScriptEnginePro {
|
|
|
errorMessage = "JS脚本预编译时出现错误" + LogUtils.getException(e);
|
|
|
}
|
|
|
}
|
|
|
- }catch (Exception e){
|
|
|
+ } catch (Exception e) {
|
|
|
errorMessage = "引擎创建失败".concat(LogUtils.getException(e));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
//脚本引擎对象关闭时的资源释放
|
|
|
public void close() {
|
|
|
//如果算法的类型是数据库 则获取jdbctempalte进行关闭;如果是其他协议则 直接调用invoke方法进行关闭
|
|
@@ -90,7 +94,7 @@ public class ScriptEnginePro {
|
|
|
try {
|
|
|
javaMethodClose.invoke(classInstance);
|
|
|
} catch (IllegalAccessException | InvocationTargetException e) {
|
|
|
- System.out.println("JAVA反射关闭方法调用失败: ".concat(Objects.nonNull(classInstance)?classInstance.toString():"").concat("释放资源失败"));
|
|
|
+ System.out.println("JAVA反射关闭方法调用失败: ".concat(Objects.nonNull(classInstance) ? classInstance.toString() : "").concat("释放资源失败"));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -102,7 +106,7 @@ public class ScriptEnginePro {
|
|
|
try {
|
|
|
resultData1 = (Map<String, Object>) returnData;
|
|
|
} catch (Exception e) {
|
|
|
- resultData1.put("returnData",returnData);
|
|
|
+ resultData1.put("returnData", returnData);
|
|
|
}
|
|
|
resultData1.put("code", "0");
|
|
|
return resultData1;
|
|
@@ -121,10 +125,11 @@ public class ScriptEnginePro {
|
|
|
returnMap.put("library_id", library_id);
|
|
|
return returnMap;
|
|
|
}
|
|
|
+
|
|
|
//初始化JAVA执行对象
|
|
|
private String initJava(Object filePath, Object className) {
|
|
|
if (Objects.isNull(className) || Objects.isNull(computing_expression)) {
|
|
|
- return "java执行参数不全,类名:".concat(Objects.isNull(className)?"":className.toString()).concat("; 方法名:").concat(computing_expression);
|
|
|
+ return "java执行参数不全,类名:".concat(Objects.isNull(className) ? "" : className.toString()).concat("; 方法名:").concat(computing_expression);
|
|
|
}
|
|
|
if (Objects.nonNull(filePath)) {//文件名不为空则加载外部JAR
|
|
|
File file = new File(System.getProperty("user.dir").concat(File.separator).concat("plugins").concat(File.separator).concat(filePath.toString()));
|
|
@@ -167,6 +172,7 @@ public class ScriptEnginePro {
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
//初始化执行参数名,同时修正表达式
|
|
|
private void initParam() {
|
|
|
Pattern regExpression = Pattern.compile("(?<=《)([^》]+)?(?=》)");//书名号方式提取正则表达式
|
|
@@ -175,13 +181,14 @@ public class ScriptEnginePro {
|
|
|
while (varNameList.find()) {//循环提取的参数
|
|
|
String varName = varNameList.group();//变量名String.dataContent
|
|
|
index++;
|
|
|
- parmaNames.put(varName, "1".equals(library_type)?String.valueOf(index):(varName.replaceAll("\\.", "")).concat(String.valueOf(threadId)));//添加到变量列表中
|
|
|
+ parmaNames.put(varName, "1".equals(library_type) ? String.valueOf(index) : (varName.replaceAll("\\.", "")).concat(String.valueOf(threadId)));//添加到变量列表中
|
|
|
if ("1".equals(library_type)) { // java参数
|
|
|
javaParams.add(null);//先初始化一个JAVA参数,因为没有键名对应,所以只能按顺序对应(数据订阅)
|
|
|
}
|
|
|
computing_expression = computing_expression.replaceFirst("《" + varName + "》", "1".equals(library_type) ? "" : parmaNames.get(varName));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
//引擎执行入口函数
|
|
|
public Map<String, Object> execScript(Map<String, Object> execData) {
|
|
|
if (null != errorMessage) {
|
|
@@ -190,10 +197,10 @@ public class ScriptEnginePro {
|
|
|
if ("1".equals(library_type)) {
|
|
|
try {
|
|
|
for (String varName : execData.keySet()) {
|
|
|
- javaParams.set(Integer.parseInt(parmaNames.get(varName)) -1, execData.get(varName));
|
|
|
+ javaParams.set(Integer.parseInt(parmaNames.get(varName)) - 1, execData.get(varName));
|
|
|
}
|
|
|
Object invoke = javaMethod.invoke(classInstance, javaParams.toArray());
|
|
|
- return processSuccess(invoke);//数组方式传参,无需参数名,按顺序对应
|
|
|
+ return processSuccess(invoke);//数组方式传参,无需参数名,按顺序对应
|
|
|
} catch (Exception e) {
|
|
|
return processFail("JAVA执行失败,执行参数:".concat(javaParams.toString()).concat(";异常信息:").concat(LogUtils.getException(e)));
|
|
|
}
|
|
@@ -210,7 +217,7 @@ public class ScriptEnginePro {
|
|
|
scriptObjec.forEach((index, o) -> tempList.add(o));
|
|
|
jsReturnData = tempList;
|
|
|
}
|
|
|
- jsReturnData = MapTools.strToObj(MapTools.objToJSONStr(jsReturnData));//JS脚本对象转为JAVA数据对象
|
|
|
+ jsReturnData = MapTools.strToObj(MapTools.objToJSONStr(jsReturnData));//JS脚本对象转为JAVA数据对象
|
|
|
}
|
|
|
return processSuccess(jsReturnData);
|
|
|
} catch (ScriptException e) {
|
|
@@ -219,6 +226,7 @@ public class ScriptEnginePro {
|
|
|
}
|
|
|
return processFail("未支持的算法类型:");
|
|
|
}
|
|
|
+
|
|
|
//修订JS返回值MAP变数组的问题
|
|
|
private void recursionEencapsulation(ScriptObjectMirror scriptObject) {
|
|
|
for (String key : scriptObject.keySet()) { // scriptObject 实际是Map 循环map的所有key--- > {"A","B"}
|
|
@@ -232,6 +240,7 @@ public class ScriptEnginePro {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 数组判定
|
|
|
*
|
|
@@ -248,6 +257,7 @@ public class ScriptEnginePro {
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 对象转数组
|
|
|
*
|
|
@@ -266,6 +276,7 @@ public class ScriptEnginePro {
|
|
|
public String getErrorMessage() {
|
|
|
return errorMessage;
|
|
|
}
|
|
|
+
|
|
|
public Map<String, String> getParmaNames() {
|
|
|
return parmaNames;
|
|
|
}
|