diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java
index 2148c64f1..41271acd8 100644
--- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java
@@ -58,7 +58,7 @@ public class SQLXmlELParser extends ClassXmlFlowELParser {
@Override
public String parseCustom() {
- return JDBCHelper.getInstance().getElDataContent();
+ return JDBCHelper.getInstance().getContent();
}
/**
diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java
index b424ce801..a9924270a 100644
--- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java
@@ -1,13 +1,10 @@
package com.yomahub.liteflow.parser.sql.util;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.enums.NodeTypeEnum;
import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
-import com.yomahub.liteflow.script.ScriptExecutor;
-
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -16,7 +13,6 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
-import java.util.ServiceLoader;
/**
* jdbc 工具类
@@ -26,13 +22,14 @@ import java.util.ServiceLoader;
*/
public class JDBCHelper {
- private static final String SQL_PATTERN = "SELECT {},{} FROM {} ";
+ private static final String SQL_PATTERN = "SELECT {},{} FROM {} WHERE {}=?";
- private static final String SCRIPT_SQL_PATTERN = "SELECT {},{},{},{},{} FROM {} ";
+ private static final String SCRIPT_SQL_CHECK_PATTERN = "SELECT 1 FROM {} WHERE {}=?";
+
+ private static final String SCRIPT_SQL_PATTERN = "SELECT {},{},{},{} FROM {} WHERE {}=?";
private static final String CHAIN_XML_PATTERN = "{}";
- private static final String NODE_XML_PATTERN = "";
- private static final String NODES_XML_PATTERN = "{}";
+ private static final String NODE_XML_PATTERN = "";
private static final String XML_PATTERN = "{}{}";
private static final Integer FETCH_SIZE_MAX = 1000;
@@ -64,7 +61,7 @@ public class JDBCHelper {
* 获取链接
*/
public Connection getConn() {
- Connection connection = null;
+ Connection connection;
try {
connection = DriverManager.getConnection(sqlParserVO.getUrl(), sqlParserVO.getUsername(), sqlParserVO.getPassword());
} catch (SQLException e) {
@@ -76,15 +73,26 @@ public class JDBCHelper {
/**
* 获取 ElData 数据内容
*/
- public String getElDataContent() {
+ public String getContent() {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
+ String chainTableName = sqlParserVO.getChainTableName();
String elDataField = sqlParserVO.getElDataField();
String chainNameField = sqlParserVO.getChainNameField();
- String tableName = sqlParserVO.getTableName();
- String sqlCmd = StrFormatter.format(SQL_PATTERN, chainNameField, elDataField, tableName);
+ String chainApplicationNameField = sqlParserVO.getChainApplicationNameField();
+ String applicationName = sqlParserVO.getApplicationName();
+
+ if(StrUtil.isBlank(chainTableName)){
+ throw new ELSQLException("You did not define the chainTableName property");
+ }
+
+ if(StrUtil.isBlank(applicationName) || StrUtil.isBlank(chainApplicationNameField)){
+ throw new ELSQLException("You did not define the applicationName or chainApplicationNameField property");
+ }
+
+ String sqlCmd = StrUtil.format(SQL_PATTERN, chainNameField, elDataField, chainTableName, chainApplicationNameField);
List result = new ArrayList<>();
try {
@@ -92,13 +100,14 @@ public class JDBCHelper {
stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
// 设置游标拉取数量
stmt.setFetchSize(FETCH_SIZE_MAX);
+ stmt.setString(1, applicationName);
rs = stmt.executeQuery();
while (rs.next()) {
String elData = getStringFromResultSet(rs, elDataField);
String chainName = getStringFromResultSet(rs, chainNameField);
- result.add(StrFormatter.format(CHAIN_XML_PATTERN, chainName, elData));
+ result.add(StrUtil.format(CHAIN_XML_PATTERN, chainName, elData));
}
} catch (Exception e) {
throw new ELSQLException(e.getMessage());
@@ -107,15 +116,16 @@ public class JDBCHelper {
close(conn, stmt, rs);
}
- String chains = CollUtil.join(result, StrUtil.EMPTY);
- // 根据 SPI 判断是否需要添加 script node 节点
- ServiceLoader loader = ServiceLoader.load(ScriptExecutor.class);
- if (loader.iterator().hasNext()) {
- String nodes = getScriptNodes();
- return StrFormatter.format(XML_PATTERN, StrFormatter.format(NODES_XML_PATTERN, nodes), chains);
+ String chainsContent = CollUtil.join(result, StrUtil.EMPTY);
+
+ String nodesContent;
+ if (hasScriptData()){
+ nodesContent = getScriptNodes();
+ }else{
+ nodesContent = StrUtil.EMPTY;
}
- return StrFormatter.format(XML_PATTERN, StrUtil.EMPTY, chains);
+ return StrUtil.format(XML_PATTERN, nodesContent, chainsContent);
}
public String getScriptNodes() {
@@ -124,36 +134,40 @@ public class JDBCHelper {
PreparedStatement stmt = null;
ResultSet rs = null;
- String scriptNodeTableName = sqlParserVO.getScriptNodeTableName();
- String scriptNodeIdField = sqlParserVO.getScriptNodeIdField();
- String scriptNodeDataField = sqlParserVO.getScriptNodeDataField();
- String scriptNodeNameField = sqlParserVO.getScriptNodeNameField();
- String scriptNodeLanguageField = sqlParserVO.getScriptNodeLanguageField();
- String scriptNodeTypeField = sqlParserVO.getScriptNodeTypeField();
+ String scriptTableName = sqlParserVO.getScriptTableName();
+ String scriptIdField = sqlParserVO.getScriptIdField();
+ String scriptDataField = sqlParserVO.getScriptDataField();
+ String scriptNameField = sqlParserVO.getScriptNameField();
+ String scriptTypeField = sqlParserVO.getScriptTypeField();
+ String scriptApplicationNameField = sqlParserVO.getScriptApplicationNameField();
+ String applicationName = sqlParserVO.getApplicationName();
+ if(StrUtil.isBlank(applicationName) || StrUtil.isBlank(scriptApplicationNameField)){
+ throw new ELSQLException("You did not define the applicationName or scriptApplicationNameField property");
+ }
- String sqlCmd = StrFormatter.format(
+ String sqlCmd = StrUtil.format(
SCRIPT_SQL_PATTERN,
- scriptNodeIdField,
- scriptNodeDataField,
- scriptNodeNameField,
- scriptNodeLanguageField,
- scriptNodeTypeField,
- scriptNodeTableName
+ scriptIdField,
+ scriptDataField,
+ scriptNameField,
+ scriptTypeField,
+ scriptTableName,
+ scriptApplicationNameField
);
try {
conn = getConn();
stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
// 设置游标拉取数量
stmt.setFetchSize(FETCH_SIZE_MAX);
+ stmt.setString(1, applicationName);
rs = stmt.executeQuery();
while (rs.next()) {
- String id = getStringFromResultSet(rs, scriptNodeIdField);
- String data = getStringFromResultSet(rs, scriptNodeDataField);
- String name = getStringFromResultSet(rs, scriptNodeNameField);
- String type = getStringFromResultSet(rs, scriptNodeTypeField);
- String language = getStringFromResultSet(rs, scriptNodeLanguageField);
+ String id = getStringFromResultSet(rs, scriptIdField);
+ String data = getStringFromResultSet(rs, scriptDataField);
+ String name = getStringFromResultSet(rs, scriptNameField);
+ String type = getStringFromResultSet(rs, scriptTypeField);
NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(type);
if (Objects.isNull(nodeTypeEnum)){
@@ -164,7 +178,7 @@ public class JDBCHelper {
throw new ELSQLException(StrUtil.format("The type value[{}] is not a script type", type));
}
- result.add(StrFormatter.format(NODE_XML_PATTERN, id, name, type, language, data));
+ result.add(StrUtil.format(NODE_XML_PATTERN, id, name, type, data));
}
} catch (Exception e) {
throw new ELSQLException(e.getMessage());
@@ -209,12 +223,38 @@ public class JDBCHelper {
}
}
+ private boolean hasScriptData(){
+ if (StrUtil.isBlank(sqlParserVO.getScriptTableName())){
+ return false;
+ }
+
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+ String sqlCmd = StrUtil.format(SCRIPT_SQL_CHECK_PATTERN,
+ sqlParserVO.getScriptTableName(),
+ sqlParserVO.getScriptApplicationNameField());
+ try {
+ conn = getConn();
+ stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+ stmt.setFetchSize(1);
+ stmt.setString(1, sqlParserVO.getApplicationName());
+ rs = stmt.executeQuery();
+ return rs.next();
+ } catch (Exception e) {
+ return false;
+ } finally {
+ // 关闭连接
+ close(conn, stmt, rs);
+ }
+ }
+
//#region get set method
private String getStringFromResultSet(ResultSet rs, String field) throws SQLException {
String data = rs.getString(field);
if (StrUtil.isBlank(data)) {
- throw new ELSQLException(StrFormatter.format("exist {} field value is empty", field));
+ throw new ELSQLException(StrUtil.format("exist {} field value is empty", field));
}
return data;
}
@@ -226,5 +266,4 @@ public class JDBCHelper {
private void setSqlParserVO(SQLParserVO sqlParserVO) {
this.sqlParserVO = sqlParserVO;
}
- //#endregion
}
diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java
index a910660dc..9065af69e 100644
--- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java
@@ -29,9 +29,19 @@ public class SQLParserVO {
private String password;
/**
- * 表名
+ * 应用名
*/
- private String tableName = "el_table";
+ private String applicationName;
+
+ /**
+ * chain表名
+ */
+ private String chainTableName;
+
+ /**
+ * chain表里的应用名字段
+ */
+ private String chainApplicationNameField = "application_name";
/**
* chainName
@@ -46,32 +56,32 @@ public class SQLParserVO {
/**
* 脚本 node 表名
*/
- private String scriptNodeTableName = "script_node_table";
+ private String scriptTableName;
+
+ /**
+ * script表里的应用名字段
+ */
+ private String scriptApplicationNameField = "application_name";
/**
* 脚本 node id 字段
*/
- private String scriptNodeIdField = "script_node_id";
+ private String scriptIdField = "script_id";
/**
* 脚本 node name 字段
*/
- private String scriptNodeNameField = "script_node_name";
+ private String scriptNameField = "script_name";
+
+ /**
+ * 脚本 node data 字段
+ */
+ private String scriptDataField = "script_data";
/**
* 脚本 node type 字段
*/
- private String scriptNodeDataField = "script_node_data";
-
- /**
- * 脚本 node type 字段
- */
- private String scriptNodeTypeField = "script_node_type";
-
- /**
- * 脚本 node language 字段
- */
- private String scriptNodeLanguageField = "script_node_language";
+ private String scriptTypeField = "script_type";
public String getUrl() {
return url;
@@ -105,12 +115,28 @@ public class SQLParserVO {
this.password = password;
}
- public String getTableName() {
- return tableName;
+ public String getApplicationName() {
+ return applicationName;
}
- public void setTableName(String tableName) {
- this.tableName = tableName;
+ public void setApplicationName(String applicationName) {
+ this.applicationName = applicationName;
+ }
+
+ public String getChainTableName() {
+ return chainTableName;
+ }
+
+ public void setChainTableName(String chainTableName) {
+ this.chainTableName = chainTableName;
+ }
+
+ public String getChainApplicationNameField() {
+ return chainApplicationNameField;
+ }
+
+ public void setChainApplicationNameField(String chainApplicationNameField) {
+ this.chainApplicationNameField = chainApplicationNameField;
}
public String getChainNameField() {
@@ -129,51 +155,51 @@ public class SQLParserVO {
this.elDataField = elDataField;
}
- public String getScriptNodeTableName() {
- return scriptNodeTableName;
+ public String getScriptTableName() {
+ return scriptTableName;
}
- public void setScriptNodeTableName(String scriptNodeTableName) {
- this.scriptNodeTableName = scriptNodeTableName;
+ public void setScriptTableName(String scriptTableName) {
+ this.scriptTableName = scriptTableName;
}
- public String getScriptNodeIdField() {
- return scriptNodeIdField;
+ public String getScriptApplicationNameField() {
+ return scriptApplicationNameField;
}
- public void setScriptNodeIdField(String scriptNodeIdField) {
- this.scriptNodeIdField = scriptNodeIdField;
+ public void setScriptApplicationNameField(String scriptApplicationNameField) {
+ this.scriptApplicationNameField = scriptApplicationNameField;
}
- public String getScriptNodeNameField() {
- return scriptNodeNameField;
+ public String getScriptIdField() {
+ return scriptIdField;
}
- public void setScriptNodeNameField(String scriptNodeNameField) {
- this.scriptNodeNameField = scriptNodeNameField;
+ public void setScriptIdField(String scriptIdField) {
+ this.scriptIdField = scriptIdField;
}
- public String getScriptNodeDataField() {
- return scriptNodeDataField;
+ public String getScriptNameField() {
+ return scriptNameField;
}
- public void setScriptNodeDataField(String scriptNodeDataField) {
- this.scriptNodeDataField = scriptNodeDataField;
+ public void setScriptNameField(String scriptNameField) {
+ this.scriptNameField = scriptNameField;
}
- public String getScriptNodeTypeField() {
- return scriptNodeTypeField;
+ public String getScriptDataField() {
+ return scriptDataField;
}
- public void setScriptNodeTypeField(String scriptNodeTypeField) {
- this.scriptNodeTypeField = scriptNodeTypeField;
+ public void setScriptDataField(String scriptDataField) {
+ this.scriptDataField = scriptDataField;
}
- public String getScriptNodeLanguageField() {
- return scriptNodeLanguageField;
+ public String getScriptTypeField() {
+ return scriptTypeField;
}
- public void setScriptNodeLanguageField(String scriptNodeLanguageField) {
- this.scriptNodeLanguageField = scriptNodeLanguageField;
+ public void setScriptTypeField(String scriptTypeField) {
+ this.scriptTypeField = scriptTypeField;
}
}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/application-xml.properties b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/application-xml.properties
index 7298d6104..7453c9b12 100644
--- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/application-xml.properties
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/application-xml.properties
@@ -1,4 +1,20 @@
-liteflow.rule-source-ext-data={"url":"jdbc:h2:mem:test_db;MODE=MySQL","driverClassName":"org.h2.Driver","username":"root","password":"123456","tableName":"EL_TABLE","chainNameField":"chain_name","elDataField":"EL_DATA","scriptNodeTableName":"script_node_table","scriptNodeIdField":"script_node_id","scriptNodeNameField":"script_node_name","scriptNodeDataField":"script_node_data","scriptNodeTypeField":"script_node_type","scriptNodeLanguageField":"script_node_language"}
+liteflow.rule-source-ext-data={\
+ "url":"jdbc:h2:mem:test_db;MODE=MySQL",\
+ "driverClassName":"org.h2.Driver",\
+ "username":"root",\
+ "password":"123456",\
+ "applicationName":"demo",\
+ "chainTableName":"EL_TABLE",\
+ "chainApplicationNameField":"application_name",\
+ "chainNameField":"chain_name",\
+ "elDataField":"EL_DATA",\
+ "scriptTableName":"script_node_table",\
+ "scriptApplicationNameField":"application_name",\
+ "scriptIdField":"script_node_id",\
+ "scriptNameField":"script_node_name",\
+ "scriptDataField":"script_node_data",\
+ "scriptTypeField":"script_node_type"\
+ }
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test_db;MODE=MySQL
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql
index fd34b0eaa..22f2e7803 100644
--- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql
@@ -1,10 +1,10 @@
DELETE FROM EL_TABLE;
-INSERT INTO EL_TABLE (CHAIN_NAME,EL_DATA) values ('chain1','THEN(a, b, c);');
-INSERT INTO EL_TABLE (CHAIN_NAME,EL_DATA) values ('chain2','THEN(a, b, c);');
-INSERT INTO EL_TABLE (CHAIN_NAME,EL_DATA) values ('chain3','IF(x0, THEN(a, b));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain1','THEN(a, b, c);');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain2','THEN(a, b, c);');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain3','IF(x0, THEN(a, b));');
DELETE FROM SCRIPT_NODE_TABLE;
-INSERT INTO SCRIPT_NODE_TABLE (SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_LANGUAGE,SCRIPT_NODE_DATA) values ('x0','if 脚本','if_script','js','return true');
-INSERT INTO SCRIPT_NODE_TABLE (SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_LANGUAGE,SCRIPT_NODE_DATA) values ('x1','if 脚本','if_script','js','return false');
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA) values ('demo','x0','if 脚本','if_script','return true');
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA) values ('demo','x1','if 脚本','if_script','return false');
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/schema.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/schema.sql
index a54844015..8016b768f 100644
--- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/schema.sql
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/schema.sql
@@ -1,6 +1,7 @@
create table `EL_TABLE`
(
`id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+ `application_name` varchar(32) NOT NULL,
`chain_name` varchar(32) NOT NULL,
`el_data` varchar(1024) NOT NULL,
PRIMARY KEY (`id`)
@@ -9,10 +10,10 @@ create table `EL_TABLE`
create table `script_node_table`
(
`id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+ `application_name` varchar(32) NOT NULL,
`script_node_id` varchar(32) NOT NULL,
`script_node_name` varchar(32) NOT NULL,
`script_node_type` varchar(32) NOT NULL,
- `script_node_language` varchar(32) NOT NULL,
`script_node_data` varchar(1024) NOT NULL,
PRIMARY KEY (`id`)
);
\ No newline at end of file