diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/enums/ScriptTypeEnum.java b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/ScriptTypeEnum.java
index bf6481224..7fb0d973b 100644
--- a/liteflow-core/src/main/java/com/yomahub/liteflow/enums/ScriptTypeEnum.java
+++ b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/ScriptTypeEnum.java
@@ -43,4 +43,18 @@ public enum ScriptTypeEnum {
return null;
}
+ /**
+ * 校验脚本类型是否合法
+ * @param scriptType 脚本类型
+ * @return true:合法,false:不合法
+ */
+ public static boolean checkScriptType(String scriptType) {
+ for (ScriptTypeEnum e : ScriptTypeEnum.values()) {
+ if (e.getDisplayName().equals(scriptType)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
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 e07f96bbd..e7a8bc939 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
@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.XmlUtil;
import com.yomahub.liteflow.enums.NodeTypeEnum;
+import com.yomahub.liteflow.enums.ScriptTypeEnum;
import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
@@ -30,12 +31,16 @@ public class JDBCHelper {
private static final String SCRIPT_SQL_PATTERN = "SELECT {},{},{},{} FROM {} WHERE {}=?";
+ private static final String SCRIPT_WITH_LANGUAG_SQL_PATTERN = "SELECT {},{},{},{},{} FROM {} WHERE {}=?";
+
private static final String CHAIN_XML_PATTERN = "{}";
private static final String NODE_XML_PATTERN = "{}";
private static final String NODE_ITEM_XML_PATTERN = "";
+ private static final String NODE_ITEM_WITH_LANGUAGE_XML_PATTERN = "";
+
private static final String XML_PATTERN = "{}{}";
private static final Integer FETCH_SIZE_MAX = 1000;
@@ -143,6 +148,11 @@ public class JDBCHelper {
}
public String getScriptNodes() {
+ String scriptLanguageField = sqlParserVO.getScriptLanguageField();
+ if (StrUtil.isNotBlank(scriptLanguageField)) {
+ return getScriptNodesWithLanguage();
+ }
+
List result = new ArrayList<>();
Connection conn = null;
PreparedStatement stmt = null;
@@ -198,6 +208,70 @@ public class JDBCHelper {
return StrUtil.format(NODE_XML_PATTERN, CollUtil.join(result, StrUtil.EMPTY));
}
+ public String getScriptNodesWithLanguage() {
+
+ List result = new ArrayList<>();
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+
+ 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();
+ String scriptLanguageField = sqlParserVO.getScriptLanguageField();
+
+ if (StrUtil.isBlank(applicationName) || StrUtil.isBlank(scriptApplicationNameField)) {
+ throw new ELSQLException("You did not define the applicationName or scriptApplicationNameField property");
+ }
+
+ String sqlCmd = StrUtil.format(SCRIPT_WITH_LANGUAG_SQL_PATTERN, scriptIdField, scriptDataField, scriptNameField,
+ scriptTypeField, scriptLanguageField, 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, scriptIdField);
+ String data = getStringFromResultSet(rs, scriptDataField);
+ String name = getStringFromResultSet(rs, scriptNameField);
+ String type = getStringFromResultSet(rs, scriptTypeField);
+ String language = getStringFromResultSet(rs, scriptLanguageField);
+
+ NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(type);
+ if (Objects.isNull(nodeTypeEnum)) {
+ throw new ELSQLException(StrUtil.format("Invalid type value[{}]", type));
+ }
+
+ if (!nodeTypeEnum.isScript()) {
+ throw new ELSQLException(StrUtil.format("The type value[{}] is not a script type", type));
+ }
+
+ if (!ScriptTypeEnum.checkScriptType(language)) {
+ throw new ELSQLException(StrUtil.format("The language value[{}] is error", language));
+ }
+
+ result.add(StrUtil.format(NODE_ITEM_WITH_LANGUAGE_XML_PATTERN, XmlUtil.escape(id), XmlUtil.escape(name),
+ type, language, data));
+ }
+ }
+ catch (Exception e) {
+ throw new ELSQLException(e.getMessage());
+ }
+ finally {
+ // 关闭连接
+ close(conn, stmt, rs);
+ }
+ return StrUtil.format(NODE_XML_PATTERN, CollUtil.join(result, StrUtil.EMPTY));
+ }
+
/**
* 关闭连接
* @param conn conn
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 982a71258..4459d1922 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
@@ -83,6 +83,11 @@ public class SQLParserVO {
*/
private String scriptTypeField = "script_type";
+ /**
+ * 脚本 node language 字段
+ */
+ private String scriptLanguageField;
+
public String getUrl() {
return url;
}
@@ -203,4 +208,12 @@ public class SQLParserVO {
this.scriptTypeField = scriptTypeField;
}
+ public String getScriptLanguageField() {
+ return scriptLanguageField;
+ }
+
+ public void setScriptLanguageField(String scriptLanguageField) {
+ this.scriptLanguageField = scriptLanguageField;
+ }
+
}
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 8fb4c22df..b759a97f2 100644
--- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/pom.xml
@@ -57,5 +57,12 @@
test
+
+ com.yomahub
+ liteflow-script-javascript
+ ${revision}
+ test
+
+
\ 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/SQLWithXmlELMultiLanguageSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELMultiLanguageSpringbootTest.java
new file mode 100644
index 000000000..aa862aadb
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELMultiLanguageSpringbootTest.java
@@ -0,0 +1,34 @@
+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;
+
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/application-xml.properties")
+@SpringBootTest(classes = SQLWithXmlELSpringbootTest.class)
+@EnableAutoConfiguration
+@ComponentScan({ "com.yomahub.liteflow.test.sql.cmp" })
+public class SQLWithXmlELMultiLanguageSpringbootTest extends BaseTest {
+
+ @Resource
+ private FlowExecutor flowExecutor;
+
+ @Test
+ public void testMultiLanguage1() {
+ LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg");
+ Assert.assertTrue(response.isSuccess());
+ Assert.assertEquals("x2[python脚本]==>x0[if 脚本]==>a==>b", response.getExecuteStepStrWithoutTime());
+ }
+
+}
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 7453c9b12..97dd95281 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
@@ -13,6 +13,7 @@ liteflow.rule-source-ext-data={\
"scriptIdField":"script_node_id",\
"scriptNameField":"script_node_name",\
"scriptDataField":"script_node_data",\
+ "scriptLanguageField":"script_language",\
"scriptTypeField":"script_node_type"\
}
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 3bb39657f..dda527ee6 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
@@ -4,8 +4,11 @@ INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain
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));');
INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','','IF(x0, THEN(a, b));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain4','IF(x2, IF(x0, THEN(a, b)));');
DELETE FROM SCRIPT_NODE_TABLE;
-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');
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','if_script','return true','groovy');
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','if_script','return false','groovy');
+
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','if_script','return true','js');
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 8016b768f..00292ff24 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
@@ -15,5 +15,6 @@ create table `script_node_table`
`script_node_name` varchar(32) NOT NULL,
`script_node_type` varchar(32) NOT NULL,
`script_node_data` varchar(1024) NOT NULL,
+ `script_language` varchar(1024) NOT NULL,
PRIMARY KEY (`id`)
);
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql
index 22f2e7803..dda527ee6 100644
--- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql
@@ -3,8 +3,12 @@ DELETE FROM EL_TABLE;
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));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','','IF(x0, THEN(a, b));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain4','IF(x2, IF(x0, THEN(a, b)));');
DELETE FROM SCRIPT_NODE_TABLE;
-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');
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','if_script','return true','groovy');
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','if_script','return false','groovy');
+
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','if_script','return true','js');
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/schema.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/schema.sql
index 8783ea6cf..f89fa2aab 100644
--- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/schema.sql
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/schema.sql
@@ -15,5 +15,6 @@ create table `script_node_table`
`script_node_name` text NOT NULL,
`script_node_type` text NOT NULL,
`script_node_data` text NOT NULL,
+ `script_language` varchar(1024) NOT NULL,
PRIMARY KEY (`id`)
);
\ No newline at end of file