From 65da6655a73f93b1313e85fbacc05914aedc085d Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 15 Apr 2021 10:12:04 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/log/annotation/ConfigItem.java | 12 +++++++++++ .../extension/log/config/LogConfig.java | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java index c868a46..38d9811 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/annotation/ConfigItem.java @@ -6,9 +6,21 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * 配置的默认值注解 + * @author sousouki + * @version 2.4.3 + */ @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ConfigItem { + + + /** + * 默认值 + * @return String + */ String defaultValue() default ""; + } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java index 4f58187..23ced3a 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java @@ -14,29 +14,50 @@ import javax.xml.bind.annotation.XmlTransient; @XmlRootElement(name = "log") public class LogConfig { + /** + * 日志文件名称 + **/ @XmlElement(name = "fileName") private String fileName; + /** + * 日志级别 + **/ @ConfigItem(defaultValue = "INFO") @XmlElement(name = "level") private String level; + /** + * 日志文件最大容量 + **/ @ConfigItem(defaultValue = "10MB") @XmlElement(name = "maxFileSize") private String maxFileSize; + /** + * 日志文件总容量 + **/ @ConfigItem(defaultValue = "10GB") @XmlElement(name = "totalFileSize") private String totalFileSize; + /** + * 最大保存时间 + **/ @ConfigItem(defaultValue = "30") @XmlElement(name = "maxHistory") private Integer maxHistory; + /** + * 日志内容格式 + **/ @ConfigItem(defaultValue = "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p --- [%t] %-40.40logger{39} : %m%n") @XmlElement(name = "pattern") private String pattern; + /** + * 包名 + **/ @XmlTransient private String packageName; -- Gitee From c357fed78f18d7eebe0edd4e06ee90c51e8212b9 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 15 Apr 2021 10:40:34 +0800 Subject: [PATCH 02/23] =?UTF-8?q?=E5=BE=AE=E8=B0=83=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/log/PluginLogConfigLoader.java | 16 ++---- .../extension/log/util/LogConfigProcess.java | 51 ++++++++----------- 2 files changed, 25 insertions(+), 42 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java index 32c94b6..ab0263f 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java @@ -9,22 +9,14 @@ import com.gitee.starblues.utils.OrderPriority; import com.gitee.starblues.utils.ResourceUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.util.CollectionUtils; -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; /** * 日志配置加载者 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java index 0c7fa91..dc533f6 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java @@ -30,6 +30,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 日志配置处理者 @@ -38,24 +39,17 @@ import java.util.Map; */ public class LogConfigProcess { - private org.slf4j.Logger log = LoggerFactory.getLogger(LogConfigProcess.class); + private final org.slf4j.Logger log = LoggerFactory.getLogger(LogConfigProcess.class); - private final Map pluginLogMap = new HashMap<>(); + private final Map pluginLogMap = new ConcurrentHashMap<>(); - private static LogConfigProcess instance = null; + private final static LogConfigProcess INSTANCE = new LogConfigProcess(); private LogConfigProcess() { } - public static LogConfigProcess getInstance() { - if (instance == null) { - synchronized (LogConfigProcess.class) { - if (instance == null) { - instance = new LogConfigProcess(); - } - } - } - return instance; + public LogConfigProcess getInstance() { + return INSTANCE; } public void loadLogConfig(List resources, PluginWrapper pluginWrapper) { @@ -191,21 +185,22 @@ public class LogConfigProcess { logConfig.setFileName(pluginId.concat("Log")); } Field[] fields = LogConfig.class.getDeclaredFields(); - Arrays.stream(fields).forEach(field -> { + for (Field field : fields) { if (!field.isAccessible()) { field.setAccessible(true); } ConfigItem configItem = field.getDeclaredAnnotation(ConfigItem.class); if (configItem == null) { - return; + continue; } try { Object fieldValue = field.get(logConfig); if(fieldValue == null){ - return; + continue; } Class fieldType = field.getType(); - if ("".equals(fieldValue.toString()) || ObjectUtil.isEmptyObject(fieldType, fieldValue)) { + if ("".equals(fieldValue.toString()) || + ObjectUtil.isEmptyObject(fieldType, fieldValue)) { String defaultValue = configItem.defaultValue(); log.debug("Field {} is not config or invalid in log config of plugin {}, set it to default value {}.", field.getName(), defaultValue, pluginId); Object fixedValue = ObjectUtil.parseBasicTypeValue(fieldType, defaultValue); @@ -214,25 +209,21 @@ public class LogConfigProcess { } catch (IllegalAccessException e) { log.error("Failed to check config item {} in log config.", field.getName()); } - }); - } - - public Map getPluginLogMap() { - return pluginLogMap; + } } private String readConfigText(Resource resource) throws IOException { String fileContent; try (InputStream inputStream = resource.getInputStream(); - ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - byte[] buff = new byte[1024]; - int len; - while ((len = inputStream.read(buff)) != -1) { - baos.write(buff, 0, len); + ByteArrayOutputStream stream = new ByteArrayOutputStream()) { + byte[] buff = new byte[1024]; + int len; + while ((len = inputStream.read(buff)) != -1) { + stream.write(buff, 0, len); + } + byte[] data = stream.toByteArray(); + fileContent = new String(data); } - byte[] data = baos.toByteArray(); - fileContent = new String(data); - } return fileContent; } @@ -246,7 +237,7 @@ public class LogConfigProcess { object = unmarshaller.unmarshal(stringReader); } catch (JAXBException e) { e.printStackTrace(); - throw new Exception("Invalid xml definition", e); + throw new Exception("Invalid xml definition"); } return object; } -- Gitee From 87c203db52b97c3b9d0716570b5de469a28c7826 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 15 Apr 2021 10:40:48 +0800 Subject: [PATCH 03/23] =?UTF-8?q?=E5=BE=AE=E8=B0=83=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/starblues/extension/log/util/LogConfigProcess.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java index dc533f6..27ab032 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java @@ -26,8 +26,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -- Gitee From 255193ec30da65a08d24559eb6d2dd45e0f992ef Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 15 Apr 2021 12:15:05 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=97=A5=E5=BF=97xml=E6=96=87=E4=BB=B6=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E5=8F=AF=E5=A4=96=E7=BD=AE=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/log/plugin/LogPlugin.java | 10 +- .../java/com/log/plugin/config/Config.java | 35 +++++++ .../java/com/log/plugin/rest/MainRest.java | 2 +- .../src/main/resources/config.yml | 1 + .../src/main/resources/log.xml | 3 +- .../extension/log/PluginLogConfigLoader.java | 79 ---------------- .../log/PluginLogConfigProcessor.java | 61 +++++++++++-- .../extension/log/SpringBootLogExtension.java | 8 -- .../extension/log/config/LogConfig.java | 30 +++++- .../log/config/SpringBootLogConfig.java | 2 + .../extension/log/util/LogConfigProcess.java | 91 ++++++++++++------- .../mybatis/MybatisCommonConfig.java | 6 +- .../gitee/starblues/utils/CommonUtils.java | 34 ++++++- .../gitee/starblues/utils/ResourceUtils.java | 2 +- 14 files changed, 213 insertions(+), 151 deletions(-) create mode 100644 example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java create mode 100644 example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml delete mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java index 6b3a527..36d6174 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java +++ b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java @@ -11,15 +11,13 @@ import java.util.Set; * description * * @author sousouki - * @version 1.0 + * @version 2.4.3 */ -public class LogPlugin extends BasePlugin implements SpringBootLogConfig { +public class LogPlugin extends BasePlugin { - private Set locations = new HashSet<>(); public LogPlugin(PluginWrapper wrapper) { super(wrapper); - locations.add("classpath:log.xml"); } @Override @@ -37,9 +35,5 @@ public class LogPlugin extends BasePlugin implements SpringBootLogConfig { } - @Override - public Set logConfigLocations() { - return locations; - } } diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java new file mode 100644 index 0000000..f2a6c0b --- /dev/null +++ b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java @@ -0,0 +1,35 @@ +package com.log.plugin.config; + +import com.gitee.starblues.annotation.ConfigDefinition; +import com.gitee.starblues.extension.log.config.SpringBootLogConfig; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * description + * + * @author starBlues + * @version 2.4.3 + */ +@ConfigDefinition(fileName="config.yml") +public class Config implements SpringBootLogConfig { + + private String logLocation; + + @Override + public Set logConfigLocations() { + Set logConfigLocations = new HashSet<>(); + logConfigLocations.add(logLocation); + return logConfigLocations; + } + + public String getLogLocation() { + return logLocation; + } + + public void setLogLocation(String logLocation) { + this.logLocation = logLocation; + } +} diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/rest/MainRest.java b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/rest/MainRest.java index b92925a..7b3be4f 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/rest/MainRest.java +++ b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/rest/MainRest.java @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.*; /** * 插件jar 包测试功能 * @author sousouki - * @version 1.0 + * @version 2.4.3 */ @RestController @RequestMapping("/log/main") diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml b/example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml new file mode 100644 index 0000000..4197938 --- /dev/null +++ b/example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml @@ -0,0 +1 @@ +logLocation: classpath:log.xml \ No newline at end of file diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/resources/log.xml b/example/integration-log/plugins/integration-log-plugin/src/main/resources/log.xml index 11b1e79..69b2bdd 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/resources/log.xml +++ b/example/integration-log/plugins/integration-log-plugin/src/main/resources/log.xml @@ -1,6 +1,7 @@ - integration-log-plugin + ~\logs\ + current INFO 10MB 10GB diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java deleted file mode 100644 index ab0263f..0000000 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigLoader.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.gitee.starblues.extension.log; - -import com.gitee.starblues.extension.log.config.SpringBootLogConfig; -import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoader; -import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; -import com.gitee.starblues.realize.BasePlugin; -import com.gitee.starblues.utils.OrderPriority; -import com.gitee.starblues.utils.ResourceUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -/** - * 日志配置加载者 - * @author sousouki - * @version 2.4.3 - */ -public class PluginLogConfigLoader implements PluginResourceLoader { - - private Logger log = LoggerFactory.getLogger(PluginLogConfigLoader.class); - - public static final String KEY = "SpringBootLogConfigLoader"; - - @Override - public String key() { - return KEY; - } - - @Override - public ResourceWrapper load(PluginRegistryInfo pluginRegistryInfo) throws Exception { - BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); - if (!(basePlugin instanceof SpringBootLogConfig)) { - log.warn("Plugin '{}' not implements SpringBootLogConfig, If you need to use log in the plugin," + "Please implements SpringBootLogConfig interface", basePlugin.getWrapper().getPluginId()); - return null; - } - SpringBootLogConfig springBootLogConfig = (SpringBootLogConfig) basePlugin; - Set logConfigLocations = springBootLogConfig.logConfigLocations(); - if (logConfigLocations == null || logConfigLocations.isEmpty()) { - log.warn("SpringBootLogConfig -> logConfigLocations return is empty, " + "Please check configuration"); - return new ResourceWrapper(); - } - ResourcePatternResolver resourcePatternResolver = - new PathMatchingResourcePatternResolver(pluginRegistryInfo.getPluginClassLoader()); - List resources = new ArrayList<>(); - for (String logConfigLocation : logConfigLocations) { - String matchLocation = ResourceUtils.getMatchLocation(logConfigLocation); - if (matchLocation == null || "".equals(matchLocation)) { - continue; - } - Resource[] logConfigResources = resourcePatternResolver.getResources(matchLocation); - if (logConfigResources.length != 0) { - resources.addAll(Arrays.asList(logConfigResources)); - } - } - ResourceWrapper resourceWrapper = new ResourceWrapper(); - resourceWrapper.addResources(resources); - return resourceWrapper; - } - - @Override - public void unload(PluginRegistryInfo pluginRegistryInfo, ResourceWrapper resourceWrapper) throws Exception { - - } - - @Override - public OrderPriority order() { - return OrderPriority.getHighPriority(); - } - - -} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java index 06f91c8..25b304c 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java @@ -1,14 +1,25 @@ package com.gitee.starblues.extension.log; +import com.gitee.starblues.extension.log.config.SpringBootLogConfig; import com.gitee.starblues.extension.log.util.LogConfigProcess; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; import com.gitee.starblues.utils.OrderPriority; +import com.gitee.starblues.utils.ResourceUtils; +import com.gitee.starblues.utils.SpringBeanUtils; import org.pf4j.PluginWrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Set; /** * 接口处理者 @@ -17,11 +28,13 @@ import java.util.List; */ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { + private Logger log = LoggerFactory.getLogger(PluginLogConfigProcessor.class); + private final LogConfigProcess logConfigProcess = LogConfigProcess.getInstance(); @Override public String key() { - return null; + return "SpringBootLogConfigProcessor"; } @Override @@ -39,21 +52,51 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { if (logConfigProcess == null) { return; } - PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - ResourceWrapper resourceWrapper = pluginRegistryInfo.getPluginLoadResource(PluginLogConfigLoader.KEY); - if (resourceWrapper == null) { - return; - } - - List pluginResources = resourceWrapper.getResources(); + List pluginResources = getLogConfigFile(pluginRegistryInfo); if (pluginResources == null || pluginResources.isEmpty()) { return; } - logConfigProcess.loadLogConfig(pluginResources, pluginWrapper); + logConfigProcess.loadLogConfig(pluginResources, pluginRegistryInfo.getPluginWrapper()); } @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { logConfigProcess.unloadLogConfig(pluginRegistryInfo.getPluginWrapper()); } + + private List getLogConfigFile(PluginRegistryInfo pluginRegistryInfo) throws IOException { + SpringBootLogConfig config = SpringBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), + SpringBootLogConfig.class); + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + + if(config == null){ + log.warn("Not found 'SpringBootLogConfig' in plugin[{}]. " + + "If you need to use log in the plugin, " + + "Please implements 'SpringBootLogConfig' interface", pluginId); + return null; + } + Set logConfigLocations = config.logConfigLocations(); + if (logConfigLocations == null || logConfigLocations.isEmpty()) { + log.warn("SpringBootLogConfig -> logConfigLocations return is empty in plugin[{}], " + + "Please check configuration", pluginId); + return null; + } + + ResourcePatternResolver resourcePatternResolver = + new PathMatchingResourcePatternResolver(pluginRegistryInfo.getPluginClassLoader()); + List resources = new ArrayList<>(); + for (String logConfigLocation : logConfigLocations) { + String matchLocation = ResourceUtils.getMatchLocation(logConfigLocation); + if (matchLocation == null || "".equals(matchLocation)) { + continue; + } + Resource[] logConfigResources = resourcePatternResolver.getResources(matchLocation); + if (logConfigResources.length != 0) { + resources.addAll(Arrays.asList(logConfigResources)); + } + } + return resources; + } + } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java index 37787d6..d7e4b33 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java @@ -3,7 +3,6 @@ package com.gitee.starblues.extension.log; import com.gitee.starblues.extension.AbstractExtension; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; -import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoader; import org.springframework.context.ApplicationContext; import java.util.ArrayList; @@ -23,13 +22,6 @@ public class SpringBootLogExtension extends AbstractExtension { return KEY; } - @Override - public List getPluginResourceLoader() { - List resourceLoaders = new ArrayList<>(); - resourceLoaders.add(new PluginLogConfigLoader()); - return resourceLoaders; - } - @Override public List getPluginPipeProcessor(ApplicationContext applicationContext) { List pipeProcessorExtends = new ArrayList<>(); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java index 23ced3a..7455c4e 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java @@ -14,6 +14,17 @@ import javax.xml.bind.annotation.XmlTransient; @XmlRootElement(name = "log") public class LogConfig { + public static final String ROOT_PLUGIN_SIGN = "~"; + + /** + * 日志存储根目录,默认为当前插件存放目录。 + * ~: 符号表示当前插件根目录 + **/ + @XmlElement(name = "rootDir") + @ConfigItem(defaultValue = ROOT_PLUGIN_SIGN + "/logs/") + private String rootDir; + + /** * 日志文件名称 **/ @@ -23,36 +34,36 @@ public class LogConfig { /** * 日志级别 **/ - @ConfigItem(defaultValue = "INFO") @XmlElement(name = "level") + @ConfigItem(defaultValue = "INFO") private String level; /** * 日志文件最大容量 **/ - @ConfigItem(defaultValue = "10MB") @XmlElement(name = "maxFileSize") + @ConfigItem(defaultValue = "10MB") private String maxFileSize; /** * 日志文件总容量 **/ - @ConfigItem(defaultValue = "10GB") @XmlElement(name = "totalFileSize") + @ConfigItem(defaultValue = "10GB") private String totalFileSize; /** * 最大保存时间 **/ - @ConfigItem(defaultValue = "30") @XmlElement(name = "maxHistory") + @ConfigItem(defaultValue = "30") private Integer maxHistory; /** * 日志内容格式 **/ - @ConfigItem(defaultValue = "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p --- [%t] %-40.40logger{39} : %m%n") @XmlElement(name = "pattern") + @ConfigItem(defaultValue = "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p --- [%t] %-40.40logger{39} : %m%n") private String pattern; /** @@ -61,6 +72,15 @@ public class LogConfig { @XmlTransient private String packageName; + @XmlTransient + public String getRootDir() { + return rootDir; + } + + public void setRootDir(String rootDir) { + this.rootDir = rootDir; + } + @XmlTransient public String getFileName() { return fileName; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java index ff27d20..e0a3df9 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java @@ -11,6 +11,8 @@ public interface SpringBootLogConfig { /** * 日志xml配置文件的路径 + * 文件路径配置为

file:D://log.xml


+ * resources路径配置为

classpath:log.xml


* @return Set */ Set logConfigLocations(); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java index 27ab032..f969dc7 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java @@ -14,7 +14,9 @@ import ch.qos.logback.core.util.FileSize; import ch.qos.logback.core.util.OptionHelper; import com.gitee.starblues.extension.log.annotation.ConfigItem; import com.gitee.starblues.extension.log.config.LogConfig; +import com.gitee.starblues.utils.CommonUtils; import org.pf4j.PluginWrapper; +import org.pf4j.util.StringUtils; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; @@ -46,12 +48,15 @@ public class LogConfigProcess { private LogConfigProcess() { } - public LogConfigProcess getInstance() { + public static LogConfigProcess getInstance() { return INSTANCE; } public void loadLogConfig(List resources, PluginWrapper pluginWrapper) { for (Resource resource : resources) { + if(resource == null || !resource.exists()){ + continue; + } String configText; try { configText = readConfigText(resource); @@ -113,24 +118,21 @@ public class LogConfigProcess { return appender; } - private RollingFileAppender createFileAppender(PluginWrapper pluginWrapper, LogConfig logConfig, String packageName) { + private RollingFileAppender createFileAppender(PluginWrapper pluginWrapper, + LogConfig logConfig, String packageName) { LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - RollingFileAppender appender = new RollingFileAppender<>(); - Filter filter = new LogFilter(packageName); - filter.start(); - appender.addFilter(filter); + RollingFileAppender appender = new RollingFileAppender<>(); + if(StringUtils.isNotNullOrEmpty(packageName)){ + Filter filter = new LogFilter(packageName); + filter.start(); + appender.addFilter(filter); + } appender.setContext(context); appender.setName(pluginWrapper.getPluginId().concat("-file")); - String fileName = logConfig.getFileName(); - if (fileName == null || "".equals(fileName)) { - fileName = pluginWrapper.getPluginId(); - } - - String home = pluginWrapper.getPluginPath().toString(); - String logPrefix = home.concat("/logs/").concat(pluginWrapper.getPluginId()).concat("/").concat(fileName); + String logPrefix = getLogFile(pluginWrapper, logConfig); appender.setFile(OptionHelper.substVars(logPrefix.concat(".log"), context)); appender.setAppend(true); @@ -158,29 +160,32 @@ public class LogConfigProcess { return appender; } - private static class LogFilter extends Filter { - - private final String packageName; - private final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); - - private LogFilter(String packageName) { - this.packageName = packageName; - } - - @Override - public FilterReply decide(ILoggingEvent event) { - Logger logger = loggerContext.getLogger(packageName); - if (event.getLoggerName().startsWith(packageName) && event.getLevel().isGreaterOrEqual(logger.getLevel())) { - return FilterReply.ACCEPT; + private String getLogFile(PluginWrapper pluginWrapper, LogConfig logConfig){ + String rootDir = logConfig.getRootDir(); + String home; + String pluginPath = pluginWrapper.getPluginPath().toString(); + if(StringUtils.isNullOrEmpty(rootDir)){ + home = CommonUtils.joiningFilePath(pluginPath, "logs"); + } else { + if(rootDir.startsWith(LogConfig.ROOT_PLUGIN_SIGN)){ + // 如果root路径中开始存在ROOT_PLUGIN_SIGN,则说明进行插件根路绝替换 + home = rootDir.replaceFirst("\\" + LogConfig.ROOT_PLUGIN_SIGN, ""); + home = CommonUtils.joiningFilePath(pluginPath, home); + } else { + home = rootDir; } - return FilterReply.DENY; } + String fileName = logConfig.getFileName(); + if (StringUtils.isNullOrEmpty(fileName)) { + fileName = pluginWrapper.getPluginId(); + } + return CommonUtils.joiningFilePath(home, pluginWrapper.getPluginId(), fileName); } private void checkLogConfig(LogConfig logConfig, String pluginId) { String fileName = logConfig.getFileName(); - if (fileName == null || "".equals(fileName)) { - logConfig.setFileName(pluginId.concat("Log")); + if (StringUtils.isNullOrEmpty(fileName)) { + logConfig.setFileName(pluginId.concat("-log")); } Field[] fields = LogConfig.class.getDeclaredFields(); for (Field field : fields) { @@ -193,11 +198,8 @@ public class LogConfigProcess { } try { Object fieldValue = field.get(logConfig); - if(fieldValue == null){ - continue; - } Class fieldType = field.getType(); - if ("".equals(fieldValue.toString()) || + if (fieldValue == null || "".equals(fieldValue.toString()) || ObjectUtil.isEmptyObject(fieldType, fieldValue)) { String defaultValue = configItem.defaultValue(); log.debug("Field {} is not config or invalid in log config of plugin {}, set it to default value {}.", field.getName(), defaultValue, pluginId); @@ -228,7 +230,6 @@ public class LogConfigProcess { private Object xml2object(String xml) throws Exception { Object object; try { - System.out.println(xml); JAXBContext context = JAXBContext.newInstance(LogConfig.class); Unmarshaller unmarshaller = context.createUnmarshaller(); StringReader stringReader = new StringReader(xml); @@ -240,4 +241,24 @@ public class LogConfigProcess { return object; } + + private static class LogFilter extends Filter { + + private final String packageName; + private final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + + private LogFilter(String packageName) { + this.packageName = packageName; + } + + @Override + public FilterReply decide(ILoggingEvent event) { + Logger logger = loggerContext.getLogger(packageName); + if (event.getLoggerName().startsWith(packageName) && event.getLevel().isGreaterOrEqual(logger.getLevel())) { + return FilterReply.ACCEPT; + } + return FilterReply.DENY; + } + } + } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java index 5b62951..3cbdad7 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisCommonConfig.java @@ -21,9 +21,9 @@ public interface MybatisCommonConfig { * * 匹配零个或多个字符
* ** 匹配路径中的零或多个目录
* 例如:
- * 文件路径配置为

file: D://xml/*PluginMapper.xml


- * resources路径配置为

classpath: xml/mapper/*PluginMapper.xml


- * 包路径配置为

package: com.plugin.xml.mapper.*PluginMapper.xml


+ * 文件路径配置为

file:D://xml/*PluginMapper.xml


+ * resources路径配置为

classpath:xml/mapper/*PluginMapper.xml


+ * 包路径配置为

package:com.plugin.xml.mapper.*PluginMapper.xml


* @return Set */ Set xmlLocationsMatch(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java index 54ceaed..87a270c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java @@ -3,6 +3,7 @@ package com.gitee.starblues.utils; import com.gitee.starblues.integration.IntegrationConfiguration; import org.pf4j.util.StringUtils; +import java.io.File; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -102,7 +103,7 @@ public class CommonUtils { /** - * 拼接路径 + * 拼接url路径 * @param paths 拼接的路径 * @return 拼接的路径 */ @@ -130,5 +131,36 @@ public class CommonUtils { return stringBuilder.toString(); } + /** + * 拼接file路径 + * @param paths 拼接的路径 + * @return 拼接的路径 + */ + public static String joiningFilePath(String ...paths){ + if(paths == null || paths.length == 0){ + return ""; + } + StringBuilder stringBuilder = new StringBuilder(); + int length = paths.length; + for (int i = 0; i < length; i++) { + String path = paths[i]; + if(StringUtils.isNullOrEmpty(path)) { + continue; + } + if(i > 0){ + if(path.startsWith(File.separator) || path.startsWith("/") || + path.startsWith("\\") || path.startsWith("//")){ + stringBuilder.append(path); + } else { + stringBuilder.append(File.separator).append(path); + } + } else { + stringBuilder.append(path); + } + } + + return stringBuilder.toString(); + } + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java index 1870294..475e34a 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java @@ -40,7 +40,7 @@ public class ResourceUtils { if(split.length != 2){ return null; } - String type = split[0]; + String type = split[0].trim(); String location = split[1]; if(TYPE_CLASSPATH.equalsIgnoreCase(type) || TYPE_FILE.equalsIgnoreCase(type)){ return locationMatch; -- Gitee From 65eb4850ba21d54dbd5b348c3f6df22fd58b4f45 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Wed, 28 Apr 2021 21:25:44 +0800 Subject: [PATCH 05/23] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=A3=85=E9=85=8Dspring-boot-xx-starter?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic-example-runner/pom.xml | 8 ++++ .../plugins/basic-example-plugin1/pom.xml | 8 ++++ .../example/plugin1/config/AutoConfig.java | 17 ++++++++ .../config/QuartzJobConfiguration.java | 33 +++++++++++++++ .../basic/example/plugin1/job/QuartzJob1.java | 24 +++++++++++ .../PluginAutoConfigurationInstaller.java | 34 ++++++++++++++++ ...PluginPipeApplicationContextProcessor.java | 40 ++++++++++++++++--- .../pipe/bean/PluginInsetBeanRegistrar.java | 2 - .../pipe/classs/PluginClassProcess.java | 1 + .../group/AutoConfigurationSelectorGroup.java | 39 ++++++++++++++++++ .../realize/AutoConfigurationSelector.java | 18 +++++++++ 11 files changed, 217 insertions(+), 7 deletions(-) create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java diff --git a/example/basic-example/basic-example-runner/pom.xml b/example/basic-example/basic-example-runner/pom.xml index ada91f7..eec58e3 100644 --- a/example/basic-example/basic-example-runner/pom.xml +++ b/example/basic-example/basic-example-runner/pom.xml @@ -26,6 +26,14 @@ com.gitee.starblues basic-example-main ${project.version} + provided + + + + org.springframework.boot + spring-boot-starter-quartz + 2.4.5 + provided diff --git a/example/basic-example/plugins/basic-example-plugin1/pom.xml b/example/basic-example/plugins/basic-example-plugin1/pom.xml index 96e72fd..b0d705c 100644 --- a/example/basic-example/plugins/basic-example-plugin1/pom.xml +++ b/example/basic-example/plugins/basic-example-plugin1/pom.xml @@ -25,5 +25,13 @@ 2.8.2 + + + org.springframework.boot + spring-boot-starter-quartz + 2.4.5 + + + \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java new file mode 100644 index 0000000..3053f27 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java @@ -0,0 +1,17 @@ +package com.basic.example.plugin1.config; + +import com.gitee.starblues.factory.process.pipe.PluginAutoConfigurationInstaller; +import com.gitee.starblues.realize.AutoConfigurationSelector; +import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; + +/** + * @Description TODO + * @Author rockstal + * @Date 2021/4/28 21:21 + **/ +public class AutoConfig implements AutoConfigurationSelector { + @Override + public void select(PluginAutoConfigurationInstaller installer) { + installer.install(QuartzAutoConfiguration.class); + } +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java new file mode 100644 index 0000000..798fa59 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java @@ -0,0 +1,33 @@ +package com.basic.example.plugin1.config; + +import com.basic.example.plugin1.job.QuartzJob1; +import org.quartz.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Description TODO + * @Author rockstal + * @Date 2021/4/22 19:18 + **/ +@Configuration +public class QuartzJobConfiguration { + + + @Bean + public JobDetail jobDetail1(){ + return JobBuilder.newJob(QuartzJob1.class).storeDurably().build(); + } + + @Bean + public Trigger trigger1(){ + SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() + .withIntervalInSeconds(1) //每一秒执行一次 + .repeatForever(); //永久重复,一直执行下去 + return TriggerBuilder.newTrigger() + .forJob(jobDetail1()) + .withSchedule(scheduleBuilder) + .build(); + } + +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java new file mode 100644 index 0000000..85f1770 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java @@ -0,0 +1,24 @@ +package com.basic.example.plugin1.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @Description TODO + * @Author rockstal + * @Date 2021/4/22 19:18 + **/ +public class QuartzJob1 extends QuartzJobBean { + + @Override + protected void executeInternal(JobExecutionContext jobExecutionContext) + throws JobExecutionException { + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + System.out.println("QuartzJob1----" + sdf.format(new Date())); + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java new file mode 100644 index 0000000..ff7d903 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java @@ -0,0 +1,34 @@ +package com.gitee.starblues.factory.process.pipe; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 插件自动装配安装操作 + * @author starBlues + * @version 2.4.3 + */ +public class PluginAutoConfigurationInstaller { + + private final Set> autoConfigurationClassSet = new HashSet<>(); + + /** + * 处理该插件的注册 + * @param autoConfigurationClass 自动装载的配置类 + * @return PluginAutoConfigurationInstaller PluginAutoConfigurationInstaller + */ + public PluginAutoConfigurationInstaller install(Class autoConfigurationClass){ + autoConfigurationClassSet.add(autoConfigurationClass); + return this; + } + + /** + * 得到自动装载的所有类 + * @return autoConfigurationClassSet + */ + Set> getAutoConfigurationClassSet() { + return autoConfigurationClassSet; + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index dc69655..7b4509b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -3,15 +3,12 @@ package com.gitee.starblues.factory.process.pipe; import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.*; +import com.gitee.starblues.factory.process.pipe.classs.group.AutoConfigurationSelectorGroup; +import com.gitee.starblues.realize.AutoConfigurationSelector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; -import org.springframework.web.servlet.HandlerExecutionChain; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.handler.AbstractHandlerMapping; - -import javax.servlet.ServletContext; import java.util.*; /** @@ -51,6 +48,7 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso } ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { + installPluginAutoConfiguration(pluginApplicationContext, pluginRegistryInfo); Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getPluginClassLoader()); pluginApplicationContext.refresh(); } finally { @@ -62,6 +60,38 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso PluginInfoContainers.addPluginApplicationContext(pluginId, pluginApplicationContext); } + /** + * 安装插件定义的自动装载配置类 + * @param pluginApplicationContext 插件ApplicationContext + * @param pluginRegistryInfo 插件注册信息 + */ + private void installPluginAutoConfiguration(GenericApplicationContext pluginApplicationContext, + PluginRegistryInfo pluginRegistryInfo) { + List> groupClasses = pluginRegistryInfo.getGroupClasses(AutoConfigurationSelectorGroup.ID); + if(groupClasses == null || groupClasses.isEmpty()){ + return; + } + PluginAutoConfigurationInstaller installer = new PluginAutoConfigurationInstaller(); + for (Class groupClass : groupClasses) { + try { + Object o = groupClass.newInstance(); + if(o instanceof AutoConfigurationSelector){ + AutoConfigurationSelector selector = (AutoConfigurationSelector) o; + selector.select(installer); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + Set> autoConfigurationClassSet = installer.getAutoConfigurationClassSet(); + if(autoConfigurationClassSet.isEmpty()){ + return; + } + for (Class autoConfigurationClass : autoConfigurationClassSet) { + pluginApplicationContext.registerBean(autoConfigurationClass); + } + } + @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { for (PluginBeanRegistrar registrar : pluginBeanDefinitionRegistrars) { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java index 02557b1..8b5e07b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java @@ -8,9 +8,7 @@ import com.gitee.starblues.factory.process.pipe.bean.inset.PluginUtilsInset; import org.pf4j.util.StringUtils; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; /** * 系统内嵌的Bean注册者 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java index 6e6c03b..644c71d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java @@ -50,6 +50,7 @@ public class PluginClassProcess implements PluginPipeProcessor { pluginClassGroups.add(new CallerGroup()); pluginClassGroups.add(new OneselfListenerGroup()); pluginClassGroups.add(new WebSocketGroup()); + pluginClassGroups.add(new AutoConfigurationSelectorGroup()); // 添加扩展 pluginClassGroups.addAll(ExtensionInitializer.getClassGroupExtends()); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java new file mode 100644 index 0000000..5e77b45 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java @@ -0,0 +1,39 @@ +package com.gitee.starblues.factory.process.pipe.classs.group; + +import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.AutoConfigurationSelector; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import org.springframework.util.ClassUtils; + +import java.util.Set; + +/** + * 自动装配分组者 + * + * @author starBlues + * @version 2.1.0 + */ +public class AutoConfigurationSelectorGroup implements PluginClassGroup { + + public static final String ID = "AutoConfigurationSelectorGroup"; + + @Override + public String groupId() { + return ID; + } + + @Override + public void initialize(BasePlugin basePlugin) { + + } + + @Override + public boolean filter(Class aClass) { + if(aClass == null){ + return false; + } + Set> allInterfacesForClassAsSet = ClassUtils.getAllInterfacesForClassAsSet(aClass); + return allInterfacesForClassAsSet.contains(AutoConfigurationSelector.class); + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java new file mode 100644 index 0000000..1d27ef4 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java @@ -0,0 +1,18 @@ +package com.gitee.starblues.realize; + +import com.gitee.starblues.factory.process.pipe.PluginAutoConfigurationInstaller; + +/** + * 插件自动装配选择者, 装配spring-boot-xx-starter + * @author starBlues + * @version 2.4.3 + */ +public interface AutoConfigurationSelector { + + /** + * 选择插件所需集成的AutoConfiguration + * @param installer 自动装配安装者 + */ + void select(PluginAutoConfigurationInstaller installer); + +} -- Gitee From 78f88bbeff7d947503badbe7be256f8600d15d8a Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 15 May 2021 11:42:39 +0800 Subject: [PATCH 06/23] =?UTF-8?q?1.=20=E9=9B=86=E6=88=90log4j=202.=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=92=E4=BB=B6=E6=B3=A8=E5=86=8C=E7=9A=84?= =?UTF-8?q?bean=E5=90=8D=E7=A7=B0=E4=B8=8D=E5=8D=B8=E8=BD=BD=E6=8F=92?= =?UTF-8?q?=E4=BB=B6id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/example/plugin1/DefinePlugin.java | 5 + .../example/plugin1/rest/HelloPlugin1.java | 5 + .../src/main/resources/pluginOfSpringBoot.yml | 2 + .../log/plugin/config/PluginBeanConfig.java | 63 +-- .../pom.xml | 7 + .../starblues/extension/log/LogRegistry.java | 31 ++ .../log/PluginLogConfigProcessor.java | 31 +- .../extension/log/SpringBootLogExtension.java | 25 +- .../extension/log/config/LogConfig.java | 2 +- .../extension/log/log4j/Log4jLogRegistry.java | 93 ++++ .../LogbackLogRegistry.java} | 449 ++++++++---------- .../extension/log/util/LogConfigUtil.java | 127 +++++ .../starblues/factory/SpringBeanRegister.java | 77 ++- ...PluginPipeApplicationContextProcessor.java | 64 +++ .../process/pipe/bean/BasicBeanRegistrar.java | 2 +- .../pipe/bean/ConfigBeanRegistrar.java | 3 +- .../pipe/bean/InvokeBeanRegistrar.java | 6 +- .../PluginAnnotationBeanNameGenerator.java | 1 + .../gitee/starblues/realize/BasePlugin.java | 9 + 19 files changed, 651 insertions(+), 351 deletions(-) create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/LogRegistry.java create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java rename springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/{util/LogConfigProcess.java => logback/LogbackLogRegistry.java} (42%) create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java index f81aa85..34b2825 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java @@ -28,4 +28,9 @@ public class DefinePlugin extends BasePlugin { protected void stopEvent() { } + + @Override + public String springBootConfigFilePath() { + return "pluginOfSpringBoot.yml"; + } } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java index 56c9aea..7712f52 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java @@ -8,6 +8,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.pf4j.PluginDescriptor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -35,9 +36,13 @@ public class HelloPlugin1 { @Autowired private ConfigBean.ConfigBeanTest configBeanTest; + @Value("${c.configYmlValue}") + private String configYmlValue; + @GetMapping("plugin1") @ApiOperation(value = "hello", notes = "hello") public String sya(){ + System.out.println("configYmlValue="+configYmlValue); return "hello plugin1 example"; } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml new file mode 100644 index 0000000..b3e919f --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml @@ -0,0 +1,2 @@ +c: + configYmlValue: zhangzhuo \ No newline at end of file diff --git a/example/integration-log/integration-log-main/src/main/java/com/log/plugin/config/PluginBeanConfig.java b/example/integration-log/integration-log-main/src/main/java/com/log/plugin/config/PluginBeanConfig.java index fc156ed..e8dfb17 100644 --- a/example/integration-log/integration-log-main/src/main/java/com/log/plugin/config/PluginBeanConfig.java +++ b/example/integration-log/integration-log-main/src/main/java/com/log/plugin/config/PluginBeanConfig.java @@ -1,57 +1,17 @@ package com.log.plugin.config; import com.gitee.starblues.extension.log.SpringBootLogExtension; -import com.gitee.starblues.integration.ConfigurationBuilder; -import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.integration.AutoIntegrationConfiguration; import com.gitee.starblues.integration.application.AutoPluginApplication; import com.gitee.starblues.integration.application.PluginApplication; -import org.pf4j.RuntimeMode; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; -@Component -@ConfigurationProperties(prefix = "plugin") +@Configuration +@Import(AutoIntegrationConfiguration.class) public class PluginBeanConfig { - /** - * 运行模式 - * 开发环境: development、dev - * 生产/部署 环境: deployment、prod - */ - @Value("${runMode:dev}") - private String runMode; - - /** - * 插件的路径 - */ - @Value("${pluginPath:plugins}") - private String pluginPath; - - /** - * 插件文件的路径 - */ - @Value("${pluginConfigFilePath:pluginConfigs}") - private String pluginConfigFilePath; - - - - @Bean - public IntegrationConfiguration configuration(){ - return ConfigurationBuilder.toBuilder() - .runtimeMode(RuntimeMode.byName(runMode)) - .pluginPath(pluginPath) - .pluginConfigFilePath(pluginConfigFilePath) - .uploadTempPath("temp") - .backupPath("backupPlugin") - .pluginRestPathPrefix("/api/plugin") - .enablePluginIdRestPathPrefix(true) - .enableSwaggerRefresh(true) - .build(); - } - - /** * 定义插件应用。使用可以注入它操作插件。 * @return PluginApplication @@ -60,19 +20,8 @@ public class PluginBeanConfig { public PluginApplication pluginApplication(){ // 实例化自动初始化插件的PluginApplication PluginApplication pluginApplication = new AutoPluginApplication(); - pluginApplication.addExtension(new SpringBootLogExtension()); + pluginApplication.addExtension(new SpringBootLogExtension(SpringBootLogExtension.Type.LOGBACK)); return pluginApplication; } - public void setRunMode(String runMode) { - this.runMode = runMode; - } - - public void setPluginPath(String pluginPath) { - this.pluginPath = pluginPath; - } - - public void setPluginConfigFilePath(String pluginConfigFilePath) { - this.pluginConfigFilePath = pluginConfigFilePath; - } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml index 515002a..4738909 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml @@ -65,6 +65,7 @@ 2.4.2-RELEASE 5.0.7.RELEASE 1.2.3 + 1.2.17 @@ -74,6 +75,12 @@ ${logback.version} provided + + log4j + log4j + ${log4j.version} + provided + org.springframework spring-context diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/LogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/LogRegistry.java new file mode 100644 index 0000000..aab1010 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/LogRegistry.java @@ -0,0 +1,31 @@ +package com.gitee.starblues.extension.log; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import org.pf4j.PluginWrapper; +import org.springframework.core.io.Resource; + +import java.util.List; + +/** + * 日志注册统一接口 + * @author starBlues + * @version 2.4.3 + */ +public interface LogRegistry { + + /** + * 注册日志 + * @param resources 日志配置文件资源 + * @param pluginRegistryInfo 当前插件的信息 + * @throws Exception 注册异常 + **/ + void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception; + + /** + * 注册日志 + * @param pluginRegistryInfo 当前插件的信息 + * @throws Exception 卸载异常 + **/ + void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception; + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java index 25b304c..9276eb3 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java @@ -1,14 +1,13 @@ package com.gitee.starblues.extension.log; import com.gitee.starblues.extension.log.config.SpringBootLogConfig; -import com.gitee.starblues.extension.log.util.LogConfigProcess; +import com.gitee.starblues.extension.log.log4j.Log4jLogRegistry; +import com.gitee.starblues.extension.log.logback.LogbackLogRegistry; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; -import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; import com.gitee.starblues.utils.OrderPriority; import com.gitee.starblues.utils.ResourceUtils; import com.gitee.starblues.utils.SpringBeanUtils; -import org.pf4j.PluginWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; @@ -30,7 +29,17 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { private Logger log = LoggerFactory.getLogger(PluginLogConfigProcessor.class); - private final LogConfigProcess logConfigProcess = LogConfigProcess.getInstance(); + private final LogRegistry logRegistry; + + public PluginLogConfigProcessor(SpringBootLogExtension.Type type){ + if(type == SpringBootLogExtension.Type.LOG4J){ + logRegistry = new Log4jLogRegistry(); + } else if(type == SpringBootLogExtension.Type.LOGBACK){ + logRegistry = new LogbackLogRegistry(); + } else { + logRegistry = null; + } + } @Override public String key() { @@ -49,21 +58,29 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - if (logConfigProcess == null) { + if (logRegistry == null) { return; } List pluginResources = getLogConfigFile(pluginRegistryInfo); if (pluginResources == null || pluginResources.isEmpty()) { return; } - logConfigProcess.loadLogConfig(pluginResources, pluginRegistryInfo.getPluginWrapper()); + logRegistry.registry(pluginResources, pluginRegistryInfo); } @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - logConfigProcess.unloadLogConfig(pluginRegistryInfo.getPluginWrapper()); + if (logRegistry == null) { + return; + } + logRegistry.unRegistry(pluginRegistryInfo); } + /** + * 加载日志配置文件资源 + * @param pluginRegistryInfo 当前插件注册的信息 + * @throws IOException 获取不到配置文件异常 + **/ private List getLogConfigFile(PluginRegistryInfo pluginRegistryInfo) throws IOException { SpringBootLogConfig config = SpringBeanUtils.getObjectByInterfaceClass( pluginRegistryInfo.getConfigSingletons(), diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java index d7e4b33..dded116 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java @@ -10,12 +10,19 @@ import java.util.List; /** * 日志扩展 - * @author sousouki + * @author sousouki starBlues * @version 2.4.3 */ public class SpringBootLogExtension extends AbstractExtension { - public static final String KEY = "SpringBootLogExtension"; + private static final String KEY = "SpringBootLogExtension"; + + private final Type type; + + public SpringBootLogExtension(Type type){ + this.type = type; + } + @Override public String key() { @@ -25,7 +32,19 @@ public class SpringBootLogExtension extends AbstractExtension { @Override public List getPluginPipeProcessor(ApplicationContext applicationContext) { List pipeProcessorExtends = new ArrayList<>(); - pipeProcessorExtends.add(new PluginLogConfigProcessor()); + pipeProcessorExtends.add(new PluginLogConfigProcessor(type)); return pipeProcessorExtends; } + + public enum Type{ + /** + * 集成log4j + **/ + LOG4J, + + /** + * 集成 logback + **/ + LOGBACK + } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java index 7455c4e..596d4e9 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/LogConfig.java @@ -67,7 +67,7 @@ public class LogConfig { private String pattern; /** - * 包名 + * 包名, 自定义当前插件的日志包名, 默认为 BasePlugin 实现类的 包名 **/ @XmlTransient private String packageName; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java new file mode 100644 index 0000000..5fa9f69 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java @@ -0,0 +1,93 @@ +package com.gitee.starblues.extension.log.log4j; + +import ch.qos.logback.core.util.OptionHelper; +import com.gitee.starblues.extension.log.LogRegistry; +import com.gitee.starblues.extension.log.config.LogConfig; +import com.gitee.starblues.extension.log.logback.LogbackLogRegistry; +import com.gitee.starblues.extension.log.util.LogConfigUtil; +import com.gitee.starblues.factory.PluginRegistryInfo; +import org.apache.log4j.*; +import org.apache.log4j.spi.Filter; +import org.apache.log4j.spi.LoggingEvent; +import org.pf4j.PluginWrapper; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.Resource; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 日志注册统一接口 + * @author starBlues + * @version 2.4.3 + */ +public class Log4jLogRegistry implements LogRegistry { + + private final org.slf4j.Logger log = LoggerFactory.getLogger(LogbackLogRegistry.class); + private final Map> pluginAppenderInfo = new ConcurrentHashMap<>(); + + @Override + public void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception { + PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); + Logger rootLogger = LogManager.getRootLogger(); + Set allAppender = new HashSet<>(); + for (Resource resource : resources) { + if(resource == null || !resource.exists()){ + continue; + } + LogConfig logConfig; + try { + logConfig = LogConfigUtil.getLogConfig(resource, pluginRegistryInfo); + } catch (Exception e){ + log.error("Failed to read log configuration.", e); + continue; + } + Set appenderSet = getAppender(pluginRegistryInfo, logConfig); + for (Appender appender : appenderSet) { + rootLogger.addAppender(appender); + allAppender.add(appender); + } + } + pluginAppenderInfo.put(pluginWrapper.getPluginId(), allAppender); + } + + + private Set getAppender(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig){ + PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); + String packageName = pluginRegistryInfo.getBasePlugin().scanPackage(); + RollingFileAppender appender = new RollingFileAppender(); + appender.addFilter(new Filter() { + @Override + public int decide(LoggingEvent event) { + if (event.getLoggerName().startsWith(packageName)) { + return Filter.ACCEPT; + } + return Filter.DENY; + } + }); + String logFilePrefix = LogConfigUtil.getLogFile(pluginWrapper, logConfig); + appender.setName(pluginWrapper.getPluginId()); + appender.setFile(logFilePrefix.concat(".log")); + appender.setMaxFileSize(logConfig.getMaxFileSize()); + appender.setAppend(true); + appender.setMaxBackupIndex(logConfig.getMaxHistory()); + appender.setThreshold(Level.toLevel(logConfig.getLevel())); + PatternLayout patternLayout = new PatternLayout(); + patternLayout.setConversionPattern(logConfig.getPattern()); + appender.setLayout(patternLayout); + appender.activateOptions(); + return Collections.singleton(appender); + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + Set allAppender = pluginAppenderInfo.get(pluginRegistryInfo.getPluginWrapper().getPluginId()); + if(allAppender == null || allAppender.isEmpty()){ + return; + } + Logger rootLogger = LogManager.getRootLogger(); + for (Appender appender : allAppender) { + rootLogger.removeAppender(appender); + } + } +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java similarity index 42% rename from springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java rename to springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java index f969dc7..70e63ff 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java @@ -1,264 +1,185 @@ -package com.gitee.starblues.extension.log.util; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.encoder.PatternLayoutEncoder; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.ConsoleAppender; -import ch.qos.logback.core.filter.Filter; -import ch.qos.logback.core.rolling.RollingFileAppender; -import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy; -import ch.qos.logback.core.spi.FilterReply; -import ch.qos.logback.core.util.FileSize; -import ch.qos.logback.core.util.OptionHelper; -import com.gitee.starblues.extension.log.annotation.ConfigItem; -import com.gitee.starblues.extension.log.config.LogConfig; -import com.gitee.starblues.utils.CommonUtils; -import org.pf4j.PluginWrapper; -import org.pf4j.util.StringUtils; -import org.slf4j.LoggerFactory; -import org.springframework.core.io.Resource; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 日志配置处理者 - * @author sousouki - * @version 2.4.3 - */ -public class LogConfigProcess { - - private final org.slf4j.Logger log = LoggerFactory.getLogger(LogConfigProcess.class); - - private final Map pluginLogMap = new ConcurrentHashMap<>(); - - private final static LogConfigProcess INSTANCE = new LogConfigProcess(); - - private LogConfigProcess() { - } - - public static LogConfigProcess getInstance() { - return INSTANCE; - } - - public void loadLogConfig(List resources, PluginWrapper pluginWrapper) { - for (Resource resource : resources) { - if(resource == null || !resource.exists()){ - continue; - } - String configText; - try { - configText = readConfigText(resource); - } catch (IOException e) { - log.error("Failed to read log configuration.", e); - return; - } - LogConfig logConfig; - try { - logConfig = (LogConfig) xml2object(configText); - } catch (Exception e) { - log.error("", e); - return; - } - checkLogConfig(logConfig, pluginWrapper.getPluginId()); - String pluginClass = pluginWrapper.getDescriptor().getPluginClass(); - String packageName = pluginClass.substring(0, pluginClass.lastIndexOf(".")); - splitPluginLog(pluginWrapper, logConfig, packageName); - String pluginId = pluginWrapper.getPluginId(); - logConfig.setPattern(packageName); - pluginLogMap.put(pluginId, logConfig); - } - } - - public void unloadLogConfig(PluginWrapper pluginWrapper) { - pluginLogMap.remove(pluginWrapper.getPluginId()); - } - - private void splitPluginLog(PluginWrapper pluginWrapper, LogConfig logConfig, String packageName) { - LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - Logger logger = context.getLogger(packageName); - logger.detachAndStopAllAppenders(); - - ConsoleAppender consoleAppender = createConsoleAppender(pluginWrapper, logConfig, packageName); - RollingFileAppender fileAppender = createFileAppender(pluginWrapper, logConfig, packageName); - - logger.setAdditive(false); - logger.setLevel(Level.toLevel(logConfig.getLevel())); - logger.addAppender(consoleAppender); - logger.addAppender(fileAppender); - } - - private ConsoleAppender createConsoleAppender(PluginWrapper pluginWrapper, LogConfig logConfig, String packageName) { - LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - ConsoleAppender appender = new ConsoleAppender<>(); - Filter filter = new LogFilter(packageName); - filter.start(); - appender.addFilter(filter); - appender.setContext(context); - appender.setName(pluginWrapper.getPluginId().concat("-console")); - - PatternLayoutEncoder encoder = new PatternLayoutEncoder(); - encoder.setContext(context); - encoder.setPattern(logConfig.getPattern()); - encoder.start(); - - appender.setEncoder(encoder); - appender.start(); - return appender; - } - - private RollingFileAppender createFileAppender(PluginWrapper pluginWrapper, - LogConfig logConfig, String packageName) { - LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); - - RollingFileAppender appender = new RollingFileAppender<>(); - if(StringUtils.isNotNullOrEmpty(packageName)){ - Filter filter = new LogFilter(packageName); - filter.start(); - appender.addFilter(filter); - } - - appender.setContext(context); - appender.setName(pluginWrapper.getPluginId().concat("-file")); - - String logPrefix = getLogFile(pluginWrapper, logConfig); - appender.setFile(OptionHelper.substVars(logPrefix.concat(".log"), context)); - - appender.setAppend(true); - appender.setPrudent(false); - - SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy<>(); - - String fp = OptionHelper.substVars(logPrefix.concat(".%d{yyyy-MM-dd}%i.log"), context); - policy.setMaxFileSize(FileSize.valueOf(logConfig.getMaxFileSize())); - policy.setFileNamePattern(fp); - policy.setMaxHistory(logConfig.getMaxHistory()); - policy.setTotalSizeCap(FileSize.valueOf(logConfig.getTotalFileSize())); - policy.setParent(appender); - policy.setContext(context); - policy.start(); - - PatternLayoutEncoder encoder = new PatternLayoutEncoder(); - encoder.setContext(context); - encoder.setPattern(logConfig.getPattern()); - encoder.start(); - - appender.setRollingPolicy(policy); - appender.setEncoder(encoder); - appender.start(); - return appender; - } - - private String getLogFile(PluginWrapper pluginWrapper, LogConfig logConfig){ - String rootDir = logConfig.getRootDir(); - String home; - String pluginPath = pluginWrapper.getPluginPath().toString(); - if(StringUtils.isNullOrEmpty(rootDir)){ - home = CommonUtils.joiningFilePath(pluginPath, "logs"); - } else { - if(rootDir.startsWith(LogConfig.ROOT_PLUGIN_SIGN)){ - // 如果root路径中开始存在ROOT_PLUGIN_SIGN,则说明进行插件根路绝替换 - home = rootDir.replaceFirst("\\" + LogConfig.ROOT_PLUGIN_SIGN, ""); - home = CommonUtils.joiningFilePath(pluginPath, home); - } else { - home = rootDir; - } - } - String fileName = logConfig.getFileName(); - if (StringUtils.isNullOrEmpty(fileName)) { - fileName = pluginWrapper.getPluginId(); - } - return CommonUtils.joiningFilePath(home, pluginWrapper.getPluginId(), fileName); - } - - private void checkLogConfig(LogConfig logConfig, String pluginId) { - String fileName = logConfig.getFileName(); - if (StringUtils.isNullOrEmpty(fileName)) { - logConfig.setFileName(pluginId.concat("-log")); - } - Field[] fields = LogConfig.class.getDeclaredFields(); - for (Field field : fields) { - if (!field.isAccessible()) { - field.setAccessible(true); - } - ConfigItem configItem = field.getDeclaredAnnotation(ConfigItem.class); - if (configItem == null) { - continue; - } - try { - Object fieldValue = field.get(logConfig); - Class fieldType = field.getType(); - if (fieldValue == null || "".equals(fieldValue.toString()) || - ObjectUtil.isEmptyObject(fieldType, fieldValue)) { - String defaultValue = configItem.defaultValue(); - log.debug("Field {} is not config or invalid in log config of plugin {}, set it to default value {}.", field.getName(), defaultValue, pluginId); - Object fixedValue = ObjectUtil.parseBasicTypeValue(fieldType, defaultValue); - field.set(logConfig, fixedValue); - } - } catch (IllegalAccessException e) { - log.error("Failed to check config item {} in log config.", field.getName()); - } - } - } - - private String readConfigText(Resource resource) throws IOException { - String fileContent; - try (InputStream inputStream = resource.getInputStream(); - ByteArrayOutputStream stream = new ByteArrayOutputStream()) { - byte[] buff = new byte[1024]; - int len; - while ((len = inputStream.read(buff)) != -1) { - stream.write(buff, 0, len); - } - byte[] data = stream.toByteArray(); - fileContent = new String(data); - } - return fileContent; - } - - private Object xml2object(String xml) throws Exception { - Object object; - try { - JAXBContext context = JAXBContext.newInstance(LogConfig.class); - Unmarshaller unmarshaller = context.createUnmarshaller(); - StringReader stringReader = new StringReader(xml); - object = unmarshaller.unmarshal(stringReader); - } catch (JAXBException e) { - e.printStackTrace(); - throw new Exception("Invalid xml definition"); - } - return object; - } - - - private static class LogFilter extends Filter { - - private final String packageName; - private final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); - - private LogFilter(String packageName) { - this.packageName = packageName; - } - - @Override - public FilterReply decide(ILoggingEvent event) { - Logger logger = loggerContext.getLogger(packageName); - if (event.getLoggerName().startsWith(packageName) && event.getLevel().isGreaterOrEqual(logger.getLevel())) { - return FilterReply.ACCEPT; - } - return FilterReply.DENY; - } - } - -} +package com.gitee.starblues.extension.log.logback; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.filter.Filter; +import ch.qos.logback.core.rolling.RollingFileAppender; +import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy; +import ch.qos.logback.core.spi.FilterReply; +import ch.qos.logback.core.util.FileSize; +import ch.qos.logback.core.util.OptionHelper; +import com.gitee.starblues.extension.log.LogRegistry; +import com.gitee.starblues.extension.log.config.LogConfig; +import com.gitee.starblues.extension.log.util.LogConfigUtil; +import com.gitee.starblues.factory.PluginRegistryInfo; +import org.pf4j.PluginWrapper; +import org.pf4j.util.StringUtils; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.Resource; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 日志配置处理者 + * @author sousouki + * @version 2.4.3 + */ +public class LogbackLogRegistry implements LogRegistry { + + private final org.slf4j.Logger log = LoggerFactory.getLogger(LogbackLogRegistry.class); + + private final Map>> pluginAppenderInfo = new ConcurrentHashMap<>(); + + + @Override + public void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception { + Set> appenderSet = new HashSet<>(); + PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); + for (Resource resource : resources) { + if(resource == null || !resource.exists()){ + continue; + } + LogConfig logConfig; + try { + logConfig = LogConfigUtil.getLogConfig(resource, pluginRegistryInfo); + } catch (Exception e){ + log.error("Failed to read log configuration.", e); + continue; + } + Set> logAppenderSet = addAppender(pluginWrapper, logConfig); + appenderSet.addAll(logAppenderSet); + } + pluginAppenderInfo.put(pluginWrapper.getPluginId(), appenderSet); + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); + Set> logAppenderSet = pluginAppenderInfo.get(pluginWrapper.getPluginId()); + if(logAppenderSet == null || logAppenderSet.isEmpty()){ + return; + } + String packageName = pluginRegistryInfo.getBasePlugin().scanPackage(); + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + Logger logger = context.getLogger(packageName); + for (Appender appender : logAppenderSet) { + logger.detachAppender(appender); + } + pluginAppenderInfo.remove(pluginWrapper.getPluginId()); + } + + private Set> addAppender(PluginWrapper pluginWrapper, LogConfig logConfig) { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + String packageName = logConfig.getPackageName(); + Logger logger = context.getLogger(packageName); + logger.detachAndStopAllAppenders(); + + ConsoleAppender consoleAppender = createConsoleAppender(pluginWrapper, + logConfig, packageName); + RollingFileAppender fileAppender = createFileAppender(pluginWrapper, + logConfig, packageName); + + logger.setAdditive(false); + logger.setLevel(Level.toLevel(logConfig.getLevel())); + logger.addAppender(consoleAppender); + logger.addAppender(fileAppender); + + Set> appenderSet = new HashSet<>(); + appenderSet.add(consoleAppender); + appenderSet.add(fileAppender); + return appenderSet; + } + + private ConsoleAppender createConsoleAppender(PluginWrapper pluginWrapper, + LogConfig logConfig, + String packageName) { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + ConsoleAppender appender = new ConsoleAppender<>(); + Filter filter = new LogFilter(packageName); + filter.start(); + appender.addFilter(filter); + appender.setContext(context); + appender.setName(pluginWrapper.getPluginId().concat("-console")); + + PatternLayoutEncoder encoder = new PatternLayoutEncoder(); + encoder.setContext(context); + encoder.setPattern(logConfig.getPattern()); + encoder.start(); + + appender.setEncoder(encoder); + appender.start(); + return appender; + } + + private RollingFileAppender createFileAppender(PluginWrapper pluginWrapper, + LogConfig logConfig, + String packageName) { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + + RollingFileAppender appender = new RollingFileAppender<>(); + if(StringUtils.isNotNullOrEmpty(packageName)){ + Filter filter = new LogFilter(packageName); + filter.start(); + appender.addFilter(filter); + } + + appender.setContext(context); + appender.setName(pluginWrapper.getPluginId()); + + String logFilePrefix = LogConfigUtil.getLogFile(pluginWrapper, logConfig); + appender.setFile(OptionHelper.substVars(logFilePrefix.concat(".log"), context)); + + appender.setAppend(true); + appender.setPrudent(false); + + SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy<>(); + + String fp = OptionHelper.substVars(logFilePrefix.concat(".%d{yyyy-MM-dd}%i.log"), context); + policy.setMaxFileSize(FileSize.valueOf(logConfig.getMaxFileSize())); + policy.setFileNamePattern(fp); + policy.setMaxHistory(logConfig.getMaxHistory()); + policy.setTotalSizeCap(FileSize.valueOf(logConfig.getTotalFileSize())); + policy.setParent(appender); + policy.setContext(context); + policy.start(); + + PatternLayoutEncoder encoder = new PatternLayoutEncoder(); + encoder.setContext(context); + encoder.setPattern(logConfig.getPattern()); + encoder.start(); + + appender.setRollingPolicy(policy); + appender.setEncoder(encoder); + appender.start(); + return appender; + } + + private static class LogFilter extends Filter { + + private final String packageName; + private final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + + private LogFilter(String packageName) { + this.packageName = packageName; + } + + @Override + public FilterReply decide(ILoggingEvent event) { + Logger logger = loggerContext.getLogger(packageName); + if (event.getLoggerName().startsWith(packageName) && event.getLevel().isGreaterOrEqual(logger.getLevel())) { + return FilterReply.ACCEPT; + } + return FilterReply.DENY; + } + } + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java new file mode 100644 index 0000000..a66bce2 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java @@ -0,0 +1,127 @@ +package com.gitee.starblues.extension.log.util; + +import com.gitee.starblues.extension.log.annotation.ConfigItem; +import com.gitee.starblues.extension.log.config.LogConfig; +import com.gitee.starblues.extension.log.logback.LogbackLogRegistry; +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.utils.CommonUtils; +import org.pf4j.PluginWrapper; +import org.pf4j.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.Resource; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.lang.reflect.Field; + +/** + * LogConfig 对象和 xml 映射的工具类 + * @author starBlues + * @version 2.4.3 + */ +public class LogConfigUtil { + + private static final Logger LOG = LoggerFactory.getLogger(LogConfigUtil.class); + + + public static LogConfig getLogConfig(Resource xmlResource, PluginRegistryInfo pluginRegistryInfo) + throws Exception{ + PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); + String configText = readConfigText(xmlResource); + LogConfig logConfig = (LogConfig) xml2object(configText); + checkLogConfig(logConfig, pluginWrapper.getPluginId()); + String packageName = logConfig.getPackageName(); + if(StringUtils.isNullOrEmpty(packageName)){ + logConfig.setPackageName(pluginRegistryInfo.getBasePlugin().scanPackage()); + } + return logConfig; + } + + + public static String getLogFile(PluginWrapper pluginWrapper, LogConfig logConfig){ + String rootDir = logConfig.getRootDir(); + String home; + String pluginPath = pluginWrapper.getPluginPath().toString(); + if(StringUtils.isNullOrEmpty(rootDir)){ + home = CommonUtils.joiningFilePath(pluginPath, "logs"); + } else { + if(rootDir.startsWith(LogConfig.ROOT_PLUGIN_SIGN)){ + // 如果root路径中开始存在ROOT_PLUGIN_SIGN,则说明进行插件根路替换 + home = rootDir.replaceFirst("\\" + LogConfig.ROOT_PLUGIN_SIGN, ""); + home = CommonUtils.joiningFilePath(pluginPath, home); + } else { + home = rootDir; + } + } + String fileName = logConfig.getFileName(); + if (StringUtils.isNullOrEmpty(fileName)) { + fileName = pluginWrapper.getPluginId(); + } + return CommonUtils.joiningFilePath(home, pluginWrapper.getPluginId(), fileName); + } + + private static void checkLogConfig(LogConfig logConfig, String pluginId) { + String fileName = logConfig.getFileName(); + if (StringUtils.isNullOrEmpty(fileName)) { + logConfig.setFileName(pluginId.concat("-log")); + } + Field[] fields = LogConfig.class.getDeclaredFields(); + for (Field field : fields) { + if (!field.isAccessible()) { + field.setAccessible(true); + } + ConfigItem configItem = field.getDeclaredAnnotation(ConfigItem.class); + if (configItem == null) { + continue; + } + try { + Object fieldValue = field.get(logConfig); + Class fieldType = field.getType(); + if (fieldValue == null || "".equals(fieldValue.toString()) || + ObjectUtil.isEmptyObject(fieldType, fieldValue)) { + String defaultValue = configItem.defaultValue(); + LOG.debug("Field {} is not config or invalid in log config of plugin {}, set it to default value {}.", field.getName(), defaultValue, pluginId); + Object fixedValue = ObjectUtil.parseBasicTypeValue(fieldType, defaultValue); + field.set(logConfig, fixedValue); + } + } catch (IllegalAccessException e) { + LOG.error("Failed to check config item {} in log config.", field.getName()); + } + } + } + + private static String readConfigText(Resource resource) throws IOException { + String fileContent; + try (InputStream inputStream = resource.getInputStream(); + ByteArrayOutputStream stream = new ByteArrayOutputStream()) { + byte[] buff = new byte[1024]; + int len; + while ((len = inputStream.read(buff)) != -1) { + stream.write(buff, 0, len); + } + byte[] data = stream.toByteArray(); + fileContent = new String(data); + } + return fileContent; + } + + private static Object xml2object(String xml) throws Exception { + Object object; + try { + JAXBContext context = JAXBContext.newInstance(LogConfig.class); + Unmarshaller unmarshaller = context.createUnmarshaller(); + StringReader stringReader = new StringReader(xml); + object = unmarshaller.unmarshal(stringReader); + } catch (JAXBException e) { + e.printStackTrace(); + throw new Exception("Invalid xml definition"); + } + return object; + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java index ddb1393..3d59a1b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java @@ -1,11 +1,11 @@ package com.gitee.starblues.factory; -import com.gitee.starblues.factory.process.pipe.bean.name.PluginAnnotationBeanNameGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.context.annotation.AnnotationBeanNameGenerator; import org.springframework.context.support.GenericApplicationContext; import java.text.MessageFormat; @@ -32,30 +32,43 @@ public class SpringBeanRegister { return applicationContext.containsBean(name); } + /** - * 默认注册 + * 基于class注册一个bean + * + * @param aClass 类名 + * @return 注册的bean名称 + */ + public String register(Class aClass) { + return register(aClass, null); + } + + + /** + * 基于class注册一个bean * * @param pluginId 插件id * @param aClass 类名 * @return 注册的bean名称 */ + @Deprecated public String register(String pluginId, Class aClass) { return register(pluginId, aClass, null); } + /** - * 默认注册 - * @param pluginId 插件id + * 基于class注册一个bean, 可自定义 BeanDefinition + * * @param aClass 注册的类 * @param consumer 自定义处理AnnotatedGenericBeanDefinition * @return 注册的bean名称 */ - public String register(String pluginId, Class aClass, + public String register(Class aClass, Consumer consumer) { AnnotatedGenericBeanDefinition beanDefinition = new AnnotatedGenericBeanDefinition(aClass); beanDefinition.setBeanClass(aClass); - BeanNameGenerator beanNameGenerator = - new PluginAnnotationBeanNameGenerator(pluginId); + BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator(); String beanName = beanNameGenerator.generateBeanName(beanDefinition, applicationContext); if(applicationContext.containsBean(beanName)){ @@ -71,25 +84,49 @@ public class SpringBeanRegister { return beanName; } + + /** + * 基于class注册一个bean, 可自定义 BeanDefinition + * + * @param pluginId 插件id + * @param aClass 注册的类 + * @param consumer 自定义处理AnnotatedGenericBeanDefinition + * @return 注册的bean名称 + */ + @Deprecated + public String register(String pluginId, Class aClass, + Consumer consumer) { + return register(aClass, consumer); + } + + /** + * 指定bean名称注册 + * @param beanName 指定的bean名称 + * @param aClass 注册的类 + */ + public void registerOfSpecifyName(String beanName, Class aClass){ + registerOfSpecifyName(beanName, aClass, null); + } + /** * 指定bean名称注册 * @param pluginId 插件id * @param beanName 指定的bean名称 * @param aClass 注册的类 */ + @Deprecated public void registerOfSpecifyName(String pluginId, String beanName, Class aClass){ registerOfSpecifyName(pluginId, beanName, aClass, null); } + /** - * 指定bean名称注册 - * @param pluginId 插件id + * 指定bean名称注册, 可自定义 BeanDefinition * @param beanName 指定的bean名称 * @param aClass 注册的类 - * @param consumer 注册异常 + * @param consumer 自定义处理AnnotatedGenericBeanDefinition */ - public void registerOfSpecifyName(String pluginId, - String beanName, + public void registerOfSpecifyName(String beanName, Class aClass, Consumer consumer) { AnnotatedGenericBeanDefinition beanDefinition = new @@ -105,6 +142,22 @@ public class SpringBeanRegister { applicationContext.registerBeanDefinition(beanName, beanDefinition); } + + /** + * 指定bean名称注册, 可自定义 BeanDefinition + * @param pluginId 插件id + * @param beanName 指定的bean名称 + * @param aClass 注册的类 + * @param consumer 自定义处理AnnotatedGenericBeanDefinition + */ + @Deprecated + public void registerOfSpecifyName(String pluginId, + String beanName, + Class aClass, + Consumer consumer) { + registerOfSpecifyName(beanName, aClass, consumer); + } + /** * 注册单例 * @param name 单例名称 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index 7b4509b..6038f38 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -7,8 +7,18 @@ import com.gitee.starblues.factory.process.pipe.classs.group.AutoConfigurationSe import com.gitee.starblues.realize.AutoConfigurationSelector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.MutablePropertyValues; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +import java.io.IOException; import java.util.*; /** @@ -49,6 +59,7 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { installPluginAutoConfiguration(pluginApplicationContext, pluginRegistryInfo); + registerPluginSpringBootConfigProcessor(pluginRegistryInfo, pluginApplicationContext); Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getPluginClassLoader()); pluginApplicationContext.refresh(); } finally { @@ -91,6 +102,59 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso pluginApplicationContext.registerBean(autoConfigurationClass); } } + /** + * 注册用于装载插件中springboot自带的配置文件 + * @param pluginRegistryInfo 插件注册信息 + */ + private void registerPluginSpringBootConfigProcessor(PluginRegistryInfo pluginRegistryInfo, GenericApplicationContext applicationContext) { + applicationContext.registerBean( + PluginConfigEnvironmentPostProcessor.class, + consumer->{ + consumer.getPropertyValues().add("pluginRegistryInfo", + pluginRegistryInfo); + }); + } + + + private static class PluginConfigEnvironmentPostProcessor implements EnvironmentPostProcessor { + + //Properties对象 + private final Properties properties = new Properties(); + private PluginRegistryInfo pluginRegistryInfo; + + public void setPluginRegistryInfo(PluginRegistryInfo pluginRegistryInfo) { + this.pluginRegistryInfo = pluginRegistryInfo; + } + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginWrapper().getPluginClassLoader(); + String s = pluginRegistryInfo.getBasePlugin().springBootConfigFilePath(); + if(s == null){ + return; + } + Resource resource = new ClassPathResource( + s, pluginClassLoader + ); + //加载成PropertySource对象,并添加到Environment环境中 + environment.getPropertySources().addLast(loadProfiles(resource)); + } + + //加载单个配置文件 + private PropertySource loadProfiles(Resource resource) { + if (!resource.exists()) { + throw new IllegalArgumentException("资源" + resource + "不存在"); + } + try { + //从输入流中加载一个Properties对象 + properties.load(resource.getInputStream()); + return new PropertiesPropertySource(resource.getFilename(), properties); + }catch (IOException ex) { + throw new IllegalStateException("加载配置文件失败" + resource, ex); + } + } + + } @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java index 5e8fedf..9291a78 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java @@ -50,7 +50,7 @@ public class BasicBeanRegistrar implements PluginBeanRegistrar { if(aClass == null){ continue; } - springBeanRegister.register(pluginId, aClass); + springBeanRegister.register(aClass); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java index eff5e40..b874aae 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java @@ -28,13 +28,12 @@ public class ConfigBeanRegistrar implements PluginBeanRegistrar { if(configBeans == null || configBeans.isEmpty()){ return; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); for (Class aClass : configBeans) { if(aClass == null){ continue; } - springBeanRegister.register(pluginId, aClass); + springBeanRegister.register(aClass); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java index d040e4e..ceca253 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java @@ -53,7 +53,6 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ if(supperClasses.isEmpty()){ return; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); Set beanNames = new HashSet<>(supperClasses.size()); for (Class supperClass : supperClasses) { @@ -71,7 +70,7 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ pluginRegistryInfo.getPluginWrapper().getPluginId(), beanName, supperClass.getName()); throw new Exception(error); } - springBeanRegister.registerOfSpecifyName(pluginId, beanName, supperClass); + springBeanRegister.registerOfSpecifyName(beanName, supperClass); beanNames.add(beanName); } pluginRegistryInfo.addExtension(SUPPLIER_KEY, beanNames); @@ -83,14 +82,13 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ if(callerClasses == null || callerClasses.isEmpty()){ return; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); for (Class callerClass : callerClasses) { Caller caller = callerClass.getAnnotation(Caller.class); if(caller == null){ continue; } - springBeanRegister.register(pluginId, callerClass, (beanDefinition) ->{ + springBeanRegister.register(callerClass, (beanDefinition) ->{ beanDefinition.getPropertyValues().add("callerInterface", callerClass); beanDefinition.getPropertyValues().add("callerAnnotation", caller); beanDefinition.setBeanClass(CallerInterfaceFactory.class); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/name/PluginAnnotationBeanNameGenerator.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/name/PluginAnnotationBeanNameGenerator.java index aa5c14e..70a13bc 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/name/PluginAnnotationBeanNameGenerator.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/name/PluginAnnotationBeanNameGenerator.java @@ -12,6 +12,7 @@ import org.springframework.util.StringUtils; * @author starBlues * @version 1.0 */ +@Deprecated public class PluginAnnotationBeanNameGenerator extends AnnotationBeanNameGenerator { /** diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java index 7bc18cf..d0cb3a9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java @@ -12,6 +12,7 @@ import org.pf4j.PluginWrapper; public abstract class BasePlugin extends Plugin { private final BasePluginExtend basePluginExtend; + private String springBootConfigFilePath; public BasePlugin(PluginWrapper wrapper) { super(wrapper); @@ -63,6 +64,14 @@ public abstract class BasePlugin extends Plugin { return this.getClass().getPackage().getName(); } + /** + * 可设置插件对应的springBoot中*.prop或者*.yml配置文件。必须为全路径 + * @return 包名 + */ + public String springBootConfigFilePath(){ + return null; + } + /** * 得到插件扩展的信息 * @return BasePluginExtend -- Gitee From 2b549e065227075a9703c354a1758134902fb225 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 15 May 2021 19:56:52 +0800 Subject: [PATCH 07/23] =?UTF-8?q?1.=20=E6=8F=92=E4=BB=B6=E6=96=B0=E5=A2=9E?= =?UTF-8?q?springboot=E5=8E=9F=E7=94=9F=E9=85=8D=E7=BD=AE=E6=94=AF?= =?UTF-8?q?=E6=8C=81=202.=20=E6=8F=92=E4=BB=B6=E9=9B=86=E6=88=90=20redis-s?= =?UTF-8?q?tarter=20=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic-example/basic-example-main/pom.xml | 4 +- .../basic-example-runner/pom.xml | 9 +- .../plugins/basic-example-plugin1/pom.xml | 10 +- .../example/plugin1/config/AutoConfig.java | 2 + .../example/plugin1/config/ConfigBean.java | 21 +++ .../example/plugin1/rest/HelloPlugin1.java | 3 + .../src/main/resources/plugin.properties | 2 +- .../src/main/resources/pluginOfSpringBoot.yml | 11 +- .../plugins/basic-example-plugin2/pom.xml | 4 +- .../src/main/resources/plugin.properties | 2 +- .../plugins/basic-example-plugin3/pom.xml | 4 +- .../src/main/resources/plugin.properties | 2 +- example/basic-example/plugins/pom.xml | 2 +- example/basic-example/pom.xml | 2 +- .../integration-log-main/pom.xml | 6 +- .../plugins/integration-log-plugin/pom.xml | 2 +- .../src/main/resources/plugin.properties | 2 +- example/integration-log/pom.xml | 2 +- .../integration-mybatis-main/pom.xml | 8 +- .../integration-mybatis-plugin-parent/pom.xml | 2 +- .../integration-mybatis-runner/pom.xml | 2 +- .../integration-mybatis-plugin1/pom.xml | 4 +- .../src/main/resources/plugin.properties | 2 +- .../plugin.properties | 2 +- .../integration-mybatis-plugin2/pom.xml | 4 +- example/integration-mybatis/pom.xml | 2 +- .../integration-mybatisplus-main/pom.xml | 6 +- .../plugin.properties | 2 +- .../integration-mybatisplus-plugin/pom.xml | 2 +- example/integration-mybatisplus/pom.xml | 2 +- .../integration-tkmybatis-main/pom.xml | 2 +- .../plugin.properties | 2 +- .../integration-tkmybatis-plugin/pom.xml | 2 +- example/integration-tkmybatis/pom.xml | 2 +- example/pom.xml | 2 +- pom.xml | 2 +- springboot-plugin-framework-extension/pom.xml | 2 +- .../pom.xml | 4 +- .../README.md | 2 +- .../pom.xml | 4 +- .../README.md | 2 +- .../pom.xml | 4 +- springboot-plugin-framework/pom.xml | 2 +- ...PluginPipeApplicationContextProcessor.java | 74 ++------ .../bean/SpringBootConfigFileRegistrar.java | 160 ++++++++++++++++++ 45 files changed, 282 insertions(+), 112 deletions(-) create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java diff --git a/example/basic-example/basic-example-main/pom.xml b/example/basic-example/basic-example-main/pom.xml index eaf35d8..ee0dab8 100644 --- a/example/basic-example/basic-example-main/pom.xml +++ b/example/basic-example/basic-example-main/pom.xml @@ -13,14 +13,14 @@ com.gitee.starblues basic-example-main - 2.4.2-RELEASE + 2.4.3-RELEASE jar 2.7.0 2.3.2 1.6 - 2.4.2-RELEASE + 2.4.3-RELEASE diff --git a/example/basic-example/basic-example-runner/pom.xml b/example/basic-example/basic-example-runner/pom.xml index eec58e3..afc3e92 100644 --- a/example/basic-example/basic-example-runner/pom.xml +++ b/example/basic-example/basic-example-runner/pom.xml @@ -14,7 +14,7 @@ com.gitee.starblues basic-example-runner - 2.4.2-RELEASE + 2.4.3-RELEASE pom @@ -35,6 +35,13 @@ 2.4.5 provided + + + org.springframework.boot + spring-boot-starter-data-redis + 2.1.5.RELEASE + provided + \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin1/pom.xml b/example/basic-example/plugins/basic-example-plugin1/pom.xml index b0d705c..f541360 100644 --- a/example/basic-example/plugins/basic-example-plugin1/pom.xml +++ b/example/basic-example/plugins/basic-example-plugin1/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues basic-example-plugin-parent - 2.4.2-RELEASE + 2.4.3-RELEASE ../pom.xml basic-example-plugin1 - 2.4.2-RELEASE + 2.4.3-RELEASE jar @@ -31,6 +31,12 @@ spring-boot-starter-quartz 2.4.5 + + + org.springframework.boot + spring-boot-starter-data-redis + 2.1.5.RELEASE + diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java index 3053f27..978e69d 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java @@ -2,6 +2,7 @@ package com.basic.example.plugin1.config; import com.gitee.starblues.factory.process.pipe.PluginAutoConfigurationInstaller; import com.gitee.starblues.realize.AutoConfigurationSelector; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; /** @@ -13,5 +14,6 @@ public class AutoConfig implements AutoConfigurationSelector { @Override public void select(PluginAutoConfigurationInstaller installer) { installer.install(QuartzAutoConfiguration.class); + installer.install(RedisAutoConfiguration.class); } } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java index c997edc..0a7a77a 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java @@ -5,6 +5,10 @@ import com.gitee.starblues.realize.PluginUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; import javax.annotation.Resource; @@ -25,6 +29,23 @@ public class ConfigBean { return configBeanTest; } + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(factory); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key采用String的序列化方式 + template.setKeySerializer(stringRedisSerializer); + // hash的key也采用String的序列化方式 + template.setHashKeySerializer(stringRedisSerializer); + // value序列化方式采用jackson + template.setValueSerializer(new StringRedisSerializer()); + // hash的value序列化方式采用jackson + template.setHashValueSerializer(new StringRedisSerializer()); + template.afterPropertiesSet(); + return template; + } + public static class ConfigBeanTest{ private String name; private Integer age; diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java index 7712f52..b8dd1eb 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiOperation; import org.pf4j.PluginDescriptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -39,6 +40,8 @@ public class HelloPlugin1 { @Value("${c.configYmlValue}") private String configYmlValue; + + @GetMapping("plugin1") @ApiOperation(value = "hello", notes = "hello") public String sya(){ diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties index a6f0abe..16bfa60 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties @@ -1,5 +1,5 @@ plugin.id=basic-example-plugin1 plugin.class=com.basic.example.plugin1.DefinePlugin -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=StarBlues plugin.requires=1.2.6 \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml index b3e919f..84be0cc 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml @@ -1,2 +1,11 @@ c: - configYmlValue: zhangzhuo \ No newline at end of file + configYmlValue: zhangzhuo + +spring: + quartz: + auto-startup: false + startup-delay: 30 + redis: + host: 127.0.0.1 + port: 6379 + timeout: 10000 \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin2/pom.xml b/example/basic-example/plugins/basic-example-plugin2/pom.xml index e062aca..07ffe84 100644 --- a/example/basic-example/plugins/basic-example-plugin2/pom.xml +++ b/example/basic-example/plugins/basic-example-plugin2/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues basic-example-plugin-parent - 2.4.2-RELEASE + 2.4.3-RELEASE ../pom.xml basic-example-plugin2 - 2.4.2-RELEASE + 2.4.3-RELEASE jar diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties b/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties index 872974a..a32f052 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties @@ -1,4 +1,4 @@ plugin.id=basic-example-plugin2 plugin.class=com.basic.example.plugin2.DefinePlugin -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin3/pom.xml b/example/basic-example/plugins/basic-example-plugin3/pom.xml index 68ef69f..e2a246d 100644 --- a/example/basic-example/plugins/basic-example-plugin3/pom.xml +++ b/example/basic-example/plugins/basic-example-plugin3/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues basic-example-plugin-parent - 2.4.2-RELEASE + 2.4.3-RELEASE ../pom.xml basic-example-plugin3 - 2.4.2-RELEASE + 2.4.3-RELEASE jar diff --git a/example/basic-example/plugins/basic-example-plugin3/src/main/resources/plugin.properties b/example/basic-example/plugins/basic-example-plugin3/src/main/resources/plugin.properties index 403655e..9e5ecaf 100644 --- a/example/basic-example/plugins/basic-example-plugin3/src/main/resources/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin3/src/main/resources/plugin.properties @@ -1,4 +1,4 @@ plugin.id=basic-example-plugin3 plugin.class=com.basic.example.plugin3.DefinePlugin -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=sousouki \ No newline at end of file diff --git a/example/basic-example/plugins/pom.xml b/example/basic-example/plugins/pom.xml index b726741..4a77d7e 100644 --- a/example/basic-example/plugins/pom.xml +++ b/example/basic-example/plugins/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues basic-example-plugin-parent - 2.4.2-RELEASE + 2.4.3-RELEASE pom diff --git a/example/basic-example/pom.xml b/example/basic-example/pom.xml index 7c64445..34e4f10 100644 --- a/example/basic-example/pom.xml +++ b/example/basic-example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues basic-example - 2.4.2-RELEASE + 2.4.3-RELEASE pom 基本案例 diff --git a/example/integration-log/integration-log-main/pom.xml b/example/integration-log/integration-log-main/pom.xml index a77618a..c13c215 100644 --- a/example/integration-log/integration-log-main/pom.xml +++ b/example/integration-log/integration-log-main/pom.xml @@ -12,7 +12,7 @@ com.gitee.starblues - 2.4.2-RELEASE + 2.4.3-RELEASE integration-log-main jar 集成插件日志 案例--主程序 @@ -22,8 +22,8 @@ UTF-8 UTF-8 3.7.0 - 2.4.2-RELEASE - 2.4.2-RELEASE + 2.4.3-RELEASE + 2.4.3-RELEASE diff --git a/example/integration-log/plugins/integration-log-plugin/pom.xml b/example/integration-log/plugins/integration-log-plugin/pom.xml index 811013f..8100214 100644 --- a/example/integration-log/plugins/integration-log-plugin/pom.xml +++ b/example/integration-log/plugins/integration-log-plugin/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-log-plugin - 2.4.2-RELEASE + 2.4.3-RELEASE jar diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/resources/plugin.properties b/example/integration-log/plugins/integration-log-plugin/src/main/resources/plugin.properties index 15d57f1..ea83962 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/resources/plugin.properties +++ b/example/integration-log/plugins/integration-log-plugin/src/main/resources/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-log-plugin plugin.class=com.log.plugin.LogPlugin -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=sousouki \ No newline at end of file diff --git a/example/integration-log/pom.xml b/example/integration-log/pom.xml index 876a306..1185d46 100644 --- a/example/integration-log/pom.xml +++ b/example/integration-log/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-log - 2.4.2-RELEASE + 2.4.3-RELEASE pom 集成插件日志案例 diff --git a/example/integration-mybatis/integration-mybatis-main/pom.xml b/example/integration-mybatis/integration-mybatis-main/pom.xml index bde1828..78b0cbc 100644 --- a/example/integration-mybatis/integration-mybatis-main/pom.xml +++ b/example/integration-mybatis/integration-mybatis-main/pom.xml @@ -14,14 +14,14 @@ com.gitee.starblues integration-mybatis-main - 2.4.2-RELEASE + 2.4.3-RELEASE jar 主程序模块 - 2.4.2-RELEASE - 2.4.2-RELEASE - 2.4.2-RELEASE + 2.4.3-RELEASE + 2.4.3-RELEASE + 2.4.3-RELEASE 2.0.1 2.7.0 1.6 diff --git a/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml b/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml index b46cd85..25afa4d 100644 --- a/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml +++ b/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues integration-mybatis-plugin-parent - 2.4.2-RELEASE + 2.4.3-RELEASE pom diff --git a/example/integration-mybatis/integration-mybatis-runner/pom.xml b/example/integration-mybatis/integration-mybatis-runner/pom.xml index 3293e33..5b3ddd2 100644 --- a/example/integration-mybatis/integration-mybatis-runner/pom.xml +++ b/example/integration-mybatis/integration-mybatis-runner/pom.xml @@ -14,7 +14,7 @@ com.gitee.starblues integration-mybatis-runner - 2.4.2-RELEASE + 2.4.3-RELEASE jar 启动程序模块。将启动类配置到该模块下 diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml index 049828c..4ab5fe7 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues integration-mybatis-plugin-parent - 2.4.2-RELEASE + 2.4.3-RELEASE ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin1 - 2.4.2-RELEASE + 2.4.3-RELEASE jar diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties index 7626041..f067786 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatis-plugin1 plugin.class=com.mybatis.plugin1.ExamplePlugin1 -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties index 5c9d9ff..f21c81d 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatis-plugin2 plugin.class=com.mybatis.plugin2.ExamplePlugin2 -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml index bf03e5f..267a913 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues integration-mybatis-plugin-parent - 2.4.2-RELEASE + 2.4.3-RELEASE ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin2 - 2.4.2-RELEASE + 2.4.3-RELEASE jar diff --git a/example/integration-mybatis/pom.xml b/example/integration-mybatis/pom.xml index c82c1ae..9225b48 100644 --- a/example/integration-mybatis/pom.xml +++ b/example/integration-mybatis/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues integration-mybatis - 2.4.2-RELEASE + 2.4.3-RELEASE pom 集成mybatis案例 diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml b/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml index a8300ef..f72791f 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml +++ b/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues - 2.4.2-RELEASE + 2.4.3-RELEASE integration-mybatisplus-main jar 集成mybatis-plus 案例--主程序 @@ -27,8 +27,8 @@ 2.0.1 3.4.1 - 2.4.2-RELEASE - 2.4.2-RELEASE + 2.4.3-RELEASE + 2.4.3-RELEASE 2.7.0 1.6 diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties index 1af73e0..fc65477 100644 --- a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties +++ b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatisplus-plugin plugin.class=com.mybatisplus.plugin.MybatisPlusPlugin -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml index 943da61..3e8a5b1 100644 --- a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml +++ b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-mybatisplus-plugin - 2.4.2-RELEASE + 2.4.3-RELEASE jar diff --git a/example/integration-mybatisplus/pom.xml b/example/integration-mybatisplus/pom.xml index 3119395..78e52d7 100644 --- a/example/integration-mybatisplus/pom.xml +++ b/example/integration-mybatisplus/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-mybatisplus - 2.4.2-RELEASE + 2.4.3-RELEASE pom 集成mybatis-plus案例 diff --git a/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml b/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml index be29244..44f3208 100644 --- a/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml +++ b/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues - 2.4.2-RELEASE + 2.4.3-RELEASE integration-tkmybatis-main jar 集成mybatis-plus 案例--主程序 diff --git a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties index 55b6531..5a4d073 100644 --- a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties +++ b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-tkmybatis-plugin plugin.class=com.tkmybatis.plugin.TkMybatisPlugin -plugin.version=2.4.2-RELEASE +plugin.version=2.4.3-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml index b487766..e7d81ba 100644 --- a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml +++ b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-tkmybatis-plugin - 2.4.2-RELEASE + 2.4.3-RELEASE jar diff --git a/example/integration-tkmybatis/pom.xml b/example/integration-tkmybatis/pom.xml index e48c1f7..241b9a0 100644 --- a/example/integration-tkmybatis/pom.xml +++ b/example/integration-tkmybatis/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-tkmybatis - 2.4.2-RELEASE + 2.4.3-RELEASE pom 集成mybatis-plus案例 diff --git a/example/pom.xml b/example/pom.xml index a8acf4b..fc82283 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues springboot-plugin-framework-example - 2.4.2-RELEASE + 2.4.3-RELEASE pom diff --git a/pom.xml b/pom.xml index 2efd6ac..747da43 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues springboot-plugin-framework-parent pom - 2.4.2-RELEASE + 2.4.3-RELEASE spring boot 插件开发集成包 diff --git a/springboot-plugin-framework-extension/pom.xml b/springboot-plugin-framework-extension/pom.xml index 0c36083..32b896a 100644 --- a/springboot-plugin-framework-extension/pom.xml +++ b/springboot-plugin-framework-extension/pom.xml @@ -9,7 +9,7 @@ com.gitee.starblues springboot-plugin-framework-extension pom - 2.4.2-RELEASE + 2.4.3-RELEASE spring boot 插件式开发集成包--扩展模块 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml index 4738909..edc7d97 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml @@ -12,7 +12,7 @@ com.gitee.starblues springboot-plugin-framework-extension-log - 2.4.2-RELEASE + 2.4.3-RELEASE 插件扩展-日志模块扩展 @@ -62,7 +62,7 @@ 3.1.0 1.6 - 2.4.2-RELEASE + 2.4.3-RELEASE 5.0.7.RELEASE 1.2.3 1.2.17 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md index 5bfc4fb..382c251 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md @@ -211,7 +211,7 @@ public void oneselfConfig(Config config){ ## 版本说明 -### `2.4.2-RELEASE` 版本 +### `2.4.3-RELEASE` 版本 1. 新增`Mybatis`、`Mybatis-Plus`、`Tk-Mybatis`扩展新增可重写覆盖主程序的配置(重写后会当前插件私有, 不影响主程序) 2. 修复`Mybatis-Plus`批量插入的bug diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml index 5206794..b5229c0 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues springboot-plugin-framework-extension-mybatis - 2.4.2-RELEASE + 2.4.3-RELEASE jar 插件扩展-spring boot mybatis 集成扩展 @@ -64,7 +64,7 @@ 3.1.0 1.6 - 2.4.2-RELEASE + 2.4.3-RELEASE 2.0.1 3.4.1 2.1.5 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index 1e9b69b..7bd65b0 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -104,7 +104,7 @@ public class ResourceConfig implements SpringBootThymeleafConfig { ## 版本说明 -### `2.4.2-RELEASE` 版本 +### `2.4.3-RELEASE` 版本 1. 修复静态资源无法访问的bug #### `2.4.0-RELEASE` 版本 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml index 2b13e49..0d1960d 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues springboot-plugin-framework-extension-resources - 2.4.2-RELEASE + 2.4.3-RELEASE jar 插件扩展-通过url读取插件中的静态资源 @@ -69,7 +69,7 @@ 5.0.7.RELEASE 4.0.1 - 2.4.2-RELEASE + 2.4.3-RELEASE 2.0.3.RELEASE 2.1.1.RELEASE diff --git a/springboot-plugin-framework/pom.xml b/springboot-plugin-framework/pom.xml index fcda2b0..21f170c 100644 --- a/springboot-plugin-framework/pom.xml +++ b/springboot-plugin-framework/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues springboot-plugin-framework jar - 2.4.2-RELEASE + 2.4.3-RELEASE spring boot 插件式开发集成包 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index 6038f38..25b9621 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -1,5 +1,11 @@ package com.gitee.starblues.factory.process.pipe; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.TreeTraversingParser; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLParser; import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.*; @@ -8,15 +14,23 @@ import com.gitee.starblues.realize.AutoConfigurationSelector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.MutablePropertyValues; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.DefaultApplicationArguments; import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; +import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.boot.env.EnvironmentPostProcessorApplicationListener; +import org.springframework.boot.env.OriginTrackedMapPropertySource; import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.event.SmartApplicationListener; import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.PropertiesPropertySource; -import org.springframework.core.env.PropertySource; +import org.springframework.core.env.*; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; +import org.springframework.util.StringUtils; import java.io.IOException; import java.util.*; @@ -46,6 +60,7 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso pluginBeanDefinitionRegistrars.add(new ConfigFileBeanRegistrar(mainApplicationContext)); pluginBeanDefinitionRegistrars.add(new BasicBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new InvokeBeanRegistrar()); + pluginBeanDefinitionRegistrars.add(new SpringBootConfigFileRegistrar()); pluginBeanDefinitionRegistrars.addAll(ExtensionInitializer.getPluginBeanRegistrarExtends()); } @@ -59,7 +74,6 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { installPluginAutoConfiguration(pluginApplicationContext, pluginRegistryInfo); - registerPluginSpringBootConfigProcessor(pluginRegistryInfo, pluginApplicationContext); Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getPluginClassLoader()); pluginApplicationContext.refresh(); } finally { @@ -102,59 +116,7 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso pluginApplicationContext.registerBean(autoConfigurationClass); } } - /** - * 注册用于装载插件中springboot自带的配置文件 - * @param pluginRegistryInfo 插件注册信息 - */ - private void registerPluginSpringBootConfigProcessor(PluginRegistryInfo pluginRegistryInfo, GenericApplicationContext applicationContext) { - applicationContext.registerBean( - PluginConfigEnvironmentPostProcessor.class, - consumer->{ - consumer.getPropertyValues().add("pluginRegistryInfo", - pluginRegistryInfo); - }); - } - - - private static class PluginConfigEnvironmentPostProcessor implements EnvironmentPostProcessor { - - //Properties对象 - private final Properties properties = new Properties(); - private PluginRegistryInfo pluginRegistryInfo; - - public void setPluginRegistryInfo(PluginRegistryInfo pluginRegistryInfo) { - this.pluginRegistryInfo = pluginRegistryInfo; - } - @Override - public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { - ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginWrapper().getPluginClassLoader(); - String s = pluginRegistryInfo.getBasePlugin().springBootConfigFilePath(); - if(s == null){ - return; - } - Resource resource = new ClassPathResource( - s, pluginClassLoader - ); - //加载成PropertySource对象,并添加到Environment环境中 - environment.getPropertySources().addLast(loadProfiles(resource)); - } - - //加载单个配置文件 - private PropertySource loadProfiles(Resource resource) { - if (!resource.exists()) { - throw new IllegalArgumentException("资源" + resource + "不存在"); - } - try { - //从输入流中加载一个Properties对象 - properties.load(resource.getInputStream()); - return new PropertiesPropertySource(resource.getFilename(), properties); - }catch (IOException ex) { - throw new IllegalStateException("加载配置文件失败" + resource, ex); - } - } - - } @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java new file mode 100644 index 0000000..100950b --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java @@ -0,0 +1,160 @@ +package com.gitee.starblues.factory.process.pipe.bean; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.TreeTraversingParser; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLParser; +import com.gitee.starblues.factory.PluginRegistryInfo; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.env.*; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; + +import java.util.*; + +/** + * 插件互相调用的bean注册者 + * @author starBlues + * @version 2.4.3 + */ +public class SpringBootConfigFileRegistrar implements PluginBeanRegistrar{ + + private final YAMLFactory yamlFactory; + private final ObjectMapper objectMapper; + + private static final String[] PROP_FILE_SUFFIX = new String[]{".prop", ".PROP", ".properties", ".PROPERTIES"}; + private static final String[] YML_FILE_SUFFIX = new String[]{".yml", ".YML", "yaml", "YAML"}; + + public SpringBootConfigFileRegistrar(){ + yamlFactory = new YAMLFactory(); + objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + ConfigurableEnvironment environment = pluginRegistryInfo.getPluginApplicationContext().getEnvironment(); + //加载成PropertySource对象,并添加到Environment环境中 + List> propertySources = loadProfiles(pluginRegistryInfo); + if(ObjectUtils.isEmpty(propertySources)){ + return; + } + for (PropertySource propertySource : propertySources) { + environment.getPropertySources().addLast(propertySource); + } + } + + private List> loadProfiles(PluginRegistryInfo pluginRegistryInfo) throws Exception { + Resource resource = getResource(pluginRegistryInfo); + if(resource == null){ + return null; + } + String filename = resource.getFilename(); + if(ObjectUtils.isEmpty(filename)){ + return null; + } + List> propProfiles = null; + for (String propFileSuffix : PROP_FILE_SUFFIX) { + if(filename.endsWith(propFileSuffix)){ + propProfiles = getPropProfiles(resource, pluginRegistryInfo); + break; + } + } + for (String propFileSuffix : YML_FILE_SUFFIX) { + if(filename.endsWith(propFileSuffix)){ + propProfiles = getYmlProfiles(resource, pluginRegistryInfo); + break; + } + } + return propProfiles; + } + + private List> getYmlProfiles(Resource resource, + PluginRegistryInfo pluginRegistryInfo) throws Exception{ + YAMLParser yamlParser = yamlFactory.createParser(resource.getInputStream()); + final JsonNode node = objectMapper.readTree(yamlParser); + Map source = objectMapper.readValue(new TreeTraversingParser(node), + new TypeReference>(){}); + Map result = new HashMap<>(); + buildFlattenedMap(result, source, null); + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + return Collections.unmodifiableList( + Collections.singletonList(new MapPropertySource(pluginId + "-config", result)) + ); + } + + private List> getPropProfiles(Resource resource, + PluginRegistryInfo pluginRegistryInfo) throws Exception{ + Properties properties = new Properties(); + properties.load(resource.getInputStream()); + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + return Collections.unmodifiableList( + Collections.singletonList(new PropertiesPropertySource(pluginId + "-config", properties)) + ); + } + + private Resource getResource(PluginRegistryInfo pluginRegistryInfo){ + ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginWrapper().getPluginClassLoader(); + String springBootConfigFilePath = pluginRegistryInfo.getBasePlugin().springBootConfigFilePath(); + if(org.pf4j.util.StringUtils.isNullOrEmpty(springBootConfigFilePath)){ + return null; + } + Resource resource = new ClassPathResource( + springBootConfigFilePath, pluginClassLoader + ); + if (!resource.exists()) { + throw new IllegalArgumentException("资源" + resource + "不存在"); + } + return resource; + } + + private void buildFlattenedMap(Map result, + Map source, + @Nullable String path) { + source.forEach((key, value) -> { + if (StringUtils.hasText(path)) { + if (key.startsWith("[")) { + key = path + key; + } + else { + key = path + '.' + key; + } + } + if (value instanceof String) { + result.put(key, value); + } + else if (value instanceof Map) { + // Need a compound key + @SuppressWarnings("unchecked") + Map map = (Map) value; + buildFlattenedMap(result, map, key); + } + else if (value instanceof Collection) { + // Need a compound key + @SuppressWarnings("unchecked") + Collection collection = (Collection) value; + if (collection.isEmpty()) { + result.put(key, ""); + } + else { + int count = 0; + for (Object object : collection) { + buildFlattenedMap(result, Collections.singletonMap( + "[" + (count++) + "]", object), key); + } + } + } + else { + result.put(key, (value != null ? value : "")); + } + }); + } + +} -- Gitee From 90b7607aaeb347623bbd2dc9a84c710b5aebb4b4 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sun, 16 May 2021 13:55:35 +0800 Subject: [PATCH 08/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9log4j=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=BA2=E4=BB=A5=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic-example/basic-example-main/pom.xml | 17 ++ .../example/main/config/PluginBeanConfig.java | 3 + .../src/main/resources/application-dev.yml | 3 + .../src/main/resources/log4j.xml | 40 +++++ .../basic-example-runner/pom.xml | 30 ++++ .../basic/example/plugin1/job/QuartzJob1.java | 6 +- .../src/main/resources/log.xml | 10 ++ .../main/resources/pluginOfSpringBoot.prop | 6 + .../src/main/resources/pluginOfSpringBoot.yml | 15 +- .../pom.xml | 6 +- .../extension/log/log4j/Log4jLogRegistry.java | 169 ++++++++++++++---- 11 files changed, 269 insertions(+), 36 deletions(-) create mode 100644 example/basic-example/basic-example-main/src/main/resources/log4j.xml create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/resources/log.xml create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop diff --git a/example/basic-example/basic-example-main/pom.xml b/example/basic-example/basic-example-main/pom.xml index ee0dab8..f2ca1d9 100644 --- a/example/basic-example/basic-example-main/pom.xml +++ b/example/basic-example/basic-example-main/pom.xml @@ -30,9 +30,26 @@ ${springboot-plugin-framework.version} + + com.gitee.starblues + springboot-plugin-framework-extension-log + ${springboot-plugin-framework.version} + + org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + + org.springframework.boot + spring-boot-starter-log4j2 diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java index 0deb6fa..3f9990d 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java @@ -1,5 +1,6 @@ package com.basic.example.main.config; +import com.gitee.starblues.extension.log.SpringBootLogExtension; import com.gitee.starblues.extension.support.SpringDocControllerProcessor; import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.application.AutoPluginApplication; @@ -27,6 +28,8 @@ public class PluginBeanConfig { AutoPluginApplication autoPluginApplication = new AutoPluginApplication(); autoPluginApplication.setPluginInitializerListener(pluginListener); autoPluginApplication.addListener(ExamplePluginListener.class); + // 添加插件log4j支持 + autoPluginApplication.addExtension(new SpringBootLogExtension(SpringBootLogExtension.Type.LOG4J)); return autoPluginApplication; } diff --git a/example/basic-example/basic-example-main/src/main/resources/application-dev.yml b/example/basic-example/basic-example-main/src/main/resources/application-dev.yml index 5586028..c748bc0 100644 --- a/example/basic-example/basic-example-main/src/main/resources/application-dev.yml +++ b/example/basic-example/basic-example-main/src/main/resources/application-dev.yml @@ -1,6 +1,9 @@ server: port: 8080 +logging: + config: classpath:log4j.xml + plugin: runMode: dev pluginPath: ./example/basic-example/plugins diff --git a/example/basic-example/basic-example-main/src/main/resources/log4j.xml b/example/basic-example/basic-example-main/src/main/resources/log4j.xml new file mode 100644 index 0000000..b573b5c --- /dev/null +++ b/example/basic-example/basic-example-main/src/main/resources/log4j.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/basic-example/basic-example-runner/pom.xml b/example/basic-example/basic-example-runner/pom.xml index afc3e92..64d91c2 100644 --- a/example/basic-example/basic-example-runner/pom.xml +++ b/example/basic-example/basic-example-runner/pom.xml @@ -27,6 +27,16 @@ basic-example-main ${project.version} provided + + + org.springframework.boot + spring-boot-starter-logging + + + ch.qos.logback + logback-classic + + @@ -34,6 +44,16 @@ spring-boot-starter-quartz 2.4.5 provided + + + org.springframework.boot + spring-boot-starter-logging + + + ch.qos.logback + logback-classic + + @@ -41,6 +61,16 @@ spring-boot-starter-data-redis 2.1.5.RELEASE provided + + + org.springframework.boot + spring-boot-starter-logging + + + ch.qos.logback + logback-classic + + diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java index 85f1770..8abae63 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/job/QuartzJob1.java @@ -2,6 +2,8 @@ package com.basic.example.plugin1.job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.scheduling.quartz.QuartzJobBean; import java.text.SimpleDateFormat; @@ -14,11 +16,13 @@ import java.util.Date; **/ public class QuartzJob1 extends QuartzJobBean { + private Logger logger = LoggerFactory.getLogger(QuartzJob1.class); + @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - System.out.println("QuartzJob1----" + sdf.format(new Date())); + logger.info("QuartzJob1---{}", sdf.format(new Date())); } } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/log.xml b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/log.xml new file mode 100644 index 0000000..b9796c9 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/log.xml @@ -0,0 +1,10 @@ + + + ~\logs\ + current + INFO + 10MB + 10GB + 30 + %d{yyyy-MM-dd HH:mm:ss.SSS} -%5p --- [%t] %-40.40logger{39} : %m%n + \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop new file mode 100644 index 0000000..73ee5f3 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop @@ -0,0 +1,6 @@ +c.configYmlValue=test +spring.quartz.autoStartup=false +spring.quartz.startupDelay=30 +spring.redis.host=127.0.0.1 +spring.redis.port=6379 +spring.redis.timeout=10000 \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml index 84be0cc..24f458d 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml @@ -1,11 +1,22 @@ c: - configYmlValue: zhangzhuo + configYmlValue: test + +logging-config: classpath:log.xml + spring: quartz: auto-startup: false startup-delay: 30 - redis: + scheduler-name: custom-plugin-scheduler + properties: + org: + quartz: + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 1 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true host: 127.0.0.1 port: 6379 timeout: 10000 \ No newline at end of file diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml index edc7d97..f6457b1 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml @@ -65,7 +65,7 @@ 2.4.3-RELEASE 5.0.7.RELEASE 1.2.3 - 1.2.17 + 2.14.1 @@ -76,8 +76,8 @@ provided - log4j - log4j + org.apache.logging.log4j + log4j-core ${log4j.version} provided diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java index 5fa9f69..3f05a23 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java @@ -1,18 +1,28 @@ package com.gitee.starblues.extension.log.log4j; -import ch.qos.logback.core.util.OptionHelper; +import ch.qos.logback.core.spi.FilterReply; import com.gitee.starblues.extension.log.LogRegistry; import com.gitee.starblues.extension.log.config.LogConfig; import com.gitee.starblues.extension.log.logback.LogbackLogRegistry; import com.gitee.starblues.extension.log.util.LogConfigUtil; import com.gitee.starblues.factory.PluginRegistryInfo; -import org.apache.log4j.*; -import org.apache.log4j.spi.Filter; -import org.apache.log4j.spi.LoggingEvent; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.core.*; +import org.apache.logging.log4j.core.appender.RollingFileAppender; +import org.apache.logging.log4j.core.appender.rolling.*; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.DefaultConfiguration; +import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.core.filter.AbstractFilter; +import org.apache.logging.log4j.core.layout.PatternLayout; +import org.apache.logging.log4j.message.Message; import org.pf4j.PluginWrapper; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; +import java.nio.charset.Charset; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -29,7 +39,9 @@ public class Log4jLogRegistry implements LogRegistry { @Override public void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception { PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - Logger rootLogger = LogManager.getRootLogger(); + LoggerContext loggerContext = (LoggerContext)LogManager.getContext(false); + Configuration configuration = loggerContext.getConfiguration(); + LoggerConfig rootLogger = configuration.getRootLogger(); Set allAppender = new HashSet<>(); for (Resource resource : resources) { if(resource == null || !resource.exists()){ @@ -44,7 +56,8 @@ public class Log4jLogRegistry implements LogRegistry { } Set appenderSet = getAppender(pluginRegistryInfo, logConfig); for (Appender appender : appenderSet) { - rootLogger.addAppender(appender); + configuration.addAppender(appender); + rootLogger.addAppender(appender, Level.ALL, null); allAppender.add(appender); } } @@ -54,28 +67,36 @@ public class Log4jLogRegistry implements LogRegistry { private Set getAppender(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig){ PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - String packageName = pluginRegistryInfo.getBasePlugin().scanPackage(); - RollingFileAppender appender = new RollingFileAppender(); - appender.addFilter(new Filter() { - @Override - public int decide(LoggingEvent event) { - if (event.getLoggerName().startsWith(packageName)) { - return Filter.ACCEPT; - } - return Filter.DENY; - } - }); - String logFilePrefix = LogConfigUtil.getLogFile(pluginWrapper, logConfig); - appender.setName(pluginWrapper.getPluginId()); - appender.setFile(logFilePrefix.concat(".log")); - appender.setMaxFileSize(logConfig.getMaxFileSize()); - appender.setAppend(true); - appender.setMaxBackupIndex(logConfig.getMaxHistory()); - appender.setThreshold(Level.toLevel(logConfig.getLevel())); - PatternLayout patternLayout = new PatternLayout(); - patternLayout.setConversionPattern(logConfig.getPattern()); - appender.setLayout(patternLayout); - appender.activateOptions(); + Filter filter = new LogFilter(pluginRegistryInfo.getBasePlugin().scanPackage()); + PatternLayout patternLayout = PatternLayout.newBuilder() + .withPattern(logConfig.getPattern()) + .withCharset(Charset.defaultCharset()) + .build(); + + final TriggeringPolicy policy = SizeBasedTriggeringPolicy.createPolicy( + logConfig.getMaxFileSize() + ); + + RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder() + .withFileIndex(logConfig.getTotalFileSize()) + .withConfig(new DefaultConfiguration()) + .build(); + + RollingFileAppender appender = RollingFileAppender.newBuilder() + .withFilter(filter) + .withName(pluginWrapper.getPluginId()) + .withLayout(patternLayout) + .withIgnoreExceptions(false) + .withFileName(LogConfigUtil.getLogFile(pluginWrapper, logConfig)) + .withFilePattern(".%d{yyyy-MM-dd}%i.log") + .withAppend(true) + .withPolicy(policy) + .withStrategy(strategy) + .build(); + + appender.start(); + filter.start(); + return Collections.singleton(appender); } @@ -85,9 +106,97 @@ public class Log4jLogRegistry implements LogRegistry { if(allAppender == null || allAppender.isEmpty()){ return; } - Logger rootLogger = LogManager.getRootLogger(); + LoggerContext loggerContext = (LoggerContext)LogManager.getContext(false); + Configuration configuration = loggerContext.getConfiguration(); for (Appender appender : allAppender) { - rootLogger.removeAppender(appender); + configuration.getAppenders().remove(appender.getName()); } } + + private static class LogFilter extends AbstractFilter{ + + private final String packageName; + + private LogFilter(String packageName) { + this.packageName = packageName; + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8, Object p9) { + return filter(logger.getName()); + } + + @Override + public Result filter(LogEvent event) { + return filter(event.getLoggerName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7) { + return filter(logger.getName()); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, Object p7, Object p8) { + return filter(logger.getName()); + } + + private Result filter(String loggerName){ + if (loggerName.startsWith(packageName)) { + return Result.ACCEPT; + } + return Result.DENY; + } + } + } -- Gitee From 8125164f88ea85b06a95b458e58748fe329d3beb Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sun, 16 May 2021 19:18:01 +0800 Subject: [PATCH 09/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=B3=A8=E5=86=8C=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/basic/example/main/ExampleMain.java | 2 -- .../extension/log/log4j/Log4jLogRegistry.java | 25 ++++++++++++++----- .../log/logback/LogbackLogRegistry.java | 2 +- ...PluginPipeApplicationContextProcessor.java | 2 +- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java index 8ad6f35..af90c79 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java @@ -16,6 +16,4 @@ public class ExampleMain { } - - } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java index 3f05a23..fe597a0 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java @@ -13,8 +13,10 @@ import org.apache.logging.log4j.core.*; import org.apache.logging.log4j.core.appender.RollingFileAppender; import org.apache.logging.log4j.core.appender.rolling.*; import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.config.DefaultConfiguration; import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory; import org.apache.logging.log4j.core.filter.AbstractFilter; import org.apache.logging.log4j.core.layout.PatternLayout; import org.apache.logging.log4j.message.Message; @@ -22,6 +24,10 @@ import org.pf4j.PluginWrapper; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; import java.nio.charset.Charset; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -57,7 +63,7 @@ public class Log4jLogRegistry implements LogRegistry { Set appenderSet = getAppender(pluginRegistryInfo, logConfig); for (Appender appender : appenderSet) { configuration.addAppender(appender); - rootLogger.addAppender(appender, Level.ALL, null); + rootLogger.addAppender(appender, Level.toLevel(logConfig.getLevel()), null); allAppender.add(appender); } } @@ -73,13 +79,18 @@ public class Log4jLogRegistry implements LogRegistry { .withCharset(Charset.defaultCharset()) .build(); - final TriggeringPolicy policy = SizeBasedTriggeringPolicy.createPolicy( - logConfig.getMaxFileSize() - ); + final TriggeringPolicy policy = + CompositeTriggeringPolicy.createPolicy( + SizeBasedTriggeringPolicy.createPolicy( + logConfig.getMaxFileSize() + ), + TimeBasedTriggeringPolicy.createPolicy("1", "true") + ); RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder() .withFileIndex(logConfig.getTotalFileSize()) .withConfig(new DefaultConfiguration()) + .withMax(String.valueOf(logConfig.getMaxHistory())) .build(); RollingFileAppender appender = RollingFileAppender.newBuilder() @@ -87,8 +98,8 @@ public class Log4jLogRegistry implements LogRegistry { .withName(pluginWrapper.getPluginId()) .withLayout(patternLayout) .withIgnoreExceptions(false) - .withFileName(LogConfigUtil.getLogFile(pluginWrapper, logConfig)) - .withFilePattern(".%d{yyyy-MM-dd}%i.log") + .withFileName(LogConfigUtil.getLogFile(pluginWrapper, logConfig).concat(".log")) + .withFilePattern(".%d{yyyy-MM-dd}%-i.log") .withAppend(true) .withPolicy(policy) .withStrategy(strategy) @@ -199,4 +210,6 @@ public class Log4jLogRegistry implements LogRegistry { } } + + } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java index 70e63ff..6a33ee4 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java @@ -143,7 +143,7 @@ public class LogbackLogRegistry implements LogRegistry { SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy<>(); - String fp = OptionHelper.substVars(logFilePrefix.concat(".%d{yyyy-MM-dd}%i.log"), context); + String fp = OptionHelper.substVars(logFilePrefix.concat(".%d{yyyy-MM-dd}%-i.log"), context); policy.setMaxFileSize(FileSize.valueOf(logConfig.getMaxFileSize())); policy.setFileNamePattern(fp); policy.setMaxHistory(logConfig.getMaxHistory()); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index 25b9621..c6bf6ad 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -55,12 +55,12 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso @Override public void initialize() throws Exception { + pluginBeanDefinitionRegistrars.add(new SpringBootConfigFileRegistrar()); pluginBeanDefinitionRegistrars.add(new PluginInsetBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigFileBeanRegistrar(mainApplicationContext)); pluginBeanDefinitionRegistrars.add(new BasicBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new InvokeBeanRegistrar()); - pluginBeanDefinitionRegistrars.add(new SpringBootConfigFileRegistrar()); pluginBeanDefinitionRegistrars.addAll(ExtensionInitializer.getPluginBeanRegistrarExtends()); } -- Gitee From 0379d96ce08fab660c06a76f1d2d0695fe4e3d0e Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 20 May 2021 16:56:16 +0800 Subject: [PATCH 10/23] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E9=92=88=E5=AF=B9springboot=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/example/plugin1/DefinePlugin.java | 7 +- .../example/plugin1/config/ConfigBean.java | 3 +- .../plugin1/config/SpringConfigBean.java | 64 +++++++++++ .../example/plugin1/rest/HelloPlugin1.java | 15 ++- .../main/resources/pluginOfSpringBoot.prop | 6 -- .../src/main/resources/pluginOfSpringBoot.yml | 25 ++++- .../main/java/com/log/plugin/LogPlugin.java | 4 - .../java/com/log/plugin/config/Config.java | 2 - .../log/PluginLogConfigProcessor.java | 45 +++----- .../starblues/extension/log/PropertyKey.java | 11 ++ .../log/config/SpringBootLogConfig.java | 19 ---- .../PluginResourceResolverProcess.java | 24 ++++- .../extension/resources/PropertyKey.java | 16 +++ .../resources/StaticResourceConfig.java | 8 +- .../resolver/PluginResourceResolver.java | 13 +-- .../annotation/ConfigDefinition.java | 1 + ...PluginPipeApplicationContextProcessor.java | 31 +----- .../pipe/bean/ConfigFileBeanRegistrar.java | 50 +-------- .../bean/SpringBootConfigFileRegistrar.java | 101 ++++++++++++------ .../classs/group/ConfigDefinitionGroup.java | 4 + .../loader/load/PluginConfigFileLoader.java | 1 - .../gitee/starblues/realize/BasePlugin.java | 8 -- .../starblues/utils/PluginConfigUtils.java | 57 ++++++++++ .../starblues/utils/PluginFileUtils.java | 4 + .../starblues/utils/PluginOperatorInfo.java | 2 +- 25 files changed, 322 insertions(+), 199 deletions(-) create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/SpringConfigBean.java delete mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java delete mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java index 34b2825..9a4ee5a 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/DefinePlugin.java @@ -1,5 +1,6 @@ package com.basic.example.plugin1; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.PluginWrapper; @@ -9,6 +10,7 @@ import org.pf4j.PluginWrapper; * @author starBlues * @version 1.0 */ +@ConfigDefinition(fileName = "pluginOfSpringBoot.yml") public class DefinePlugin extends BasePlugin { public DefinePlugin(PluginWrapper wrapper) { super(wrapper); @@ -28,9 +30,4 @@ public class DefinePlugin extends BasePlugin { protected void stopEvent() { } - - @Override - public String springBootConfigFilePath() { - return "pluginOfSpringBoot.yml"; - } } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java index 0a7a77a..f7e89aa 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java @@ -13,7 +13,8 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; import javax.annotation.Resource; /** - * @author starBlues + * + * * @version 1.0 */ @Configuration diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/SpringConfigBean.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/SpringConfigBean.java new file mode 100644 index 0000000..d95257e --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/SpringConfigBean.java @@ -0,0 +1,64 @@ +package com.basic.example.plugin1.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * @author zhangzhuo + * @version 1.0 + * @since 2021-05-20 + */ +@Component +@ConfigurationProperties(prefix = "spring-config") +public class SpringConfigBean { + + private String name; + private Integer age; + private String sex; + private List list; + private Map map; + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java index b8dd1eb..142b41f 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java @@ -2,6 +2,7 @@ package com.basic.example.plugin1.rest; import com.basic.example.plugin1.config.ConfigBean; import com.basic.example.plugin1.config.PluginConfig1; +import com.basic.example.plugin1.config.SpringConfigBean; import com.basic.example.plugin1.service.HelloService; import com.gitee.starblues.realize.PluginUtils; import io.swagger.annotations.Api; @@ -9,7 +10,9 @@ import io.swagger.annotations.ApiOperation; import org.pf4j.PluginDescriptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -40,6 +43,11 @@ public class HelloPlugin1 { @Value("${c.configYmlValue}") private String configYmlValue; + @Autowired + private SpringConfigBean springConfigBean; + + @Autowired + private ApplicationContext applicationContext; @GetMapping("plugin1") @@ -76,4 +84,9 @@ public class HelloPlugin1 { return configBeanTest; } + @GetMapping("spring-config") + public SpringConfigBean getSpringConfigBean(){ + return springConfigBean; + } + } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop deleted file mode 100644 index 73ee5f3..0000000 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.prop +++ /dev/null @@ -1,6 +0,0 @@ -c.configYmlValue=test -spring.quartz.autoStartup=false -spring.quartz.startupDelay=30 -spring.redis.host=127.0.0.1 -spring.redis.port=6379 -spring.redis.timeout=10000 \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml index 24f458d..80d5fb9 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml @@ -19,4 +19,27 @@ spring: threadsInheritContextClassLoaderOfInitializingThread: true host: 127.0.0.1 port: 6379 - timeout: 10000 \ No newline at end of file + timeout: 10000 + +logConfigLocation: classpath:log.xml + +list: + - a + - n + - c + +map: + a: 1 + b: 2 + +spring-config: + name: starblues + age: 26 + sex: 男 + list: + - a + - b + - c + map: + a: 1 + b: 2 diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java index 36d6174..f165a16 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java +++ b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java @@ -1,12 +1,8 @@ package com.log.plugin; -import com.gitee.starblues.extension.log.config.SpringBootLogConfig; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.PluginWrapper; -import java.util.HashSet; -import java.util.Set; - /** * description * diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java index f2a6c0b..1e30f21 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java +++ b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java @@ -1,9 +1,7 @@ package com.log.plugin.config; import com.gitee.starblues.annotation.ConfigDefinition; -import com.gitee.starblues.extension.log.config.SpringBootLogConfig; -import java.util.Collections; import java.util.HashSet; import java.util.Set; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java index 9276eb3..479242b 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java @@ -1,24 +1,21 @@ package com.gitee.starblues.extension.log; -import com.gitee.starblues.extension.log.config.SpringBootLogConfig; import com.gitee.starblues.extension.log.log4j.Log4jLogRegistry; import com.gitee.starblues.extension.log.logback.LogbackLogRegistry; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.utils.OrderPriority; import com.gitee.starblues.utils.ResourceUtils; -import com.gitee.starblues.utils.SpringBeanUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.util.ObjectUtils; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Set; /** * 接口处理者 @@ -27,8 +24,6 @@ import java.util.Set; */ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { - private Logger log = LoggerFactory.getLogger(PluginLogConfigProcessor.class); - private final LogRegistry logRegistry; public PluginLogConfigProcessor(SpringBootLogExtension.Type type){ @@ -78,40 +73,28 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { /** * 加载日志配置文件资源 + * 文件路径配置为

file:D://log.xml


+ * resources路径配置为

classpath:log.xml


* @param pluginRegistryInfo 当前插件注册的信息 * @throws IOException 获取不到配置文件异常 **/ private List getLogConfigFile(PluginRegistryInfo pluginRegistryInfo) throws IOException { - SpringBootLogConfig config = SpringBeanUtils.getObjectByInterfaceClass( - pluginRegistryInfo.getConfigSingletons(), - SpringBootLogConfig.class); - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - - if(config == null){ - log.warn("Not found 'SpringBootLogConfig' in plugin[{}]. " + - "If you need to use log in the plugin, " + - "Please implements 'SpringBootLogConfig' interface", pluginId); - return null; - } - Set logConfigLocations = config.logConfigLocations(); - if (logConfigLocations == null || logConfigLocations.isEmpty()) { - log.warn("SpringBootLogConfig -> logConfigLocations return is empty in plugin[{}], " + - "Please check configuration", pluginId); + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + String logConfigLocation = pluginApplicationContext.getEnvironment().getProperty(PropertyKey.LOG_CONFIG_LOCATION); + if (ObjectUtils.isEmpty(logConfigLocation)) { return null; } ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(pluginRegistryInfo.getPluginClassLoader()); List resources = new ArrayList<>(); - for (String logConfigLocation : logConfigLocations) { - String matchLocation = ResourceUtils.getMatchLocation(logConfigLocation); - if (matchLocation == null || "".equals(matchLocation)) { - continue; - } - Resource[] logConfigResources = resourcePatternResolver.getResources(matchLocation); - if (logConfigResources.length != 0) { - resources.addAll(Arrays.asList(logConfigResources)); - } + String matchLocation = ResourceUtils.getMatchLocation(logConfigLocation); + if (matchLocation == null || "".equals(matchLocation)) { + return null; + } + Resource[] logConfigResources = resourcePatternResolver.getResources(matchLocation); + if (logConfigResources.length != 0) { + resources.addAll(Arrays.asList(logConfigResources)); } return resources; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java new file mode 100644 index 0000000..63a4208 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java @@ -0,0 +1,11 @@ +package com.gitee.starblues.extension.log; + +/** + * @author zhangzhuo + * @version 2.4.3 + */ +public class PropertyKey { + + public final static String LOG_CONFIG_LOCATION = "plugin.logConfigLocation"; + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java deleted file mode 100644 index e0a3df9..0000000 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/config/SpringBootLogConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gitee.starblues.extension.log.config; - -import java.util.Set; - -/** - * 日志配置 - * @author sousouki - * @version 2.4.3 - */ -public interface SpringBootLogConfig { - - /** - * 日志xml配置文件的路径 - * 文件路径配置为

file:D://log.xml


- * resources路径配置为

classpath:log.xml


- * @return Set - */ - Set logConfigLocations(); -} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java index bf1c431..6ed1faa 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java @@ -7,8 +7,14 @@ import com.gitee.starblues.utils.OrderPriority; import com.gitee.starblues.utils.SpringBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.util.ObjectUtils; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * 插件资源处理器 @@ -48,13 +54,21 @@ public class PluginResourceResolverProcess implements PluginPostProcessorExtend } String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); try { - StaticResourceConfig config = SpringBeanUtils.getObjectByInterfaceClass( - pluginRegistryInfo.getConfigSingletons(), - StaticResourceConfig.class); - if(config == null){ + // 直接从配置文件获取, 后续版本移除从实现类中获取配置 + ConfigurableEnvironment environment = pluginRegistryInfo.getPluginApplicationContext().getEnvironment(); + Set locations = Binder.get(environment).bind(PropertyKey.LOG_CONFIG_LOCATION, Bindable.setOf(String.class)).get(); + if(ObjectUtils.isEmpty(locations)){ + StaticResourceConfig config = SpringBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), + StaticResourceConfig.class); + if(config != null){ + locations = config.locations(); + } + } + if(ObjectUtils.isEmpty(locations)){ return; } - PluginResourceResolver.parse(pluginRegistryInfo, config); + PluginResourceResolver.parse(pluginRegistryInfo, locations); } catch (Exception e){ LOGGER.error("Parse plugin '{}' static resource failure.", pluginId, e); } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java new file mode 100644 index 0000000..7d21e8f --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java @@ -0,0 +1,16 @@ +package com.gitee.starblues.extension.resources; + +/** + * @author zhangzhuo + * @version 2.4.3 + */ +public class PropertyKey { + + /** + * 静态文件路径 + * classpath: static/ + * file: D://path/test + */ + public final static String LOG_CONFIG_LOCATION = "plugin.static.locations"; + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java index aba9f42..917a9f4 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java @@ -4,10 +4,16 @@ import java.util.Set; /** * 插件静态资源的配置 - * + * 建议从配置文件中进行配置: + * plugin: + * static: + * locations: + * - classpath: static/ + * - file: D://path/test * @author starBlues * @version 2.3 */ +@Deprecated public interface StaticResourceConfig { diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java index 182ea6e..1a8d2b1 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java @@ -194,17 +194,10 @@ public class PluginResourceResolver extends AbstractResourceResolver { /** * 每新增一个插件, 都需要调用该方法,来解析该插件的 StaticResourceConfig 配置。并将其保存到 StaticResourceConfig bean 中。 * @param pluginRegistryInfo 插件信息 - * @param staticResourceConfig 静态资源配置 + * @param locations 静态资源配置 */ public static synchronized void parse(PluginRegistryInfo pluginRegistryInfo, - StaticResourceConfig staticResourceConfig){ - if(pluginRegistryInfo == null || staticResourceConfig == null){ - return; - } - - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - - Set locations = staticResourceConfig.locations(); + Set locations){ if(locations == null || locations.isEmpty()){ return; } @@ -212,6 +205,8 @@ public class PluginResourceResolver extends AbstractResourceResolver { Set classPaths = new HashSet<>(); Set filePaths = new HashSet<>(); + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + for (String location : locations) { if(StringUtils.isEmpty(location)){ continue; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java index 2b47718..84dc677 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java @@ -32,6 +32,7 @@ public @interface ConfigDefinition { * 自定义 bean 名称 * @return String */ + @Deprecated String beanName() default ""; /** diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index c6bf6ad..dc4cff9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -1,11 +1,5 @@ package com.gitee.starblues.factory.process.pipe; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.TreeTraversingParser; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLParser; import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.*; @@ -13,27 +7,13 @@ import com.gitee.starblues.factory.process.pipe.classs.group.AutoConfigurationSe import com.gitee.starblues.realize.AutoConfigurationSelector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.MutablePropertyValues; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.DefaultApplicationArguments; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; -import org.springframework.boot.context.event.ApplicationPreparedEvent; -import org.springframework.boot.env.EnvironmentPostProcessor; -import org.springframework.boot.env.EnvironmentPostProcessorApplicationListener; -import org.springframework.boot.env.OriginTrackedMapPropertySource; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.event.SmartApplicationListener; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.env.*; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.lang.Nullable; -import org.springframework.util.StringUtils; -import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; /** * 插件的ApplicationContext 处理 @@ -55,7 +35,7 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso @Override public void initialize() throws Exception { - pluginBeanDefinitionRegistrars.add(new SpringBootConfigFileRegistrar()); + pluginBeanDefinitionRegistrars.add(new SpringBootConfigFileRegistrar(mainApplicationContext)); pluginBeanDefinitionRegistrars.add(new PluginInsetBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigFileBeanRegistrar(mainApplicationContext)); @@ -74,7 +54,6 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { installPluginAutoConfiguration(pluginApplicationContext, pluginRegistryInfo); - Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getPluginClassLoader()); pluginApplicationContext.refresh(); } finally { Thread.currentThread().setContextClassLoader(contextClassLoader); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java index ecfb5aa..183afc1 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java @@ -10,13 +10,11 @@ import com.gitee.starblues.factory.process.pipe.classs.group.ConfigDefinitionGro import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.realize.ConfigDefinitionTip; import com.gitee.starblues.utils.ClassUtils; -import org.pf4j.RuntimeMode; +import com.gitee.starblues.utils.PluginConfigUtils; import org.pf4j.util.StringUtils; -import org.springframework.beans.BeanUtils; import org.springframework.context.ApplicationContext; import org.springframework.util.ReflectionUtils; -import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.util.List; @@ -53,15 +51,14 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { * 注册配置文件 * @param pluginRegistryInfo 插件注册的信息 * @param aClass 配置文件类 - * @return 注册的bean名称 * @throws Exception Exception */ - private String registry(PluginRegistryInfo pluginRegistryInfo, Class aClass) throws Exception{ + private void registry(PluginRegistryInfo pluginRegistryInfo, Class aClass) throws Exception{ ConfigDefinition configDefinition = aClass.getAnnotation(ConfigDefinition.class); if(configDefinition == null){ - return null; + return; } - String fileName = getConfigFileName(configDefinition); + String fileName = PluginConfigUtils.getConfigFileName(configDefinition, integrationConfiguration.environment()); Object parseObject = null; if(!StringUtils.isNullOrEmpty(fileName)){ PluginConfigDefinition pluginConfigDefinition = @@ -81,7 +78,6 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { setConfigDefinitionTip(pluginRegistryInfo, parseObject); springBeanRegister.registerSingleton(name, parseObject); pluginRegistryInfo.addConfigSingleton(parseObject); - return name; } /** @@ -100,42 +96,4 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { } } - /** - * 根据项目运行环境模式来获取配置文件 - * @param configDefinition 配置的注解 - * @return 文件名称 - */ - private String getConfigFileName(ConfigDefinition configDefinition){ - // TODO 后期移除 value - String fileName = configDefinition.value(); - if(StringUtils.isNullOrEmpty(fileName)){ - fileName = configDefinition.fileName(); - if(StringUtils.isNullOrEmpty(fileName)){ - return null; - } - } - - String fileNamePrefix; - String fileNamePrefixSuffix; - - if(fileName.lastIndexOf(".") == -1) { - fileNamePrefix = fileName; - fileNamePrefixSuffix = ""; - } else { - int index = fileName.lastIndexOf("."); - fileNamePrefix = fileName.substring(0, index); - fileNamePrefixSuffix = fileName.substring(index); - } - - RuntimeMode environment = integrationConfiguration.environment(); - if(environment == RuntimeMode.DEPLOYMENT){ - // 生产环境 - fileNamePrefix = fileNamePrefix + configDefinition.prodSuffix(); - } else if(environment == RuntimeMode.DEVELOPMENT){ - // 开发环境 - fileNamePrefix = fileNamePrefix + configDefinition.devSuffix(); - } - return fileNamePrefix + fileNamePrefixSuffix; - } - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java index 100950b..7469fe8 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java @@ -7,10 +7,21 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.TreeTraversingParser; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.dataformat.yaml.YAMLParser; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.factory.PluginRegistryInfo; -import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.env.*; -import org.springframework.core.io.ClassPathResource; +import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; +import com.gitee.starblues.factory.process.pipe.loader.load.PluginConfigFileLoader; +import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.utils.PluginConfigUtils; +import org.pf4j.RuntimeMode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; @@ -25,13 +36,22 @@ import java.util.*; */ public class SpringBootConfigFileRegistrar implements PluginBeanRegistrar{ + private final Logger logger = LoggerFactory.getLogger(SpringBootConfigFileRegistrar.class); + private final YAMLFactory yamlFactory; private final ObjectMapper objectMapper; private static final String[] PROP_FILE_SUFFIX = new String[]{".prop", ".PROP", ".properties", ".PROPERTIES"}; private static final String[] YML_FILE_SUFFIX = new String[]{".yml", ".YML", "yaml", "YAML"}; - public SpringBootConfigFileRegistrar(){ + public static final String CONFIG_PROP = "PLUGIN_SPRING_BOOT_CONFIG-"; + + + private final IntegrationConfiguration integrationConfiguration; + + public SpringBootConfigFileRegistrar(ApplicationContext mainApplicationContext){ + integrationConfiguration = + mainApplicationContext.getBean(IntegrationConfiguration.class); yamlFactory = new YAMLFactory(); objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); @@ -52,27 +72,44 @@ public class SpringBootConfigFileRegistrar implements PluginBeanRegistrar{ } private List> loadProfiles(PluginRegistryInfo pluginRegistryInfo) throws Exception { - Resource resource = getResource(pluginRegistryInfo); - if(resource == null){ + List resources = getResource(pluginRegistryInfo); + if(ObjectUtils.isEmpty(resources)){ return null; } - String filename = resource.getFilename(); - if(ObjectUtils.isEmpty(filename)){ - return null; - } - List> propProfiles = null; - for (String propFileSuffix : PROP_FILE_SUFFIX) { - if(filename.endsWith(propFileSuffix)){ - propProfiles = getPropProfiles(resource, pluginRegistryInfo); + List> propProfiles = new ArrayList<>(); + for (Resource resource : resources) { + if(resource == null || !resource.exists()){ + continue; + } + String filename = resource.getFilename(); + if(ObjectUtils.isEmpty(filename)){ + return null; + } + + for (String propFileSuffix : PROP_FILE_SUFFIX) { + if(!filename.endsWith(propFileSuffix)){ + continue; + } + List> propertySources = getPropProfiles(resource, pluginRegistryInfo); + if(ObjectUtils.isEmpty(propertySources)){ + continue; + } + propProfiles.addAll(propertySources); break; } - } - for (String propFileSuffix : YML_FILE_SUFFIX) { - if(filename.endsWith(propFileSuffix)){ - propProfiles = getYmlProfiles(resource, pluginRegistryInfo); + for (String propFileSuffix : YML_FILE_SUFFIX) { + if(!filename.endsWith(propFileSuffix)){ + continue; + } + List> propertySources = getYmlProfiles(resource, pluginRegistryInfo); + if(ObjectUtils.isEmpty(propertySources)){ + continue; + } + propProfiles.addAll(propertySources); break; } } + return propProfiles; } @@ -85,9 +122,9 @@ public class SpringBootConfigFileRegistrar implements PluginBeanRegistrar{ Map result = new HashMap<>(); buildFlattenedMap(result, source, null); String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - return Collections.unmodifiableList( - Collections.singletonList(new MapPropertySource(pluginId + "-config", result)) - ); + List> propertySources = new ArrayList<>(1); + propertySources.add(new MapPropertySource(CONFIG_PROP.concat(pluginId), result)); + return Collections.unmodifiableList(propertySources); } private List> getPropProfiles(Resource resource, @@ -96,23 +133,23 @@ public class SpringBootConfigFileRegistrar implements PluginBeanRegistrar{ properties.load(resource.getInputStream()); String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); return Collections.unmodifiableList( - Collections.singletonList(new PropertiesPropertySource(pluginId + "-config", properties)) + Collections.singletonList(new PropertiesPropertySource(pluginId.concat("-config"), properties)) ); } - private Resource getResource(PluginRegistryInfo pluginRegistryInfo){ - ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginWrapper().getPluginClassLoader(); - String springBootConfigFilePath = pluginRegistryInfo.getBasePlugin().springBootConfigFilePath(); - if(org.pf4j.util.StringUtils.isNullOrEmpty(springBootConfigFilePath)){ + private List getResource(PluginRegistryInfo pluginRegistryInfo) throws Exception{ + BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); + ConfigDefinition configDefinition = basePlugin.getClass().getAnnotation(ConfigDefinition.class); + if(configDefinition == null){ return null; } - Resource resource = new ClassPathResource( - springBootConfigFilePath, pluginClassLoader + RuntimeMode runtimeMode = pluginRegistryInfo.getPluginWrapper().getRuntimeMode(); + String fileName = PluginConfigUtils.getConfigFileName(configDefinition, runtimeMode); + PluginConfigFileLoader pluginConfigFileLoader = new PluginConfigFileLoader( + integrationConfiguration.pluginConfigFilePath(), fileName ); - if (!resource.exists()) { - throw new IllegalArgumentException("资源" + resource + "不存在"); - } - return resource; + ResourceWrapper resourceWrapper = pluginConfigFileLoader.load(pluginRegistryInfo); + return resourceWrapper.getResources(); } private void buildFlattenedMap(Map result, diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java index 252c037..953a8ad 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java @@ -4,6 +4,7 @@ import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; +import org.springframework.util.ObjectUtils; /** * 分组存在注解: @ConfigDefinition @@ -31,6 +32,9 @@ public class ConfigDefinitionGroup implements PluginClassGroup { @Override public boolean filter(Class aClass) { + if(BasePlugin.class.isAssignableFrom(aClass)){ + return false; + } return AnnotationsUtils.haveAnnotations(aClass, false, ConfigDefinition.class); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java index eccbb9b..1628b80 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java @@ -51,7 +51,6 @@ public class PluginConfigFileLoader implements PluginResourceLoader { suppliers.add(findPluginRoot(basePlugin)); suppliers.add(findClassPath(pluginRegistryInfo.getPluginClassLoader())); - for (Supplier supplier : suppliers) { SupplierBean supplierBean = supplier.get(); Resource resource = supplierBean.getResource(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java index d0cb3a9..9d55eab 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java @@ -64,14 +64,6 @@ public abstract class BasePlugin extends Plugin { return this.getClass().getPackage().getName(); } - /** - * 可设置插件对应的springBoot中*.prop或者*.yml配置文件。必须为全路径 - * @return 包名 - */ - public String springBootConfigFilePath(){ - return null; - } - /** * 得到插件扩展的信息 * @return BasePluginExtend diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java new file mode 100644 index 0000000..3c8b88d --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java @@ -0,0 +1,57 @@ +package com.gitee.starblues.utils; + +import com.gitee.starblues.annotation.ConfigDefinition; +import org.apache.catalina.core.ApplicationContext; +import org.pf4j.RuntimeMode; +import org.pf4j.util.StringUtils; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.env.PropertySource; + +/** + * 插件配置工具类 + * @author starBlues + * @version 2.4.3 + */ +public class PluginConfigUtils { + + private PluginConfigUtils(){} + + /** + * 根据项目运行环境模式来获取配置文件名称 + * @param configDefinition 配置的注解 + * @param runtimeMode 运行模式 + * @return 文件名称 + */ + public static String getConfigFileName(ConfigDefinition configDefinition, RuntimeMode runtimeMode){ + // TODO 后期移除 value + String fileName = configDefinition.value(); + if(StringUtils.isNullOrEmpty(fileName)){ + fileName = configDefinition.fileName(); + if(StringUtils.isNullOrEmpty(fileName)){ + return null; + } + } + + String fileNamePrefix; + String fileNamePrefixSuffix; + + if(fileName.lastIndexOf(".") == -1) { + fileNamePrefix = fileName; + fileNamePrefixSuffix = ""; + } else { + int index = fileName.lastIndexOf("."); + fileNamePrefix = fileName.substring(0, index); + fileNamePrefixSuffix = fileName.substring(index); + } + + if(runtimeMode == RuntimeMode.DEPLOYMENT){ + // 生产环境 + fileNamePrefix = fileNamePrefix + configDefinition.prodSuffix(); + } else if(runtimeMode == RuntimeMode.DEVELOPMENT){ + // 开发环境 + fileNamePrefix = fileNamePrefix + configDefinition.devSuffix(); + } + return fileNamePrefix + fileNamePrefixSuffix; + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java index 38d5699..e40b1bf 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java @@ -1,5 +1,9 @@ package com.gitee.starblues.utils; +import com.gitee.starblues.annotation.ConfigDefinition; +import org.pf4j.RuntimeMode; +import org.pf4j.util.StringUtils; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginOperatorInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginOperatorInfo.java index af22bb3..be3b0ec 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginOperatorInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginOperatorInfo.java @@ -21,7 +21,7 @@ public class PluginOperatorInfo { * 该参数主要解决在安装插件时 setOperatorType 一次操作类型,但是它又调用了启动插件,而启动插件也要 setOperatorType 一次操作类型 * 所以, 使用该参数, 用于在安装插件时, 锁定 setOperatorType, 在启动时就无法再 setOperatorType 了, 就不会覆盖该值 */ - private AtomicBoolean isLock = new AtomicBoolean(false); + private final AtomicBoolean isLock = new AtomicBoolean(false); /** * 设置操作类型 -- Gitee From b25077a1779ebc2a4da193a27627f2cf37d42362 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 21 May 2021 16:25:54 +0800 Subject: [PATCH 11/23] =?UTF-8?q?ConfigDefinitionTip=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=8F=AF=E8=8E=B7=E5=8F=96=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/pluginOfSpringBoot.yml | 4 +- .../com/mybatis/plugin1/ExamplePlugin1.java | 2 + .../com/mybatis/plugin1/ResourceConfig.java | 32 ------- .../mybatis/plugin1/config/Plugin1Config.java | 2 +- .../src/main/resources/plugin1-spring-dev.yml | 10 +++ .../log/PluginLogConfigProcessor.java | 3 +- .../pom.xml | 9 ++ .../PluginResourceResolverProcess.java | 5 +- .../extension/resources/PropertyKey.java | 7 +- .../resources/thymeleaf/ThymeleafConfig.java | 27 ++++-- .../thymeleaf/ThymeleafProcessor.java | 27 ++++-- .../annotation/ConfigDefinition.java | 14 ---- .../starblues/factory/PluginRegistryInfo.java | 11 +++ .../pipe/bean/ConfigFileBeanRegistrar.java | 6 +- .../realize/ConfigDefinitionTip.java | 83 +++++++++++++++++++ .../starblues/utils/PluginConfigUtils.java | 8 +- 16 files changed, 169 insertions(+), 81 deletions(-) delete mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml index 80d5fb9..ab2246a 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml @@ -1,7 +1,7 @@ c: configYmlValue: test - -logging-config: classpath:log.xml +plugin: + logConfigLocation: classpath:log.xml spring: diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java index b5154fd..bd8d018 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java @@ -1,5 +1,6 @@ package com.mybatis.plugin1; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.PluginWrapper; @@ -10,6 +11,7 @@ import org.pf4j.PluginWrapper; * @author starBlues * @version 1.0 */ +@ConfigDefinition(fileName = "plugin1-spring.yml", devSuffix = "-dev") public class ExamplePlugin1 extends BasePlugin { diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java deleted file mode 100644 index 17784c8..0000000 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.mybatis.plugin1; - -import com.gitee.starblues.annotation.ConfigDefinition; -import com.gitee.starblues.extension.resources.StaticResourceConfig; -import com.gitee.starblues.extension.resources.thymeleaf.SpringBootThymeleafConfig; -import com.gitee.starblues.extension.resources.thymeleaf.ThymeleafConfig; -import org.springframework.stereotype.Component; - -import java.util.HashSet; -import java.util.Set; - -/** - * @author starBlues - * @version 1.0 - * @since 2020-12-19 - */ -@ConfigDefinition -public class ResourceConfig implements StaticResourceConfig, SpringBootThymeleafConfig { - @Override - public Set locations() { - Set locations = new HashSet<>(); - locations.add("classpath:static"); - locations.add("file:D:\\aa"); - return locations; - } - - @Override - public void config(ThymeleafConfig thymeleafConfig) { - thymeleafConfig.setPrefix("tf"); - thymeleafConfig.setSuffix(".html"); - } -} diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/Plugin1Config.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/Plugin1Config.java index 7582238..ffdc1ce 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/Plugin1Config.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/Plugin1Config.java @@ -8,7 +8,7 @@ import com.gitee.starblues.annotation.ConfigDefinition; * @author starBlues * @version 1.0 */ -@ConfigDefinition("plugin1.yml") +@ConfigDefinition(fileName = "plugin1.yml") public class Plugin1Config { private String name; diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml new file mode 100644 index 0000000..78b3923 --- /dev/null +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml @@ -0,0 +1,10 @@ +plugin: + static: + locations: + - classpath:static + - file:D:\aa + thymeleaf: + prefix: tf + suffix: html + mode: html + encoding: gbk \ No newline at end of file diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java index 479242b..d5c330c 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java @@ -80,7 +80,8 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { **/ private List getLogConfigFile(PluginRegistryInfo pluginRegistryInfo) throws IOException { GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); - String logConfigLocation = pluginApplicationContext.getEnvironment().getProperty(PropertyKey.LOG_CONFIG_LOCATION); + String logConfigLocation = pluginApplicationContext.getEnvironment() + .getProperty(PropertyKey.LOG_CONFIG_LOCATION); if (ObjectUtils.isEmpty(logConfigLocation)) { return null; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml index 0d1960d..ee5e37c 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml @@ -72,6 +72,8 @@ 2.4.3-RELEASE 2.0.3.RELEASE 2.1.1.RELEASE + + 4.11 @@ -106,6 +108,13 @@ provided true + + + junit + junit + ${junit.version} + test + diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java index 6ed1faa..1ee364b 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java @@ -55,8 +55,9 @@ public class PluginResourceResolverProcess implements PluginPostProcessorExtend String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); try { // 直接从配置文件获取, 后续版本移除从实现类中获取配置 - ConfigurableEnvironment environment = pluginRegistryInfo.getPluginApplicationContext().getEnvironment(); - Set locations = Binder.get(environment).bind(PropertyKey.LOG_CONFIG_LOCATION, Bindable.setOf(String.class)).get(); + Set locations = pluginRegistryInfo.getPluginBinder() + .bind(PropertyKey.STATIC_LOCATIONS, Bindable.setOf(String.class)) + .get(); if(ObjectUtils.isEmpty(locations)){ StaticResourceConfig config = SpringBeanUtils.getObjectByInterfaceClass( pluginRegistryInfo.getConfigSingletons(), diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java index 7d21e8f..d83dbad 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PropertyKey.java @@ -11,6 +11,11 @@ public class PropertyKey { * classpath: static/ * file: D://path/test */ - public final static String LOG_CONFIG_LOCATION = "plugin.static.locations"; + public final static String STATIC_LOCATIONS = "plugin.static.locations"; + + /** + * Thymeleaf 配置前缀 + */ + public final static String THYMELEAF_CONFIG = "plugin.thymeleaf"; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafConfig.java index 7f7178d..3b11388 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafConfig.java @@ -42,15 +42,13 @@ public class ThymeleafConfig { /** * 是否启用模板引擎的缓存 */ - private boolean cache = true; + private Boolean cache = true; /** * 模板解析器的执行顺序, 数字越小越先执行 */ private Integer templateResolverOrder; - - public String getPrefix() { return prefix; } @@ -71,23 +69,23 @@ public class ThymeleafConfig { return mode; } - public void setMode(TemplateMode mode) { - this.mode = mode; + public void setMode(String mode) { + this.mode = TemplateMode.parse(mode); } public Charset getEncoding() { return encoding; } - public void setEncoding(Charset encoding) { - this.encoding = encoding; + public void setEncoding(String encoding) { + this.encoding = Charset.forName(encoding); } - public boolean isCache() { + public Boolean getCache() { return cache; } - public void setCache(boolean cache) { + public void setCache(Boolean cache) { this.cache = cache; } @@ -99,4 +97,15 @@ public class ThymeleafConfig { this.templateResolverOrder = templateResolverOrder; } + @Override + public String toString() { + return "ThymeleafConfig{" + + "prefix='" + prefix + '\'' + + ", suffix='" + suffix + '\'' + + ", mode=" + mode.name() + + ", encoding=" + encoding.name() + + ", cache=" + cache + + ", templateResolverOrder=" + templateResolverOrder + + '}'; + } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java index 5075825..c1eca8e 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java @@ -1,5 +1,6 @@ package com.gitee.starblues.extension.resources.thymeleaf; +import com.gitee.starblues.extension.resources.PropertyKey; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.utils.ClassUtils; @@ -7,7 +8,10 @@ import com.gitee.starblues.utils.OrderPriority; import com.gitee.starblues.utils.SpringBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.thymeleaf.spring5.SpringTemplateEngine; @@ -51,14 +55,21 @@ public class ThymeleafProcessor implements PluginPipeProcessorExtend { if(springTemplateEngine == null){ return; } - SpringBootThymeleafConfig config = SpringBeanUtils.getObjectByInterfaceClass( - pluginRegistryInfo.getConfigSingletons(), - SpringBootThymeleafConfig.class); - if(config == null){ - return; + + ThymeleafConfig thymeleafConfig = pluginRegistryInfo.getPluginBinder() + .bind(PropertyKey.THYMELEAF_CONFIG, ThymeleafConfig.class) + .orElse(null); + if(thymeleafConfig == null){ + SpringBootThymeleafConfig config = SpringBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), + SpringBootThymeleafConfig.class); + if(config == null){ + return; + } + thymeleafConfig = new ThymeleafConfig(); + config.config(thymeleafConfig); } - ThymeleafConfig thymeleafConfig = new ThymeleafConfig(); - config.config(thymeleafConfig); + String prefix = thymeleafConfig.getPrefix(); if(StringUtils.isEmpty(prefix)){ throw new IllegalArgumentException("prefix can't be empty"); @@ -83,7 +94,7 @@ public class ThymeleafProcessor implements PluginPipeProcessorExtend { resolver.setSuffix(thymeleafConfig.getSuffix()); resolver.setTemplateMode(thymeleafConfig.getMode()); - resolver.setCacheable(thymeleafConfig.isCache()); + resolver.setCacheable(thymeleafConfig.getCache()); if(thymeleafConfig.getEncoding() != null){ resolver.setCharacterEncoding(thymeleafConfig.getEncoding().name()); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java index 84dc677..42109c7 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java @@ -15,26 +15,12 @@ import java.lang.annotation.*; public @interface ConfigDefinition { - /** - * 插件中的配置文件的名称. 建议使用 fileName 进行文件名称配置. - * @return String - */ - @Deprecated - String value() default ""; - /** * 插件中的配置文件的名称, 新版本替换 value 值 * @return String */ String fileName() default ""; - /** - * 自定义 bean 名称 - * @return String - */ - @Deprecated - String beanName() default ""; - /** * 开发环境下文件后缀 * 如果文件名称为: xxx.yml, 根据当前配置(当前配置为-dev)在开发环境下文件后缀为: xxx-dev.yml diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java index 5d7ca4d..cc43577 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java @@ -8,6 +8,7 @@ import org.pf4j.*; import org.pf4j.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.ClassUtils; @@ -31,6 +32,7 @@ public class PluginRegistryInfo { private final PluginManager pluginManager; private final GenericApplicationContext mainApplicationContext; private final AnnotationConfigApplicationContext pluginApplicationContext; + private final Binder pluginBinder; private final SpringBeanRegister springBeanRegister; /** @@ -84,6 +86,7 @@ public class PluginRegistryInfo { // 生成插件Application this.pluginApplicationContext = new AnnotationConfigApplicationContext(); this.pluginApplicationContext.setClassLoader(basePlugin.getWrapper().getPluginClassLoader()); + this.pluginBinder = Binder.get(this.pluginApplicationContext.getEnvironment()); this.springBeanRegister = new SpringBeanRegister(pluginApplicationContext); } @@ -253,6 +256,14 @@ public class PluginRegistryInfo { return pluginApplicationContext; } + /** + * 得到当前插件的Binder + * @return Binder + */ + public Binder getPluginBinder() { + return pluginBinder; + } + /** * 得到当前插件Bean注册者 * @return SpringBeanRegister diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java index 183afc1..b1ddce5 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java @@ -69,11 +69,7 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { parseObject = aClass.newInstance(); } - String name = configDefinition.beanName(); - if(StringUtils.isNullOrEmpty(name)){ - name = aClass.getName(); - } - name = name + "@" + pluginRegistryInfo.getPluginWrapper().getPluginId(); + String name = aClass.getName(); SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); setConfigDefinitionTip(pluginRegistryInfo, parseObject); springBeanRegister.registerSingleton(name, parseObject); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java index 681ce1e..19e926f 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java @@ -5,7 +5,14 @@ import com.gitee.starblues.integration.operator.module.PluginInfo; import com.gitee.starblues.utils.SpringBeanUtils; import org.pf4j.PluginManager; import org.pf4j.PluginWrapper; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.ApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; + +import java.util.List; +import java.util.Map; +import java.util.Set; /** * 给系统中所有ConfigDefinition 提供一个小工具类。可通过它获取主程序的某些bean. 和当前插件一些信息 @@ -52,4 +59,80 @@ public class ConfigDefinitionTip { configDefinitionClass); } + /** + * 将配置文件中的值映射为bean + * 注意: 只针对插件扩展的 springboot 配置文件生效 + * @param prefix 配置文件中的前置, 比如: plugin.config + * @param type 配置文件中结构对应的类类型, 比如: plugin.config 下定义的键值对和type类类型一致 + * @param 类类型 + * @return T + */ + public T getConfigOfBean(String prefix, Class type){ + return pluginRegistryInfo.getPluginBinder() + .bind(prefix, Bindable.of(type)) + .get(); + } + + /** + * 将配置文件中的值映射为 List + * 注意: 只针对插件扩展的 springboot 配置文件生效 + * @param prefix 配置文件中的前置, 比如: plugin.config + * @param type List元素的类类型 + * @param List中定义的类类型 + * @return List + */ + public List getConfigOfList(String prefix, Class type){ + return pluginRegistryInfo.getPluginBinder() + .bind(prefix, Bindable.listOf(type)) + .get(); + } + + /** + * 将配置文件中的值映射为 Set + * 注意: 只针对插件扩展的 springboot 配置文件生效 + * @param prefix 配置文件中的前置, 比如: plugin.config + * @param type Set元素的类类型 + * @param 类类型 + * @return Set + */ + public Set getConfigOfSet(String prefix, Class type){ + return pluginRegistryInfo.getPluginBinder() + .bind(prefix, Bindable.setOf(type)) + .get(); + } + + + /** + * 将配置文件中的值映射为 Map + * 注意: 只针对插件扩展的 springboot 配置文件生效 + * @param prefix 配置文件中的前置, 比如: plugin.config + * @param keyType map的key元素类型 + * @param valueType map的值元素类型 + * @param map key 元素的类类型 + * @param map value 元素的类类型 + * @return Map + */ + public Map getConfigOfSet(String prefix, Class keyType, Class valueType){ + return pluginRegistryInfo.getPluginBinder() + .bind(prefix, Bindable.mapOf(keyType, valueType)) + .get(); + } + + + /** + * 返回当前插件的ConfigurableEnvironment + * @return ConfigurableEnvironment + */ + public ConfigurableEnvironment getPluginEnvironment(){ + return pluginRegistryInfo.getPluginApplicationContext().getEnvironment(); + } + + /** + * 返回当前插件的Binder + * @return Binder + */ + public Binder getPluginBinder(){ + return pluginRegistryInfo.getPluginBinder(); + } + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java index 3c8b88d..2d79c79 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginConfigUtils.java @@ -23,13 +23,9 @@ public class PluginConfigUtils { * @return 文件名称 */ public static String getConfigFileName(ConfigDefinition configDefinition, RuntimeMode runtimeMode){ - // TODO 后期移除 value - String fileName = configDefinition.value(); + String fileName = configDefinition.fileName(); if(StringUtils.isNullOrEmpty(fileName)){ - fileName = configDefinition.fileName(); - if(StringUtils.isNullOrEmpty(fileName)){ - return null; - } + return null; } String fileNamePrefix; -- Gitee From 5598562d9d6742174ae48b322eb184ddeeea5536 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 24 May 2021 14:13:28 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9auto-install-config?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=B9=E5=BC=8F=E5=88=B0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/plugin1/config/AutoConfig.java | 19 --------- .../example/plugin1/config/PluginConfig1.java | 2 +- .../src/main/resources/pluginOfSpringBoot.yml | 6 ++- .../example/plugin2/config/Plugin2Config.java | 2 +- .../main/java/com/log/plugin/LogPlugin.java | 2 + .../java/com/log/plugin/config/Config.java | 33 ---------------- .../src/main/resources/config.yml | 3 +- .../mybatis/plugin2/config/Plugin2Config.java | 2 +- .../starblues/extension/log/PropertyKey.java | 2 +- .../extension/log/util/LogConfigUtil.java | 1 - .../PluginResourceResolverProcess.java | 2 +- .../gitee/starblues/factory/PropertyKey.java | 11 ++++++ .../PluginAutoConfigurationInstaller.java | 34 ---------------- ...PluginPipeApplicationContextProcessor.java | 36 +++++++---------- .../bean/SpringBootConfigFileRegistrar.java | 4 ++ .../pipe/classs/PluginClassProcess.java | 1 - .../group/AutoConfigurationSelectorGroup.java | 39 ------------------- .../realize/AutoConfigurationSelector.java | 18 --------- .../realize/ConfigDefinitionTip.java | 9 +++-- 19 files changed, 48 insertions(+), 178 deletions(-) delete mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java delete mode 100644 example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PropertyKey.java delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java deleted file mode 100644 index 978e69d..0000000 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/AutoConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.basic.example.plugin1.config; - -import com.gitee.starblues.factory.process.pipe.PluginAutoConfigurationInstaller; -import com.gitee.starblues.realize.AutoConfigurationSelector; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; - -/** - * @Description TODO - * @Author rockstal - * @Date 2021/4/28 21:21 - **/ -public class AutoConfig implements AutoConfigurationSelector { - @Override - public void select(PluginAutoConfigurationInstaller installer) { - installer.install(QuartzAutoConfiguration.class); - installer.install(RedisAutoConfiguration.class); - } -} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/PluginConfig1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/PluginConfig1.java index 15890e0..322d01a 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/PluginConfig1.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/PluginConfig1.java @@ -11,7 +11,7 @@ import java.util.Set; * @author starBlues * @version 1.0 */ -@ConfigDefinition("plugin1.yml") +@ConfigDefinition(fileName = "plugin1.yml") public class PluginConfig1 { private String name; diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml index ab2246a..542ae39 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/pluginOfSpringBoot.yml @@ -1,8 +1,10 @@ c: configYmlValue: test plugin: - logConfigLocation: classpath:log.xml - + log-config-location: classpath:log.xml + auto-config-class: + - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration + - org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration spring: quartz: diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/config/Plugin2Config.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/config/Plugin2Config.java index 32f6832..bde4c87 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/config/Plugin2Config.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/config/Plugin2Config.java @@ -11,7 +11,7 @@ import java.util.Set; * @author starBlues * @version 1.0 */ -@ConfigDefinition("plugin2.yml") +@ConfigDefinition(fileName = "plugin2.yml") public class Plugin2Config { private String name; diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java index f165a16..1647d90 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java +++ b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/LogPlugin.java @@ -1,5 +1,6 @@ package com.log.plugin; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.PluginWrapper; @@ -9,6 +10,7 @@ import org.pf4j.PluginWrapper; * @author sousouki * @version 2.4.3 */ +@ConfigDefinition(fileName = "config.yml") public class LogPlugin extends BasePlugin { diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java b/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java deleted file mode 100644 index 1e30f21..0000000 --- a/example/integration-log/plugins/integration-log-plugin/src/main/java/com/log/plugin/config/Config.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.log.plugin.config; - -import com.gitee.starblues.annotation.ConfigDefinition; - -import java.util.HashSet; -import java.util.Set; - -/** - * description - * - * @author starBlues - * @version 2.4.3 - */ -@ConfigDefinition(fileName="config.yml") -public class Config implements SpringBootLogConfig { - - private String logLocation; - - @Override - public Set logConfigLocations() { - Set logConfigLocations = new HashSet<>(); - logConfigLocations.add(logLocation); - return logConfigLocations; - } - - public String getLogLocation() { - return logLocation; - } - - public void setLogLocation(String logLocation) { - this.logLocation = logLocation; - } -} diff --git a/example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml b/example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml index 4197938..7fe05d5 100644 --- a/example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml +++ b/example/integration-log/plugins/integration-log-plugin/src/main/resources/config.yml @@ -1 +1,2 @@ -logLocation: classpath:log.xml \ No newline at end of file +plugin: + logConfigLocation: classpath:log.xml \ No newline at end of file diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/config/Plugin2Config.java b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/config/Plugin2Config.java index 2f32fb7..fcf3cd2 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/config/Plugin2Config.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/config/Plugin2Config.java @@ -8,7 +8,7 @@ import com.gitee.starblues.annotation.ConfigDefinition; * @author starBlues * @version 1.0 */ -@ConfigDefinition("plugin2.yml") +@ConfigDefinition(fileName = "plugin2.yml") public class Plugin2Config { private String name; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java index 63a4208..a907a53 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PropertyKey.java @@ -6,6 +6,6 @@ package com.gitee.starblues.extension.log; */ public class PropertyKey { - public final static String LOG_CONFIG_LOCATION = "plugin.logConfigLocation"; + public final static String LOG_CONFIG_LOCATION = "plugin.log-config-location"; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java index a66bce2..bbbedce 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java @@ -2,7 +2,6 @@ package com.gitee.starblues.extension.log.util; import com.gitee.starblues.extension.log.annotation.ConfigItem; import com.gitee.starblues.extension.log.config.LogConfig; -import com.gitee.starblues.extension.log.logback.LogbackLogRegistry; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.utils.CommonUtils; import org.pf4j.PluginWrapper; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java index 1ee364b..c930a3a 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java @@ -57,7 +57,7 @@ public class PluginResourceResolverProcess implements PluginPostProcessorExtend // 直接从配置文件获取, 后续版本移除从实现类中获取配置 Set locations = pluginRegistryInfo.getPluginBinder() .bind(PropertyKey.STATIC_LOCATIONS, Bindable.setOf(String.class)) - .get(); + .orElseGet(()->null); if(ObjectUtils.isEmpty(locations)){ StaticResourceConfig config = SpringBeanUtils.getObjectByInterfaceClass( pluginRegistryInfo.getConfigSingletons(), diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PropertyKey.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PropertyKey.java new file mode 100644 index 0000000..8bff0dc --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PropertyKey.java @@ -0,0 +1,11 @@ +package com.gitee.starblues.factory; + +/** + * @author zhangzhuo + * @version 2.4.3 + */ +public class PropertyKey { + + public final static String INSTALL_AUTO_CONFIG_CLASS = "plugin.auto-config-class"; + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java deleted file mode 100644 index ff7d903..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginAutoConfigurationInstaller.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.gitee.starblues.factory.process.pipe; - -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * 插件自动装配安装操作 - * @author starBlues - * @version 2.4.3 - */ -public class PluginAutoConfigurationInstaller { - - private final Set> autoConfigurationClassSet = new HashSet<>(); - - /** - * 处理该插件的注册 - * @param autoConfigurationClass 自动装载的配置类 - * @return PluginAutoConfigurationInstaller PluginAutoConfigurationInstaller - */ - public PluginAutoConfigurationInstaller install(Class autoConfigurationClass){ - autoConfigurationClassSet.add(autoConfigurationClass); - return this; - } - - /** - * 得到自动装载的所有类 - * @return autoConfigurationClassSet - */ - Set> getAutoConfigurationClassSet() { - return autoConfigurationClassSet; - } -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index dc4cff9..0d727d2 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -2,16 +2,17 @@ package com.gitee.starblues.factory.process.pipe; import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.PropertyKey; import com.gitee.starblues.factory.process.pipe.bean.*; -import com.gitee.starblues.factory.process.pipe.classs.group.AutoConfigurationSelectorGroup; -import com.gitee.starblues.realize.AutoConfigurationSelector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.util.ObjectUtils; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -70,26 +71,19 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso * @param pluginRegistryInfo 插件注册信息 */ private void installPluginAutoConfiguration(GenericApplicationContext pluginApplicationContext, - PluginRegistryInfo pluginRegistryInfo) { - List> groupClasses = pluginRegistryInfo.getGroupClasses(AutoConfigurationSelectorGroup.ID); - if(groupClasses == null || groupClasses.isEmpty()){ + PluginRegistryInfo pluginRegistryInfo) throws ClassNotFoundException { + Set installAutoConfigClassString = pluginRegistryInfo.getPluginBinder() + .bind(PropertyKey.INSTALL_AUTO_CONFIG_CLASS, Bindable.setOf(String.class)) + .orElseGet(()->null); + if(ObjectUtils.isEmpty(installAutoConfigClassString)){ return; } - PluginAutoConfigurationInstaller installer = new PluginAutoConfigurationInstaller(); - for (Class groupClass : groupClasses) { - try { - Object o = groupClass.newInstance(); - if(o instanceof AutoConfigurationSelector){ - AutoConfigurationSelector selector = (AutoConfigurationSelector) o; - selector.select(installer); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - Set> autoConfigurationClassSet = installer.getAutoConfigurationClassSet(); - if(autoConfigurationClassSet.isEmpty()){ - return; + + Set> autoConfigurationClassSet = new HashSet<>(installAutoConfigClassString.size()); + ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginClassLoader(); + for (String autoConfigClassPackage : installAutoConfigClassString) { + Class aClass = Class.forName(autoConfigClassPackage, false, pluginClassLoader); + autoConfigurationClassSet.add(aClass); } for (Class autoConfigurationClass : autoConfigurationClassSet) { pluginApplicationContext.registerBean(autoConfigurationClass); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java index 7469fe8..cf54db5 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/SpringBootConfigFileRegistrar.java @@ -141,6 +141,10 @@ public class SpringBootConfigFileRegistrar implements PluginBeanRegistrar{ BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); ConfigDefinition configDefinition = basePlugin.getClass().getAnnotation(ConfigDefinition.class); if(configDefinition == null){ + logger.warn("Plugin '{}' not config annotation : @ConfigDefinition, " + + "If you want to use the plugin spring boot configuration file, " + + "please configure the annotation: @ConfigDefinition to BasePlugin subclasses", + pluginRegistryInfo.getPluginWrapper().getPluginId()); return null; } RuntimeMode runtimeMode = pluginRegistryInfo.getPluginWrapper().getRuntimeMode(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java index 644c71d..6e6c03b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java @@ -50,7 +50,6 @@ public class PluginClassProcess implements PluginPipeProcessor { pluginClassGroups.add(new CallerGroup()); pluginClassGroups.add(new OneselfListenerGroup()); pluginClassGroups.add(new WebSocketGroup()); - pluginClassGroups.add(new AutoConfigurationSelectorGroup()); // 添加扩展 pluginClassGroups.addAll(ExtensionInitializer.getClassGroupExtends()); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java deleted file mode 100644 index 5e77b45..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/AutoConfigurationSelectorGroup.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gitee.starblues.factory.process.pipe.classs.group; - -import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; -import com.gitee.starblues.realize.AutoConfigurationSelector; -import com.gitee.starblues.realize.BasePlugin; -import com.gitee.starblues.realize.OneselfListener; -import org.springframework.util.ClassUtils; - -import java.util.Set; - -/** - * 自动装配分组者 - * - * @author starBlues - * @version 2.1.0 - */ -public class AutoConfigurationSelectorGroup implements PluginClassGroup { - - public static final String ID = "AutoConfigurationSelectorGroup"; - - @Override - public String groupId() { - return ID; - } - - @Override - public void initialize(BasePlugin basePlugin) { - - } - - @Override - public boolean filter(Class aClass) { - if(aClass == null){ - return false; - } - Set> allInterfacesForClassAsSet = ClassUtils.getAllInterfacesForClassAsSet(aClass); - return allInterfacesForClassAsSet.contains(AutoConfigurationSelector.class); - } -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java deleted file mode 100644 index 1d27ef4..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/AutoConfigurationSelector.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gitee.starblues.realize; - -import com.gitee.starblues.factory.process.pipe.PluginAutoConfigurationInstaller; - -/** - * 插件自动装配选择者, 装配spring-boot-xx-starter - * @author starBlues - * @version 2.4.3 - */ -public interface AutoConfigurationSelector { - - /** - * 选择插件所需集成的AutoConfiguration - * @param installer 自动装配安装者 - */ - void select(PluginAutoConfigurationInstaller installer); - -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java index 19e926f..84e3d37 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java @@ -10,6 +10,7 @@ import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.ApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -70,7 +71,7 @@ public class ConfigDefinitionTip { public T getConfigOfBean(String prefix, Class type){ return pluginRegistryInfo.getPluginBinder() .bind(prefix, Bindable.of(type)) - .get(); + .orElseGet(() -> null); } /** @@ -84,7 +85,7 @@ public class ConfigDefinitionTip { public List getConfigOfList(String prefix, Class type){ return pluginRegistryInfo.getPluginBinder() .bind(prefix, Bindable.listOf(type)) - .get(); + .orElseGet(() -> Collections.emptyList()); } /** @@ -98,7 +99,7 @@ public class ConfigDefinitionTip { public Set getConfigOfSet(String prefix, Class type){ return pluginRegistryInfo.getPluginBinder() .bind(prefix, Bindable.setOf(type)) - .get(); + .orElseGet(() -> Collections.emptySet()); } @@ -115,7 +116,7 @@ public class ConfigDefinitionTip { public Map getConfigOfSet(String prefix, Class keyType, Class valueType){ return pluginRegistryInfo.getPluginBinder() .bind(prefix, Bindable.mapOf(keyType, valueType)) - .get(); + .orElseGet(() -> Collections.emptyMap()); } -- Gitee From d080a9103986d3753b7f7e5b9d0247cec1b0394b Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 24 May 2021 21:20:49 +0800 Subject: [PATCH 13/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=9C=A8=E6=9F=90=E4=BA=9B=E6=83=85=E5=86=B5?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=B3=A8=E5=86=8C=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/basic/example/main/ExampleMain.java | 1 + .../plugin1/config/QuartzJobConfiguration.java | 2 ++ .../gitee/starblues/factory/PluginRegistryInfo.java | 1 + .../pipe/PluginPipeApplicationContextProcessor.java | 13 +++++++++++++ 4 files changed, 17 insertions(+) diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java index af90c79..855333e 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/ExampleMain.java @@ -2,6 +2,7 @@ package com.basic.example.main; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; /** * 插件案例启动类 diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java index 798fa59..60267c6 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/QuartzJobConfiguration.java @@ -1,9 +1,11 @@ package com.basic.example.plugin1.config; import com.basic.example.plugin1.job.QuartzJob1; +import com.gitee.starblues.factory.process.pipe.PluginPipeApplicationContextProcessor; import org.quartz.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; /** * @Description TODO diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java index cc43577..6914bea 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java @@ -11,6 +11,7 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.io.DefaultResourceLoader; import org.springframework.util.ClassUtils; import java.io.Closeable; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index 0d727d2..7fd918e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -6,9 +6,18 @@ import com.gitee.starblues.factory.PropertyKey; import com.gitee.starblues.factory.process.pipe.bean.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ConfigurationClassPostProcessor; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.type.AnnotationMetadata; import org.springframework.util.ObjectUtils; import java.util.ArrayList; @@ -79,6 +88,10 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso return; } + // 注册AutoConfigurationPackages, 用于插件可自动配置 + AutoConfigurationPackages.register(pluginApplicationContext.getDefaultListableBeanFactory(), + pluginRegistryInfo.getBasePlugin().scanPackage()); + Set> autoConfigurationClassSet = new HashSet<>(installAutoConfigClassString.size()); ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginClassLoader(); for (String autoConfigClassPackage : installAutoConfigClassString) { -- Gitee From 5139b749ee56735dfef47ae3c73b37d06ee6df2a Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 24 May 2021 21:21:28 +0800 Subject: [PATCH 14/23] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pipe/PluginPipeApplicationContextProcessor.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index 7fd918e..e302bc6 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -6,18 +6,10 @@ import com.gitee.starblues.factory.PropertyKey; import com.gitee.starblues.factory.process.pipe.bean.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.ConfigurationClassPostProcessor; -import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.ResourceLoader; -import org.springframework.core.type.AnnotationMetadata; import org.springframework.util.ObjectUtils; import java.util.ArrayList; -- Gitee From 570f19853a49b0b3c6de90487cc94846bdb45da8 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 25 May 2021 14:19:26 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9logback=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=90=8D=E7=A7=B0=E8=A7=A3=E6=9E=90=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starblues/extension/log/log4j/Log4jLogRegistry.java | 2 +- .../extension/log/logback/LogbackLogRegistry.java | 2 +- .../pipe/PluginPipeApplicationContextProcessor.java | 2 +- .../integration/application/AbstractPluginApplication.java | 7 ++++--- .../integration/application/PluginApplication.java | 5 +++-- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java index fe597a0..2e5481f 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java @@ -99,7 +99,7 @@ public class Log4jLogRegistry implements LogRegistry { .withLayout(patternLayout) .withIgnoreExceptions(false) .withFileName(LogConfigUtil.getLogFile(pluginWrapper, logConfig).concat(".log")) - .withFilePattern(".%d{yyyy-MM-dd}%-i.log") + .withFilePattern(".%d{yyyy-MM-dd}-%i.log") .withAppend(true) .withPolicy(policy) .withStrategy(strategy) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java index 6a33ee4..f0d6a8d 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java @@ -143,7 +143,7 @@ public class LogbackLogRegistry implements LogRegistry { SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy<>(); - String fp = OptionHelper.substVars(logFilePrefix.concat(".%d{yyyy-MM-dd}%-i.log"), context); + String fp = OptionHelper.substVars(logFilePrefix.concat(".%d{yyyy-MM-dd}-%i.log"), context); policy.setMaxFileSize(FileSize.valueOf(logConfig.getMaxFileSize())); policy.setFileNamePattern(fp); policy.setMaxHistory(logConfig.getMaxHistory()); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index e302bc6..a64d1f1 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -21,7 +21,7 @@ import java.util.Set; * 插件的ApplicationContext 处理 * 主要进行插件bean的扫描 * @author starBlues - * @version 2.4.0 + * @version 2.4.3 */ public class PluginPipeApplicationContextProcessor implements PluginPipeProcessor{ diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java index 8299375..f34bd1d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java @@ -14,7 +14,7 @@ import java.util.List; * 公用的的插件应用 * * @author starBlues - * @version 2.2.0 + * @version 2.4.3 */ public abstract class AbstractPluginApplication implements PluginApplication { @@ -22,12 +22,13 @@ public abstract class AbstractPluginApplication implements PluginApplication { @Override - public void addExtension(AbstractExtension extension) { + public PluginApplication addExtension(AbstractExtension extension) { if(extension == null){ - return; + return this; } extension.setPluginApplication(this); ExtensionFactory.addExtension(extension); + return this; } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/PluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/PluginApplication.java index a397f8e..3ac7b85 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/PluginApplication.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/PluginApplication.java @@ -10,7 +10,7 @@ import org.springframework.context.ApplicationContext; /** * 插件应用。 * @author starBlues - * @version 2.2.0 + * @version 2.4.3 */ public interface PluginApplication extends PluginListenerContext { @@ -37,7 +37,8 @@ public interface PluginApplication extends PluginListenerContext { /** * 添加扩展 * @param extension 扩展类 + * @return PluginApplication */ - void addExtension(AbstractExtension extension); + PluginApplication addExtension(AbstractExtension extension); } -- Gitee From 320f1219e5b1ae3d739212a1f50f6acdaf043e83 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 25 May 2021 14:35:42 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=9D=99=E6=80=81?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/plugin1-spring-dev.yml | 4 ++-- .../extension/resources/StaticResourceExtension.java | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml index 78b3923..0a7353b 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin1-spring-dev.yml @@ -5,6 +5,6 @@ plugin: - file:D:\aa thymeleaf: prefix: tf - suffix: html + suffix: .html mode: html - encoding: gbk \ No newline at end of file + encoding: utf-8 \ No newline at end of file diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java index b4c95c7..1f92529 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java @@ -17,7 +17,7 @@ import java.util.concurrent.TimeUnit; * 插件静态资源访问的扩展插件 * * @author starBlues - * @version 2.3 + * @version 2.4.3 */ public class StaticResourceExtension extends AbstractExtension { @@ -80,23 +80,27 @@ public class StaticResourceExtension extends AbstractExtension { /** * 设置访问插件静态资源前缀 * @param pluginStaticResourcePathPrefix 静态资源前缀。默认为: static-plugin。 + * @return StaticResourceExtension */ - public void setPathPrefix(String pluginStaticResourcePathPrefix){ + public StaticResourceExtension setPathPrefix(String pluginStaticResourcePathPrefix){ if(pluginStaticResourcePathPrefix != null && !"".equals(pluginStaticResourcePathPrefix)){ StaticResourceExtension.pluginStaticResourcePathPrefix = pluginStaticResourcePathPrefix; } + return this; } /** * 设置缓存控制 * @param pluginStaticResourcesCacheControl 访问静态资源的缓存控制。默认最大1小时。主要针对http协议的缓存。 + * @return StaticResourceExtension */ - public void setCacheControl(CacheControl pluginStaticResourcesCacheControl){ + public StaticResourceExtension setCacheControl(CacheControl pluginStaticResourcesCacheControl){ if(pluginStaticResourcesCacheControl == null){ StaticResourceExtension.pluginStaticResourcesCacheControl = null; } else { StaticResourceExtension.pluginStaticResourcesCacheControl = pluginStaticResourcesCacheControl; } + return this; } public static String getPluginStaticResourcePathPrefix() { -- Gitee From d0b50292a7b7f73def23913dc0cd7f87ce191de7 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sun, 30 May 2021 21:37:24 +0800 Subject: [PATCH 17/23] =?UTF-8?q?=E6=8E=92=E9=99=A4log=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E9=92=88=E5=AF=B9spring=E7=9A=84=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springboot-plugin-framework-extension-log/pom.xml | 4 ++-- .../gitee/starblues/factory/PluginRegistryInfo.java | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml index f6457b1..6d98075 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/pom.xml @@ -85,13 +85,13 @@ org.springframework spring-context ${spring-version} - compile + provided com.gitee.starblues springboot-plugin-framework ${springboot-plugin-framework.version} - compile + provided diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java index 6914bea..c711309 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java @@ -8,6 +8,7 @@ import org.pf4j.*; import org.pf4j.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; @@ -84,9 +85,13 @@ public class PluginRegistryInfo { this.mainApplicationContext = mainApplicationContext; this.followingInitial = followingInitial; - // 生成插件Application - this.pluginApplicationContext = new AnnotationConfigApplicationContext(); - this.pluginApplicationContext.setClassLoader(basePlugin.getWrapper().getPluginClassLoader()); + ClassLoader pluginClassLoader = basePlugin.getWrapper().getPluginClassLoader(); + // 生成插件ApplicationContext-DefaultListableBeanFactory + DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory(); + this.pluginApplicationContext = new AnnotationConfigApplicationContext(defaultListableBeanFactory); + // 设置插件ApplicationContext的classLoader + this.pluginApplicationContext.setClassLoader(pluginClassLoader); + this.pluginBinder = Binder.get(this.pluginApplicationContext.getEnvironment()); this.springBeanRegister = new SpringBeanRegister(pluginApplicationContext); } -- Gitee From 29a2631c8817c22e7c52cc6ec0a6ef19efe13ddd Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sun, 30 May 2021 21:51:42 +0800 Subject: [PATCH 18/23] =?UTF-8?q?=E5=B0=86=E6=8F=92=E4=BB=B6=E8=87=AA?= =?UTF-8?q?=E4=B8=BB=E7=9B=91=E5=90=AC=E5=99=A8=E7=9A=84=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E6=8F=90=E5=89=8D=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pipe/PluginOneselfStopEventProcessor.java | 51 +++++++++++++++++++ .../pipe/PluginPipeProcessorFactory.java | 4 +- .../post/PluginPostProcessorFactory.java | 4 +- .../PluginOneselfStartEventProcessor.java | 20 ++------ 4 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginOneselfStopEventProcessor.java diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginOneselfStopEventProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginOneselfStopEventProcessor.java new file mode 100644 index 0000000..e7e717d --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginOneselfStopEventProcessor.java @@ -0,0 +1,51 @@ +package com.gitee.starblues.factory.process.pipe; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.post.bean.PluginOneselfStartEventProcessor; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * 插件中 OneselfListener 监听者处理者。主要执行监听器的停止事件。 + * @author starBlues + * @version 1.0 + * @since 2021-05-30 + */ +public class PluginOneselfStopEventProcessor implements PluginPipeProcessor{ + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + @Override + public void initialize() throws Exception { + + } + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + // 当前不执行启动事件 + // 由类 com.gitee.starblues.factory.process.post.bean.PluginOneselfStartEventProcessor 实现启动 + // 主要是资源全部加载注册完成后再触发启动事件 + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + List oneselfListeners = pluginRegistryInfo + .getExtension(PluginOneselfStartEventProcessor.KEY); + if(oneselfListeners == null || oneselfListeners.isEmpty()){ + return; + } + BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); + for (OneselfListener oneselfListener : oneselfListeners) { + try { + oneselfListener.stopEvent(basePlugin); + } catch (Exception e){ + log.error("OneselfListener {} execute stopEvent exception. {}", + oneselfListener.getClass().getName(), e.getMessage(), e); + } + } + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java index 23a604c..ec43b32 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java @@ -34,7 +34,9 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { @Override public void initialize() throws Exception{ // 以下顺序不能更改 - // 插件资源加载者, 必须放在第一位 + // 停止事件放在第一位 + pluginPipeProcessors.add(new PluginOneselfStopEventProcessor()); + // 插件资源加载者, 必须放在第二位 pluginPipeProcessors.add(new PluginResourceLoadFactory()); // 插件类处理者 pluginPipeProcessors.add(new PluginClassProcess()); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java index ffa2282..778b29e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java @@ -39,11 +39,11 @@ public class PluginPostProcessorFactory implements PluginPostProcessor { // 如果配置启用webSocket的功能, 则进行引入 pluginPostProcessors.add(new PluginWebSocketProcessor(mainApplicationContext)); } - // 主要触发启动监听事件,因此在最后一个执行。配合 OneselfListenerStopEventProcessor 该类触发启动、停止事件。 - pluginPostProcessors.add(new PluginOneselfStartEventProcessor()); // 添加扩展 pluginPostProcessors.addAll(ExtensionInitializer.getPostProcessorExtends()); + // 主要触发启动监听事件,因此在最后一个执行。配合 OneselfListenerStopEventProcessor 该类触发启动、停止事件。 + pluginPostProcessors.add(new PluginOneselfStartEventProcessor()); // 进行初始化 for (PluginPostProcessor pluginPostProcessor : pluginPostProcessors) { pluginPostProcessor.initialize(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java index 1eb90be..94854ed 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java @@ -21,7 +21,7 @@ import java.util.List; public class PluginOneselfStartEventProcessor implements PluginPostProcessor { private final Logger log = LoggerFactory.getLogger(this.getClass()); - private final static String KEY = "OneselfListeners"; + public final static String KEY = "OneselfListeners"; public PluginOneselfStartEventProcessor(){ } @@ -65,21 +65,9 @@ public class PluginOneselfStartEventProcessor implements PluginPostProcessor { @Override public void unRegistry(List pluginRegistryInfos) { - for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { - BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); - List oneselfListeners = pluginRegistryInfo.getExtension(KEY); - if(oneselfListeners == null || oneselfListeners.isEmpty()){ - continue; - } - for (OneselfListener oneselfListener : oneselfListeners) { - try { - oneselfListener.stopEvent(basePlugin); - } catch (Exception e){ - log.error("OneselfListener {} execute stopEvent exception. {}", - oneselfListener.getClass().getName(), e.getMessage(), e); - } - } - } + // 当前不执行停止事件 + // 由类 com.gitee.starblues.factory.process.pipe.PluginOneselfStopEventProcessor 实现停止 + // 主要考虑到停止时, 需要先执行, 自主来关闭当前插件某些资源 } -- Gitee From b90eba4b1adbcc1d3385f3341d415e33966af146 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Tue, 1 Jun 2021 22:08:45 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84=E8=A7=A3=E6=9E=90bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log/PluginLogConfigProcessor.java | 11 +++++- .../gitee/starblues/utils/ResourceUtils.java | 24 +++++++------ .../starblues/utils/ResourceUtilsTest.java | 34 +++++++++++++++++++ 3 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/ResourceUtilsTest.java diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java index d5c330c..bcfa09f 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java @@ -6,6 +6,8 @@ import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.utils.OrderPriority; import com.gitee.starblues.utils.ResourceUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @@ -24,6 +26,7 @@ import java.util.List; */ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { + private final static Logger LOG = LoggerFactory.getLogger(PluginLogConfigProcessor.class); private final LogRegistry logRegistry; public PluginLogConfigProcessor(SpringBootLogExtension.Type type){ @@ -86,16 +89,22 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { return null; } + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(pluginRegistryInfo.getPluginClassLoader()); List resources = new ArrayList<>(); String matchLocation = ResourceUtils.getMatchLocation(logConfigLocation); if (matchLocation == null || "".equals(matchLocation)) { + LOG.warn("Plugin '{}' not match {}: {}", pluginId, PropertyKey.LOG_CONFIG_LOCATION, + logConfigLocation); return null; } Resource[] logConfigResources = resourcePatternResolver.getResources(matchLocation); - if (logConfigResources.length != 0) { + if (logConfigResources.length > 0) { resources.addAll(Arrays.asList(logConfigResources)); + } else { + LOG.error("Plugin '{}' not found {}: {}", pluginId, PropertyKey.LOG_CONFIG_LOCATION, + logConfigLocation); } return resources; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java index 475e34a..4ddc148 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java @@ -26,6 +26,7 @@ public class ResourceUtils { public final static String TYPE_CLASSPATH = "classpath"; public final static String TYPE_PACKAGE = "package"; + public final static String TYPE_SPLIT = ":"; /** * 获取匹配路绝 @@ -36,20 +37,21 @@ public class ResourceUtils { if(StringUtils.isNullOrEmpty(locationMatch)){ return null; } - String[] split = locationMatch.split(":"); - if(split.length != 2){ - return null; + String classPathType = TYPE_CLASSPATH + TYPE_SPLIT; + if(locationMatch.startsWith(classPathType)){ + return locationMatch.replaceFirst(classPathType, ""); + } + String fileType = TYPE_FILE + TYPE_SPLIT; + if(locationMatch.startsWith(fileType)){ + return locationMatch.replaceFirst(fileType, ""); } - String type = split[0].trim(); - String location = split[1]; - if(TYPE_CLASSPATH.equalsIgnoreCase(type) || TYPE_FILE.equalsIgnoreCase(type)){ - return locationMatch; - } else if(TYPE_PACKAGE.equalsIgnoreCase(type)){ + String packageType = TYPE_PACKAGE + TYPE_SPLIT; + if(locationMatch.startsWith(packageType)){ + String location = locationMatch.replaceFirst(packageType, ""); return location.replace(".", "/"); - } else { - LOGGER.error("locationMatch {} illegal", locationMatch); - return null; } + LOGGER.error("locationMatch {} illegal", locationMatch); + return null; } } diff --git a/springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/ResourceUtilsTest.java b/springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/ResourceUtilsTest.java new file mode 100644 index 0000000..1f2f6d1 --- /dev/null +++ b/springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/ResourceUtilsTest.java @@ -0,0 +1,34 @@ +package com.gitee.starblues.utils; + + +import org.junit.Assert; +import org.junit.Test; + +/** + * @author starBlues + * @version 2.3.4 + * @since 2021-06-01 + */ +public class ResourceUtilsTest { + + @Test + public void test(){ + String locationMatch = "file:C:\\Users\\Desktop\\plugin1-log.xml"; + String matchLocation = ResourceUtils.getMatchLocation(locationMatch); + Assert.assertEquals("C:\\Users\\Desktop\\plugin1-log.xml", + matchLocation); + + locationMatch = "classpath:C:\\Users\\Desktop\\plugin1-log.xml"; + matchLocation = ResourceUtils.getMatchLocation(locationMatch); + Assert.assertEquals("C:\\Users\\Desktop\\plugin1-log.xml", + matchLocation); + + locationMatch = "package:com.test.aa"; + matchLocation = ResourceUtils.getMatchLocation(locationMatch); + Assert.assertEquals("com/test/aa", + matchLocation); + + + } + +} \ No newline at end of file -- Gitee From c2f122720b8034df3b44b4a76b3ea68af9d3603c Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Wed, 2 Jun 2021 22:17:34 +0800 Subject: [PATCH 20/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8B=E6=8F=92=E4=BB=B6=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=97=A0=E6=B3=95=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log/PluginLogConfigProcessor.java | 29 +++++++------------ .../extension/log/SpringBootLogExtension.java | 2 +- .../extension/log/log4j/Log4jLogRegistry.java | 12 ++------ .../log/logback/LogbackLogRegistry.java | 16 +++++----- .../extension/log/util/LogConfigUtil.java | 18 +++++++++--- .../starblues/factory/PluginRegistryInfo.java | 6 ++++ .../gitee/starblues/utils/ResourceUtils.java | 19 ++++++++++-- 7 files changed, 58 insertions(+), 44 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java index bcfa09f..71c7d02 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/PluginLogConfigProcessor.java @@ -9,14 +9,13 @@ import com.gitee.starblues.utils.ResourceUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.util.ObjectUtils; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -59,11 +58,10 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { if (logRegistry == null) { return; } - List pluginResources = getLogConfigFile(pluginRegistryInfo); - if (pluginResources == null || pluginResources.isEmpty()) { - return; - } - logRegistry.registry(pluginResources, pluginRegistryInfo); + Resource resource = getLogConfigFile(pluginRegistryInfo); + List resources = new ArrayList<>(1); + resources.add(resource); + logRegistry.registry(resources, pluginRegistryInfo); } @Override @@ -81,32 +79,25 @@ class PluginLogConfigProcessor implements PluginPipeProcessorExtend { * @param pluginRegistryInfo 当前插件注册的信息 * @throws IOException 获取不到配置文件异常 **/ - private List getLogConfigFile(PluginRegistryInfo pluginRegistryInfo) throws IOException { + private Resource getLogConfigFile(PluginRegistryInfo pluginRegistryInfo) throws IOException { GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); String logConfigLocation = pluginApplicationContext.getEnvironment() .getProperty(PropertyKey.LOG_CONFIG_LOCATION); if (ObjectUtils.isEmpty(logConfigLocation)) { return null; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - ResourcePatternResolver resourcePatternResolver = - new PathMatchingResourcePatternResolver(pluginRegistryInfo.getPluginClassLoader()); - List resources = new ArrayList<>(); String matchLocation = ResourceUtils.getMatchLocation(logConfigLocation); if (matchLocation == null || "".equals(matchLocation)) { LOG.warn("Plugin '{}' not match {}: {}", pluginId, PropertyKey.LOG_CONFIG_LOCATION, logConfigLocation); return null; } - Resource[] logConfigResources = resourcePatternResolver.getResources(matchLocation); - if (logConfigResources.length > 0) { - resources.addAll(Arrays.asList(logConfigResources)); + if(ResourceUtils.isFile(logConfigLocation)){ + return new FileSystemResource(matchLocation); } else { - LOG.error("Plugin '{}' not found {}: {}", pluginId, PropertyKey.LOG_CONFIG_LOCATION, - logConfigLocation); + return new ClassPathResource(matchLocation, pluginRegistryInfo.getPluginClassLoader()); } - return resources; } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java index dded116..93cb475 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/SpringBootLogExtension.java @@ -30,7 +30,7 @@ public class SpringBootLogExtension extends AbstractExtension { } @Override - public List getPluginPipeProcessor(ApplicationContext applicationContext) { + public List getPluginPipeProcessor(ApplicationContext mainApplicationContext) { List pipeProcessorExtends = new ArrayList<>(); pipeProcessorExtends.add(new PluginLogConfigProcessor(type)); return pipeProcessorExtends; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java index 2e5481f..c314075 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/log4j/Log4jLogRegistry.java @@ -1,6 +1,5 @@ package com.gitee.starblues.extension.log.log4j; -import ch.qos.logback.core.spi.FilterReply; import com.gitee.starblues.extension.log.LogRegistry; import com.gitee.starblues.extension.log.config.LogConfig; import com.gitee.starblues.extension.log.logback.LogbackLogRegistry; @@ -13,10 +12,8 @@ import org.apache.logging.log4j.core.*; import org.apache.logging.log4j.core.appender.RollingFileAppender; import org.apache.logging.log4j.core.appender.rolling.*; import org.apache.logging.log4j.core.config.Configuration; -import org.apache.logging.log4j.core.config.ConfigurationSource; import org.apache.logging.log4j.core.config.DefaultConfiguration; import org.apache.logging.log4j.core.config.LoggerConfig; -import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory; import org.apache.logging.log4j.core.filter.AbstractFilter; import org.apache.logging.log4j.core.layout.PatternLayout; import org.apache.logging.log4j.message.Message; @@ -24,10 +21,6 @@ import org.pf4j.PluginWrapper; import org.slf4j.LoggerFactory; import org.springframework.core.io.Resource; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; import java.nio.charset.Charset; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -42,6 +35,7 @@ public class Log4jLogRegistry implements LogRegistry { private final org.slf4j.Logger log = LoggerFactory.getLogger(LogbackLogRegistry.class); private final Map> pluginAppenderInfo = new ConcurrentHashMap<>(); + @Override public void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception { PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); @@ -50,7 +44,7 @@ public class Log4jLogRegistry implements LogRegistry { LoggerConfig rootLogger = configuration.getRootLogger(); Set allAppender = new HashSet<>(); for (Resource resource : resources) { - if(resource == null || !resource.exists()){ + if(resource == null){ continue; } LogConfig logConfig; @@ -98,7 +92,7 @@ public class Log4jLogRegistry implements LogRegistry { .withName(pluginWrapper.getPluginId()) .withLayout(patternLayout) .withIgnoreExceptions(false) - .withFileName(LogConfigUtil.getLogFile(pluginWrapper, logConfig).concat(".log")) + .withFileName(LogConfigUtil.getLogFile(pluginRegistryInfo, logConfig).concat(".log")) .withFilePattern(".%d{yyyy-MM-dd}-%i.log") .withAppend(true) .withPolicy(policy) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java index f0d6a8d..d81d723 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/logback/LogbackLogRegistry.java @@ -39,13 +39,12 @@ public class LogbackLogRegistry implements LogRegistry { private final Map>> pluginAppenderInfo = new ConcurrentHashMap<>(); - @Override public void registry(List resources, PluginRegistryInfo pluginRegistryInfo) throws Exception { Set> appenderSet = new HashSet<>(); PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); for (Resource resource : resources) { - if(resource == null || !resource.exists()){ + if(resource == null){ continue; } LogConfig logConfig; @@ -55,7 +54,7 @@ public class LogbackLogRegistry implements LogRegistry { log.error("Failed to read log configuration.", e); continue; } - Set> logAppenderSet = addAppender(pluginWrapper, logConfig); + Set> logAppenderSet = addAppender(pluginRegistryInfo, logConfig); appenderSet.addAll(logAppenderSet); } pluginAppenderInfo.put(pluginWrapper.getPluginId(), appenderSet); @@ -77,15 +76,15 @@ public class LogbackLogRegistry implements LogRegistry { pluginAppenderInfo.remove(pluginWrapper.getPluginId()); } - private Set> addAppender(PluginWrapper pluginWrapper, LogConfig logConfig) { + private Set> addAppender(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig) { LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); String packageName = logConfig.getPackageName(); Logger logger = context.getLogger(packageName); logger.detachAndStopAllAppenders(); - ConsoleAppender consoleAppender = createConsoleAppender(pluginWrapper, + ConsoleAppender consoleAppender = createConsoleAppender(pluginRegistryInfo.getPluginWrapper(), logConfig, packageName); - RollingFileAppender fileAppender = createFileAppender(pluginWrapper, + RollingFileAppender fileAppender = createFileAppender(pluginRegistryInfo, logConfig, packageName); logger.setAdditive(false); @@ -120,7 +119,7 @@ public class LogbackLogRegistry implements LogRegistry { return appender; } - private RollingFileAppender createFileAppender(PluginWrapper pluginWrapper, + private RollingFileAppender createFileAppender(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig, String packageName) { LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); @@ -132,10 +131,11 @@ public class LogbackLogRegistry implements LogRegistry { appender.addFilter(filter); } + PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); appender.setContext(context); appender.setName(pluginWrapper.getPluginId()); - String logFilePrefix = LogConfigUtil.getLogFile(pluginWrapper, logConfig); + String logFilePrefix = LogConfigUtil.getLogFile(pluginRegistryInfo, logConfig); appender.setFile(OptionHelper.substVars(logFilePrefix.concat(".log"), context)); appender.setAppend(true); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java index bbbedce..a5fcdab 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-log/src/main/java/com/gitee/starblues/extension/log/util/LogConfigUtil.java @@ -3,8 +3,10 @@ package com.gitee.starblues.extension.log.util; import com.gitee.starblues.extension.log.annotation.ConfigItem; import com.gitee.starblues.extension.log.config.LogConfig; import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.utils.CommonUtils; import org.pf4j.PluginWrapper; +import org.pf4j.RuntimeMode; import org.pf4j.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,17 +45,25 @@ public class LogConfigUtil { } - public static String getLogFile(PluginWrapper pluginWrapper, LogConfig logConfig){ + public static String getLogFile(PluginRegistryInfo pluginRegistryInfo, LogConfig logConfig){ String rootDir = logConfig.getRootDir(); String home; - String pluginPath = pluginWrapper.getPluginPath().toString(); + PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); + IntegrationConfiguration configuration = pluginRegistryInfo.getConfiguration(); + String pluginRootDir; + RuntimeMode runtimeMode = pluginWrapper.getRuntimeMode(); + if(runtimeMode == RuntimeMode.DEVELOPMENT){ + pluginRootDir = pluginWrapper.getPluginPath().toString(); + } else { + pluginRootDir = configuration.pluginPath(); + } if(StringUtils.isNullOrEmpty(rootDir)){ - home = CommonUtils.joiningFilePath(pluginPath, "logs"); + home = CommonUtils.joiningFilePath(pluginRootDir, "logs"); } else { if(rootDir.startsWith(LogConfig.ROOT_PLUGIN_SIGN)){ // 如果root路径中开始存在ROOT_PLUGIN_SIGN,则说明进行插件根路替换 home = rootDir.replaceFirst("\\" + LogConfig.ROOT_PLUGIN_SIGN, ""); - home = CommonUtils.joiningFilePath(pluginPath, home); + home = CommonUtils.joiningFilePath(pluginRootDir, home); } else { home = rootDir; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java index c711309..b34d7e4 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java @@ -3,6 +3,7 @@ package com.gitee.starblues.factory; import com.gitee.starblues.factory.process.pipe.PluginInfoContainers; import com.gitee.starblues.factory.process.pipe.PluginPipeApplicationContextProcessor; import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; +import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.*; import org.pf4j.util.StringUtils; @@ -32,6 +33,7 @@ public class PluginRegistryInfo { private final PluginWrapper pluginWrapper; private final PluginManager pluginManager; + private final IntegrationConfiguration configuration; private final GenericApplicationContext mainApplicationContext; private final AnnotationConfigApplicationContext pluginApplicationContext; private final Binder pluginBinder; @@ -83,6 +85,7 @@ public class PluginRegistryInfo { this.pluginManager = pluginManager; this.basePlugin = (BasePlugin) pluginWrapper.getPlugin(); this.mainApplicationContext = mainApplicationContext; + this.configuration = mainApplicationContext.getBean(IntegrationConfiguration.class); this.followingInitial = followingInitial; ClassLoader pluginClassLoader = basePlugin.getWrapper().getPluginClassLoader(); @@ -309,6 +312,9 @@ public class PluginRegistryInfo { return followingInitial; } + public IntegrationConfiguration getConfiguration() { + return configuration; + } void destroy(){ // 关闭ApplicationContext diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java index 4ddc148..3c45b3f 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/ResourceUtils.java @@ -38,15 +38,15 @@ public class ResourceUtils { return null; } String classPathType = TYPE_CLASSPATH + TYPE_SPLIT; - if(locationMatch.startsWith(classPathType)){ + if(isClasspath(locationMatch)){ return locationMatch.replaceFirst(classPathType, ""); } String fileType = TYPE_FILE + TYPE_SPLIT; - if(locationMatch.startsWith(fileType)){ + if(isFile(locationMatch)){ return locationMatch.replaceFirst(fileType, ""); } String packageType = TYPE_PACKAGE + TYPE_SPLIT; - if(locationMatch.startsWith(packageType)){ + if(isPackage(locationMatch)){ String location = locationMatch.replaceFirst(packageType, ""); return location.replace(".", "/"); } @@ -54,4 +54,17 @@ public class ResourceUtils { return null; } + public static boolean isClasspath(String locationMatch){ + return locationMatch.startsWith(TYPE_CLASSPATH + TYPE_SPLIT); + } + + public static boolean isFile(String locationMatch){ + return locationMatch.startsWith(TYPE_FILE + TYPE_SPLIT); + } + + public static boolean isPackage(String locationMatch){ + return locationMatch.startsWith(TYPE_PACKAGE + TYPE_SPLIT); + } + + } -- Gitee From 0562088c1c7b18a0ab2f6be15b4d480b9aa2b9ba Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Wed, 2 Jun 2021 22:18:06 +0800 Subject: [PATCH 21/23] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/starblues/factory/PluginRegistryInfo.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java index b34d7e4..95cbb0d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java @@ -1,11 +1,11 @@ package com.gitee.starblues.factory; import com.gitee.starblues.factory.process.pipe.PluginInfoContainers; -import com.gitee.starblues.factory.process.pipe.PluginPipeApplicationContextProcessor; import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.realize.BasePlugin; -import org.pf4j.*; +import org.pf4j.PluginManager; +import org.pf4j.PluginWrapper; import org.pf4j.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,11 +13,7 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.util.ClassUtils; -import java.io.Closeable; -import java.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -- Gitee From 94f18b2320ada6ab34cfb63aeae1094af90f51c6 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 4 Jun 2021 19:55:50 +0800 Subject: [PATCH 22/23] =?UTF-8?q?=E6=8F=90=E4=BA=A4maven?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springboot-plugin-framework-extension-resources/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml index ee5e37c..f6c4553 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml @@ -86,7 +86,6 @@ provided - org.springframework.boot spring-boot-starter-thymeleaf -- Gitee From fafeb7a6d1fa1f183c47ae67478f51a1004d34dc Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 4 Jun 2021 22:42:16 +0800 Subject: [PATCH 23/23] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/starblues/realize/ConfigDefinitionTip.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java index 84e3d37..dcb0a16 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/ConfigDefinitionTip.java @@ -61,7 +61,7 @@ public class ConfigDefinitionTip { } /** - * 将配置文件中的值映射为bean + * 将Springboot类型的配置文件中的值映射为bean * 注意: 只针对插件扩展的 springboot 配置文件生效 * @param prefix 配置文件中的前置, 比如: plugin.config * @param type 配置文件中结构对应的类类型, 比如: plugin.config 下定义的键值对和type类类型一致 @@ -75,7 +75,7 @@ public class ConfigDefinitionTip { } /** - * 将配置文件中的值映射为 List + * 将Springboot类型的配置文件中的值映射为 List * 注意: 只针对插件扩展的 springboot 配置文件生效 * @param prefix 配置文件中的前置, 比如: plugin.config * @param type List元素的类类型 @@ -89,7 +89,7 @@ public class ConfigDefinitionTip { } /** - * 将配置文件中的值映射为 Set + * 将Springboot类型的配置文件中的值映射为 Set * 注意: 只针对插件扩展的 springboot 配置文件生效 * @param prefix 配置文件中的前置, 比如: plugin.config * @param type Set元素的类类型 @@ -104,7 +104,7 @@ public class ConfigDefinitionTip { /** - * 将配置文件中的值映射为 Map + * 将Springboot类型的配置文件中的值映射为 Map * 注意: 只针对插件扩展的 springboot 配置文件生效 * @param prefix 配置文件中的前置, 比如: plugin.config * @param keyType map的key元素类型 -- Gitee