From fc411cbef7135ab889187abdfa3a7d465937fd42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8E=E6=88=96=E9=9D=9E?= <1016771049@qq.com> Date: Mon, 26 Sep 2022 12:21:51 +0000 Subject: [PATCH] =?UTF-8?q?enhancement=20#I5T4LS=20=E4=BC=98=E5=8C=96=20Fl?= =?UTF-8?q?owParserProvider=20=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parser/factory/ClassParserFactory.java | 32 ++- .../parser/factory/FlowParserFactory.java | 19 +- .../parser/factory/FlowParserProvider.java | 210 ++++++++++-------- 3 files changed, 141 insertions(+), 120 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/ClassParserFactory.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/ClassParserFactory.java index 319b2aec9..ed1be9691 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/ClassParserFactory.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/ClassParserFactory.java @@ -20,38 +20,46 @@ import com.yomahub.liteflow.spi.holder.ContextAwareHolder; public class ClassParserFactory implements FlowParserFactory { @Override - public JsonFlowParser createJsonParser(String path) throws Exception { - Class c = Class.forName(path); + public JsonFlowParser createJsonParser(String path) { + Class c = forName(path); return (JsonFlowParser) ContextAwareHolder.loadContextAware().registerBean(c); } @Override - public XmlFlowParser createXmlParser(String path) throws Exception { - Class c = Class.forName(path); + public XmlFlowParser createXmlParser(String path) { + Class c = forName(path); return (XmlFlowParser) ContextAwareHolder.loadContextAware().registerBean(c); } @Override - public YmlFlowParser createYmlParser(String path) throws Exception { - Class c = Class.forName(path); + public YmlFlowParser createYmlParser(String path) { + Class c = forName(path); return (YmlFlowParser) ContextAwareHolder.loadContextAware().registerBean(c); } @Override - public BaseJsonFlowParser createJsonELParser(String path) throws Exception { - Class c = Class.forName(path); + public BaseJsonFlowParser createJsonELParser(String path) { + Class c = forName(path); return (JsonFlowELParser) ContextAwareHolder.loadContextAware().registerBean(c); } @Override - public BaseXmlFlowParser createXmlELParser(String path) throws Exception { - Class c = Class.forName(path); + public BaseXmlFlowParser createXmlELParser(String path) { + Class c = forName(path); return (XmlFlowELParser) ContextAwareHolder.loadContextAware().registerBean(c); } @Override - public BaseYmlFlowParser createYmlELParser(String path) throws Exception { - Class c = Class.forName(path); + public BaseYmlFlowParser createYmlELParser(String path) { + Class c = forName(path); return (YmlFlowELParser) ContextAwareHolder.loadContextAware().registerBean(c); } + + private Class forName(String path) { + try { + return Class.forName(path); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserFactory.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserFactory.java index f3d4c7e07..8330d3ca5 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserFactory.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserFactory.java @@ -1,14 +1,8 @@ package com.yomahub.liteflow.parser.factory; -import com.yomahub.liteflow.parser.JsonFlowParser; -import com.yomahub.liteflow.parser.XmlFlowParser; -import com.yomahub.liteflow.parser.YmlFlowParser; import com.yomahub.liteflow.parser.base.BaseJsonFlowParser; import com.yomahub.liteflow.parser.base.BaseXmlFlowParser; import com.yomahub.liteflow.parser.base.BaseYmlFlowParser; -import com.yomahub.liteflow.parser.el.JsonFlowELParser; -import com.yomahub.liteflow.parser.el.XmlFlowELParser; -import com.yomahub.liteflow.parser.el.YmlFlowELParser; /** * Flow Parser 工厂接口 @@ -18,17 +12,16 @@ import com.yomahub.liteflow.parser.el.YmlFlowELParser; */ public interface FlowParserFactory { - BaseJsonFlowParser createJsonParser(String path) throws Exception; + BaseJsonFlowParser createJsonParser(String path); - BaseXmlFlowParser createXmlParser(String path) throws Exception; + BaseXmlFlowParser createXmlParser(String path); - BaseYmlFlowParser createYmlParser(String path) throws Exception; + BaseYmlFlowParser createYmlParser(String path); - BaseJsonFlowParser createJsonELParser(String path) throws Exception; + BaseJsonFlowParser createJsonELParser(String path); - BaseXmlFlowParser createXmlELParser(String path) throws Exception; - - BaseYmlFlowParser createYmlELParser(String path) throws Exception; + BaseXmlFlowParser createXmlELParser(String path); + BaseYmlFlowParser createYmlELParser(String path); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java index 3b651ce84..2526837b0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java @@ -14,7 +14,19 @@ import com.yomahub.liteflow.parser.el.ClassYmlFlowELParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.yomahub.liteflow.enums.FlowParserTypeEnum.*; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Predicate; + +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.CLASS_CONFIG_REGEX; +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.LOCAL_EL_JSON_CONFIG_REGEX; +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.LOCAL_EL_XML_CONFIG_REGEX; +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.LOCAL_EL_YML_CONFIG_REGEX; +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.LOCAL_JSON_CONFIG_REGEX; +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.LOCAL_XML_CONFIG_REGEX; +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.LOCAL_YML_CONFIG_REGEX; +import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegexConstant.PREFIX_FORMAT_CONFIG_REGEX; /** * 解析器提供者 @@ -24,108 +36,116 @@ import static com.yomahub.liteflow.enums.FlowParserTypeEnum.*; */ public class FlowParserProvider { - private static final Logger LOG = LoggerFactory.getLogger(FlowExecutor.class); + private static final Logger LOG = LoggerFactory.getLogger(FlowExecutor.class); - private static final String LOCAL_XML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.xml$"; - private static final String LOCAL_JSON_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.json$"; - private static final String LOCAL_YML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.yml$"; + private static final FlowParserFactory LOCAL_PARSER_FACTORY = new LocalParserFactory(); + /** + * 使用 map 枚举不同类型的 Parser,用于解耦如下的 if 判断 + *
+	 * if (ReUtil.isMatch(LOCAL_XML_CONFIG_REGEX, path)) {
+	 * 	return factory.createXmlParser(path);
+	 * }
+	 * 
+ */ + private static final Map, Function> LOCAL_PARSER_DICT = + new HashMap, Function>() {{ + put(path -> ReUtil.isMatch(LOCAL_XML_CONFIG_REGEX, path), LOCAL_PARSER_FACTORY::createXmlParser); + put(path -> ReUtil.isMatch(LOCAL_JSON_CONFIG_REGEX, path), LOCAL_PARSER_FACTORY::createJsonParser); + put(path -> ReUtil.isMatch(LOCAL_YML_CONFIG_REGEX, path), LOCAL_PARSER_FACTORY::createYmlParser); + put(path -> ReUtil.isMatch(LOCAL_EL_XML_CONFIG_REGEX, path), LOCAL_PARSER_FACTORY::createXmlELParser); + put(path -> ReUtil.isMatch(LOCAL_EL_JSON_CONFIG_REGEX, path), LOCAL_PARSER_FACTORY::createJsonELParser); + put(path -> ReUtil.isMatch(LOCAL_EL_YML_CONFIG_REGEX, path), LOCAL_PARSER_FACTORY::createYmlELParser); + }}; - private static final String LOCAL_EL_XML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.el\\.xml$"; + private static final FlowParserFactory CLASS_PARSER_FACTORY = new ClassParserFactory(); + /** + * 使用 map 枚举不同类型的 Parser,用于解耦如下的 if 判断 + *
+	 * if (ClassXmlFlowParser.class.isAssignableFrom(clazz)) {
+	 *   return factory.createXmlParser(className);
+	 * }
+	 * 
+ */ + private static final Map>, Function> CLASS_PARSER_DICT = + new HashMap>, Function>() {{ + put(ClassXmlFlowParser.class::isAssignableFrom, CLASS_PARSER_FACTORY::createXmlParser); + put(ClassJsonFlowParser.class::isAssignableFrom, CLASS_PARSER_FACTORY::createJsonParser); + put(ClassYmlFlowParser.class::isAssignableFrom, CLASS_PARSER_FACTORY::createYmlParser); + put(ClassXmlFlowELParser.class::isAssignableFrom, CLASS_PARSER_FACTORY::createXmlELParser); + put(ClassJsonFlowELParser.class::isAssignableFrom, CLASS_PARSER_FACTORY::createJsonELParser); + put(ClassYmlFlowELParser.class::isAssignableFrom, CLASS_PARSER_FACTORY::createYmlELParser); + }}; - private static final String LOCAL_EL_JSON_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.el\\.json$"; + /** + * 根据配置的地址找到对应的解析器 + */ + public static FlowParser lookup(String path) throws Exception { + // 自定义类必须实现以上实现类,否则报错 + String errorMsg = StrUtil.format("can't support the format {}", path); - private static final String LOCAL_EL_YML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.el\\.yml$"; + // 本地文件 + if (isLocalConfig(path)) { + // 遍历枚举 map 找到对应 factory + Predicate dictKey = LOCAL_PARSER_DICT.keySet() + .stream() + .filter(key -> key.test(path)) + .findFirst() + .orElseThrow(() -> new ErrorSupportPathException(errorMsg)); - private static final String PREFIX_FORMAT_CONFIG_REGEX = "xml:|json:|yml:|el_xml:|el_json:|el_yml:"; + LOG.info("flow info loaded from local file,path={}", path); + return LOCAL_PARSER_DICT.get(dictKey).apply(path); + } + // 自定义 class 配置 + else if (isClassConfig(path)) { + // 获取最终的className,因为有些可能className前面带了文件类型的标识,比如json:x.x.x.x + String className = ReUtil.replaceAll(path, PREFIX_FORMAT_CONFIG_REGEX, ""); + Class clazz = Class.forName(className); - private static final String CLASS_CONFIG_REGEX = "^(xml:|json:|yml:|el_xml:|el_json:|el_yml:)?\\w+(\\.\\w+)*$"; + // 遍历枚举 map 找到对应 factory + Predicate> dictKey = CLASS_PARSER_DICT.keySet() + .stream() + .filter(key -> key.test(clazz)) + .findFirst() + .orElseThrow(() -> new ErrorSupportPathException(errorMsg)); - /** - * 根据配置的地址找到对应的解析器 - */ - public static FlowParser lookup(String path) throws Exception { - if (isLocalConfig(path)) { - FlowParserFactory factory = new LocalParserFactory(); - if (ReUtil.isMatch(LOCAL_XML_CONFIG_REGEX, path)) { - LOG.info("flow info loaded from local file,path={},format type={}", path, TYPE_XML.getType()); - return factory.createXmlParser(path); - } - else if (ReUtil.isMatch(LOCAL_JSON_CONFIG_REGEX, path)) { - LOG.info("flow info loaded from local file,path={},format type={}", path, TYPE_JSON.getType()); - return factory.createJsonParser(path); - } - else if (ReUtil.isMatch(LOCAL_YML_CONFIG_REGEX, path)) { - LOG.info("flow info loaded from local file,path={},format type={}", path, TYPE_YML.getType()); - return factory.createYmlParser(path); - } - else if (ReUtil.isMatch(LOCAL_EL_XML_CONFIG_REGEX, path)) { - LOG.info("flow info loaded from local EL file,path={},format type={}", path, TYPE_EL_XML.getType()); - return factory.createXmlELParser(path); - } - else if (ReUtil.isMatch(LOCAL_EL_JSON_CONFIG_REGEX, path)) { - LOG.info("flow info loaded from local EL file,path={},format type={}", path, TYPE_EL_JSON.getType()); - return factory.createJsonELParser(path); - } - else if (ReUtil.isMatch(LOCAL_EL_YML_CONFIG_REGEX, path)) { - LOG.info("flow info loaded from local EL file,path={},format type={}", path, TYPE_EL_YML.getType()); - return factory.createYmlELParser(path); - } - } - else if (isClassConfig(path)) { - // 获取最终的className,因为有些可能className前面带了文件类型的标识,比如json:x.x.x.x - String className = ReUtil.replaceAll(path, PREFIX_FORMAT_CONFIG_REGEX, ""); - FlowParserFactory factory = new ClassParserFactory(); - Class clazz = Class.forName(className); - if (ClassXmlFlowParser.class.isAssignableFrom(clazz)) { - LOG.info("flow info loaded from class config,class={},format type={}", className, TYPE_XML.getType()); - return factory.createXmlParser(className); - } - else if (ClassJsonFlowParser.class.isAssignableFrom(clazz)) { - LOG.info("flow info loaded from class config,class={},format type={}", className, TYPE_JSON.getType()); - return factory.createJsonParser(className); - } - else if (ClassYmlFlowParser.class.isAssignableFrom(clazz)) { - LOG.info("flow info loaded from class config,class={},format type={}", className, TYPE_YML.getType()); - return factory.createYmlParser(className); - } - else if (ClassXmlFlowELParser.class.isAssignableFrom(clazz)) { - LOG.info("flow info loaded from class config with el,class={},format type={}", className, TYPE_EL_XML.getType()); - return factory.createXmlELParser(className); - } - else if (ClassJsonFlowELParser.class.isAssignableFrom(clazz)) { - LOG.info("flow info loaded from class config with el,class={},format type={}", className, TYPE_EL_JSON.getType()); - return factory.createJsonELParser(className); - } - else if (ClassYmlFlowELParser.class.isAssignableFrom(clazz)) { - LOG.info("flow info loaded from class config with el,class={},format type={}", className, TYPE_EL_YML.getType()); - return factory.createYmlELParser(className); - } - // 自定义类必须实现以上实现类,否则报错 - String errorMsg = StrUtil.format("can't support the format {}", path); - throw new ErrorSupportPathException(errorMsg); - } + LOG.info("flow info loaded from class config with el,class={}", className); + return CLASS_PARSER_DICT.get(dictKey).apply(className); + } - // not found - String errorMsg = StrUtil.format("can't find the parser for path:{}", path); - throw new ErrorSupportPathException(errorMsg); - } + // not found + throw new ErrorSupportPathException(errorMsg); + } - /** - * 判定是否为本地文件 - */ - private static boolean isLocalConfig(String path) { - return ReUtil.isMatch(LOCAL_XML_CONFIG_REGEX, path) - || ReUtil.isMatch(LOCAL_JSON_CONFIG_REGEX, path) - || ReUtil.isMatch(LOCAL_YML_CONFIG_REGEX, path) - || ReUtil.isMatch(LOCAL_EL_XML_CONFIG_REGEX, path) - || ReUtil.isMatch(LOCAL_EL_JSON_CONFIG_REGEX, path) - || ReUtil.isMatch(LOCAL_EL_YML_CONFIG_REGEX, path); - } + /** + * 判定是否为本地文件 + */ + private static boolean isLocalConfig(String path) { + return ReUtil.isMatch(LOCAL_XML_CONFIG_REGEX, path) + || ReUtil.isMatch(LOCAL_JSON_CONFIG_REGEX, path) + || ReUtil.isMatch(LOCAL_YML_CONFIG_REGEX, path) + || ReUtil.isMatch(LOCAL_EL_XML_CONFIG_REGEX, path) + || ReUtil.isMatch(LOCAL_EL_JSON_CONFIG_REGEX, path) + || ReUtil.isMatch(LOCAL_EL_YML_CONFIG_REGEX, path); + } - /** - * 判定是否为自定义class配置 - */ - private static boolean isClassConfig(String path) { - return ReUtil.isMatch(CLASS_CONFIG_REGEX, path); - } + /** + * 判定是否为自定义class配置 + */ + private static boolean isClassConfig(String path) { + return ReUtil.isMatch(CLASS_CONFIG_REGEX, path); + } + + /** + * 统一管理类的常量 + */ + protected static class ConfigRegexConstant { + public static final String LOCAL_XML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.xml$"; + public static final String LOCAL_JSON_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.json$"; + public static final String LOCAL_YML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.yml$"; + public static final String LOCAL_EL_XML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.el\\.xml$"; + public static final String LOCAL_EL_JSON_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.el\\.json$"; + public static final String LOCAL_EL_YML_CONFIG_REGEX = "^[\\w\\:\\-\\@\\/\\\\\\*]+\\.el\\.yml$"; + public static final String PREFIX_FORMAT_CONFIG_REGEX = "xml:|json:|yml:|el_xml:|el_json:|el_yml:"; + public static final String CLASS_CONFIG_REGEX = "^(xml:|json:|yml:|el_xml:|el_json:|el_yml:)?\\w+(\\.\\w+)*$"; + } }