From cbc4df5809aa72c24d17a504cc4843e3793fb1ad Mon Sep 17 00:00:00 2001
From: tangkc <1016771049@qq.com>
Date: Sun, 18 Sep 2022 22:08:46 +0800
Subject: [PATCH] =?UTF-8?q?feature=20#I5ROOR=20=E5=A2=9E=E5=8A=A0=E5=85=B3?=
=?UTF-8?q?=E7=B3=BB=E5=9E=8B=E6=95=B0=E6=8D=AE=E5=BA=93EL=E5=AD=98?=
=?UTF-8?q?=E5=82=A8=E6=8F=92=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../liteflow-rule-sql/pom.xml | 23 +++
.../parser/spi/sql/SQLParserClassNameSpi.java | 19 +++
.../liteflow/parser/sql/SQLXmlELParser.java | 84 ++++++++++
.../parser/sql/exception/ELSQLException.java | 30 ++++
.../liteflow/parser/sql/util/JDBCHelper.java | 157 ++++++++++++++++++
.../liteflow/parser/sql/vo/SQLParserVO.java | 116 +++++++++++++
...hub.liteflow.parser.spi.ParserClassNameSpi | 1 +
liteflow-rule-plugin/pom.xml | 1 +
.../pom.xml | 70 ++++++++
.../com/yomahub/liteflow/test/BaseTest.java | 23 +++
.../test/sql/SQLWithXmlELSpringbootTest.java | 35 ++++
.../yomahub/liteflow/test/sql/cmp/ACmp.java | 20 +++
.../yomahub/liteflow/test/sql/cmp/BCmp.java | 21 +++
.../yomahub/liteflow/test/sql/cmp/CCmp.java | 21 +++
.../test/resources/application-xml.properties | 9 +
.../src/test/resources/sql/data.sql | 4 +
.../src/test/resources/sql/schema.sql | 6 +
liteflow-testcase-el/pom.xml | 1 +
18 files changed, 641 insertions(+)
create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/pom.xml
create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/sql/SQLParserClassNameSpi.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/exception/ELSQLException.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/ACmp.java
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/BCmp.java
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/CCmp.java
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/application-xml.properties
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/schema.sql
diff --git a/liteflow-rule-plugin/liteflow-rule-sql/pom.xml b/liteflow-rule-plugin/liteflow-rule-sql/pom.xml
new file mode 100644
index 00000000..af48a726
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-sql/pom.xml
@@ -0,0 +1,23 @@
+
+
+
+ liteflow
+ com.yomahub
+ ${revision}
+ ../../pom.xml
+
+ 4.0.0
+
+ liteflow-rule-sql
+
+
+
+ com.yomahub
+ liteflow-core
+ ${revision}
+ true
+
+
+
\ No newline at end of file
diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/sql/SQLParserClassNameSpi.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/sql/SQLParserClassNameSpi.java
new file mode 100644
index 00000000..19017fcc
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/sql/SQLParserClassNameSpi.java
@@ -0,0 +1,19 @@
+package com.yomahub.liteflow.parser.spi.sql;
+
+import com.yomahub.liteflow.parser.spi.ParserClassNameSpi;
+import com.yomahub.liteflow.parser.sql.SQLXmlELParser;
+
+/**
+ * SQL 解析器 SPI 实现
+ *
+ * @author tangkc
+ * @since 2.9.0
+ */
+public class SQLParserClassNameSpi implements ParserClassNameSpi {
+
+ @Override
+ public String getSpiClassName() {
+ return SQLXmlELParser.class.getName();
+ }
+
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..87ea0976
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java
@@ -0,0 +1,84 @@
+package com.yomahub.liteflow.parser.sql;
+
+import cn.hutool.core.text.StrFormatter;
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.parser.el.ClassXmlFlowELParser;
+import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
+import com.yomahub.liteflow.parser.sql.util.JDBCHelper;
+import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
+import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.util.JsonUtil;
+
+import java.util.Objects;
+
+/**
+ * SQL 解析器实现,只支持 EL 形式的 XML,不支持其他的形式
+ *
+ * @author tangkc
+ * @since 2.9.0
+ */
+public class SQLXmlELParser extends ClassXmlFlowELParser {
+
+ private static final String ERROR_MSG_PATTERN = "rule-source-ext-data {} is blank";
+ private static final String ERROR_COMMON_MSG = "rule-source-ext-data is empty";
+
+ /**
+ * 构造函数
+ */
+ public SQLXmlELParser() {
+ LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
+
+ if (StrUtil.isBlank(liteflowConfig.getRuleSourceExtData())) {
+ throw new ELSQLException(ERROR_COMMON_MSG);
+ }
+
+ try {
+ SQLParserVO sqlParserVO = JsonUtil.parseObject(liteflowConfig.getRuleSourceExtData(), SQLParserVO.class);
+ if (Objects.isNull(sqlParserVO)) {
+ throw new ELSQLException(ERROR_COMMON_MSG);
+ }
+
+ // 检查配置文件
+ checkParserVO(sqlParserVO);
+
+ // 初始化 JDBCHelper
+ JDBCHelper.init(sqlParserVO);
+
+ } catch (ELSQLException elsqlException) {
+ throw elsqlException;
+ } catch (Exception ex) {
+ throw new ELSQLException(ex.getMessage());
+ }
+
+ }
+
+ @Override
+ public String parseCustom() {
+ return JDBCHelper.getInstance().getElDataContent();
+ }
+
+
+ /**
+ * 检查配置文件并设置默认值
+ *
+ * @param sqlParserVO sqlParserVO
+ */
+ private void checkParserVO(SQLParserVO sqlParserVO) {
+ if (StrUtil.isEmpty(sqlParserVO.getUrl())) {
+ throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "url"));
+ }
+ if (StrUtil.isEmpty(sqlParserVO.getDriverClassName())) {
+ throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "driverClassName"));
+ }
+ if (Objects.isNull(sqlParserVO.getUsername())) {
+ throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "username"));
+ }
+ if (Objects.isNull(sqlParserVO.getPassword())) {
+ throw new ELSQLException(StrFormatter.format(ERROR_MSG_PATTERN, "password"));
+ }
+ if (Objects.isNull(sqlParserVO.getElTable())) {
+ sqlParserVO.setElTable(new SQLParserVO.ElTable());
+ }
+ }
+}
diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/exception/ELSQLException.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/exception/ELSQLException.java
new file mode 100644
index 00000000..e0a4a24a
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/exception/ELSQLException.java
@@ -0,0 +1,30 @@
+package com.yomahub.liteflow.parser.sql.exception;
+
+/**
+ * SQL 相关业务异常
+ *
+ * @author tangkc
+ * @since 2.9.0
+ */
+public class ELSQLException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 异常信息
+ */
+ private String message;
+
+ public ELSQLException(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
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
new file mode 100644
index 00000000..c529b542
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/JDBCHelper.java
@@ -0,0 +1,157 @@
+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.parser.sql.exception.ELSQLException;
+import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * jdbc 工具类
+ *
+ * @author tangkc
+ * @since 2.9.0
+ */
+public class JDBCHelper {
+
+ private static final String SQL_PATTERN = "SELECT {},{} FROM {} ";
+
+ private static final String CHAIN_XML_PATTERN = "{}";
+ private static final String XML_PATTERN = "{}";
+ private static final Integer FETCH_SIZE_MAX = 1000;
+
+ private SQLParserVO sqlParserVO;
+
+ private static JDBCHelper INSTANCE;
+
+ /**
+ * 初始化 INSTANCE
+ */
+ public static void init(SQLParserVO sqlParserVO) {
+ try {
+ INSTANCE = new JDBCHelper();
+ Class.forName(sqlParserVO.getDriverClassName());
+ INSTANCE.setSqlParserVO(sqlParserVO);
+ } catch (ClassNotFoundException e) {
+ throw new ELSQLException(e.getMessage());
+ }
+ }
+
+ /**
+ * 获取 INSTANCE
+ */
+ public static JDBCHelper getInstance() {
+ return INSTANCE;
+ }
+
+ /**
+ * 获取链接
+ */
+ public Connection getConn() {
+ Connection connection = null;
+ try {
+ connection = DriverManager.getConnection(sqlParserVO.getUrl(), sqlParserVO.getUsername(), sqlParserVO.getPassword());
+ } catch (SQLException e) {
+ throw new ELSQLException(e.getMessage());
+ }
+ return connection;
+ }
+
+ /**
+ * 获取 ElData 数据内容
+ */
+ public String getElDataContent() {
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+
+ String elDataField = sqlParserVO.getElTable().getElDataField();
+ String chainNameField = sqlParserVO.getElTable().getChainNameField();
+ String tableName = sqlParserVO.getElTable().getTableName();
+ String sqlCmd = StrFormatter.format(SQL_PATTERN, chainNameField, elDataField, tableName);
+
+ List result = new ArrayList<>();
+ try {
+ conn = getConn();
+ stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+ // 设置游标拉取数量
+ stmt.setFetchSize(FETCH_SIZE_MAX);
+ rs = stmt.executeQuery();
+
+ while (rs.next()) {
+ String elData = rs.getString(elDataField);
+ if (StrUtil.isBlank(elData)) {
+ throw new ELSQLException(StrFormatter.format("{} table exist {} field value is empty", tableName, elDataField));
+ }
+ String chainName = rs.getString(chainNameField);
+ if (StrUtil.isBlank(elData)) {
+ throw new ELSQLException(StrFormatter.format("{} table exist {} field value is empty", tableName, elDataField));
+ }
+
+ result.add(StrFormatter.format(CHAIN_XML_PATTERN, chainName, elData));
+ }
+ } catch (Exception e) {
+ throw new ELSQLException(e.getMessage());
+ } finally {
+ // 关闭连接
+ close(conn, stmt, rs);
+ }
+
+ String chains = CollUtil.join(result, StrUtil.CRLF);
+ return StrFormatter.format(XML_PATTERN, chains);
+ }
+
+ /**
+ * 关闭连接
+ *
+ * @param conn conn
+ * @param stmt stmt
+ * @param rs rs
+ */
+ private void close(Connection conn, PreparedStatement stmt, ResultSet rs) {
+ // 关闭连接
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ throw new ELSQLException(e.getMessage());
+ }
+ }
+ // 关闭 statement
+ if (stmt != null) {
+ try {
+ stmt.close();
+ } catch (SQLException e) {
+ throw new ELSQLException(e.getMessage());
+ }
+ }
+ //关闭结果集
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ throw new ELSQLException(e.getMessage());
+ }
+ }
+ }
+
+
+ //#region get set method
+ private SQLParserVO getSqlParserVO() {
+ return sqlParserVO;
+ }
+
+ private JDBCHelper setSqlParserVO(SQLParserVO sqlParserVO) {
+ this.sqlParserVO = sqlParserVO;
+ return this;
+ }
+ //#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
new file mode 100644
index 00000000..6eb9f9c6
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java
@@ -0,0 +1,116 @@
+package com.yomahub.liteflow.parser.sql.vo;
+
+/**
+ * 用于解析 RuleSourceExtData 的 VO 类,用于 sql 模式中
+ *
+ * @author tangkc
+ * @since 2.9.0
+ */
+public class SQLParserVO {
+
+ /**
+ * 连接地址
+ */
+ private String url;
+
+ /**
+ * 驱动
+ */
+ private String driverClassName;
+
+ /**
+ * 账号名
+ */
+ private String username;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ /**
+ * EL 表相关配置
+ */
+ private ElTable elTable;
+
+ public static class ElTable {
+ /**
+ * 表名
+ */
+ private String tableName = "el_table";
+
+ /**
+ * chainName
+ */
+ private String chainNameField = "chain_name";
+
+ /**
+ * el 表达式相关数据
+ */
+ private String elDataField = "el_data";
+
+ public String getTableName() {
+ return tableName;
+ }
+
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ public String getChainNameField() {
+ return chainNameField;
+ }
+
+ public void setChainNameField(String chainNameField) {
+ this.chainNameField = chainNameField;
+ }
+
+ public String getElDataField() {
+ return elDataField;
+ }
+
+ public void setElDataField(String elDataField) {
+ this.elDataField = elDataField;
+ }
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getDriverClassName() {
+ return driverClassName;
+ }
+
+ public void setDriverClassName(String driverClassName) {
+ this.driverClassName = driverClassName;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public ElTable getElTable() {
+ return elTable;
+ }
+
+ public void setElTable(ElTable elTable) {
+ this.elTable = elTable;
+ }
+}
diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi b/liteflow-rule-plugin/liteflow-rule-sql/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi
new file mode 100644
index 00000000..4a0937b2
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi
@@ -0,0 +1 @@
+com.yomahub.liteflow.parser.spi.sql.SQLParserClassNameSpi
\ No newline at end of file
diff --git a/liteflow-rule-plugin/pom.xml b/liteflow-rule-plugin/pom.xml
index 4e1601b4..9599dbec 100644
--- a/liteflow-rule-plugin/pom.xml
+++ b/liteflow-rule-plugin/pom.xml
@@ -12,6 +12,7 @@
pom
liteflow-rule-zk
+ liteflow-rule-sql
liteflow-rule-plugin
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml
new file mode 100644
index 00000000..b1bfc69d
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml
@@ -0,0 +1,70 @@
+
+
+
+ liteflow-testcase-el
+ com.yomahub
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+
+ liteflow-testcase-el-sql-springboot
+
+
+ 2.1.214
+
+
+
+
+ com.yomahub
+ liteflow-spring-boot-starter
+ ${revision}
+
+
+
+ com.yomahub
+ liteflow-rule-sql
+ ${revision}
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+ 2.0.5.RELEASE
+ test
+
+
+
+ com.h2database
+ h2
+ ${h2.version}
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${springboot.version}
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 2.8.2
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java
new file mode 100644
index 00000000..7d8cef60
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java
@@ -0,0 +1,23 @@
+package com.yomahub.liteflow.test;
+
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.spi.holder.SpiFactoryCleaner;
+import com.yomahub.liteflow.spring.ComponentScanner;
+import com.yomahub.liteflow.thread.ExecutorHelper;
+import org.junit.AfterClass;
+
+/**
+ * @author tangkc
+ * @since 2.8.6
+ */
+public class BaseTest {
+ @AfterClass
+ public static void cleanScanCache(){
+ ComponentScanner.cleanCache();
+ FlowBus.cleanCache();
+ ExecutorHelper.loadInstance().clearExecutorServiceMap();
+ SpiFactoryCleaner.clean();
+ LiteflowConfigGetter.clean();
+ }
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java
new file mode 100644
index 00000000..34ceb68a
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java
@@ -0,0 +1,35 @@
+package com.yomahub.liteflow.test.sql;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+/**
+ * @author tangkc
+ * @since 2.9.0
+ */
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/application-xml.properties")
+@SpringBootTest(classes = SQLWithXmlELSpringbootTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.sql.cmp"})
+public class SQLWithXmlELSpringbootTest extends BaseTest {
+ @Resource
+ private FlowExecutor flowExecutor;
+
+ @Test
+ public void testSQLWithXml() {
+ LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
+ Assert.assertEquals("a==>b==>c", response.getExecuteStepStr());
+ }
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/ACmp.java
new file mode 100644
index 00000000..4b7958ec
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/ACmp.java
@@ -0,0 +1,20 @@
+/**
+ * Title: liteflow
+ * Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.sql.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("a")
+public class ACmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("ACmp executed!");
+ }
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/BCmp.java
new file mode 100644
index 00000000..5d71a230
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/BCmp.java
@@ -0,0 +1,21 @@
+/**
+ * Title: liteflow
+ * Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.sql.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("b")
+public class BCmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("BCmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/CCmp.java
new file mode 100644
index 00000000..8bce5991
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/cmp/CCmp.java
@@ -0,0 +1,21 @@
+/**
+ * Title: liteflow
+ * Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.sql.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("c")
+public class CCmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("CCmp 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
new file mode 100644
index 00000000..8565f159
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/application-xml.properties
@@ -0,0 +1,9 @@
+liteflow.rule-source-ext-data={"url":"jdbc:h2:mem:test_db;MODE=MySQL","driverClassName":"org.h2.Driver","username":"root","password":"123456","elTable":{"tableName":"EL_TABLE","elDataField":"EL_DATA"}}
+
+spring.datasource.driver-class-name=org.h2.Driver
+spring.datasource.url=jdbc:h2:mem:test_db;MODE=MySQL
+spring.datasource.username=root
+spring.datasource.password=123456
+spring.datasource.schema=classpath:/sql/schema.sql
+spring.datasource.data=classpath:/sql/data.sql
+spring.datasource.platform=h2
\ No newline at end of file
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
new file mode 100644
index 00000000..4a8db084
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql
@@ -0,0 +1,4 @@
+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
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
new file mode 100644
index 00000000..38a82c58
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/schema.sql
@@ -0,0 +1,6 @@
+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
diff --git a/liteflow-testcase-el/pom.xml b/liteflow-testcase-el/pom.xml
index ee768dbc..c3133976 100644
--- a/liteflow-testcase-el/pom.xml
+++ b/liteflow-testcase-el/pom.xml
@@ -23,5 +23,6 @@
liteflow-testcase-el-script-groovy-springboot
liteflow-testcase-el-script-qlexpress-springboot
liteflow-testcase-el-zk-springboot
+ liteflow-testcase-el-sql-springboot
\ No newline at end of file