mirror of
https://gitee.com/dromara/liteFlow.git
synced 2026-06-12 15:41:04 +08:00
enhancement #I5XWL2 数据库插件支持脚本的存储
This commit is contained in:
@@ -21,6 +21,7 @@ import com.yomahub.liteflow.util.JsonUtil;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.ServiceLoader;
|
||||
|
||||
/**
|
||||
* SQL 解析器实现,只支持 EL 形式的 XML,不支持其他的形式
|
||||
@@ -55,9 +56,6 @@ public class SQLXmlELParser extends ClassXmlFlowELParser {
|
||||
|
||||
// 初始化 JDBCHelper
|
||||
JDBCHelper.init(sqlParserVO);
|
||||
|
||||
// 初始化 ScriptNodeData
|
||||
initScriptNodeData();
|
||||
} catch (ELSQLException elsqlException) {
|
||||
throw elsqlException;
|
||||
} catch (Exception ex) {
|
||||
@@ -71,20 +69,6 @@ public class SQLXmlELParser extends ClassXmlFlowELParser {
|
||||
return JDBCHelper.getInstance().getElDataContent();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化 ScriptNodeData
|
||||
*/
|
||||
private void initScriptNodeData() {
|
||||
if (Objects.isNull(ScriptExecutorFactory.loadInstance().getScriptExecutor())) {
|
||||
// SPI 加载不到脚本执行器,说明不需要加载脚本节点
|
||||
return;
|
||||
}
|
||||
|
||||
List<NodePropBean> scriptNodeBeans = JDBCHelper.getInstance().getScriptNodeBeans();
|
||||
// 构建脚本 node
|
||||
scriptNodeBeans.forEach(ParserHelper::buildNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查配置文件并设置默认值
|
||||
*
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
|
||||
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
@@ -29,7 +30,9 @@ public class JDBCHelper {
|
||||
private static final String SCRIPT_SQL_PATTERN = "SELECT {},{},{},{},{} FROM {} ";
|
||||
|
||||
private static final String CHAIN_XML_PATTERN = "<chain name=\"{}\">{}</chain>";
|
||||
private static final String XML_PATTERN = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><flow>{}</flow>";
|
||||
private static final String NODE_XML_PATTERN = "<node id=\"{}\" name=\"{}\" type=\"{}\" language=\"{}\"><![CDATA[{}]]></node>";
|
||||
private static final String NODES_XML_PATTERN = "<nodes>{}</nodes>";
|
||||
private static final String XML_PATTERN = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><flow>{}{}</flow>";
|
||||
private static final Integer FETCH_SIZE_MAX = 1000;
|
||||
|
||||
private SQLParserVO sqlParserVO;
|
||||
@@ -104,10 +107,16 @@ public class JDBCHelper {
|
||||
}
|
||||
|
||||
String chains = CollUtil.join(result, StrUtil.CRLF);
|
||||
return StrFormatter.format(XML_PATTERN, chains);
|
||||
String nodes = getScriptNodes();
|
||||
if (StrUtil.isEmpty(nodes)) {
|
||||
return StrFormatter.format(XML_PATTERN, StrUtil.EMPTY, chains);
|
||||
}
|
||||
|
||||
return StrFormatter.format(XML_PATTERN, StrFormatter.format(NODES_XML_PATTERN, nodes), chains);
|
||||
}
|
||||
|
||||
public List<NodePropBean> getScriptNodeBeans() {
|
||||
public String getScriptNodes() {
|
||||
List<String> result = new ArrayList<>();
|
||||
Connection conn = null;
|
||||
PreparedStatement stmt = null;
|
||||
ResultSet rs = null;
|
||||
@@ -119,7 +128,7 @@ public class JDBCHelper {
|
||||
String scriptNodeLanguageField = sqlParserVO.getScriptNodeLanguageField();
|
||||
String scriptNodeTypeField = sqlParserVO.getScriptNodeTypeField();
|
||||
|
||||
List<NodePropBean> result = new ArrayList<>();
|
||||
|
||||
String sqlCmd = StrFormatter.format(
|
||||
SCRIPT_SQL_PATTERN,
|
||||
scriptNodeIdField,
|
||||
@@ -131,6 +140,14 @@ public class JDBCHelper {
|
||||
);
|
||||
try {
|
||||
conn = getConn();
|
||||
// 判断表是否存在
|
||||
// DatabaseMetaData meta = conn.getMetaData();
|
||||
// String types[] = {"TABLE"};
|
||||
// rs = meta.getTables(null, null, scriptNodeTableName, types);
|
||||
// if (!rs.next()) {
|
||||
// return StrUtil.EMPTY;
|
||||
// }
|
||||
|
||||
stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
|
||||
// 设置游标拉取数量
|
||||
stmt.setFetchSize(FETCH_SIZE_MAX);
|
||||
@@ -141,19 +158,13 @@ public class JDBCHelper {
|
||||
String data = getStringFromResultSet(rs, scriptNodeDataField);
|
||||
String name = rs.getString(scriptNodeNameField);
|
||||
String type = getStringFromResultSet(rs, scriptNodeTypeField);
|
||||
String language = getStringFromResultSet(rs, scriptNodeLanguageField);
|
||||
|
||||
if (!NodeTypeEnum.isScriptNodeType(type)) {
|
||||
throw new ELSQLException("is not script node type; node id: " + id);
|
||||
}
|
||||
|
||||
// 构建 node
|
||||
NodePropBean nodePropBean = new NodePropBean()
|
||||
.setId(id)
|
||||
.setName(name)
|
||||
.setScript(data)
|
||||
.setType(type);
|
||||
|
||||
result.add(nodePropBean);
|
||||
result.add(StrFormatter.format(NODE_XML_PATTERN, id, name, type, language));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new ELSQLException(e.getMessage());
|
||||
@@ -161,7 +172,7 @@ public class JDBCHelper {
|
||||
// 关闭连接
|
||||
close(conn, stmt, rs);
|
||||
}
|
||||
return result;
|
||||
return CollUtil.join(result, StrUtil.CRLF);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -49,5 +49,12 @@
|
||||
<version>${h2.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.yomahub</groupId>
|
||||
<artifactId>liteflow-script-javascript</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.yomahub.liteflow.test.sql.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
|
||||
@LiteflowComponent("d")
|
||||
public class DCmp extends NodeComponent {
|
||||
|
||||
@Override
|
||||
public void process() {
|
||||
System.out.println("DCmp executed!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.yomahub.liteflow.test.sql.cmp;
|
||||
|
||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||
import com.yomahub.liteflow.core.NodeComponent;
|
||||
|
||||
|
||||
@LiteflowComponent("e")
|
||||
public class ECmp extends NodeComponent {
|
||||
|
||||
@Override
|
||||
public void process() {
|
||||
System.out.println("ECmp executed!");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
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"}
|
||||
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"}
|
||||
|
||||
spring.datasource.driver-class-name=org.h2.Driver
|
||||
spring.datasource.url=jdbc:h2:mem:test_db;MODE=MySQL
|
||||
|
||||
@@ -1,4 +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 ('chain2','THEN(a, b, c);');
|
||||
INSERT INTO EL_TABLE (CHAIN_NAME,EL_DATA) values ('chain3','IF(x0, THEN(d, e));');
|
||||
|
||||
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;');
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
create table `EL_TABLE` (
|
||||
`id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
`chain_name` varchar(32) NOT NULL,
|
||||
`el_data` varchar(1024) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ;
|
||||
create table `EL_TABLE`
|
||||
(
|
||||
`id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
`chain_name` varchar(32) NOT NULL,
|
||||
`el_data` varchar(1024) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
|
||||
create table `script_node_table`
|
||||
(
|
||||
`id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
`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`)
|
||||
);
|
||||
Reference in New Issue
Block a user