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 f964eac23..087e263b2 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 @@ -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 scriptNodeBeans = JDBCHelper.getInstance().getScriptNodeBeans(); - // 构建脚本 node - scriptNodeBeans.forEach(ParserHelper::buildNode); - } - /** * 检查配置文件并设置默认值 * 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 65cd19cb7..ec00e11c7 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 @@ -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 = "{}"; - private static final String XML_PATTERN = "{}"; + private static final String NODE_XML_PATTERN = ""; + private static final String NODES_XML_PATTERN = "{}"; + private static final String XML_PATTERN = "{}{}"; 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 getScriptNodeBeans() { + public String getScriptNodes() { + List 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 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); } /** diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml index 4e970bc8e..6c932fd17 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml @@ -49,5 +49,12 @@ ${h2.version} test + + + com.yomahub + liteflow-script-javascript + ${revision} + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/DCmp.java new file mode 100644 index 000000000..8607708f8 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/DCmp.java @@ -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!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/ECmp.java new file mode 100644 index 000000000..1a31a8cf1 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/ECmp.java @@ -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!"); + } + +} 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 a1db40e4a..7298d6104 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,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 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 4a8db0849..af8029563 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,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);'); \ No newline at end of file +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;'); 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 38a82c585..a54844015 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,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`) -) ; \ No newline at end of file +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`) +); \ No newline at end of file