From 7a2887ac03614482132968837de2afebefc8b9a9 Mon Sep 17 00:00:00 2001
From: zhanghua <964552300@qq.com>
Date: Sun, 4 Dec 2022 01:41:15 +0800
Subject: [PATCH] =?UTF-8?q?1.=20=E6=94=AF=E6=8C=81apollo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../liteflow-rule-apollo/pom.xml | 45 ++++++++++
.../parser/apollo/ApolloXmlELParser.java | 65 ++++++++++++++
.../apollo/exception/ApolloException.java | 21 +++++
.../parser/apollo/util/ApolloParseHelper.java | 87 +++++++++++++++++++
.../apollo/vo/ApolloParserConfigVO.java | 34 ++++++++
.../spi/apollo/ApolloParserClassNameSpi.java | 17 ++++
...hub.liteflow.parser.spi.ParserClassNameSpi | 1 +
.../pom.xml | 38 ++++++++
pom.xml | 9 ++
9 files changed, 317 insertions(+)
create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/pom.xml
create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java
create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi
create mode 100644 liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml
diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/pom.xml b/liteflow-rule-plugin/liteflow-rule-apollo/pom.xml
new file mode 100644
index 000000000..f69b5075f
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-apollo/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+ liteflow-rule-plugin
+ com.yomahub
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+
+ liteflow-rule-apollo
+
+
+ 8
+ 8
+
+
+
+
+ com.yomahub
+ liteflow-core
+ ${revision}
+ true
+ provided
+
+
+
+ com.alibaba.nacos
+ nacos-client
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+
+
+
+
+
\ No newline at end of file
diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java
new file mode 100644
index 000000000..9401af7c9
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java
@@ -0,0 +1,65 @@
+package com.yomahub.liteflow.parser.apollo;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.parser.apollo.exception.ApolloException;
+import com.yomahub.liteflow.parser.apollo.util.ApolloParseHelper;
+import com.yomahub.liteflow.parser.apollo.vo.ApolloParserConfigVO;
+import com.yomahub.liteflow.parser.el.ClassXmlFlowELParser;
+import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.util.JsonUtil;
+
+import java.util.Objects;
+import java.util.function.Consumer;
+
+/**
+ * @Description:
+ * @Author: zhanghua
+ * @Date: 2022/12/3 13:38
+ */
+public class ApolloXmlELParser extends ClassXmlFlowELParser {
+
+ private final ApolloParseHelper apolloParseHelper;
+
+ public ApolloXmlELParser() {
+ LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
+ try {
+ ApolloParserConfigVO apolloParserConfigVO = null;
+ if (MapUtil.isNotEmpty((liteflowConfig.getRuleSourceExtDataMap()))) {
+ apolloParserConfigVO = BeanUtil.toBean(liteflowConfig.getRuleSourceExtDataMap(), ApolloParserConfigVO.class, CopyOptions.create());
+ } else if (StrUtil.isNotBlank(liteflowConfig.getRuleSourceExtData())) {
+ apolloParserConfigVO = JsonUtil.parseObject(liteflowConfig.getRuleSourceExtData(), ApolloParserConfigVO.class);
+ }
+ if (Objects.isNull(apolloParserConfigVO)) {
+ throw new ApolloException("ruleSourceExtData or map is empty");
+ }
+
+ apolloParseHelper = new ApolloParseHelper(apolloParserConfigVO);
+ } catch (Exception e) {
+ throw new ApolloException(e.getMessage());
+ }
+ }
+
+ @Override
+ public String parseCustom() {
+ Consumer parseConsumer = t -> {
+ try {
+ parse(t);
+ } catch (Exception e) {
+ throw new ApolloException(e.getMessage());
+ }
+ };
+ try {
+ String content = apolloParseHelper.getContent();
+ apolloParseHelper.checkContent(content);
+ apolloParseHelper.listen(parseConsumer);
+ return content;
+
+ } catch (Exception e) {
+ throw new ApolloException(e.getMessage());
+ }
+ }
+}
diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java
new file mode 100644
index 000000000..f8aa53ec9
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java
@@ -0,0 +1,21 @@
+package com.yomahub.liteflow.parser.apollo.exception;
+
+/**
+ * @Description:
+ * @Author: zhanghua
+ * @Date: 2022/12/3 13:45
+ */
+public class ApolloException extends RuntimeException {
+
+ private String message;
+
+ public ApolloException(String message) {
+ super();
+ this.message = message;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java
new file mode 100644
index 000000000..a275e80ef
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java
@@ -0,0 +1,87 @@
+package com.yomahub.liteflow.parser.apollo.util;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.nacos.api.PropertyKeyConst;
+import com.alibaba.nacos.client.config.NacosConfigService;
+import com.ctrip.framework.apollo.Config;
+import com.ctrip.framework.apollo.ConfigFile;
+import com.ctrip.framework.apollo.ConfigFileChangeListener;
+import com.ctrip.framework.apollo.ConfigService;
+import com.ctrip.framework.apollo.core.dto.ApolloConfig;
+import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
+import com.ctrip.framework.apollo.model.ConfigFileChangeEvent;
+import com.yomahub.liteflow.exception.ParseException;
+import com.yomahub.liteflow.parser.apollo.exception.ApolloException;
+import com.yomahub.liteflow.parser.apollo.vo.ApolloParserConfigVO;
+import com.yomahub.liteflow.spi.holder.ContextAwareHolder;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Objects;
+import java.util.Properties;
+import java.util.function.Consumer;
+
+/**
+ * @Description:
+ * @Author: zhanghua
+ * @Date: 2022/12/3 13:47
+ */
+public class ApolloParseHelper {
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(ApolloParseHelper.class);
+
+ private final ApolloParserConfigVO apolloParserConfigVO;
+
+ private ConfigFile liteflowConfigFile;
+
+ public ApolloParseHelper(ApolloParserConfigVO apolloParserConfigVO) {
+ this.apolloParserConfigVO = apolloParserConfigVO;
+ try {
+ liteflowConfigFile = ConfigService.getConfigFile(apolloParserConfigVO.getNamespace(), ConfigFileFormat.XML);
+ } catch (Exception e) {
+ LOG.error("[ApolloParseHelper] liteflowConfigFile get init error, apolloParserConfigVO:{}", apolloParserConfigVO);
+ throw new ApolloException(e.getMessage());
+ }
+ }
+
+ public String getContent() {
+ try {
+ ConfigFile configFile = ConfigService.getConfigFile(apolloParserConfigVO.getNamespace(), ConfigFileFormat.XML);
+ String content;
+ if (Objects.isNull(configFile) || StrUtil.isBlank(content = configFile.getContent())) {
+ throw new ApolloException(String.format("not find config file, namespace:%s", apolloParserConfigVO.getNamespace()));
+ }
+ return content;
+ } catch (Exception e) {
+ throw new ApolloException(e.getMessage());
+ }
+ }
+
+ /**
+ * 检查 content 是否合法
+ */
+ public void checkContent(String content) {
+ if (StrUtil.isBlank(content)) {
+ String error = StrUtil.format("the node[{}] value is empty", apolloParserConfigVO.toString());
+ throw new ParseException(error);
+ }
+ }
+
+ /**
+ * 监听 apollo 数据变化
+ */
+ public void listen(Consumer parseConsumer) {
+ try {
+ liteflowConfigFile.addChangeListener(configFileChangeEvent -> {
+ String newContext = configFileChangeEvent.getNewValue();
+ parseConsumer.accept(newContext);
+ });
+ } catch (Exception e) {
+ throw new ApolloException(e.getMessage());
+ }
+ }
+
+
+}
diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java
new file mode 100644
index 000000000..ed79f75e2
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java
@@ -0,0 +1,34 @@
+package com.yomahub.liteflow.parser.apollo.vo;
+
+/**
+ * @Description:
+ * @Author: zhanghua
+ * @Date: 2022/12/3 13:45
+ */
+public class ApolloParserConfigVO {
+
+ private String namespace;
+
+
+ public ApolloParserConfigVO() {
+ }
+
+ public ApolloParserConfigVO(String namespace) {
+ this.namespace = namespace;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ public void setNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+ @Override
+ public String toString() {
+ return "ApolloParserConfigVO{" +
+ "namespace='" + namespace + '\'' +
+ '}';
+ }
+}
diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java
new file mode 100644
index 000000000..d83a7eca1
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java
@@ -0,0 +1,17 @@
+package com.yomahub.liteflow.parser.spi.apollo;
+
+import com.yomahub.liteflow.parser.apollo.ApolloXmlELParser;
+import com.yomahub.liteflow.parser.spi.ParserClassNameSpi;
+
+/**
+ * @Description:
+ * @Author: zhanghua
+ * @Date: 2022/12/3 13:40
+ */
+public class ApolloParserClassNameSpi implements ParserClassNameSpi {
+
+ @Override
+ public String getSpiClassName() {
+ return ApolloXmlELParser.class.getName();
+ }
+}
diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi
new file mode 100644
index 000000000..b5c5af6bd
--- /dev/null
+++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi
@@ -0,0 +1 @@
+com.yomahub.liteflow.parser.spi.apollo.ApolloParserClassNameSpi
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml
new file mode 100644
index 000000000..c7cc3c43d
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml
@@ -0,0 +1,38 @@
+
+
+
+ liteflow
+ com.yomahub
+ 2.9.4
+
+ 4.0.0
+
+ liteflow-testcase-el-apollo-springboot
+
+
+ 8
+ 8
+
+
+
+
+ com.yomahub
+ liteflow-spring-boot-starter
+ ${revision}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+ com.yomahub
+ liteflow-rule-apollo
+ ${revision}
+ test
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9ece2bb5f..36d2115cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,6 +68,7 @@
31.1-jre
4.5.13
1.9.4
+ 1.7.0
@@ -259,6 +260,12 @@
provided
true
+
+ com.ctrip.framework.apollo
+ apollo-client
+ ${apollo.version}
+
+
@@ -370,6 +377,8 @@
liteflow-spring-boot-starter
liteflow-spring
liteflow-testcase-el
+ liteflow-rule-apollo
+ liteflow-testcase-el-apollo-springboot