From 18cf5af50249fc500ee7836dae0ebf709c396fa9 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Thu, 23 May 2024 19:28:21 +0800 Subject: [PATCH] =?UTF-8?q?feature=20#I9RPBK=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=94=AF=E6=8C=81=E5=86=B3=E7=AD=96=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 3 +- .../parser/helper/NodeConvertHelper.java | 23 ------- .../parser/constant/SqlReadConstant.java | 2 +- .../sql/polling/AbstractSqlReadPollTask.java | 61 +++++++++++------- .../parser/sql/polling/SqlReadPollTask.java | 6 +- .../sql/polling/impl/ChainReadPollTask.java | 36 ++++++++--- .../sql/polling/impl/ScriptReadPollTask.java | 44 +++++++++---- .../parser/sql/read/AbstractSqlRead.java | 21 +++--- .../liteflow/parser/sql/read/SqlRead.java | 5 +- .../parser/sql/read/SqlReadFactory.java | 20 +++--- .../parser/sql/read/impl/ChainRead.java | 31 ++++----- .../parser/sql/read/impl/ScriptRead.java | 54 ++++------------ .../liteflow/parser/sql/read/vo/ChainVO.java | 44 +++++++++++++ .../liteflow/parser/sql/read/vo/ScriptVO.java | 64 +++++++++++++++++++ .../liteflow/parser/sql/util/JDBCHelper.java | 32 ++++++---- .../liteflow/parser/sql/vo/SQLParserVO.java | 26 ++++++++ 16 files changed, 306 insertions(+), 166 deletions(-) create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ChainVO.java create mode 100644 liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ScriptVO.java diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java index 26071666f..c8e6ef6ee 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java @@ -136,8 +136,7 @@ public class LiteFlowChainELBuilder { public LiteFlowChainELBuilder setRoute(String routeEl){ if (StrUtil.isBlank(routeEl)) { - String errMsg = StrUtil.format("You have defined the label but there is no el in the chain route[{}].", chain.getChainId()); - throw new FlowSystemException(errMsg); + return this; } List errorList = new ArrayList<>(); try { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/NodeConvertHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/NodeConvertHelper.java index 7b5d9105b..c834425b6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/NodeConvertHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/NodeConvertHelper.java @@ -15,29 +15,6 @@ import java.util.List; */ public class NodeConvertHelper { - /*script节点的修改/添加*/ - public static void changeScriptNode(NodeSimpleVO nodeSimpleVO, String newValue) { - // 有语言类型 - if (StrUtil.isNotBlank(nodeSimpleVO.getLanguage())) { - LiteFlowNodeBuilder.createScriptNode() - .setId(nodeSimpleVO.getNodeId()) - .setType(NodeTypeEnum.getEnumByCode(nodeSimpleVO.getType())) - .setName(nodeSimpleVO.getName()) - .setScript(newValue) - .setLanguage(nodeSimpleVO.getLanguage()) - .build(); - } - // 没有语言类型 - else { - LiteFlowNodeBuilder.createScriptNode() - .setId(nodeSimpleVO.getNodeId()) - .setType(NodeTypeEnum.getEnumByCode(nodeSimpleVO.getType())) - .setName(nodeSimpleVO.getName()) - .setScript(newValue) - .build(); - } - } - public static NodeSimpleVO convert(String scriptKey){ // 不需要去理解这串正则,就是一个匹配冒号的 // 一定得是a:b,或是a:b:c...这种完整类型的字符串的 diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java index 1161493d2..6cc4015db 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java @@ -16,7 +16,7 @@ public class SqlReadConstant { public static final String SCRIPT_SQL_PATTERN = "SELECT * FROM {} WHERE {}=?"; - public static final String CHAIN_XML_PATTERN = ""; + public static final String CHAIN_XML_PATTERN = ""; public static final String NODE_XML_PATTERN = "{}"; diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/AbstractSqlReadPollTask.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/AbstractSqlReadPollTask.java index d4049a4ca..9d464839c 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/AbstractSqlReadPollTask.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/AbstractSqlReadPollTask.java @@ -11,6 +11,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; /** * sql 轮询任务抽象类,维护公共方法 @@ -19,11 +21,11 @@ import java.util.Set; * @author houxinyu * @since 2.11.1 */ -public abstract class AbstractSqlReadPollTask implements SqlReadPollTask { +public abstract class AbstractSqlReadPollTask implements SqlReadPollTask { private final Map DATA_SHA_MAP = new HashMap<>(); - private final SqlRead read; + private final SqlRead read; - public AbstractSqlReadPollTask(SqlRead read) { + public AbstractSqlReadPollTask(SqlRead read) { this.read = read; if (!read.type().equals(type())) { @@ -33,35 +35,34 @@ public abstract class AbstractSqlReadPollTask implements SqlReadPollTask { @Override public void execute() { - Map newData = read.read(); + List dataList = read.read(); // 新增或者更新的元素 - Map saveElementMap = new HashMap<>(); + List saveElementList = new ArrayList<>(); // 删除的元素 - List deleteElementIds = new ArrayList<>(); + List deleteElementIds; - for (Map.Entry entry : newData.entrySet()) { - String id = entry.getKey(); - String element = entry.getValue(); - String newSHA = DigestUtil.sha1Hex(element); + for (T data : dataList) { + String id = getKey(data); + String newSHA = getNeedSha1Value(data); // 新增 // 如果封装的SHAMap中不存在该chain, 表示该元素为新增 if (!DATA_SHA_MAP.containsKey(id)) { - saveElementMap.put(id, element); + saveElementList.add(data); DATA_SHA_MAP.put(id, newSHA); } // 修改 // SHA值发生变化,表示该元素的值已被修改,重新拉取变化的chain else if (!StrUtil.equals(newSHA, DATA_SHA_MAP.get(id))) { - saveElementMap.put(id, element); + saveElementList.add(data); DATA_SHA_MAP.put(id, newSHA); } } Set oldIdList = DATA_SHA_MAP.keySet(); // 旧的 id 列表 - Set newIdList = newData.keySet(); // 新的 id 列表 + Set newIdList = dataList.stream().map(this::getKey).collect(Collectors.toSet()); // 新的 id 列表 // 计算单差集 // 计算集合的单差集,即只返回【oldIdList】中有,但是【newIdList】中没有的元素,例如: // subtractToList([1,2,3,4],[2,3,4,5]) -》 [1] @@ -71,8 +72,8 @@ public abstract class AbstractSqlReadPollTask implements SqlReadPollTask { DATA_SHA_MAP.remove(id); } - if (CollUtil.isNotEmpty(saveElementMap)) { - doSave(saveElementMap); + if (CollUtil.isNotEmpty(saveElementList)) { + doSave(saveElementList); } if (CollUtil.isNotEmpty(deleteElementIds)) { @@ -81,20 +82,34 @@ public abstract class AbstractSqlReadPollTask implements SqlReadPollTask { } @Override - public void initData(Map dataMap) { - DATA_SHA_MAP.putAll(shaMapValue(dataMap)); + public void initData(List dataList) { + DATA_SHA_MAP.putAll(shaValue(dataList)); } - public abstract void doSave(Map saveElementMap); + public abstract void doSave(List saveElementList); public abstract void doDelete(List deleteElementId); - private Map shaMapValue(Map dataMap) { + private Map shaValue(List dataList) { Map result = new HashMap<>(); - dataMap.forEach((k, v) -> { - result.put(k, DigestUtil.sha1Hex(v)); - }); - + dataList.forEach(t -> result.put(getKey(t), DigestUtil.sha1Hex(getNeedSha1Value(t)))); return result; } + + private String getNeedSha1Value(T data) { + if (StrUtil.isBlank(getExtValue(data))) { + return DigestUtil.sha1Hex(getValue(data)); + }else{ + return DigestUtil.sha1Hex(getValue(data) + "|||" + getExtValue(data)); + } + } + + // 如果是chain,那就是返回chain的id,如果是script,那就返回script的id + protected abstract String getKey(T t); + + // 如果是chain,那就返回EL,如果是script,那就返回脚本数据 + protected abstract String getValue(T t); + + // 如果是chain,那就返回route el,如果是script,这个不返回,因为script没有扩展value + protected abstract String getExtValue(T t); } diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/SqlReadPollTask.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/SqlReadPollTask.java index 8c491e9ad..7d8ac7e9e 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/SqlReadPollTask.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/SqlReadPollTask.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.parser.sql.polling; import com.yomahub.liteflow.parser.constant.ReadType; +import java.util.List; import java.util.Map; /** @@ -11,7 +12,7 @@ import java.util.Map; * @author houxinyu * @since 2.11.1 */ -public interface SqlReadPollTask { +public interface SqlReadPollTask { /** * 执行 @@ -21,9 +22,8 @@ public interface SqlReadPollTask { /** * 初始化数据 * - * @param dataMap 数据 */ - void initData(Map dataMap); + void initData(List dataList); /** * 类型 diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ChainReadPollTask.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ChainReadPollTask.java index 717ebc106..b2d10b44b 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ChainReadPollTask.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ChainReadPollTask.java @@ -1,13 +1,16 @@ package com.yomahub.liteflow.parser.sql.polling.impl; +import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.parser.constant.ReadType; import com.yomahub.liteflow.parser.sql.polling.AbstractSqlReadPollTask; import com.yomahub.liteflow.parser.sql.read.SqlRead; +import com.yomahub.liteflow.parser.sql.read.vo.ChainVO; import java.util.List; import java.util.Map; +import java.util.function.Consumer; /** * chain 读取任务 @@ -16,20 +19,20 @@ import java.util.Map; * @author houxinyu * @since 2.11.1 */ -public class ChainReadPollTask extends AbstractSqlReadPollTask { +public class ChainReadPollTask extends AbstractSqlReadPollTask { - public ChainReadPollTask(SqlRead read) { + public ChainReadPollTask(SqlRead read) { super(read); } @Override - public void doSave(Map saveElementMap) { - for (Map.Entry entry : saveElementMap.entrySet()) { - String chainName = entry.getKey(); - String newData = entry.getValue(); - - LiteFlowChainELBuilder.createChain().setChainId(chainName).setEL(newData).build(); - } + public void doSave(List saveElementList) { + saveElementList.forEach(chainVO -> + LiteFlowChainELBuilder.createChain().setChainId(chainVO.getChainId()) + .setRoute(chainVO.getRoute()) + .setNamespace(chainVO.getNamespace()) + .setEL(chainVO.getBody()) + .build()); } @Override @@ -39,6 +42,21 @@ public class ChainReadPollTask extends AbstractSqlReadPollTask { } } + @Override + protected String getKey(ChainVO chainVO) { + return chainVO.getChainId(); + } + + @Override + protected String getValue(ChainVO chainVO) { + return chainVO.getBody(); + } + + @Override + protected String getExtValue(ChainVO chainVO) { + return chainVO.getRoute(); + } + @Override public ReadType type() { return ReadType.CHAIN; diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ScriptReadPollTask.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ScriptReadPollTask.java index 38bbd621d..ddfff6daa 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ScriptReadPollTask.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/polling/impl/ScriptReadPollTask.java @@ -1,13 +1,18 @@ package com.yomahub.liteflow.parser.sql.polling.impl; +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.builder.LiteFlowNodeBuilder; +import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.parser.constant.ReadType; import com.yomahub.liteflow.parser.helper.NodeConvertHelper; import com.yomahub.liteflow.parser.sql.polling.AbstractSqlReadPollTask; import com.yomahub.liteflow.parser.sql.read.SqlRead; +import com.yomahub.liteflow.parser.sql.read.vo.ScriptVO; import java.util.List; import java.util.Map; +import java.util.function.Consumer; /** * 脚本轮询任务 @@ -16,32 +21,45 @@ import java.util.Map; * @author houxinyu * @since 2.11.1 */ -public class ScriptReadPollTask extends AbstractSqlReadPollTask { - public ScriptReadPollTask(SqlRead read) { +public class ScriptReadPollTask extends AbstractSqlReadPollTask { + public ScriptReadPollTask(SqlRead read) { super(read); } @Override - public void doSave(Map saveElementMap) { - for (Map.Entry entry : saveElementMap.entrySet()) { - String scriptKey = entry.getKey(); - String newData = entry.getValue(); - - NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(scriptKey); - NodeConvertHelper.changeScriptNode(scriptVO, newData); - } + public void doSave(List saveElementList) { + saveElementList.forEach(scriptVO -> LiteFlowNodeBuilder.createScriptNode() + .setId(scriptVO.getNodeId()) + .setType(NodeTypeEnum.getEnumByCode(scriptVO.getType())) + .setName(scriptVO.getName()) + .setScript(scriptVO.getScript()) + .setLanguage(scriptVO.getLanguage()) + .build()); } @Override public void doDelete(List deleteElementId) { for (String id : deleteElementId) { - NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(id); - // 删除script - FlowBus.unloadScriptNode(scriptVO.getNodeId()); + FlowBus.unloadScriptNode(id); } } + @Override + protected String getKey(ScriptVO scriptVO) { + return scriptVO.getNodeId(); + } + + @Override + protected String getValue(ScriptVO scriptVO) { + return scriptVO.getScript(); + } + + @Override + protected String getExtValue(ScriptVO scriptVO) { + return StrUtil.EMPTY; + } + @Override public ReadType type() { return ReadType.SCRIPT; diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/AbstractSqlRead.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/AbstractSqlRead.java index bb2f7cbec..5d611f4e0 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/AbstractSqlRead.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/AbstractSqlRead.java @@ -9,7 +9,9 @@ import com.yomahub.liteflow.parser.sql.util.LiteFlowJdbcUtil; import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; import java.sql.*; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -20,7 +22,7 @@ import java.util.Map; * @author Bryan.Zhang * @since 2.11.1 */ -public abstract class AbstractSqlRead implements SqlRead { +public abstract class AbstractSqlRead implements SqlRead { public final SQLParserVO config; private static LFLog LOG = LFLoggerManager.getLogger(AbstractSqlRead.class); @@ -29,10 +31,10 @@ public abstract class AbstractSqlRead implements SqlRead { } @Override - public Map read() { + public List read() { // 如果不需要读取直接返回 if (!needRead()) { - return new HashMap<>(); + return new ArrayList<>(); } checkConfig(); @@ -40,7 +42,7 @@ public abstract class AbstractSqlRead implements SqlRead { // 如果允许,就打印 sql 语句 logSqlIfEnable(sqlCmd); - Map result = new HashMap<>(); + List result = new ArrayList<>(); Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; @@ -54,9 +56,6 @@ public abstract class AbstractSqlRead implements SqlRead { rs = stmt.executeQuery(); while (rs.next()) { - String xml = buildXmlElement(rs); - String uniqueKey = buildXmlElementUniqueKey(rs); - if (hasEnableFiled()){ boolean enable = getEnableFiledValue(rs); // 如果停用,直接跳过 @@ -64,7 +63,7 @@ public abstract class AbstractSqlRead implements SqlRead { continue; } } - result.put(uniqueKey, xml); + result.add(parse(rs)); } } catch (Exception e) { throw new ELSQLException(e.getMessage()); @@ -76,6 +75,8 @@ public abstract class AbstractSqlRead implements SqlRead { return result; } + protected abstract T parse(ResultSet rs) throws SQLException; + /** * 是否包含启停字段 */ @@ -88,10 +89,6 @@ public abstract class AbstractSqlRead implements SqlRead { public abstract String buildQuerySql(); - public abstract String buildXmlElement(ResultSet rs) throws SQLException; - - public abstract String buildXmlElementUniqueKey(ResultSet rs) throws SQLException; - public abstract void checkConfig(); /** diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlRead.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlRead.java index af003f8ea..e6c8c96f9 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlRead.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlRead.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.parser.sql.read; import com.yomahub.liteflow.parser.constant.ReadType; +import java.util.List; import java.util.Map; /** @@ -11,14 +12,14 @@ import java.util.Map; * @author houxinyu * @since 2.11.1 */ -public interface SqlRead { +public interface SqlRead { /** * 读取 * * @return 返回读取到的数据 */ - Map read(); + List read(); /** * 类型 diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlReadFactory.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlReadFactory.java index 281f77989..f22f3657b 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlReadFactory.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/SqlReadFactory.java @@ -19,8 +19,8 @@ import java.util.Map; * @since 2.11.1 */ public class SqlReadFactory { - private static final Map READ_MAP = new HashMap<>(); - private static final Map POLL_TASK_MAP = new HashMap<>(); + private static final Map> READ_MAP = new HashMap<>(); + private static final Map> POLL_TASK_MAP = new HashMap<>(); public static void registerRead(SQLParserVO config) { READ_MAP.putIfAbsent(ReadType.CHAIN, new ChainRead(config)); @@ -28,19 +28,21 @@ public class SqlReadFactory { } public static void registerSqlReadPollTask(ReadType readType) { - SqlRead sqlRead = getSqlRead(readType); + SqlRead sqlRead = getSqlRead(readType); if (ReadType.CHAIN.equals(readType)) { - POLL_TASK_MAP.putIfAbsent(ReadType.CHAIN, new ChainReadPollTask(sqlRead)); + POLL_TASK_MAP.putIfAbsent(ReadType.CHAIN, new ChainReadPollTask((ChainRead)sqlRead)); } else if (ReadType.SCRIPT.equals(readType)) { - POLL_TASK_MAP.putIfAbsent(ReadType.SCRIPT, new ScriptReadPollTask(sqlRead)); + POLL_TASK_MAP.putIfAbsent(ReadType.SCRIPT, new ScriptReadPollTask((ScriptRead)sqlRead)); } } - public static SqlRead getSqlRead(ReadType readType) { - return READ_MAP.get(readType); + @SuppressWarnings("unchecked") + public static SqlRead getSqlRead(ReadType readType) { + return (SqlRead)READ_MAP.get(readType); } - public static SqlReadPollTask getSqlReadPollTask(ReadType readType) { - return POLL_TASK_MAP.get(readType); + @SuppressWarnings("unchecked") + public static SqlReadPollTask getSqlReadPollTask(ReadType readType) { + return (SqlReadPollTask)POLL_TASK_MAP.get(readType); } } diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ChainRead.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ChainRead.java index c7048a8b0..b7ce9ef97 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ChainRead.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ChainRead.java @@ -5,6 +5,7 @@ import com.yomahub.liteflow.parser.constant.ReadType; import com.yomahub.liteflow.parser.constant.SqlReadConstant; import com.yomahub.liteflow.parser.sql.exception.ELSQLException; import com.yomahub.liteflow.parser.sql.read.AbstractSqlRead; +import com.yomahub.liteflow.parser.sql.read.vo.ChainVO; import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; import java.sql.ResultSet; @@ -17,12 +18,26 @@ import java.sql.SQLException; * @author houxinyu * @since 2.11.1 */ -public class ChainRead extends AbstractSqlRead { +public class ChainRead extends AbstractSqlRead { public ChainRead(SQLParserVO config) { super(config); } + @Override + protected ChainVO parse(ResultSet rs) throws SQLException { + ChainVO chainVO = new ChainVO(); + chainVO.setChainId(getStringFromRsWithCheck(rs, super.config.getChainNameField())); + chainVO.setBody(getStringFromRsWithCheck(rs, super.config.getElDataField())); + if (StrUtil.isNotBlank(super.config.getNamespaceField())){ + chainVO.setNamespace(getStringFromRs(rs, super.config.getNamespaceField())); + } + if (StrUtil.isNotBlank(super.config.getRouteField())){ + chainVO.setRoute(getStringFromRs(rs, super.config.getRouteField())); + } + return chainVO; + } + @Override public boolean hasEnableFiled() { String chainEnableField = super.config.getChainEnableField(); @@ -70,20 +85,6 @@ public class ChainRead extends AbstractSqlRead { } } - @Override - public String buildXmlElement(ResultSet rs) throws SQLException { - String elDataField = super.config.getElDataField(); - - return getStringFromRs(rs, elDataField); - } - - @Override - public String buildXmlElementUniqueKey(ResultSet rs) throws SQLException { - String chainNameField = super.config.getChainNameField(); - - return getStringFromRsWithCheck(rs, chainNameField); - } - @Override public ReadType type() { return ReadType.CHAIN; diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ScriptRead.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ScriptRead.java index 3b2fd2642..fa10a616c 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ScriptRead.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/ScriptRead.java @@ -8,6 +8,7 @@ import com.yomahub.liteflow.parser.constant.ReadType; import com.yomahub.liteflow.parser.constant.SqlReadConstant; import com.yomahub.liteflow.parser.sql.exception.ELSQLException; import com.yomahub.liteflow.parser.sql.read.AbstractSqlRead; +import com.yomahub.liteflow.parser.sql.read.vo.ScriptVO; import com.yomahub.liteflow.parser.sql.util.LiteFlowJdbcUtil; import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; @@ -24,12 +25,23 @@ import java.util.Objects; * @author houxinyu * @since 2.11.1 */ -public class ScriptRead extends AbstractSqlRead { +public class ScriptRead extends AbstractSqlRead { public ScriptRead(SQLParserVO config) { super(config); } + @Override + protected ScriptVO parse(ResultSet rs) throws SQLException { + ScriptVO scriptVO = new ScriptVO(); + scriptVO.setNodeId(getStringFromRsWithCheck(rs, super.config.getScriptIdField())); + scriptVO.setName(getStringFromRs(rs, super.config.getScriptNameField())); + scriptVO.setType(getStringFromRsWithCheck(rs, super.config.getScriptTypeField())); + scriptVO.setLanguage(getStringFromRs(rs, super.config.getScriptLanguageField())); + scriptVO.setScript(getStringFromRsWithCheck(rs, super.config.getScriptDataField())); + return scriptVO; + } + @Override public boolean hasEnableFiled() { String scriptEnableField = super.config.getScriptEnableField(); @@ -80,46 +92,6 @@ public class ScriptRead extends AbstractSqlRead { } } - @Override - public String buildXmlElement(ResultSet rs) throws SQLException { - String scriptDataField = super.config.getScriptDataField(); - - return getStringFromRs(rs, scriptDataField); - - } - - @Override - public String buildXmlElementUniqueKey(ResultSet rs) throws SQLException { - String scriptIdField = super.config.getScriptIdField(); - String scriptNameField = super.config.getScriptNameField(); - String scriptTypeField = super.config.getScriptTypeField(); - String scriptLanguageField = super.config.getScriptLanguageField(); - - String id = getStringFromRsWithCheck(rs, scriptIdField); - String name = getStringFromRsWithCheck(rs, scriptNameField); - String type = getStringFromRsWithCheck(rs, scriptTypeField); - String language = withLanguage() ? getStringFromRs(rs, scriptLanguageField) : null; - - 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 (withLanguage() && !ScriptTypeEnum.checkScriptType(language)) { - throw new ELSQLException(StrUtil.format("The language value[{}] is invalid", language)); - } - List keys = CollUtil.newArrayList(id, type, name); - if (StrUtil.isNotBlank(language)) { - keys.add(language); - } - - return StrUtil.join(StrUtil.COLON, keys); - } - @Override public boolean needRead() { if (StrUtil.isBlank(super.config.getScriptTableName())) { diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ChainVO.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ChainVO.java new file mode 100644 index 000000000..61710e207 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ChainVO.java @@ -0,0 +1,44 @@ +package com.yomahub.liteflow.parser.sql.read.vo; + +public class ChainVO { + + private String chainId; + + private String route; + + private String namespace; + + private String body; + + public String getChainId() { + return chainId; + } + + public void setChainId(String chainId) { + this.chainId = chainId; + } + + public String getRoute() { + return route; + } + + public void setRoute(String route) { + this.route = route; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ScriptVO.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ScriptVO.java new file mode 100644 index 000000000..5c4f3fb11 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/vo/ScriptVO.java @@ -0,0 +1,64 @@ +package com.yomahub.liteflow.parser.sql.read.vo; + +public class ScriptVO { + + private String nodeId; + + private String type; + + private String name; + + private String language; + + private Boolean enable; + + private String script; + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + public String getScript() { + return script; + } + + public void setScript(String script) { + this.script = script; + } +} 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 4c5b91d72..714644a3f 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 @@ -11,9 +11,12 @@ import com.yomahub.liteflow.parser.constant.ReadType; import com.yomahub.liteflow.parser.helper.NodeConvertHelper; import com.yomahub.liteflow.parser.sql.exception.ELSQLException; +import com.yomahub.liteflow.parser.sql.polling.SqlReadPollTask; import com.yomahub.liteflow.parser.sql.read.AbstractSqlRead; import com.yomahub.liteflow.parser.sql.read.SqlRead; import com.yomahub.liteflow.parser.sql.read.SqlReadFactory; +import com.yomahub.liteflow.parser.sql.read.vo.ChainVO; +import com.yomahub.liteflow.parser.sql.read.vo.ScriptVO; import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; import org.apache.commons.lang.StringUtils; @@ -87,30 +90,30 @@ public class JDBCHelper { * @return 数据内容 */ public String getContent() { - SqlRead chainRead = SqlReadFactory.getSqlRead(ReadType.CHAIN); - SqlRead scriptRead = SqlReadFactory.getSqlRead(ReadType.SCRIPT); + SqlRead chainRead = SqlReadFactory.getSqlRead(ReadType.CHAIN); + SqlRead scriptRead = SqlReadFactory.getSqlRead(ReadType.SCRIPT); // 获取 chain 数据 - Map chainMap = chainRead.read(); + List chainVOList = chainRead.read(); List chainList = new ArrayList<>(); - chainMap.entrySet().stream() - .filter(entry -> StrUtil.isNotBlank(entry.getValue())) - .forEach( - entry -> chainList.add(StrUtil.format(CHAIN_XML_PATTERN, XmlUtil.escape(entry.getKey()), entry.getValue())) - ); + chainVOList.forEach( + chainVO -> chainList.add(StrUtil.format(CHAIN_XML_PATTERN, XmlUtil.escape(chainVO.getChainId()), StrUtil.emptyIfNull(chainVO.getNamespace()), StrUtil.emptyIfNull(chainVO.getRoute()), chainVO.getBody())) + ); + String chainsContent = CollUtil.join(chainList, StrUtil.EMPTY); // 获取脚本数据 - Map scriptMap = scriptRead.read(); + List scriptVOList = scriptRead.read(); List scriptList = new ArrayList<>(); - scriptMap.forEach((scriptKey, elData) -> { - NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(scriptKey); + + scriptVOList.forEach(scriptVO -> { String id = scriptVO.getNodeId(); String name = scriptVO.getName(); String type = scriptVO.getType(); String language = scriptVO.getLanguage(); + String elData = scriptVO.getScript(); if (StringUtils.isNotBlank(scriptVO.getLanguage())) { scriptList.add(StrUtil.format(NODE_ITEM_WITH_LANGUAGE_XML_PATTERN, XmlUtil.escape(id), XmlUtil.escape(name), type, language, elData)); @@ -118,11 +121,14 @@ public class JDBCHelper { scriptList.add(StrUtil.format(NODE_ITEM_XML_PATTERN, XmlUtil.escape(id), XmlUtil.escape(name), type, elData)); } }); + String nodesContent = StrUtil.format(NODE_XML_PATTERN, CollUtil.join(scriptList, StrUtil.EMPTY)); // 初始化轮询任务 - SqlReadFactory.getSqlReadPollTask(ReadType.CHAIN).initData(chainMap); - SqlReadFactory.getSqlReadPollTask(ReadType.SCRIPT).initData(scriptMap); + SqlReadPollTask sqlReadPollTask4Chain = SqlReadFactory.getSqlReadPollTask(ReadType.CHAIN); + sqlReadPollTask4Chain.initData(chainVOList); + SqlReadPollTask sqlReadPollTask4Script = SqlReadFactory.getSqlReadPollTask(ReadType.SCRIPT); + sqlReadPollTask4Script.initData(scriptVOList); return StrUtil.format(XML_PATTERN, nodesContent, chainsContent); } 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 535f18569..c654df2a1 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 @@ -56,6 +56,16 @@ public class SQLParserVO { */ private String elDataField = "el_data"; + /** + * 决策路由字段 + */ + private String routeField; + + /** + * 命名空间字段 + */ + private String namespaceField; + /** * 是否启动某一条chain */ @@ -310,4 +320,20 @@ public class SQLParserVO { public boolean hasEnableField() { return StrUtil.isNotBlank(chainEnableField) || StrUtil.isNotBlank(scriptEnableField); } + + public String getRouteField() { + return routeField; + } + + public void setRouteField(String routeField) { + this.routeField = routeField; + } + + public String getNamespaceField() { + return namespaceField; + } + + public void setNamespaceField(String namespaceField) { + this.namespaceField = namespaceField; + } }